igniteui-angular 18.1.14 → 18.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/esm2022/lib/grids/grid-base.directive.mjs +5 -2
  2. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +26 -5
  3. package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
  4. package/fesm2022/igniteui-angular.mjs +29 -5
  5. package/fesm2022/igniteui-angular.mjs.map +1 -1
  6. package/lib/core/styles/components/grid/_grid-theme.scss +4 -1
  7. package/lib/core/styles/components/query-builder/_query-builder-theme.scss +3 -13
  8. package/lib/grids/grid-base.directive.d.ts +1 -0
  9. package/lib/grids/pivot-grid/pivot-grid.component.d.ts +8 -2
  10. package/package.json +1 -1
  11. package/styles/igniteui-angular-dark.css +1 -1
  12. package/styles/igniteui-angular.css +1 -1
  13. package/styles/igniteui-bootstrap-dark.css +1 -1
  14. package/styles/igniteui-bootstrap-light.css +1 -1
  15. package/styles/igniteui-dark-green.css +1 -1
  16. package/styles/igniteui-fluent-dark-excel.css +1 -1
  17. package/styles/igniteui-fluent-dark-word.css +1 -1
  18. package/styles/igniteui-fluent-dark.css +1 -1
  19. package/styles/igniteui-fluent-light-excel.css +1 -1
  20. package/styles/igniteui-fluent-light-word.css +1 -1
  21. package/styles/igniteui-fluent-light.css +1 -1
  22. package/styles/igniteui-indigo-dark.css +1 -1
  23. package/styles/igniteui-indigo-light.css +1 -1
  24. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  25. package/styles/maps/igniteui-angular.css.map +1 -1
  26. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  27. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  28. package/styles/maps/igniteui-dark-green.css.map +1 -1
  29. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  30. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  31. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  32. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  33. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  34. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  35. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  36. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -2613,7 +2613,7 @@ export class IgxGridBaseDirective {
2613
2613
  this.zone.run(() => {
2614
2614
  // do not trigger reflow if element is detached.
2615
2615
  if (this.nativeElement.isConnected) {
2616
- if (this._gridSize !== this.gridSize) {
2616
+ if (this.shouldResize) {
2617
2617
  // resizing occurs due to the change of --ig-size css var
2618
2618
  this._gridSize = this.gridSize;
2619
2619
  this.updateDefaultRowHeight();
@@ -4130,6 +4130,9 @@ export class IgxGridBaseDirective {
4130
4130
  get isPercentWidth() {
4131
4131
  return this.width && this.width.indexOf('%') !== -1;
4132
4132
  }
4133
+ get shouldResize() {
4134
+ return this._gridSize !== this.gridSize;
4135
+ }
4133
4136
  /**
4134
4137
  * @hidden @internal
4135
4138
  */
@@ -6939,4 +6942,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.4", ngImpor
6939
6942
  type: Input,
6940
6943
  args: [{ transform: booleanAttribute }]
6941
6944
  }] } });
6942
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFHSCxnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixlQUFlLEVBQ2YsU0FBUyxFQUVULFVBQVUsRUFFVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBRU4sS0FBSyxFQUdMLFNBQVMsRUFJVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUF3QixNQUFNLG1EQUFtRCxDQUFDO0FBRXpHLE9BQU8sRUFBK0IscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUczRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN0RyxPQUFPLEVBQ0gsd0JBQXdCLEVBQTZCLDRCQUE0QixFQUNwRixNQUFNLCtDQUErQyxDQUFDO0FBRXZELE9BQU8sRUFBZSxlQUFlLEVBQTZCLE1BQU0sd0JBQXdCLENBQUM7QUFDakcsT0FBTyxFQUNILHNCQUFzQixFQUN0QiwyQkFBMkIsRUFDM0IsMEJBQTBCLEVBQzFCLHVCQUF1QixFQUN2QiwwQkFBMEIsRUFDN0IsTUFBTSwwQkFBMEIsQ0FBQztBQUlsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHFCQUFxQixFQUF3QixNQUFNLDZCQUE2QixDQUFDO0FBRTFGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZFLE9BQU8sRUFBOEIsMEJBQTBCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNqSSxPQUFPLEVBQUUsMkNBQTJDLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNuSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXNCLE1BQU0sdUNBQXVDLENBQUM7QUFDOUYsT0FBTyxFQUNILGdDQUFnQyxFQUFFLGlDQUFpQyxFQUFFLG1DQUFtQyxFQUN4RyxvQ0FBb0MsRUFBRSxnQ0FBZ0MsRUFBRSxtQ0FBbUMsRUFDM0csb0NBQW9DLEVBQUUsMEJBQTBCLEVBQ25FLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUVILGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLFVBQVUsRUFDVixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLGNBQWMsRUFFZCxJQUFJLEVBQ1AsTUFBTSxnQkFBZ0IsQ0FBQztBQWtDeEIsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDekgsT0FBTyxFQWdCSCxxQkFBcUIsRUFLeEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHdCQUF3QixFQUFFLDZCQUE2QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDaEYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHdEYsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBcUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMxSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMzRyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNyRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQztBQUM3RixPQUFPLEVBQTRCLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHdkcsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0seURBQXlELENBQUM7QUFHOUcsT0FBTyxFQUFFLHdCQUF3QixFQUFzQixNQUFNLHdDQUF3QyxDQUFDO0FBR3RHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7QUFTbkUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDckIsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDakMsd0hBQXdIO0FBQ3hILDhIQUE4SDtBQUM5SCx1SEFBdUg7QUFDdkgsd0hBQXdIO0FBQ3hILG9HQUFvRztBQUNwRyxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQUUxQzs7OzJCQUcyQjtBQUUzQixNQUFNLE9BQWdCLG9CQUFvQjtJQWtGdEM7O09BRUc7SUFDSCxJQUNXLGdCQUFnQixDQUFDLEtBQWE7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN2QixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUN6RCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEYsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLG9CQUFvQjtRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGlCQUFpQixDQUFDLFFBQTRCO1FBQ3JELElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUNoRCxDQUFDO0lBQ0wsQ0FBQztJQXlJRCx3QkFBd0I7SUFDeEIsSUFBVyw0QkFBNEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQXNxQkQsd0JBQXdCO0lBQ3hCLElBQVcsV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUM7SUFDN0MsQ0FBQztJQWtERDs7T0FFRztJQUNILElBQ1csdUJBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILElBQVcsdUJBQXVCLENBQUMsUUFBaUQ7UUFDaEYsSUFBSSxDQUFDLHdCQUF3QixHQUFHLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBK0JELHdCQUF3QjtJQUN4QixJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztJQUN0QyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsdUJBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSx1QkFBdUIsQ0FBQztJQUNsRCxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQztJQUM5QyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsb0JBQW9CO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQztJQUMvQyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDO0lBQ3BDLENBQUM7SUE4REQ7O09BRUc7SUFDSCxJQUNXLG1CQUFtQjtRQUMxQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDO0lBQzFFLENBQUM7SUFDRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxJQUFXLG1CQUFtQixDQUFDLFFBQXdEO1FBQ25GLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7SUFDekMsQ0FBQztJQVFEOztPQUVHO0lBQ0gsSUFDVyxrQkFBa0I7UUFDekIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN2RCxDQUFDO0lBQ0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFBVyxrQkFBa0IsQ0FBQyxRQUFrRDtRQUM1RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO0lBQ3hDLENBQUM7SUFRRDs7T0FFRztJQUNILElBQ1csc0JBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUM7SUFDaEYsQ0FBQztJQUNEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxJQUFXLHNCQUFzQixDQUFDLFFBQTJEO1FBQ3pGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQVFEOztNQUVFO0lBQ0YsSUFDVyw0QkFBNEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsNkJBQTZCLElBQUksSUFBSSxDQUFDLHFDQUFxQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O01BWUU7SUFDRixJQUFXLDRCQUE0QixDQUFDLFFBQWdEO1FBQ3BGLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxRQUFRLENBQUM7SUFDbEQsQ0FBQztJQVFEOztNQUVFO0lBQ0YsSUFDVyw2QkFBNkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsOEJBQThCLElBQUksSUFBSSxDQUFDLHNDQUFzQyxDQUFDO0lBQzlGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O01BWUU7SUFDRixJQUFXLDZCQUE2QixDQUFDLFFBQWdEO1FBQ3JGLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLENBQUM7SUFDbkQsQ0FBQztJQVFEOztNQUVFO0lBQ0YsSUFDVywrQkFBK0I7UUFDdEMsT0FBTyxJQUFJLENBQUMsOEJBQThCLElBQUksSUFBSSxDQUFDLHdDQUF3QyxDQUFDO0lBQ2hHLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O01BWUU7SUFDRixJQUFXLCtCQUErQixDQUFDLFFBQTZDO1FBQ3BGLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxRQUFRLENBQUM7SUFDbkQsQ0FBQztJQVFEOztNQUVFO0lBQ0YsSUFDVyxnQ0FBZ0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLElBQUksSUFBSSxDQUFDLHlDQUF5QyxDQUFDO0lBQ25HLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O01BWUU7SUFDRixJQUFXLGdDQUFnQyxDQUFDLFFBQTZDO1FBQ3JGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxRQUFRLENBQUM7SUFDckQsQ0FBQztJQU1EOztNQUVFO0lBQ0YsSUFDVyw0QkFBNEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsNkJBQTZCLElBQUksSUFBSSxDQUFDLHFDQUFxQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O01BWUU7SUFDRixJQUFXLDRCQUE0QixDQUFDLFFBQW1EO1FBQ3ZGLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxRQUFRLENBQUM7SUFDbEQsQ0FBQztJQVVEOztPQUVHO0lBQ0gsSUFDVywrQkFBK0I7UUFDdEMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILElBQVcsK0JBQStCLENBQUMsUUFBbUQ7UUFDMUYsSUFBSSxDQUFDLGdDQUFnQyxHQUFHLFFBQVEsQ0FBQztJQUNyRCxDQUFDO0lBTUQ7O09BRUc7SUFDSCxJQUNXLGdDQUFnQztRQUN2QyxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFBVyxnQ0FBZ0MsQ0FBQyxRQUFtRDtRQUMzRixJQUFJLENBQUMsaUNBQWlDLEdBQUcsUUFBUSxDQUFDO0lBQ3RELENBQUM7SUFTRDs7T0FFRztJQUNILElBQ1csc0JBQXNCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxJQUFXLHNCQUFzQixDQUFDLFFBQW1EO1FBQ2pGLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQThHRDs7Ozs7T0FLRztJQUNILElBQ1csZUFBZSxDQUFDLEtBQTJCO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBRUgsSUFDVyxjQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztJQUNuRCxDQUFDO0lBRUQsSUFBVyxjQUFjLENBQUMsS0FBcUI7UUFDM0MsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDcEQsQ0FBQztJQUVELGtEQUFrRDtJQUNsRDs7Ozs7Ozs7O09BU0c7SUFFSCxJQUNXLHdCQUF3QjtRQUMvQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBVyx3QkFBd0IsQ0FBQyxLQUFLO1FBQ3JDLElBQUksS0FBSyxJQUFJLEtBQUssWUFBWSx3QkFBd0IsRUFBRSxDQUFDO1lBQ3JELE1BQU0sR0FBRyxHQUFJLEtBQWtDLENBQUM7WUFDaEQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxZQUFZLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztvQkFDdEUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLHdCQUF3QixDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNwSCxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBeUIsQ0FBQyxDQUFDO29CQUNoRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3RELENBQUM7WUFDTCxDQUFDO1lBRUQsS0FBSyxDQUFDLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxPQUFPLENBQUM7WUFDbEQsSUFBSSxDQUFDLHlCQUF5QixHQUFHLEtBQUssQ0FBQztZQUN2QyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRXpFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztnQkFDckYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFFSCxJQUNXLGdDQUFnQztRQUN2QyxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsSUFBVyxnQ0FBZ0MsQ0FBQyxLQUFLO1FBQzdDLE1BQU0sa0JBQWtCLEdBQXdCO1lBQzVDLEtBQUssRUFBRSxJQUFJO1lBQ1gsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixNQUFNLEVBQUUsS0FBSztTQUNoQixDQUFDO1FBRUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUV4QyxJQUFJLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksS0FBSyxZQUFZLHdCQUF3QixFQUFFLENBQUM7WUFDckQsS0FBSyxDQUFDLElBQUksR0FBRyw0QkFBNEIsQ0FBQyxRQUFRLENBQUM7WUFDbkQsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEtBQUssQ0FBQztZQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxJQUFJLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFFekYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1lBQ3JGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsRUFBRSxDQUFDO1lBQ2hHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXJCLG1HQUFtRztRQUNuRyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQ1csTUFBTTtRQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUMzQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztZQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFDVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsSUFBVyxVQUFVLENBQUMsR0FBbUI7UUFDckMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLElBQUk7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxJQUFJLENBQUMsR0FBVztRQUN2QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDOUIsQ0FBQztJQUNMLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sSUFBSSxzQkFBc0IsQ0FBQztJQUM3RCxDQUFDO0lBRUQsSUFBVyxPQUFPLENBQUMsR0FBVztRQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7UUFDakMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUVILElBQ1csZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFXLGdCQUFnQixDQUFDLEtBQWM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbkQsQ0FBQztJQUVELElBQVcsWUFBWSxDQUFDLEdBQVk7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBc0JEOzs7Ozs7Ozs7T0FTRztJQUVILElBQ1csV0FBVztRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQVcsV0FBVyxDQUFDLEdBQVk7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFFSCxJQUVXLE1BQU07UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLEtBQW9CO1FBQ2xDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQ1csU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUVILElBQ1csS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBVyxLQUFLLENBQUMsS0FBb0I7UUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLFdBQVc7UUFDbEIsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFFSCxJQUNXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDckUsQ0FBQztJQUVELElBQVcsU0FBUyxDQUFDLEtBQXNCO1FBQ3ZDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBRUgsSUFDVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBVyxXQUFXLENBQUMsS0FBYTtRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUNXLGdCQUFnQixDQUFDLEtBQWE7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUNuQyxDQUFDO0lBQ0QsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQztJQUNyRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUVILElBQ1csU0FBUyxDQUFDLEtBQWM7UUFDL0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDeEIsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxJQUFXLFNBQVM7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFnQkQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csd0JBQXdCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFXLHdCQUF3QjtRQUMvQixPQUFPLElBQUksQ0FBQyx5QkFBeUIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQ7Ozs7Ozs7Ozs7T0FVRztJQUNILElBQ1csT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBVyxPQUFPLENBQUMsS0FBSztRQUNwQixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsY0FBYyxDQUFDLEtBQUs7UUFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRXpDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBRTVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxzQkFBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsc0JBQXNCLENBQUMsS0FBSztRQUNuQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBRXpDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxJQUNXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFXLFVBQVUsQ0FBQyxLQUFpQjtRQUNuQyxRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ1osS0FBSyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7WUFDakMsS0FBSyxVQUFVLENBQUMsV0FBVztnQkFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLE1BQU07WUFDVjtnQkFDSSxNQUFNO1FBQ2QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsSUFDVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLGVBQWUsQ0FBQyxLQUEwQjtRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsSUFDVyxzQkFBc0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQVcsc0JBQXNCLENBQUMsS0FBaUM7UUFDL0QsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsSUFDVyxxQkFBcUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQVcscUJBQXFCLENBQUMsS0FBYztRQUMzQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsY0FBYyxDQUFDLFFBQTRCO1FBQ2xELElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFDVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUEyQjtRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxJQUNXLGNBQWMsQ0FBQyxLQUFzQjtRQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2Qsa0ZBQWtGO1lBQ2xGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELHdCQUF3QjtJQUN4QiwyQkFBMkI7SUFDM0Isb0ZBQW9GO0lBQ3BGLDBCQUEwQjtJQUMxQjs7Ozs7Ozs7O09BU0c7SUFDSCxJQUNXLFlBQVksQ0FBQyxNQUFhO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFHRCx3QkFBd0I7SUFDeEIsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsY0FBYztRQUNyQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixPQUFPLEdBQUcsQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3pHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCOzs7Ozs7O09BT0c7SUFDSCxJQUFXLE9BQU87UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLFNBQVMsRUFBbUIsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQ3RCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQzthQUNuRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELGdCQUFnQjtJQUNoQjs7Ozs7OztPQU9HO0lBQ0gsSUFBVyxXQUFXO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksU0FBUyxFQUFtQixDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckIsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEksR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILElBQ1csb0JBQW9CO1FBQzNCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILElBQVcsb0JBQW9CLENBQUMsUUFBcUQ7UUFDakYsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxxQkFBcUIsQ0FBQyxHQUFHLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNILElBQ1csbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7V0FZTztJQUNQLElBQVcsbUJBQW1CLENBQUMsUUFBb0Q7UUFDL0UsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLHdCQUF3QjtRQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3BCLElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDakYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFDVyx5QkFBeUI7UUFDaEMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFBVyx5QkFBeUIsQ0FBQyxHQUE2QztRQUM5RSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsR0FBRyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsd0JBQXdCO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQzthQUN4RCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyx1QkFBdUI7UUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2FBQ3hELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDNUYsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLGdCQUFnQjtRQUN2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUU5QyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2QixHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNsRixHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksVUFBVSxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLFdBQVc7UUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDO1FBQ2hILE9BQU8sY0FBYyxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hEOzs7Ozs7Ozs7T0FTRztJQUVILElBQ1csa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFXLGtCQUFrQixDQUFDLEtBQTJCO1FBQ3JELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDMUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsSUFDVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBVyxZQUFZLENBQUMsR0FBWTtRQUNoQyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtJQUNwQjs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNuQixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDN0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CO1FBQzNCLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQ3RDLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsTUFBTSxDQUFDLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBRUgsSUFDVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxhQUFnQztRQUNyRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsYUFBYSxDQUFDO1FBQ3hDLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJO0lBQ1IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUVILElBQ1csWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBVyxZQUFZLENBQUMsYUFBZ0M7UUFDcEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUVILElBQ1csZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBVyxlQUFlLENBQUMsYUFBZ0M7UUFDdkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGFBQWEsQ0FBQztRQUMxQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxXQUFXLENBQUMsS0FBSztRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDOUQsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUF5QkQ7O09BRUc7SUFDSCxJQUFXLGNBQWM7UUFDckIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFpRkQsd0JBQXdCO0lBQ3hCLElBQVcsSUFBSTtRQUNYLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFtR0Qsd0JBQXdCO0lBQ3hCLElBQVcsU0FBUztRQUNoQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQXVHRDs7T0FFRztJQUNILElBQWMsY0FBYztRQUN4QixPQUFPLG9CQUFvQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFjLG9CQUFvQjtRQUM5QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBU0Q7Ozs7Ozs7T0FPRztJQUNILElBQVcsWUFBWTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNuQixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekYsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JELENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyw4QkFBOEI7UUFDckMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDO2lCQUN0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxHQUFHLENBQUM7aUJBQzNDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqRixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsVUFBVTtRQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUN2SCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDakUsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDO1FBQ2pHLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUM1RixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDO1FBQzNGLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFZLG1CQUFtQjtRQUMzQixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVksU0FBUztRQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLG9CQUFvQjtRQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQzFFLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsMEJBQTBCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxpQkFBaUIsQ0FBQyxRQUFRO2VBQ2hELElBQUksQ0FBQyxZQUFZLEtBQUssaUJBQWlCLENBQUMsZUFBZSxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssaUJBQWlCLENBQUMsSUFBSSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUNvQixVQUFvQztJQUNwRCx3QkFBd0I7SUFDUixnQkFBeUMsRUFDL0Msa0JBQTRDLEVBQ1AsT0FBd0IsRUFDN0Qsa0JBQTZDLEVBQy9DLFVBQW1DLEVBQ2pDLElBQVk7SUFDdEIsd0JBQXdCO0lBQ0MsUUFBYSxFQUN0QixHQUFzQixFQUM1QixPQUF3QixFQUN4QixPQUF5QixFQUN6QixRQUFrQixFQUNsQixXQUFnQyxFQUNuQyxVQUFvQztJQUMzQyx3QkFBd0I7SUFDakIsZ0JBQXFDLEVBQ2xDLG9CQUE2QyxFQUNsQixjQUFpQztJQUN0RSx3QkFBd0I7SUFDakIsY0FBcUMsRUFDakIsUUFBZ0IsRUFDakMsUUFBc0IsRUFDa0IsZUFBd0Q7UUF4QjFGLGVBQVUsR0FBVixVQUFVLENBQTBCO1FBRXBDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFDL0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQUNQLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQzdELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBMkI7UUFDL0MsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDakMsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUVHLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDNUIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDekIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7UUFDbkMsZUFBVSxHQUFWLFVBQVUsQ0FBMEI7UUFFcEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFxQjtRQUNsQyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXlCO1FBQ2xCLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUUvRCxtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNqQyxhQUFRLEdBQVIsUUFBUSxDQUFjO1FBQ2tCLG9CQUFlLEdBQWYsZUFBZSxDQUF5QztRQTFuRzlHOzs7OztXQUtHO1FBRUksd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBRWxDOzs7Ozs7Ozs7V0FTRztRQUVJLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTVCOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFFSSx3QkFBbUIsR0FBYSxFQUFFLENBQUM7UUFFMUM7OztXQUdHO1FBRUksV0FBTSxHQUFHLEtBQUssQ0FBQztRQStFdEI7O1dBRUc7UUFFSSxxQkFBZ0IsR0FBc0I7WUFDekM7O2VBRUc7WUFDSCxPQUFPLEVBQUUsSUFBSTtZQUNiOztlQUVHO1lBQ0gsV0FBVyxFQUFFLElBQUk7WUFDakI7O2VBRUc7WUFDSCxjQUFjLEVBQUUsSUFBSTtZQUNwQjs7ZUFFRztZQUNILFNBQVMsRUFBRSxJQUFJO1NBQ2xCLENBQUM7UUFFRjs7Ozs7Ozs7OztXQVVHO1FBRUksbUNBQThCLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFFdEY7Ozs7Ozs7Ozs7V0FVRztRQUVJLDJDQUFzQyxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRTlGOzs7Ozs7OztXQVFHO1FBRUksZUFBVSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBcUI3RCxnQkFBZ0I7UUFDaEI7Ozs7Ozs7Ozs7Ozs7OztXQWVHO1FBRUksY0FBUyxHQUFHLElBQUksQ0FBQztRQTZDeEI7Ozs7Ozs7OztXQVNHO1FBRUksY0FBUyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRTFEOzs7Ozs7Ozs7V0FTRztRQUVJLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUd4RDs7Ozs7OztXQU9HO1FBRUkscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFFN0U7Ozs7Ozs7V0FPRztRQUVJLDJCQUFzQixHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBRW5GOzs7Ozs7Ozs7V0FTRztRQUVJLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUV6RDs7Ozs7OztXQU9HO1FBRUkseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFFekU7Ozs7Ozs7V0FPRztRQUVJLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRS9FOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFFSSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFFdEU7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUVJLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFFOUQ7Ozs7Ozs7Ozs7V0FVRztRQUVJLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFOUQ7Ozs7Ozs7O1dBUUc7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRWpFOzs7Ozs7Ozs7OztXQVdHO1FBRUksYUFBUSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRXpELHNCQUFzQjtRQUN0Qjs7Ozs7Ozs7V0FRRztRQUVJLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFFakU7Ozs7Ozs7Ozs7O1dBV0c7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRTdEOzs7Ozs7Ozs7Ozs7OztXQWNHO1FBRUksWUFBTyxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRXhEOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRWhFOzs7Ozs7Ozs7Ozs7V0FZRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFFaEU7Ozs7Ozs7OztXQVNHO1FBRUksZUFBVSxHQUFHLElBQUksWUFBWSxFQUFzQixDQUFDO1FBRTNELG1CQUFtQjtRQUNuQjs7V0FFRztRQUVJLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFrQyxDQUFDO1FBRWpGOzs7Ozs7Ozs7V0FTRztRQUVJLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUV2RDs7Ozs7Ozs7O1dBU0c7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE2QyxDQUFDO1FBRW5GOzs7Ozs7Ozs7V0FTRztRQUVJLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUUzRDs7Ozs7Ozs7O1dBU0c7UUFFSSxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRXJFLHNCQUFzQjtRQUN0Qjs7Ozs7Ozs7O1dBU0c7UUFFSSxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFeEQsc0JBQXNCO1FBQ3RCOzs7Ozs7Ozs7V0FTRztRQUVJLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQztRQUUxRDs7Ozs7Ozs7OztXQVVHO1FBRUksY0FBUyxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBRW5FOzs7Ozs7Ozs7O1dBVUc7UUFFSSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFFaEU7Ozs7Ozs7OztXQVNHO1FBRUksa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUVsRTs7Ozs7Ozs7V0FRRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFFbkU7Ozs7Ozs7OztXQVNHO1FBRUksZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQUU1RDs7Ozs7Ozs7O1dBU0c7UUFFSSw2QkFBd0IsR0FBRyxJQUFJLFlBQVksRUFBc0MsQ0FBQztRQUV6Rjs7Ozs7Ozs7O1dBU0c7UUFFSSw0QkFBdUIsR0FBRyxJQUFJLFlBQVksRUFBcUMsQ0FBQztRQUV2Rjs7Ozs7Ozs7O1dBU0c7UUFFSSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQUUzRTs7Ozs7Ozs7O1dBU0c7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRWpFOzs7Ozs7Ozs7V0FTRztRQUVJLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFFdkU7Ozs7Ozs7Ozs7V0FVRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFFL0Q7Ozs7O1dBS0c7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO1FBRWpFOzs7OztXQUtHO1FBRUksZUFBVSxHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRTdEOzs7OztXQUtHO1FBRUksYUFBUSxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBRTFEOztXQUVHO1FBRUksMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQXFCLENBQUM7UUFFckU7Ozs7Ozs7V0FPRztRQUVJLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUUzRDs7Ozs7OztXQU9HO1FBRUksZUFBVSxHQUFHLElBQUksWUFBWSxFQUFvQixDQUFDO1FBRXpEOzs7Ozs7O1dBT0c7UUFFSSxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQW9CLENBQUM7UUFFeEQ7Ozs7Ozs7V0FPRztRQUVJLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE4QixDQUFDO1FBRXpFOzs7Ozs7Ozs7V0FTRztRQUVJLDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUF3QixDQUFDO1FBRzNFOzs7Ozs7Ozs7V0FTRztRQUVJLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBRTFFLHdDQUF3QztRQUV4Qzs7Ozs7V0FLRztRQUVJLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFFOUQsdUZBQXVGO1FBRWhGLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTlDOztXQUVHO1FBRUksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWxEOzs7Ozs7O1dBT0c7UUFFSSxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBRXRFOzs7Ozs7O1dBT0c7UUFFSSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUEyQjdDLDBCQUEwQjtRQUMxQixtQkFBbUI7UUFDbkIsNkJBQTZCO1FBQzdCLDRDQUE0QztRQUM1QyxpQ0FBaUM7UUFDakM7O1dBRUc7UUFFSSxlQUFVLEdBQWtDLElBQUksU0FBUyxFQUFzQixDQUFDO1FBbUx2Rjs7V0FFRztRQUVJLGVBQVUsR0FBbUIsSUFBSSxTQUFTLEVBQU8sQ0FBQztRQTBHekQ7O1dBRUc7UUFFTywwQ0FBcUMsR0FBMkMsSUFBSSxDQUFDO1FBMkIvRjs7V0FFRztRQUVPLDJDQUFzQyxHQUEyQyxJQUFJLENBQUM7UUEyQmhHOztXQUVHO1FBRU8sNkNBQXdDLEdBQXdDLElBQUksQ0FBQztRQTJCL0Y7O1dBRUc7UUFFTyw4Q0FBeUMsR0FBd0MsSUFBSSxDQUFDO1FBMkJoRyx3QkFBd0I7UUFFakIsMENBQXFDLEdBQThDLElBQUksQ0FBQztRQTRCL0Y7OztXQUdHO1FBRUksNkNBQXdDLEdBQThDLElBQUksQ0FBQztRQTJCbEcsd0JBQXdCO1FBRWpCLDhDQUF5QyxHQUE4QyxJQUFJLENBQUM7UUEyQm5HOzs7V0FHRztRQUVJLG9DQUErQixHQUE4QyxJQUFJLENBQUM7UUFvRHpGOztXQUVHO1FBRUksYUFBUSxHQUFHLENBQUMsQ0FBQztRQUVwQjs7V0FFRztRQUVJLGFBQVEsR0FBRyxNQUFNLENBQUM7UUFzRWYsY0FBUyxHQUFHLFVBQVUsQ0FBQztRQStOakM7Ozs7Ozs7V0FPRztRQUVJLHNCQUFpQixHQUEwQixRQUFRLENBQUM7UUFFM0Q7OztXQUdHO1FBQ0ksZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFM0Isd0JBQXdCO1FBQ2pCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUF1M0J4Qjs7V0FFRztRQUNJLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFNdEI7O1dBRUc7UUFDSSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFTbEM7O1dBRUc7UUFDSSx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFZcEM7O1dBRUc7UUFDSSxjQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXJHLHdCQUF3QjtRQUNqQixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFMUMsd0JBQXdCO1FBQ2pCLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFxQixDQUFDO1FBRTNELHdCQUF3QjtRQUNqQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBcUIsQ0FBQztRQUU3RCx3QkFBd0I7UUFDakIsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQWUzQzs7V0FFRztRQUNJLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDMUI7O1dBRUc7UUFDSSxrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCOztXQUVHO1FBQ0ksMkJBQXNCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDOztXQUVHO1FBQ0ksZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDdkI7O1dBRUc7UUFDSSx5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFDaEM7O1dBRUc7UUFDSSx1QkFBa0IsR0FBRyxDQUFDLENBQUM7UUFDOUI7O1dBRUc7UUFDSSx5QkFBb0IsR0FBRyxDQUFDLENBQUM7UUFFaEM7O1VBRUU7UUFDSyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBVXZCOztXQUVHO1FBQ0ksYUFBUSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDckM7O1dBRUc7UUFDTyxnQkFBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFLN0M7O1dBRUc7UUFDTyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDcEM7O1dBRUc7UUFDTyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQzNCOztXQUVHO1FBQ08sYUFBUSxHQUF5QixFQUFFLENBQUM7UUFDOUM7O1dBRUc7UUFDTyxtQkFBYyxHQUF5QixFQUFFLENBQUM7UUFDcEQ7O1dBRUc7UUFDTyxxQkFBZ0IsR0FBeUIsRUFBRSxDQUFDO1FBQ3REOztXQUVHO1FBQ08sOEJBQXlCLEdBQThCLElBQUksd0JBQXdCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBS2xIOztXQUVHO1FBQ08sd0JBQW1CLEdBQThCLEVBQUUsQ0FBQztRQUM5RDs7V0FFRztRQUNPLHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUN0Qzs7V0FFRztRQUNPLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ2hDOztXQUVHO1FBQ08sbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBTXRCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUNoQyxnQkFBVyxHQUFlLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFHakQsK0JBQTBCLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLHFCQUFnQixHQUFzQixJQUFJLEdBQUcsRUFBZ0IsQ0FBQztRQUM5RCx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIseUJBQW9CLEdBQUcsR0FBRyxDQUFDO1FBQzNCLFVBQUssR0FBRyxJQUFJLENBQUM7UUFDYixxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIsMkJBQXNCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUM3Qyx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFHM0Isa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsb0JBQWUsR0FBb0IsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDeEQsb0JBQWUsR0FBdUIsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1FBQzlELHVCQUFrQixHQUFHLEVBQUUsQ0FBQztRQUN4QixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysb0JBQWUsR0FBZ0I7WUFDckMsVUFBVSxFQUFFLEVBQUU7WUFDZCxhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsS0FBSztZQUNqQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBZU0saUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsd0JBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQzNCLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBZXJCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHFCQUFnQixHQUFHLHlCQUF5QixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDcEUsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLDhCQUF5QixHQUFHLElBQUksQ0FBQztRQUNqQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRW5CLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsYUFBUSxHQUFtQixFQUFFLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwRSwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFJL0IsdUNBQWtDLEdBQXFCO1lBQzNELGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLE1BQU07WUFDM0MsbUJBQW1CLEVBQUUsbUJBQW1CLENBQUMsTUFBTTtZQUMvQyxvQkFBb0IsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNO1lBQ2hELGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLE1BQU07U0FDL0MsQ0FBQztRQUVNLHNDQUFpQyxHQUFvQjtZQUN6RCxtQkFBbUIsRUFBRSxLQUFLO1lBQzFCLEtBQUssRUFBRSxLQUFLO1lBQ1osZ0JBQWdCLEVBQUUsSUFBSSw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUM7U0FDOUYsQ0FBQztRQUlNLFlBQU8sR0FBa0IsTUFBTSxDQUFDO1FBQ2hDLFdBQU0sR0FBa0IsTUFBTSxDQUFDO1FBRS9CLHNCQUFpQixHQUE2QyxFQUFFLENBQUM7UUFDakUsMkJBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLFNBQVM7UUFDRCxnQkFBVyxHQUFHLEdBQUcsQ0FBQztRQUNsQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNwQixxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsaUJBQVksR0FBRyxHQUFHLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJdEIscUJBQWdCLEdBQXdCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztRQUNuRSw0QkFBdUIsR0FBK0IsMEJBQTBCLENBQUMsa0JBQWtCLENBQUM7UUFDcEcsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLHNCQUFpQixHQUFHLENBQUMsQ0FBQztRQUN0Qix1QkFBa0IsR0FBc0IsaUJBQWlCLENBQUMsUUFBUSxDQUFDO1FBQ25FLHNCQUFpQixHQUFzQixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDOUQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLHlCQUFvQixHQUFzQixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFLakUsK0JBQTBCLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQztZQUM3RCxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLO1lBQzlDLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLE1BQU07WUFDM0Msb0JBQW9CLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtZQUM5QyxrQkFBa0IsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO1lBQzVDLGNBQWMsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQztRQUVLLG9CQUFlLEdBQW9CO1lBQ3ZDLGNBQWMsRUFBRSxJQUFJLHNCQUFzQixFQUFFO1lBQzVDLEtBQUssRUFBRSxLQUFLO1lBQ1osbUJBQW1CLEVBQUUsS0FBSztZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtZQUMvQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsMEJBQTBCO1NBQ3BELENBQUM7UUFFTSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3pDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDVCxzQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsdUJBQWtCLEdBQXVCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUN4RSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLDRCQUF1QixHQUE4QyxJQUFJLENBQUM7UUFDMUUscUNBQWdDLEdBQThDLElBQUksQ0FBQztRQUNuRixzQ0FBaUMsR0FBOEMsSUFBSSxDQUFDO1FBQ3BGLGNBQVMsR0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLHNCQUFpQixHQUFHLEVBQUUsQ0FBQztRQWlsQy9COztXQUVHO1FBQ0ksNkJBQXdCLEdBQUcsS0FBSyxDQUFDO1FBODhDeEM7O1dBRUc7UUFDSSwyQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3BDLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDN0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDTCxDQUFDLENBQUM7UUF4M0VFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sb0NBQXVCLENBQUM7UUFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQzFELElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRztJQUVJLGVBQWU7UUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxJQUFJO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsSUFBSTtRQUN2QixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsTUFBVztRQUM1QixPQUFPLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO0lBQzVDLENBQUM7SUFDRDs7T0FFRztJQUNJLGNBQWMsQ0FBQyxNQUFXO1FBQzdCLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNO1FBQ3BDLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEMsUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNDLFFBQVEsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7UUFDckQsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILElBQVcsbUJBQW1CO1FBQzFCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQztJQUM5QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWTtRQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRTlELElBQUksT0FBTyxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNsRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLFFBQWdCO1FBQzdDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUM3RixDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUIsQ0FBQyxRQUFnQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQztZQUN4RyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsMkJBQTJCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxHQUFHO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7OztPQUlHO0lBQ0kscUJBQXFCLENBQUMsR0FBRztRQUM1QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsa0JBQWtCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLElBQVcsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxJQUFXLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsSUFBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLElBQVcsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZTtRQUNsQixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDdkgsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTtnQkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVTtnQkFDNUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQzt1QkFDbkQsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt1QkFDdkYsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5RyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDOUYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQzVELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxHQUFHLEVBQWlCLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFDekIsWUFBWSxDQUFDLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQzVFLFVBQVUsQ0FDYjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2YsZ0RBQWdEO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ25DLHlEQUF5RDt3QkFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO3dCQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7d0JBQzNGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNoQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO3dCQUMxQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0IsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdELElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUErQyxDQUFDO2dCQUNwRixJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNYLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBVyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUM7WUFFL0UsdURBQXVEO1lBQ3ZELElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUErQyxDQUFDO2dCQUNwRixJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNYLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7b0JBQ3JELFFBQVEsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDOUMsQ0FBQztnQkFDRCxPQUFPO1lBQ1gsQ0FBQztZQUVELG9EQUFvRDtZQUNwRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqRCxPQUFPO1lBQ1gsQ0FBQztZQUVELElBQUksZUFBZSxFQUFFLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2RixJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDO2dCQUN4QyxPQUFPO1lBQ1gsQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkcsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZUFBZTtnQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQ2xFLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQ3RGLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQy9HLG1FQUFtRTtZQUNuRSxxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBR0gsSUFBSSxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEcsMENBQTBDO1lBQzFDLGlEQUFpRDtZQUNqRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN4SCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQzVCLFlBQVksQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUM1RSxVQUFVLENBQ2I7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLFFBQVE7UUFDWCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELDZDQUE2QztRQUM3QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQWUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksa0JBQWtCO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNoQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9FLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQzdHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlO1FBQ2xCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQzVDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDaEQsQ0FBQztZQUNELFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQWU7UUFDeEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksRUFBRSxDQUFDO1lBQzFELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDO1FBQzdGLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLHNCQUFzQjtRQUN6QixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGlCQUFpQjtRQUNwQixJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLGtCQUFrQixHQUFHLElBQUk7UUFDeEMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQjtRQUNyQixJQUFJLElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUM7UUFDdkUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLCtCQUErQixHQUFHLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQztRQUN6RixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMseUNBQXlDLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLHlDQUF5QyxDQUFDO1FBQzNGLENBQUM7UUFFRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN6SCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDNUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5RCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLEtBQWtDO1FBQ25ELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLEtBQUs7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsd0JBQXdCO0lBQ2pCLG9CQUFvQixDQUFDLE1BQWtCLEVBQUUsT0FBd0I7UUFDcEUsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLDRCQUE0QixDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUMxRCxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xHLE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELHdCQUF3QjtJQUNqQixjQUFjO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZGLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1lBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDMUYsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ1gsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsTUFBZTtRQUM5QyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNULElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUksSUFBSSxDQUFDLHlCQUF5QixFQUFFLEdBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztvQkFDNUgsQ0FBQyxHQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxHQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQztZQUM1QyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLDZCQUE2QjtRQUNoQyxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQThDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzSCxJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDckIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztTQUM3RSxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBOEMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFpQixFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEgsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RSxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzFELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzdELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNHLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN0RyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7b0JBQzVFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUNqQyxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFDRCxvSEFBb0g7WUFDcEgsaUdBQWlHO1lBQ2pHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkgsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakksQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRTVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNoRSxTQUFTLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUU3RSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU87YUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLENBQUMsTUFBc0MsRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztRQUVQLElBQUksQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDekQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO2dCQUNsRyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDN0QsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUUzRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsT0FBTyxHQUFHLEtBQUs7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDWixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNiLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLDBCQUEwQjtRQUU3QixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNuQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFFdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM3RCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQztRQUM1QyxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFOUQsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUdILElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDL0YsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixDQUFDO1lBQ2pFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLHNCQUFzQixDQUFDLElBQXVDO1FBQ2pFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFbkYsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsT0FBTztRQUNYLENBQUM7UUFDRCxHQUFHLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxvQkFBb0I7SUFDcEI7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxJQUNXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFXLGVBQWUsQ0FBQyxLQUFLO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBZSxLQUFLLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksU0FBUztRQUNaLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFdBQVc7UUFDZCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWdCLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxTQUFTLENBQUMsS0FBVTtRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLFdBQVcsQ0FBQyxLQUFVO1FBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFHRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksU0FBUyxDQUFDLEtBQVU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsQ0FBQyxJQUFTO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBVyxhQUFhO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDVyxNQUFNO1FBQ2IsT0FBTyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQVcsTUFBTSxDQUFDLEdBQThCO1FBQzVDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7SUFDcEMsQ0FBQztJQUdEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGdCQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLG9CQUFvQjtRQUMzQixRQUFRLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixLQUFLLElBQUksQ0FBQyxNQUFNO2dCQUNaLE9BQU8sRUFBRSxDQUFDO1lBQ2QsS0FBSyxJQUFJLENBQUMsS0FBSztnQkFDWCxPQUFPLEVBQUUsQ0FBQztZQUNkO2dCQUNJLE9BQU8sRUFBRSxDQUFDO1FBQ2xCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBVywwQkFBMEI7UUFDakMsUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsTUFBTTtnQkFDWixPQUFPLEVBQUUsQ0FBQztZQUNkLEtBQUssSUFBSSxDQUFDLEtBQUs7Z0JBQ1gsT0FBTyxFQUFFLENBQUM7WUFDZDtnQkFDSSxPQUFPLEVBQUUsQ0FBQztRQUNsQixDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLFdBQVc7UUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsYUFBYTtRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQU9EOzs7T0FHRztJQUNJLGtCQUFrQixDQUFDLE9BQW9CO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQ3ZELE9BQU8sRUFDUCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFM0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUM1RixVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFN0MseUhBQXlIO1FBQ3pILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNoSCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNJLG1CQUFtQixDQUFDLFFBQXFCO1FBQzVDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1lBQzFDLHFDQUFxQztZQUNyQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUM7Z0JBQ3RGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFDckcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQztnQkFDbkYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sYUFBYSxHQUFHLFFBQVEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoSSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxHQUFHLFdBQVcsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQzVGLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFXLGFBQWE7UUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCOzs7Ozs7O09BT0c7SUFDSCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBVyxlQUFlO1FBQ3RCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0UsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CLENBQUMsTUFBMEI7UUFDakQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hCLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksZUFBZSxDQUFDLElBQVk7UUFDL0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU0sdUJBQXVCLENBQUMsS0FBYTtRQUN4QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDcEMsQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVk7WUFDckMsR0FBRyxDQUFDLFlBQVksS0FBSyxLQUFLLENBQzdCLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLG9CQUFvQjtRQUN2QiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsY0FBYztRQUNyQixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxJQUNXLFlBQVk7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQ2xHLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFhO1FBQ2pDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUN4QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0wsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLFVBQVU7UUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDNUIsQ0FBQztRQUNELDhCQUE4QjtRQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9FLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDVixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLFVBQVUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGdCQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3BGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGFBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsYUFBYTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQy9FLENBQUM7SUFFRDs7O09BR0c7SUFDTyxpQkFBaUIsQ0FBQyxLQUFhO1FBQ3JDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNGLFFBQVEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ2hELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVELFFBQVEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDO1FBQ3hFLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sWUFBWSxDQUFDLGFBQXFCO1FBQ3hDLElBQUksUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JELFFBQVEsR0FBRyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDO1FBQ2hGLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFVBQVUsQ0FBQyxNQUEwQixFQUFFLE1BQTBCLEVBQUUsTUFBb0IsWUFBWSxDQUFDLGVBQWU7UUFDdEgsc0RBQXNEO1FBQ3RELE1BQU0sU0FBUyxHQUE4QixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUV2RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksTUFBTSxLQUFLLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNwRCxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELDZCQUE2QjtRQUM3Qix1RUFBdUU7UUFDdkUseUZBQXlGO1FBQ3pGLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RCxNQUFNLEtBQUssR0FBRyxHQUFHLEtBQUssWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVELE1BQU0sS0FBSyxHQUFHLEdBQUcsS0FBSyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDdkYsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLHNFQUFzRTtRQUN0RSxJQUFJO1FBRUosb0VBQW9FO1FBQ3BFLHdFQUF3RTtRQUN4RSxJQUFJO1FBRUosSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDSSxZQUFZO1FBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGdCQUFnQjtJQUNoQjs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxJQUFTO1FBQ25CLDhDQUE4QztRQUM5QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6SSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELHNCQUFzQjtJQUN0Qjs7Ozs7Ozs7Ozs7T0FXRztJQUNJLFNBQVMsQ0FBQyxXQUFnQjtRQUM3QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDNUQsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDTCxDQUFDO0lBRUQsY0FBYztJQUNQLGFBQWEsQ0FBQyxLQUFVO1FBQzNCLE1BQU0sSUFBSSxHQUFnQztZQUN0QyxLQUFLLEVBQUUsS0FBSztZQUNaLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLE1BQU0sRUFBRSxLQUFLO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQy9CLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsS0FBSztZQUNmLE1BQU0sRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQyxNQUFNLG1CQUFtQixHQUFzQjtnQkFDM0MsSUFBSSxFQUFFLE1BQU07Z0JBQ1osT0FBTyxFQUFFLE1BQU07Z0JBQ2YsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDbEMsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxzQkFBc0I7SUFDdEI7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksVUFBVSxDQUFDLEtBQVUsRUFBRSxXQUFnQixFQUFFLE1BQWM7UUFDMUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQztZQUN4RCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNOLFdBQVc7Z0JBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzlELDJCQUEyQjtnQkFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ1osT0FBTztnQkFDWCxDQUFDO2dCQUVELE1BQU0sRUFBRSxHQUFHO29CQUNQLEtBQUssRUFBRSxXQUFXO29CQUNsQixRQUFRLEVBQUUsR0FBRyxDQUFDLEtBQUs7b0JBQ25CLFFBQVEsRUFBRSxLQUFLO2lCQUNsQixDQUFDO2dCQUVGLE1BQU0sSUFBSSxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFXLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckYsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILGlDQUFpQztJQUMxQixTQUFTLENBQUMsS0FBVSxFQUFFLFdBQWdCO1FBQ3pDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUMzQyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQyxDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQVcsQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVwQyxtREFBbUQ7WUFDbkQsb0VBQW9FO1lBQ3BFLGtGQUFrRjtZQUNsRiwrRUFBK0U7WUFDL0Usd0NBQXdDO1lBQ3hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxVQUFVLENBQUMsV0FBZ0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQixPQUFPLFdBQVcsQ0FBQztRQUN2QixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLElBQUksQ0FBQyxVQUEwRDtRQUNsRSxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFekQsSUFBSSxVQUFVLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQzFCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7d0JBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM5QixDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQXNCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ3RHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTdCLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxVQUFVLFlBQVksS0FBSyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLE1BQU0sQ0FBQyxJQUFZLEVBQUUsS0FBVSxFQUFFLHlCQUEyRSxFQUMvRyxVQUFvQjtRQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUseUJBQXlCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxZQUFZLENBQUMsS0FBVSxFQUFFLFNBQVMsRUFBRSxVQUFXO1FBQ2xELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0ksZUFBZSxDQUFDLEdBQUcsSUFBSTtRQUMxQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLGdCQUFnQixDQUFDLEdBQUcsSUFBSTtRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxXQUFXLENBQUMsSUFBYTtRQUM1QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksU0FBUyxDQUFDLElBQWE7UUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztZQUM3QixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekMsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxLQUFNO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCwrREFBK0Q7SUFFL0Q7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxTQUFTLENBQUMsVUFBdUMsRUFBRSxLQUFjO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLFVBQVUsWUFBWSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JHLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksV0FBVyxDQUFDLFVBQXVDLEVBQUUsS0FBYztRQUN0RSxNQUFNLEdBQUcsR0FBRyxVQUFVLFlBQVksa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQjs7Ozs7Ozs7Ozs7T0FXRztJQUNJLE1BQU0sQ0FBQyxLQUFVLEVBQUUsS0FBYyxFQUFFLEdBQWE7UUFDbkQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFaEMsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoQyxNQUFNLFdBQVcsR0FBRyxPQUFPLFNBQVMsQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1FBQ3pILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEI7Ozs7Ozs7Ozs7T0FVRztJQUNJLFFBQVEsQ0FBQyxLQUFVLEVBQUUsR0FBYTtRQUNyQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVoQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFXLGVBQWU7UUFDdEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0YsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNO1FBQ1QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFFBQVEsQ0FBQyxJQUFZLEVBQUUsYUFBdUIsRUFBRSxVQUFvQjtRQUN2RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFFBQVEsQ0FBQyxJQUFZLEVBQUUsYUFBdUIsRUFBRSxVQUFvQjtRQUN2RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGFBQWEsQ0FBQyxnQkFBMEIsRUFBRSxPQUFPLEdBQUcsSUFBSTtRQUMzRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFekIsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNyRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU07d0JBQ2xDLEtBQUssQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEdBQUc7d0JBQzVCLEtBQUssQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLEtBQUs7d0JBQ2hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztvQkFDOUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQzVDLENBQUMsRUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFDbEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQy9CLEtBQUssRUFDTCxPQUFPLENBQUMsQ0FBQztRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksV0FBVztRQUNkLElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDbkIsVUFBVSxFQUFFLEVBQUU7WUFDZCxhQUFhLEVBQUUsS0FBSztZQUNwQixVQUFVLEVBQUUsS0FBSztZQUNqQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsT0FBTyxFQUFFLEVBQUU7U0FDZCxDQUFDO1FBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN6QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWixHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQXVCLEVBQUUsRUFBRTtvQkFDMUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxrQkFBa0I7UUFDekIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxvQkFBb0I7UUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckYsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsb0JBQW9CO1FBQzNCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixLQUFLLDBCQUEwQixDQUFDLGVBQWUsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGlCQUFpQjtRQUN4QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsaUJBQWlCLENBQUMsS0FBSztRQUM5QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxpQkFBaUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFHRDs7T0FFRztJQUNILElBQVcscUJBQXFCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWMsY0FBYztRQUN4QixPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFjLGNBQWM7UUFDeEIsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZUFBZTtRQUN0QixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyx1QkFBdUI7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQVcsaUJBQWlCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxVQUFVO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7O09BR0c7SUFDSSx1QkFBdUI7UUFDMUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztRQUM5RixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDcEQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7T0FFRztJQUNJLHNCQUFzQixDQUFDLFlBQW9CLElBQUk7UUFDbEQsSUFBSSxhQUFhLENBQUM7UUFDbEIsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDckIsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNKLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUztnQkFDMUIsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRyxDQUFDO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRzVFLHlCQUF5QjtRQUN6QixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEUsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNqRyxNQUFNLGtCQUFrQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRixZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRSxFQUFFO1FBRUYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNoRCxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLGFBQWEsQ0FBQyxDQUFDO1FBRW5GLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3pDLGtCQUFrQixHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xELG1CQUFtQixDQUFDLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7UUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxvQkFBb0I7YUFDekMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDNUIsSUFBSSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN4QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNwQixVQUFVLEdBQUcsb0JBQW9CLENBQUM7WUFDdEMsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixVQUFVLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUNsQyxVQUFVLENBQUM7WUFDZixPQUFPLElBQUksR0FBRyxTQUFTLENBQUM7UUFDNUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRVYsZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxhQUFhLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBRXhGLE9BQU8sV0FBVyxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4RyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUM7SUFDM0YsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksY0FBYyxDQUFDLFVBQVUsR0FBRyxLQUFLO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNqRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDWixLQUFLLE1BQU0sR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25CLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEIsR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixHQUFHLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLFVBQWtCO1FBQ3JDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsQ0FBQyxLQUFLO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLHlCQUF5QjtRQUNoQyxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO1FBQ3ZHLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNyRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyx5QkFBeUI7UUFDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELENBQUM7UUFFRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxjQUFjO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUN0RyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBRUgsSUFDVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQVcsZ0JBQWdCLENBQUMsT0FBZ0I7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksVUFBVSxDQUFDLE1BQWEsRUFBRSxxQkFBK0I7UUFDNUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxZQUFZLENBQUMsTUFBYTtRQUM3QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxhQUFhLENBQUMsY0FBYyxHQUFHLElBQUk7UUFDdEMsTUFBTSxJQUFJLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0csSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxlQUFlLENBQUMsY0FBYyxHQUFHLElBQUk7UUFDeEMsSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLEtBQW9DO1FBQ2xELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRTVCLFVBQVUsQ0FBQyxVQUFVLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN2RCxRQUFRLENBQUMsU0FBUyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLEdBQVE7UUFDckIsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLEdBQWlFO1FBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLEdBQUcsWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUN2QixHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNJLG9CQUFvQixDQUFDLEtBQXNCO1FBQzlDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDM0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM1QixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksWUFBWSxDQUFDLEtBQXlCO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUNoRyxNQUFNLE9BQU8sR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFFMUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLGVBQWUsQ0FBQyxVQUFVLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGVBQWU7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUQsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxhQUFhLENBQUMsT0FBZ0MsRUFBRSxxQkFBK0I7UUFDbEYsSUFBSSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDekQsYUFBYSxHQUFHLE9BQW1CLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDSCxPQUF3QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMvRSxhQUFhLEdBQUcsQ0FBQyxHQUFHLGFBQWEsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsYUFBYSxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGVBQWUsQ0FBQyxPQUFnQztRQUNuRCxJQUFJLGVBQWUsR0FBYSxFQUFFLENBQUM7UUFDbkMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN6RCxlQUFlLEdBQUcsT0FBbUIsQ0FBQztRQUMxQyxDQUFDO2FBQU0sQ0FBQztZQUNILE9BQXdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQy9FLGVBQWUsR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7Z0JBQ3hELENBQUM7cUJBQU0sQ0FBQztvQkFDSixlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZ0JBQWdCO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksc0JBQXNCLENBQUMsVUFBVSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSztRQUM3RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM3RSxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFHRCx5QkFBeUI7SUFDbEIsZ0NBQWdDLENBQUMsVUFBaUIsRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQzFGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBZ0JEOzs7T0FHRztJQUNJLFdBQVcsQ0FBQyxLQUFLO1FBQ3BCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRixJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztZQUNwRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hILElBQUksWUFBWSxDQUFDO1FBQ2pCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqSCxDQUFDO1FBRUQsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztZQUMzSCxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMxQixNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLEdBQUcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUN6RixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3ZDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxHQUFHLFVBQVUsQ0FBQztnQkFDbEIsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFFRCxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQzthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkcsT0FBTztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDdkMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxHQUFHLFlBQVksQ0FBQztnQkFDcEIsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUs7UUFDckMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBeUIsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6RixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUU5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdkI7O1VBRUU7UUFDRixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZSxDQUFDLEtBQWE7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUM7UUFDOUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxzQkFBc0I7SUFDdEI7Ozs7Ozs7Ozs7T0FVRztJQUNJLFVBQVUsQ0FBQyxRQUFnQixFQUFFLGVBQWUsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUEwQixJQUFJO1FBQ3BGLE1BQU0sVUFBVSxHQUFJLElBQVksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsVUFBVSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsQ0FBQztlQUM3RCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pGLE9BQU87UUFDWCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDaEcsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFDRCx5REFBeUQ7UUFDekQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFHLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFO2dCQUN4RSxJQUFJLHdCQUF3QixFQUFFLENBQUM7b0JBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUNoRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLElBQUksd0JBQXdCLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLDZCQUE2QixDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7Z0JBQ2hFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEQsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBc0I7SUFDdEI7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxXQUFXLENBQUMsWUFBb0IsRUFBRSxrQkFBMEIsRUFDL0QsV0FBNEMsSUFBSTtRQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLENBQUM7UUFDOUUsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdILE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztRQUMzRSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxhQUFhLEdBQUcsQ0FBQyxDQUFDO2FBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM1SCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsQ0FBQztRQUN6RSxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUN4RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztZQUM5RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksZUFBZSxDQUFDLFlBQW9CLEVBQUUsa0JBQTBCLEVBQ25FLFdBQTRDLElBQUk7UUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztZQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQzlFLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3SCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxHQUFHLENBQUMsQ0FBQzthQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDNUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDekUsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9ELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQzlFLENBQUM7aUJBQU0sQ0FBQztnQkFDSixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLEtBQWE7UUFDakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXpELElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztRQUMzRCxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxHQUFHO1FBQ2hDLE9BQU8sR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWUsQ0FBQyxNQUFzQjtRQUN6QyxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksY0FBYyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSwrQkFBK0IsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxzQkFBc0I7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLDBCQUEwQixDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksdUJBQXVCLENBQUMsSUFBSTtRQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0RCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUM5QixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksMkJBQTJCLENBQUMsR0FBWTtRQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDcEUsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDTixRQUFRLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixRQUFRLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLElBQWdDO1FBQ3BELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQy9FLE1BQU0sVUFBVSxHQUFHLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbEgsSUFBSSxHQUFHLElBQUksR0FBRyxZQUFZLGVBQWUsRUFBRSxDQUFDO29CQUN4QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hDLENBQUM7cUJBQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksMkJBQTJCLENBQUMsZUFBaUM7UUFDaEUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQztRQUM1RixJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLE1BQU07Z0JBQ3hDLElBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUU1RCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQ3pELG1DQUFtQyxFQUNuQyxJQUFJLENBQUMsT0FBTyxFQUNaLFFBQVEsQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksNEJBQTRCLENBQUMsWUFBcUI7UUFDckQsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUNuQyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3RHLE1BQU0sdUJBQXVCLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxDQUFDLFFBQStDLENBQUM7WUFFdEgsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDZix1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLHVCQUF1QixDQUFDLEtBQWM7UUFDekMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUN0RCxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDMUIsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZLENBQUMsT0FBTztRQUN2QixPQUFPLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksc0JBQXNCLENBQUMsS0FBaUI7UUFDM0MsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0JBQW9CLENBQUMsRUFBRTtRQUMxQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILDJEQUEyRDtJQUMzRCxpR0FBaUc7SUFDakcsc0JBQXNCO0lBQ2YsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsS0FBYTtRQUN2QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0ksZUFBZSxDQUFDLEtBQVUsRUFBRSxPQUFpQjtRQUNoRCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDaEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDVixPQUFPLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7Z0JBQ2hGLE9BQU87WUFDWCxDQUFDO1lBQ0QsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLDRDQUE0QztZQUM1QyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPO1lBQ1gsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRVMsZUFBZSxDQUFDLEtBQWEsRUFBRSxPQUFpQjtRQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLE9BQU87UUFDWCxDQUFDO1FBQ0QsNkVBQTZFO1FBQzdFLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3Qyx5Q0FBeUM7WUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVTtnQkFDNUMsS0FBSyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztnQkFDbEYsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVM7cUJBQ2pDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3FCQUN2QyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU87WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM3QyxDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkVBQTZFLENBQUMsQ0FBQztRQUNoRyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQjs7Ozs7Ozs7OztPQVVHO0lBQ0ksa0JBQWtCLENBQUMsS0FBYTtRQUNuQyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUIsQ0FBQyxJQUFJO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFVBQWtCLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0wsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEtBQWEsRUFBRSxPQUFPLEdBQUcsS0FBSztRQUN4RCx3REFBd0Q7UUFDeEQsTUFBTSxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDO1FBQ3JELElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0wsQ0FBQztJQUVTLHdCQUF3QixDQUFDLEdBQVk7UUFDM0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNOLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sb0NBQXVCLENBQUM7UUFDL0UsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLG9DQUF1QixDQUFDO1FBQy9FLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUM5RCxDQUFDO0lBQ0wsQ0FBQztJQUVTLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2FBQ3pGLFNBQVMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVTLHVCQUF1QixDQUFDLEtBQXVCO1FBQ3JELElBQUksT0FBTyxHQUEwQixFQUFFLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVHLENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssc0JBQXNCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEQsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekcsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUM3RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzNFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ25FLENBQUM7cUJBQU0sSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDckcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3QkFDUixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNwRCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDNUMsQ0FBQztnQkFDTCxDQUFDO1lBRUwsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVTLFdBQVcsQ0FBQyxRQUFnQixFQUFFLEtBQVU7UUFDOUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVTLGlCQUFpQixDQUFDLEdBQUc7UUFDM0IsNkRBQTZEO1FBQzdELGdEQUFnRDtRQUNoRCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDcEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFUyxvQ0FBb0MsQ0FBQyxHQUFZO1FBQ3ZELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuRixPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNPLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLGdDQUFnQztZQUNoQyxNQUFNLGVBQWUsR0FBb0I7Z0JBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDMUIsbUJBQW1CLEVBQUUsS0FBSztnQkFDMUIsZ0JBQWdCLEVBQUUsSUFBSSx5QkFBeUIsRUFBRTthQUNwRCxDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sa0JBQWtCO1FBQ3hCLElBQUksS0FBSyxDQUFDO1FBRVYsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsZUFBZTtZQUNmLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxRyxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDSixLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxDQUFDO1FBR0QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNyQyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xELEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3pHLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEgsTUFBTSxDQUFDLFlBQVksR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7WUFDckQsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLHdGQUF3RjtnQkFDeEYsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVELE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sd0JBQXdCLENBQUMsTUFBMEI7UUFDekQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUM5QixJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQ3hGLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7UUFDeEYsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBRUQsZ0VBQWdFO1FBQ2hFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNsQixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVTLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCx3QkFBd0I7SUFDakIsYUFBYTtRQUNoQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxZQUFZLENBQUMsSUFBd0IsRUFBRSxFQUFzQixFQUFFLEdBQWlCO1FBQ3RGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFHRDs7O09BR0c7SUFDSSxhQUFhLENBQUMsVUFBZ0M7UUFDakQsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVTthQUMzQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNPLGdCQUFnQixDQUFDLElBQUs7UUFDNUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1IsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxlQUFlLENBQUMsSUFBd0IsRUFBRSxFQUFzQixFQUFFLFFBQXNCLEVBQUUsZ0JBQXVCLEVBQ3ZILE9BQU8sR0FBRyxLQUFLO1FBQ2YsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNwRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksUUFBUSxLQUFLLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QyxTQUFTLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM3QixTQUFTLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFDRCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGlCQUFpQixDQUFDLE1BQTBCLEVBQUUsSUFBd0IsRUFBRSxFQUFzQixFQUFFLEdBQWlCO1FBQ3ZILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTzthQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUM5QixTQUFTLENBQUMsQ0FBQyxNQUFxQyxFQUFFLEVBQUU7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVTLGFBQWE7UUFDbkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNPLGlCQUFpQixDQUFDLEtBQVUsRUFBRSxLQUFhO1FBQ2pELDZDQUE2QztRQUM3Qyx3RUFBd0U7UUFDeEUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxXQUFXLEdBQWdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDekQsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLEtBQUssR0FBVSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakgsQ0FBQztJQUNMLENBQUM7SUFHRDs7T0FFRztJQUNPLHNCQUFzQjtRQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ08sbUJBQW1CLENBQUMsTUFBc0M7UUFDaEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLGdCQUFnQixDQUFDLE1BQXFDO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hGLHlGQUF5RjtZQUN6RixnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM1QyxPQUFPO1FBQ1gsQ0FBQztRQUNELElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFnRCxFQUFFLEVBQUU7Z0JBQ3ZFLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBMEUsRUFBRSxFQUFFO2dCQUNuRyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxZQUFZLHVCQUF1QixDQUFDO2dCQUNyRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2pCLGlCQUFpQjtvQkFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFOUMsa0JBQWtCO29CQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXRELG1CQUFtQjtvQkFDbkIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCOzJCQUNyQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYzsyQkFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDdEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDOUIsQ0FBQztvQkFFRCxnQkFBZ0I7b0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRTNDLDBCQUEwQjtvQkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxDQUFDO2dCQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkIsSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ25DLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN4QixnSEFBZ0g7WUFDaEgsaUhBQWlIO1lBQ2pILElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxrQkFBa0IsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJO1FBQ2xEOzs7Ozs7O1VBT0U7UUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3pCLDJEQUEyRDtRQUMzRCxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztRQUVELHNFQUFzRTtRQUN0RSxJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDZixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO29CQUNmLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNsQyxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9HLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUMsV0FBVyxDQUFDO1lBQ3pGLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3JILElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsR0FBRyxPQUFPLEtBQUssQ0FBQztRQUNsRSxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVEOztPQUVHO0lBQ08saUJBQWlCLENBQUMsSUFBSTtRQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0gsQ0FBQztJQUNEOztPQUVHO0lBQ08sZUFBZTtRQUNyQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRixDQUFDO0lBQ0Q7O09BRUc7SUFDTyxpQkFBaUI7UUFDdkIseUZBQXlGO1FBQ3pGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEcsTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ08sZ0JBQWdCO1FBQ3RCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckIsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ08scUJBQXFCO1FBQzNCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2pFLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sbUJBQW1CO1FBQ3pCLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDOUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkYsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7T0FFRztJQUNPLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDbEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakUsTUFBTSxjQUFjLEdBQUcsYUFBYSxHQUFHLGNBQWM7WUFDakQsWUFBWSxHQUFHLFlBQVksR0FBRyxlQUFlO1lBQzdDLFNBQVMsQ0FBQztRQUVkLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUVuQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0csTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUNqRCxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlDLENBQUM7WUFDRCxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7YUFBTSxDQUFDO1lBQ0osVUFBVSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQztRQUVyRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztZQUNoRCxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsd0JBQXdCO1FBQzlCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxJQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3pHLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDdEMsT0FBTyxVQUFVLEtBQUssTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFUyxlQUFlLENBQUMsY0FBYztRQUNwQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNoRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsSUFBSyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBVSxDQUFDLElBQUksQ0FBQztRQUN6RyxJQUFJLEdBQUcsR0FBRyxDQUFDLGFBQWE7WUFDcEIsYUFBYSxDQUFDLFlBQVksS0FBSyxDQUFDO1lBQ2hDLGFBQWEsQ0FBQyxZQUFZLEtBQUssY0FBYyxDQUFDO1FBQ2xELElBQUksYUFBYSxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzNDLHFGQUFxRjtZQUNyRiwySEFBMkg7WUFDM0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsR0FBRyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1QyxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sZ0JBQWdCLENBQUMsVUFBVSxHQUFHLEtBQUs7UUFDekMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkQsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUVELE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ08sVUFBVSxDQUFDLFNBQWlCLEVBQUUsVUFBbUIsRUFBRSxjQUFvQjtRQUM3RSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUMvQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO29CQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzVDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUM7WUFDdEMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxrQkFBa0IsQ0FBQyxXQUFpQyxFQUFFLFVBQW1CO1FBQy9FLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRDs7T0FFRztJQUNPLHlCQUF5QixDQUFDLFdBQVc7UUFDM0MsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzNCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxHQUFHO1FBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDckMsQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFDdEMsQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUN4RCxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNuQyxDQUFDO2FBQU0sSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3JGLE9BQU8sa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxtQkFBbUI7UUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBRW5CLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUMzSCxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDM0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzlELEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUM7UUFFbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVTLGtCQUFrQixDQUFDLElBQVc7UUFDcEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFDLFVBQWdDLEVBQUUsS0FBMEIsSUFBSTtRQUNsRixJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4Qiw4QkFBOEI7WUFDOUIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDbkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM3QixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN6RixDQUFDLENBQUM7b0JBQ04sSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUNwRixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2hELHNEQUFzRDtZQUN0RCx1QkFBdUI7WUFDdkIsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xHLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBMEIsRUFBRSxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFckgsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDTCxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRS9CLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDeEIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQTBCLEVBQUUsRUFBRTtnQkFDOUMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sZUFBZTtRQUNyQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRO2FBQzlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7aUJBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFUyx3QkFBd0IsQ0FBQyxNQUFhLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFFLFVBQWtCO1FBQ3JHLElBQUksWUFBa0MsQ0FBQztRQUN2QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQztRQUVyRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7WUFDL0IsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7WUFDL0IsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDUixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3RFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDakMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzt3QkFDbkUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO3dCQUN2QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFOzRCQUNoQyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDM0IsUUFBUSxFQUFFLENBQUM7NEJBQ2YsQ0FBQzt3QkFDTCxDQUFDLENBQUMsQ0FBQzt3QkFDSCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDMUQsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNqQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQzlCLElBQUksUUFBUSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDN0IsUUFBUSxFQUFFLENBQUM7d0JBQ2YsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDSCxRQUFRLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQztnQkFDN0IsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUksSUFBWSxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNqRSxJQUFJLFlBQVksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxZQUFZLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDdkQsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRixDQUFDO2FBQU0sQ0FBQztZQUNKLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM5RCxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsRUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssaUJBQWlCLENBQUMsSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzVELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixZQUFZLEdBQUcsVUFBVSxDQUFDO1FBQzlCLENBQUM7UUFFRCx3Q0FBd0M7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2xDLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxjQUFjLENBQUMsS0FBSyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNsSixHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEQsU0FBUztZQUNiLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzdCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2pELFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtvQkFDekIsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDTixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDbkYsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM5RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDOzRCQUMxRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO3dCQUNsRixJQUFJLFVBQVUsRUFBRSxDQUFDOzRCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOzRCQUNyQixDQUFDOzRCQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDcEUsQ0FBQztvQkFDTCxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxVQUFVLEVBQUUsQ0FBQztvQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO3dCQUNmLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxDQUFDO29CQUNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7d0JBQ2hELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ25CLENBQUM7d0JBQ0QsSUFBSSxDQUFDLEdBQVEsS0FBSyxDQUFDO3dCQUNuQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzVDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDakUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztvQkFDeEMsQ0FBQztnQkFDTCxDQUFDO3FCQUFNLENBQUM7b0JBQ0osWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0IsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixPQUFPLFdBQVcsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7SUFDTCxDQUFDO0lBRVMsc0JBQXNCLENBQUMsS0FBSztRQUNsQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWM7aUJBQzNDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7aUJBQy9CLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JELE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekQsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYztpQkFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO2lCQUMvQixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNyRCxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFUyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0I7WUFBRSxPQUFPO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQzFDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4SyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFzQyxDQUFDLENBQUM7UUFDeEYsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO2dCQUM5QixJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO2dCQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUM7Z0JBQzVDLGtFQUFrRTtnQkFDbEUsbUVBQW1FO2dCQUNuRSxxREFBcUQ7Z0JBQ3JELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDckYsd0JBQXdCLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN0RyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osV0FBVyxHQUFHLEdBQUcsQ0FBQztnQkFDdEIsQ0FBQztnQkFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksd0JBQXdCLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztvQkFDbEYseURBQXlEO29CQUN6RCxTQUFTO2dCQUNiLENBQUM7Z0JBQ0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzNDLE9BQU8sR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUM3QixDQUFDO3FCQUFNLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQzdCLENBQUM7Z0JBQ0QsR0FBRyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbEIsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRVMsK0JBQStCLENBQUMsTUFBYSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDeEYsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN4QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDL0MsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUVELEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7WUFDeEIsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUM1QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztnQkFDMUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDO29CQUM1RSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVztRQUNqQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNPLFFBQVEsQ0FBQyxHQUFpQixFQUFFLE1BQW9CLEVBQUUsWUFBWSxHQUFHLElBQUksQ0FBQywyQkFBMkI7UUFDdkcsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTNCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDOUMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFakQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNPLG9CQUFvQixDQUFDLE1BQW9CO1FBQy9DLElBQUksV0FBVyxHQUFHLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUNsRyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyRCxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMzQyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxlQUFlLENBQUMsU0FBNEMsRUFBRSxJQUFZO1FBQ2hGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNiLE9BQU87UUFDWCxDQUFDO1FBQ0QsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBR0Q7O09BRUc7SUFDTyxpQkFBaUI7UUFDdkIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQ3pGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDekIsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsTUFBMEI7UUFDaEQsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxLQUFZO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDckMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BELENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLHNCQUFzQjtRQUMxQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3hCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2pCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsS0FBSyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFUyxxQkFBcUIsQ0FBQyxLQUFLO1FBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUUvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNuQixJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUUsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRWhDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQyxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQXlCO1lBQy9CLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLEtBQUs7WUFDTCxjQUFjLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWM7U0FDOUQsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxLQUFLO1FBQ25DLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDOUQscUJBQXFCLENBQUMsR0FBRyxFQUFFO29CQUN2QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQ3pFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQXlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQWMsdUJBQXVCO1FBQ2pDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRixNQUFNLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdkcsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQTBCLElBQUk7UUFDbEYsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ04sT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDMUgsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1AsSUFBSyxJQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQkFDbEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDekIsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDdEgsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDakUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNmLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUVELE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMvRCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU8sc0JBQXNCLENBQUMsR0FBRyxFQUFFLGVBQWU7UUFDL0MsSUFBSSxVQUFpQyxDQUFDO1FBQUMsSUFBSSxNQUFNLENBQUM7UUFDbEQsUUFBUSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQzlDLEtBQUssc0JBQXNCO2dCQUN2QixVQUFVLEdBQUcsVUFBVSxDQUFDO2dCQUN4QixNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNiLE1BQU07WUFDVixLQUFLLHNCQUFzQjtnQkFDdkIsVUFBVSxHQUFHLGFBQWEsQ0FBQztnQkFDM0IsTUFBTSxHQUFHLGVBQWUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBQ2xHLE1BQU07WUFDVixLQUFLLG9CQUFvQjtnQkFDckIsVUFBVSxHQUFHLGlCQUFpQixDQUFDO2dCQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNiLE1BQU07WUFDVjtnQkFDSSxVQUFVLEdBQUcsVUFBVSxDQUFDO2dCQUN4QixNQUFNLEdBQUcsZUFBZSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0JBQ2xILE1BQU07UUFDZCxDQUFDO1FBQ0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsZUFBZSxFQUFFLFFBQVEsR0FBRyxLQUFLO1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5RCxJQUFJLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDekgsT0FBTyxlQUFlLENBQUM7UUFDM0IsQ0FBQztRQUNELDBDQUEwQztRQUMxQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ25DLEtBQUssR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RCxPQUFPLGFBQWEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw0QkFBNEIsQ0FBQyxZQUFZO1FBQzdDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzdCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsR0FBRyxhQUFhLElBQUksSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxDQUFDO1lBQ2IsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILHFDQUFxQztJQUM3QiwyQkFBMkIsQ0FBQyxhQUFhO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXO1lBQy9FLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG9CQUFvQixDQUFDLGFBQWE7UUFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDbkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVE7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDcEcsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzFHLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07WUFDaEQsUUFBUSxHQUFHLENBQUUsQ0FBQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzFGLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sSUFBSSxDQUFDLElBQVksRUFBRSxTQUFpQixFQUFFLGFBQXVCLEVBQUUsVUFBb0IsRUFBRSxNQUFnQixFQUFFLE9BQU8sR0FBRyxJQUFJO1FBQ3pILElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLENBQUM7UUFDYixDQUFDO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyRCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsS0FBSyxJQUFJO1lBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxLQUFLLHFCQUFxQjtZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxlQUFlLEdBQUc7Z0JBQ25CLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQixhQUFhLEVBQUUscUJBQXFCO2dCQUNwQyxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixjQUFjLEVBQUUsRUFBRTtnQkFDbEIsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLEVBQUU7YUFDZCxDQUFDO1lBRUYsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLElBQUksU0FBUyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ1osR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUF1QixFQUFFLEVBQUU7d0JBQzFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixDQUFDLENBQUM7b0JBQ3JFLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMzRSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFFbkQsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07Z0JBQ3hCLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRztnQkFDbEIsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLO2dCQUN0QixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7YUFDL0IsQ0FBQyxDQUFDO1FBRVAsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO0lBQzNDLENBQUM7SUFFTyxpQkFBaUI7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRXpDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDO1FBQ3pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25ILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUNyQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMvQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFDeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ25GLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO3dCQUMzRyxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQU07NEJBQ2pCLENBQUMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQzs0QkFDbEcsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFFOUUsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDYixJQUFJLFdBQVcsS0FBSyxVQUFVLEVBQUUsQ0FBQzs0QkFDN0IsTUFBTSxHQUFHLEdBQW9CO2dDQUN6QixHQUFHLEVBQUUsT0FBTztnQ0FDWixNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0NBQ2YsS0FBSyxFQUFFLENBQUM7Z0NBQ1IsUUFBUSxFQUFFLElBQUksR0FBRyxDQUFrQixDQUFDLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ3pGLENBQUM7NEJBRUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNsRCxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7d0JBQ3hCLElBQUksV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBRWxELE9BQU8sV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLE1BQU0sR0FBRyxHQUFvQjtnQ0FDekIsR0FBRyxFQUFFLE9BQU87Z0NBQ1osTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLO2dDQUNmLEtBQUssRUFBRSxlQUFlLEVBQUU7Z0NBQ3hCLFFBQVEsRUFBRSxJQUFJLEdBQUcsQ0FBa0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDOzZCQUN6RixDQUFDOzRCQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFFOUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDckUsV0FBVyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ2xELENBQUM7b0JBQ0wsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztJQUNqRixDQUFDO0lBRVMsc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pHLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDcEosSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELDhCQUE4QjtJQUN0QiwwQkFBMEIsQ0FBQyxLQUFVLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDM0QsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckYsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDckYsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDOUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBb0I7WUFDckQsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQW9CLENBQUM7UUFDcEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2IsT0FBTztRQUNYLENBQUM7UUFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ2xELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sNEJBQTRCO1FBQ2hDLGtFQUFrRTtRQUNsRSxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDekIsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBRTNCLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNiLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUM3QixDQUFDO1lBQ0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxpR0FBaUc7UUFDakcsNEVBQTRFO1FBQzVFLG9GQUFvRjtRQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNqQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN4QyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQy9CLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDdEIsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLENBQUM7UUFDTCxDQUFDO1FBQ0QscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7SUFDNUMsQ0FBQzs4R0FsOE9pQixvQkFBb0IseUlBeW1HMUIscUJBQXFCLHNHQUtyQixRQUFRLDBSQVVSLGlCQUFpQixrREFHakIsU0FBUyx5Q0FFRyxrQkFBa0I7a0dBN25HeEIsb0JBQW9CLHVHQXNCbEIsZ0JBQWdCLDRFQXdCaEIsZ0JBQWdCLG8yQ0E2ckRoQixnQkFBZ0Isa0RBa0JoQixnQkFBZ0IsdUZBeUNoQixnQkFBZ0IscUtBd0loQixnQkFBZ0Isa0lBZ0ZoQixnQkFBZ0IsZ0ZBNkJoQixnQkFBZ0IsNkxBc0doQixnQkFBZ0IsOFdBNFloQixnQkFBZ0Isb1BBa3NGaEIsZ0JBQWdCLHdrRUFweEl0QiwyQ0FBMkMsMkJBQVUsMkNBQTJDLHdFQW1OaEcsc0JBQXNCLDJCQUFVLFdBQVcscUZBNkQzQyxnQ0FBZ0MsMkJBQVUsV0FBVyxzRkErQnJELGlDQUFpQywyQkFBVSxXQUFXLHdGQStCdEQsbUNBQW1DLDJCQUFVLFdBQVcseUZBK0J4RCxvQ0FBb0MsMkJBQVUsV0FBVyxxRkE2QnpELGdDQUFnQywyQkFBVSxXQUFXLHdGQWlDckQsbUNBQW1DLDJCQUFVLFdBQVcseUZBNkJ4RCxvQ0FBb0MsMkJBQVUsV0FBVywrRUFnQ3pELDBCQUEwQiwyQkFBVSxXQUFXLGdFQWpxQzVDLG1DQUFtQyxRQUFVLG1DQUFtQyw2Q0FvcUJoRixrQkFBa0IsMkJBQVUsa0JBQWtCLHdEQVU5QyxtQkFBbUIseURBc0NuQix3QkFBd0IsUUFBVSxXQUFXLHdEQU83Qyx1QkFBdUIsUUFBVSxXQUFXLDJEQU81Qyx3QkFBd0IsUUFBVSxXQUFXLDBEQXNJN0MsMkJBQTJCLFFBQThCLFdBQVcsd0RBTXBFLHVCQUF1QixRQUE4QixXQUFXLDJEQTREaEUsMEJBQTBCLFFBQThCLFdBQVcsNkRBdVJuRSw2QkFBNkIsUUFBVSxXQUFXLG9EQVlsRCwwQkFBMEIsNkRBMkIxQixlQUFlLHVEQVNmLGlCQUFpQiw2RUExbUJ2QixvQkFBb0IsNkVBTXBCLDZCQUE2Qiw4SEFNSCxrQkFBa0IsaUlBTVQseUJBQXlCLHVJQW9DL0IsV0FBVyxxSUFJWixXQUFXLHlJQU1ULFdBQVcseUhBTWQscUJBQXFCLDJJQXNEYixxQkFBcUIsK0hBTXhCLHFCQUFxQixtR0FNdEMsVUFBVSwrSUFJVyxXQUFXLHlHQU03QixVQUFVLHdEQTZCNUIseUJBQXlCLDBGQUl6QiwyQkFBMkIsZ0xBUzNCLG9CQUFvQiwyQkFBd0IsVUFBVSxxSEFNOUIsVUFBVSxpT0FZSSx5QkFBeUIsdUlBYTlCLFdBQVcsK0hBaVhmLGtCQUFrQix3SEFvQ1YseUJBQXlCLHVHQU85QyxnQkFBZ0IsMklBTUcsV0FBVyw2SUFNVixXQUFXLDZJQU1mLFdBQVcseUlBZVQsV0FBVywyREFwYzFDLDBCQUEwQiwyQkFBVSwwQkFBMEIscURBNFc5RCwwQkFBMEIsOEdBNEVKLHNCQUFzQixxTUFlNUMsZUFBZSwyQkFBVSxlQUFlOztBQXR6Qy9DO0lBRk4sWUFBWSxFQUFFO3dEQUVXO0FBdTFDMUI7SUFEQyxZQUFZLEVBQUU7MERBSWQ7QUFrQkQ7SUFEQyxZQUFZLEVBQUU7b0VBSWQ7QUF3Q0Q7SUFEQyxZQUFZLEVBQUU7NEVBSWQ7QUFtR0Q7SUFEQyxZQUFZLEVBQUU7NERBSWQ7QUF3REQ7SUFEQyxZQUFZLEVBQUU7dURBSWQ7QUFtQkQ7SUFEQyxZQUFZLEVBQUU7a0RBS2Q7QUEyQkQ7SUFEQyxZQUFZLEVBQUU7aURBSWQ7QUF3QkQ7SUFEQyxZQUFZLEVBQUU7cURBSWQ7QUFrQkQ7SUFEQyxZQUFZLEVBQUU7dURBSWQ7QUFnQ0Q7SUFEQyxZQUFZLEVBQUU7cURBYWQ7QUE4aEJEO0lBREMsWUFBWSxFQUFFOzhEQUlkO0FBdUdEO0lBREMsWUFBWSxFQUFFO3lEQUlkO0FBa0JEO0lBREMsWUFBWSxFQUFFO3dEQUlkO0FBa0JEO0lBREMsWUFBWSxFQUFFOzJEQUlkO0FBZ21GRDtJQURDLFlBQVksRUFBRTs0REFJZDsyRkFsdEtpQixvQkFBb0I7a0JBRHpDLFNBQVM7OzBCQTBtR0QsTUFBTTsyQkFBQyxxQkFBcUI7OzBCQUs1QixNQUFNOzJCQUFDLFFBQVE7OzBCQVVmLE1BQU07MkJBQUMsaUJBQWlCOzswQkFHeEIsTUFBTTsyQkFBQyxTQUFTOzswQkFFaEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxrQkFBa0I7eUNBbm5HbkMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQWNDLFlBQVk7c0JBRGxCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBa0IvQixtQkFBbUI7c0JBRHpCLEtBQUs7Z0JBUUMsTUFBTTtzQkFEWixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQVkvQixpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBWUMsbUJBQW1CO3NCQUR6QixLQUFLO2dCQVlDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFPSyxnQkFBZ0I7c0JBRDFCLEtBQUs7Z0JBOEJLLGlCQUFpQjtzQkFEM0IsS0FBSztnQkFnQkMsZ0JBQWdCO3NCQUR0QixLQUFLO2dCQWdDQyw4QkFBOEI7c0JBRHBDLE1BQU07Z0JBZUEsc0NBQXNDO3NCQUQ1QyxNQUFNO2dCQWFBLFVBQVU7c0JBRGhCLE1BQU07Z0JBb0JBLFVBQVU7c0JBRGhCLEtBQUs7Z0JBcUJDLFNBQVM7c0JBRGYsS0FBSztnQkFhQyxVQUFVO3NCQURoQixLQUFLO2dCQWdCQywwQkFBMEI7c0JBRGhDLEtBQUs7Z0JBT0MsNkJBQTZCO3NCQURuQyxlQUFlO3VCQUFDLG1DQUFtQyxFQUFFLEVBQUUsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBd0JoSCxTQUFTO3NCQURmLE1BQU07Z0JBY0EsUUFBUTtzQkFEZCxNQUFNO2dCQWFBLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFZQSxzQkFBc0I7c0JBRDVCLE1BQU07Z0JBY0EsUUFBUTtzQkFEZCxNQUFNO2dCQVlBLG9CQUFvQjtzQkFEMUIsTUFBTTtnQkFZQSx1QkFBdUI7c0JBRDdCLE1BQU07Z0JBa0JBLFNBQVM7c0JBRGYsTUFBTTtnQkFrQkEsWUFBWTtzQkFEbEIsTUFBTTtnQkFlQSxhQUFhO3NCQURuQixNQUFNO2dCQWFBLFlBQVk7c0JBRGxCLE1BQU07Z0JBZ0JBLFFBQVE7c0JBRGQsTUFBTTtnQkFjQSxZQUFZO3NCQURsQixNQUFNO2dCQWdCQSxZQUFZO3NCQURsQixNQUFNO2dCQW1CQSxPQUFPO3NCQURiLE1BQU07Z0JBa0JBLFdBQVc7c0JBRGpCLE1BQU07Z0JBaUJBLFdBQVc7c0JBRGpCLE1BQU07Z0JBY0EsVUFBVTtzQkFEaEIsTUFBTTtnQkFRQSxvQkFBb0I7c0JBRDFCLE1BQU07Z0JBY0EsT0FBTztzQkFEYixNQUFNO2dCQWNBLFdBQVc7c0JBRGpCLE1BQU07Z0JBY0EsU0FBUztzQkFEZixNQUFNO2dCQWNBLGFBQWE7c0JBRG5CLE1BQU07Z0JBZUEsUUFBUTtzQkFEZCxNQUFNO2dCQWVBLFVBQVU7c0JBRGhCLE1BQU07Z0JBZUEsU0FBUztzQkFEZixNQUFNO2dCQWVBLE1BQU07c0JBRFosTUFBTTtnQkFjQSxhQUFhO3NCQURuQixNQUFNO2dCQWFBLFdBQVc7c0JBRGpCLE1BQU07Z0JBY0EsV0FBVztzQkFEakIsTUFBTTtnQkFjQSx3QkFBd0I7c0JBRDlCLE1BQU07Z0JBY0EsdUJBQXVCO3NCQUQ3QixNQUFNO2dCQWNBLGlCQUFpQjtzQkFEdkIsTUFBTTtnQkFjQSxZQUFZO3NCQURsQixNQUFNO2dCQWNBLGVBQWU7c0JBRHJCLE1BQU07Z0JBZUEsV0FBVztzQkFEakIsTUFBTTtnQkFVQSxZQUFZO3NCQURsQixNQUFNO2dCQVVBLFVBQVU7c0JBRGhCLE1BQU07Z0JBVUEsUUFBUTtzQkFEZCxNQUFNO2dCQU9BLHFCQUFxQjtzQkFEM0IsTUFBTTtnQkFZQSxTQUFTO3NCQURmLE1BQU07Z0JBWUEsVUFBVTtzQkFEaEIsTUFBTTtnQkFZQSxTQUFTO3NCQURmLE1BQU07Z0JBWUEsZ0JBQWdCO3NCQUR0QixNQUFNO2dCQWNBLHdCQUF3QjtzQkFEOUIsTUFBTTtnQkFlQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBWUEsYUFBYTtzQkFEbkIsTUFBTTtnQkFLQSxRQUFRO3NCQURkLE1BQU07Z0JBT0EsWUFBWTtzQkFEbEIsTUFBTTtnQkFZQSxZQUFZO3NCQURsQixNQUFNO2dCQVlBLFdBQVc7c0JBRGpCLE1BQU07Z0JBUUEsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBT3hCLFVBQVU7c0JBRGhCLFNBQVM7dUJBQUMsNkJBQTZCO2dCQU9qQyxjQUFjO3NCQURwQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT2hFLGFBQWE7c0JBRG5CLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxJQUFJLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFZaEYsVUFBVTtzQkFEaEIsZUFBZTt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQVcxRSxxQkFBcUI7c0JBRDlCLGVBQWU7dUJBQUMsbUJBQW1CO2dCQVk3Qix3Q0FBd0M7c0JBRDlDLFlBQVk7dUJBQUMsMkNBQTJDLEVBQUUsRUFBRSxJQUFJLEVBQUUsMkNBQTJDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFLdkgseUJBQXlCO3NCQUQvQixTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUs1RCx3QkFBd0I7c0JBRDlCLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBTzNELDBCQUEwQjtzQkFEaEMsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPN0QsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVFwRSxzQkFBc0I7c0JBRDVCLGVBQWU7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBUTdFLHFCQUFxQjtzQkFEM0IsZUFBZTt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQkFRNUUsd0JBQXdCO3NCQUQ5QixlQUFlO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO2dCQVF6RSx1QkFBdUI7c0JBRGpDLEtBQUs7Z0JBMkJDLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU81RSxjQUFjO3NCQURwQixTQUFTO3VCQUFDLHNCQUFzQixFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT3pFLEdBQUc7c0JBRFQsU0FBUzt1QkFBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSzdDLDBCQUEwQjtzQkFEaEMsU0FBUzt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPbkUsTUFBTTtzQkFEWixTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBOEJsQyxRQUFRO3NCQURkLFNBQVM7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUsvQyxTQUFTO3NCQURmLFNBQVM7dUJBQUMsMkJBQTJCO2dCQU8vQixLQUFLO3NCQURYLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJMUIsY0FBYztzQkFEdkIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFPNUQsWUFBWTtzQkFEbEIsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQU94QyxLQUFLO3NCQURYLFNBQVM7dUJBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPN0IseUJBQXlCO3NCQUQvQixTQUFTO3VCQUFDLDRCQUE0QixFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT25GLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7Z0JBUXZFLHFCQUFxQjtzQkFEM0IsU0FBUzt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPaEUsdUJBQXVCO3NCQUQ3QixlQUFlO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQU9oRixxQkFBcUI7c0JBRDNCLGVBQWU7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBT3hFLG1CQUFtQjtzQkFEN0IsS0FBSztnQkF5QkMsVUFBVTtzQkFEaEIsWUFBWTt1QkFBQyxzQkFBc0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBT2hELGtCQUFrQjtzQkFENUIsS0FBSztnQkF5QkMsd0JBQXdCO3NCQUQ5QixlQUFlO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQU8zRSxzQkFBc0I7c0JBRGhDLEtBQUs7Z0JBMEJJLHFDQUFxQztzQkFEOUMsWUFBWTt1QkFBQyxnQ0FBZ0MsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBTzFELDRCQUE0QjtzQkFEdEMsS0FBSztnQkEwQkksc0NBQXNDO3NCQUQvQyxZQUFZO3VCQUFDLGlDQUFpQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPM0QsNkJBQTZCO3NCQUR2QyxLQUFLO2dCQTBCSSx3Q0FBd0M7c0JBRGpELFlBQVk7dUJBQUMsbUNBQW1DLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQU83RCwrQkFBK0I7c0JBRHpDLEtBQUs7Z0JBMEJJLHlDQUF5QztzQkFEbEQsWUFBWTt1QkFBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBTzlELGdDQUFnQztzQkFEMUMsS0FBSztnQkF3QkMscUNBQXFDO3NCQUQzQyxZQUFZO3VCQUFDLGdDQUFnQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPMUQsNEJBQTRCO3NCQUR0QyxLQUFLO2dCQTRCQyx3Q0FBd0M7c0JBRDlDLFlBQVk7dUJBQUMsbUNBQW1DLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO2dCQU83RCwrQkFBK0I7c0JBRHpDLEtBQUs7Z0JBd0JDLHlDQUF5QztzQkFEL0MsWUFBWTt1QkFBQyxvQ0FBb0MsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7Z0JBTzlELGdDQUFnQztzQkFEMUMsS0FBSztnQkEyQkMsK0JBQStCO3NCQURyQyxZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtnQkFPcEQsc0JBQXNCO3NCQURoQyxLQUFLO2dCQTJCQywwQkFBMEI7c0JBRGhDLGVBQWU7dUJBQUMsNkJBQTZCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBT2xGLGtCQUFrQjtzQkFEeEIsWUFBWTt1QkFBQywwQkFBMEI7Z0JBT2pDLGlCQUFpQjtzQkFEdkIsZUFBZTt1QkFBQywwQkFBMEIsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBTzNELGlCQUFpQjtzQkFEdkIsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtnQkFPckQsUUFBUTtzQkFEZCxXQUFXO3VCQUFDLGVBQWU7Z0JBT3JCLFFBQVE7c0JBRGQsV0FBVzt1QkFBQyxXQUFXO2dCQVVqQixPQUFPO3NCQURiLGVBQWU7dUJBQUMsZUFBZTtnQkFVdEIsb0JBQW9CO3NCQUQ3QixlQUFlO3VCQUFDLGlCQUFpQjtnQkFPeEIsZ0JBQWdCO3NCQUR6QixTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBUWxGLE1BQU07c0JBRFosU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFPakQsdUJBQXVCO3NCQURoQyxTQUFTO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU8vRCx3QkFBd0I7c0JBRGpDLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBT2hFLDRCQUE0QjtzQkFEckMsU0FBUzt1QkFBQyxzQkFBc0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJNUQsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUU7Z0JBSXBELFFBQVE7c0JBRGYsWUFBWTt1QkFBQyxLQUFLO2dCQUlYLGNBQWM7c0JBRHJCLFlBQVk7dUJBQUMsV0FBVztnQkFPakIsc0JBQXNCO3NCQUQ3QixTQUFTO3VCQUFDLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUloRSxZQUFZO3NCQURuQixZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBSTlDLFNBQVM7c0JBRGxCLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQVdsQixlQUFlO3NCQUR6QixLQUFLO2dCQXFCSyxjQUFjO3NCQUR4QixLQUFLO2dCQXNCSyx3QkFBd0I7c0JBRGxDLEtBQUs7Z0JBNENLLGdDQUFnQztzQkFEMUMsS0FBSztnQkErQ0ssTUFBTTtzQkFEaEIsS0FBSztnQkFpQkssVUFBVTtzQkFEcEIsS0FBSztnQkF5Q0ssZ0JBQWdCO3NCQUQxQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1CM0IsWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFtQi9CLGlCQUFpQjtzQkFEdkIsS0FBSztnQkF3QkssV0FBVztzQkFEckIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkF3QjNCLE1BQU07c0JBRmhCLFdBQVc7dUJBQUMsY0FBYzs7c0JBQzFCLEtBQUs7Z0JBaUJLLFNBQVM7c0JBRG5CLFdBQVc7dUJBQUMsYUFBYTtnQkFlZixLQUFLO3NCQURmLEtBQUs7Z0JBNEJLLFNBQVM7c0JBRG5CLEtBQUs7Z0JBc0JLLFdBQVc7c0JBRHJCLEtBQUs7Z0JBbUJLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFrQkssU0FBUztzQkFEbkIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkF5QzNCLHdCQUF3QjtzQkFEbEMsS0FBSztnQkFzQkssT0FBTztzQkFEakIsS0FBSztnQkFvQkssY0FBYztzQkFEeEIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkE4QjNCLHNCQUFzQjtzQkFEaEMsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkEyQjNCLFVBQVU7c0JBRHBCLEtBQUs7Z0JBZ0NLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBcUJLLHNCQUFzQjtzQkFEaEMsS0FBSztnQkEwQksscUJBQXFCO3NCQUQvQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1CM0IsY0FBYztzQkFEeEIsS0FBSztnQkFrQkssWUFBWTtzQkFEdEIsS0FBSztnQkF1QkssY0FBYztzQkFEeEIsS0FBSztnQkE0QkssWUFBWTtzQkFEdEIsS0FBSztnQkFrRkssb0JBQW9CO3NCQUQ5QixLQUFLO2dCQTBDSyxtQkFBbUI7c0JBRDdCLEtBQUs7Z0JBMkRLLHlCQUF5QjtzQkFEbkMsS0FBSztnQkFnRkssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQXNESyxZQUFZO3NCQUR0QixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQXNEM0IsYUFBYTtzQkFEdkIsS0FBSztnQkFzQkssWUFBWTtzQkFEdEIsS0FBSztnQkFzQkssZUFBZTtzQkFEekIsS0FBSztnQkEraEJDLGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsWUFBWTtnQkFzdEJmLGVBQWU7c0JBRHpCLEtBQUs7Z0JBb0hLLE1BQU07c0JBRGhCLEtBQUs7Z0JBOFBLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBaWdDSyxnQkFBZ0I7c0JBRDFCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgZm9ybWF0TnVtYmVyLCBnZXRMb2NhbGVOdW1iZXJGb3JtYXQsIE51bWJlckZvcm1hdFN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBMT0NBTEVfSUQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ2NUcmlhbFdhdGVybWFyayB9IGZyb20gJ2lnbml0ZXVpLXRyaWFsLXdhdGVybWFyayc7XG5pbXBvcnQgeyBTdWJqZWN0LCBwaXBlLCBmcm9tRXZlbnQsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIG1lcmdlT2JqZWN0cywgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0U2VydmljZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGV4dC1oaWdobGlnaHQvdGV4dC1oaWdobGlnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBJU3VtbWFyeUV4cHJlc3Npb24gfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHsgSWd4R3JpZEJvZHlEaXJlY3RpdmUsIFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9ncmlkLmNvbW1vbic7XG5pbXBvcnQgdHlwZSB7IElneEdyaWRUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyL2dyaWQtdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VG9vbGJhclRva2VuIH0gZnJvbSAnLi90b29sYmFyL3Rva2VuJztcbmltcG9ydCB7IElneFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVUeXBlXG59IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25TZXJ2aWNlLCBTdGF0ZSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dBZGRUZXh0RGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLCBJQWN0aXZlTm9kZSB9IGZyb20gJy4vZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFdhdGNoQ2hhbmdlcyB9IGZyb20gJy4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRSZXNvdXJjZVN0cmluZ3NFTiwgSUdyaWRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vZ3JpZC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCB9IGZyb20gJy4vc3VtbWFyaWVzL3N1bW1hcnktcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEVkaXRSb3csIElneENlbGwsIElneEFkZFJvdyB9IGZyb20gJy4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncywgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY3N2L2NoYXItc2VwYXJhdGVkLXZhbHVlLWRhdGEnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlcmluZ1N0cmF0ZWd5LCBJRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7XG4gICAgSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIElneFJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4SGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsXG4gICAgSWd4SGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hFeGNlbFN0eWxlSGVhZGVySWNvbkRpcmVjdGl2ZSwgSWd4U29ydEFzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsXG4gICAgSWd4U29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlLCBJZ3hTb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQuZGlyZWN0aXZlcyc7XG5pbXBvcnQge1xuICAgIEdyaWRLZXlkb3duVGFyZ2V0VHlwZSxcbiAgICBHcmlkU2VsZWN0aW9uTW9kZSxcbiAgICBHcmlkU3VtbWFyeVBvc2l0aW9uLFxuICAgIEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLFxuICAgIEZpbHRlck1vZGUsXG4gICAgQ29sdW1uUGlubmluZ1Bvc2l0aW9uLFxuICAgIFJvd1Bpbm5pbmdQb3NpdGlvbixcbiAgICBHcmlkUGFnaW5nTW9kZSxcbiAgICBHcmlkVmFsaWRhdGlvblRyaWdnZXIsXG4gICAgU2l6ZVxufSBmcm9tICcuL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQge1xuICAgIElHcmlkQ2VsbEV2ZW50QXJncyxcbiAgICBJUm93U2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5FdmVudEFyZ3MsXG4gICAgSVJvd0RhdGFFdmVudEFyZ3MsXG4gICAgSUNvbHVtblJlc2l6ZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkS2V5ZG93bkV2ZW50QXJncyxcbiAgICBJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElSb3dEcmFnRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkQ2xpcGJvYXJkRXZlbnQsXG4gICAgSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzLFxuICAgIElTZWFyY2hJbmZvLFxuICAgIElDZWxsUG9zaXRpb24sXG4gICAgSVJvd1RvZ2dsZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Sb3dFdmVudEFyZ3MsXG4gICAgSUdyaWRTY3JvbGxFdmVudEFyZ3MsXG4gICAgSUFjdGl2ZU5vZGVDaGFuZ2VFdmVudEFyZ3MsXG4gICAgSVNvcnRpbmdFdmVudEFyZ3MsXG4gICAgSUZpbHRlcmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MsXG4gICAgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncyxcbiAgICBJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RXZlbnRBcmdzLFxuICAgIElSb3dEYXRhQ2FuY2VsYWJsZUV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXREb25lRXZlbnRBcmdzLFxuICAgIElHcmlkUm93RXZlbnRBcmdzLFxuICAgIElHcmlkQ29udGV4dE1lbnVFdmVudEFyZ3MsXG4gICAgSUNvbHVtbnNBdXRvR2VuZXJhdGVkRXZlbnRBcmdzXG59IGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2FkdmFuY2VkLWZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmctZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIENvbHVtblR5cGUsXG4gICAgR3JpZFNlcnZpY2VUeXBlLFxuICAgIEdyaWRUeXBlLFxuICAgIElHcmlkRm9ybUdyb3VwQ3JlYXRlZEV2ZW50QXJncyxcbiAgICBJR3JpZFZhbGlkYXRpb25TdGF0dXNFdmVudEFyZ3MsXG4gICAgSWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4R3JpZFJvd0RyYWdHaG9zdENvbnRleHQsXG4gICAgSWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0LFxuICAgIElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0LFxuICAgIElHWF9HUklEX1NFUlZJQ0VfQkFTRSxcbiAgICBJU2l6ZUluZm8sXG4gICAgUm93VHlwZSxcbiAgICBJUGlubmluZ0NvbmZpZyxcbiAgICBJQ2xpcGJvYXJkT3B0aW9uc1xufSBmcm9tICcuL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wUG9zaXRpb24gfSBmcm9tICcuL21vdmluZy9tb3Zpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIElneFJvd1NlbGVjdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9zZWxlY3Rpb24vcm93LXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy1kcmFnLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hTbmFja2JhckNvbXBvbmVudCB9IGZyb20gJy4uL3NuYWNrYmFyL3NuYWNrYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IElneEFjdGlvblN0cmlwVG9rZW4gfSBmcm9tICcuLi9hY3Rpb24tc3RyaXAvdG9rZW4nO1xuaW1wb3J0IHsgSWd4R3JpZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JUb2tlbiB9IGZyb20gJy4uL3BhZ2luYXRvci90b2tlbic7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50IH0gZnJvbSAnLi9ncm91cGluZy9ncmlkLWdyb3VwLWJ5LWFyZWEuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZsYXRUcmFuc2FjdGlvbkZhY3RvcnksIFRSQU5TQUNUSU9OX1RZUEUgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbi1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdPcHRpb25zIH0gZnJvbSAnLi9jb2x1bW5zL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgR3JpZFNlbGVjdGlvblJhbmdlLCBJZ3hHcmlkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBWZXJ0aWNhbEFsaWdubWVudCwgSG9yaXpvbnRhbEFsaWdubWVudCwgUG9zaXRpb25TZXR0aW5ncywgT3ZlcmxheVNldHRpbmdzIH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29ubmVjdGVkLXBvc2l0aW9uaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IENvbnRhaW5lclBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2NvbnRhaW5lci1wb3NpdGlvbi1zdHJhdGVneSc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwvYWJzb2x1dGUtc2Nyb2xsLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFjdGlvbiwgU3RhdGVVcGRhdGVFdmVudCwgVHJhbnNhY3Rpb25FdmVudE9yaWdpbiB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElHcmlkU29ydGluZ1N0cmF0ZWd5IH0gZnJvbSAnLi9jb21tb24vc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVmYXVsdERhdGFDbG9uZVN0cmF0ZWd5LCBJRGF0YUNsb25lU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS1jbG9uZS1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcblxuaW50ZXJmYWNlIElNYXRjaEluZm9DYWNoZSB7XG4gICAgcm93OiBhbnk7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBjb2x1bW46IHN0cmluZztcbiAgICBtZXRhZGF0YTogTWFwPHN0cmluZywgYm9vbGVhbj47XG59XG5cbmxldCBGQUtFX1JPV19JRCA9IC0xO1xuY29uc3QgREVGQVVMVF9JVEVNU19QRVJfUEFHRSA9IDE1O1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEggPSAxMzY7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbi8qIGJsYXpvckluZGlyZWN0UmVuZGVyXG4gICBibGF6b3JDb21wb25lbnRcbiAgIG9taXRNb2R1bGVcbiAgIHdjU2tpcENvbXBvbmVudFN1ZmZpeCAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4R3JpZEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBHcmlkVHlwZSxcbiAgICBPbkluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRpc3BsYXkgdGltZSBmb3IgdGhlIHJvdyBhZGRpbmcgc25hY2tiYXIgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIDYwMDBtcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzbmFja2JhckRpc3BsYXlUaW1lID0gNjAwMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRvIGF1dG8tZ2VuZXJhdGUgdGhlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBXaGVuIHNldCB0byB0cnVlLCBpdCB3aWxsIG92ZXJyaWRlIGFsbCBjb2x1bW5zIGRlY2xhcmVkIHRocm91Z2ggY29kZSBvciBpbiBtYXJrdXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGNvbGxlY3Rpb25cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBjb2xsZWN0aW9uIGlzIG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGNoYW5naW5nIGl0IHdpbGwgbm90IGNhdXNlIGFueSBjaGFuZ2VzIGluIHRoZSBnZW5lcmF0ZWQgY29sdW1ucyBhdCBydW50aW1lXG4gICAgICogdW5sZXNzIHRoZSBncmlkIGlzIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkLiBUbyBtb2RpZnkgdGhlIGNvbHVtbnMgdmlzaWJsZSBpbiB0aGUgVUkgYXQgcnVudGltZSwgcGxlYXNlIHVzZSB0aGVpclxuICAgICAqIFtoaWRkZW5dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvZG9jcy90eXBlc2NyaXB0L2xhdGVzdC9jbGFzc2VzL0lneENvbHVtbkNvbXBvbmVudC5odG1sI2hpZGRlbikgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIGRhdGE9W0RhdGFdIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVFeGNsdWRlXT1cIlsnUHJvZHVjdE5hbWUnLCAnQ291bnQnXVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IERhdGEgPSBbeyAnSWQnOiAnMScsICdQcm9kdWN0TmFtZSc6ICduYW1lMScsICdEZXNjcmlwdGlvbic6ICdkZXNjcmlwdGlvbjEnLCAnQ291bnQnOiA1IH1dXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlRXhjbHVkZTogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY29sdW1ucyBtb3ZpbmcgaXMgZW5hYmxlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBtb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtcHR5R3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgYWRkaW5nIHJvdyBVSSB3aGVuIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYWRkUm93RW1wdHlUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRSb3dFbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbbG9hZGluZ0dyaWRUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldC9TZXQgSWd4U3VtbWFyeVJvdyBoZWlnaHRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeVJvd0hlaWdodCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgPSB2YWx1ZSB8IDA7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3VtbWFyaXplZENvbHVtbnMgJiYgdGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgfHwgdGhpcy5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uc1RvQXV0b3NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoeCA9PiB4LndpZHRoID09PSAnZml0LWNvbnRlbnQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRhdGEgY2xvbmUgc3RyYXRlZ3kgb2YgdGhlIGdyaWQgd2hlbiBpbiBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtkYXRhQ2xvbmVTdHJhdGVneV09XCJjdXN0b21DbG9uZVN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGF0YUNsb25lU3RyYXRlZ3koKTogSURhdGFDbG9uZVN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFDbG9uZVN0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGF0YUNsb25lU3RyYXRlZ3koc3RyYXRlZ3k6IElEYXRhQ2xvbmVTdHJhdGVneSkge1xuICAgICAgICBpZiAoc3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFDbG9uZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMuY2xvbmVTdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIGNvcHkgYmVoYXZpb3Igb2YgdGhlIGdyaWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xpcGJvYXJkT3B0aW9uczogSUNsaXBib2FyZE9wdGlvbnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSBjb3B5IGJlaGF2aW9yXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogSW5jbHVkZSB0aGUgY29sdW1ucyBoZWFkZXJzIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUhlYWRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBseSB0aGUgY29sdW1ucyBmb3JtYXR0ZXJzIChpZiBhbnkpIG9uIHRoZSBkYXRhIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUZvcm1hdHRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2VwYXJhdG9yIHVzZWQgZm9yIGZvcm1hdHRpbmcgdGhlIGNvcHkgb3V0cHV0LiBEZWZhdWx0cyB0byBgXFx0YC5cbiAgICAgICAgICovXG4gICAgICAgIHNlcGFyYXRvcjogJ1xcdCdcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZSBvZiB0aGUgY29sdW1uIGZvciB3aGljaCBmaWx0ZXJpbmcgd2FzIHBlcmZvcm1lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJmaWx0ZXJpbmdFeHByVHJlZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBhZHZhbmNlZCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgKGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlKT1cImFkdmFuY2VkRmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGdyaWQgaXMgc2Nyb2xsZWQgaG9yaXpvbnRhbGx5L3ZlcnRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKGdyaWRTY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkU2Nyb2xsRXZlbnRBcmdzPigpO1xuXG4gICAgLyogdHJlYXRBc1JlZiAqL1xuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb25kaXRpb25hbCBjbGFzcyBzZWxlY3RvciB0byB0aGUgZ3JpZCdzIHJvdyBlbGVtZW50LlxuICAgICAqIEFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwsIGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIENTUyBjbGFzcyBhbmQgdGhlIHZhbHVlIGlzXG4gICAgICogZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbiwgb3IgYm9vbGVhbiwgbGlrZSBzbzpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY2FsbGJhY2sgPSAocm93OiBSb3dUeXBlKSA9PiB7IHJldHVybiByb3cuc2VsZWN0ZWQgPiA2OyB9XG4gICAgICogcm93Q2xhc3NlcyA9IHsgJ2NsYXNzTmFtZScgOiB0aGlzLmNhbGxiYWNrIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd0NsYXNzZXNdID0gXCJyb3dDbGFzc2VzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dDbGFzc2VzOiBhbnk7XG5cbiAgICAvKiB0cmVhdEFzUmVmICovXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25kaXRpb25hbCBzdHlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBncmlkIHJvdyBlbGVtZW50LlxuICAgICAqIEl0IGFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAgICogdGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc3R5bGVzID0ge1xuICAgICAqICBiYWNrZ3JvdW5kOiAneWVsbG93JyxcbiAgICAgKiAgY29sb3I6IChyb3c6IFJvd1R5cGUpID0+IHJvdy5zZWxlY3RlZCA6ICdyZWQnOiAnd2hpdGUnXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtyb3dTdHlsZXNdPVwic3R5bGVzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dTdHlsZXMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJpbWFyeUtleTogc3RyaW5nO1xuXG4gICAgLyogYmxhem9yU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSB1bmlxdWUgdmFsdWVzIHN0cmF0ZWd5IHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZ1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIGNhbGxiYWNrIGZvciBsb2FkaW5nIHVuaXF1ZSBjb2x1bW4gdmFsdWVzIG9uIGRlbWFuZC5cbiAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHByb3ZpZGVkLCB0aGUgdW5pcXVlIHZhbHVlcyBpdCBnZW5lcmF0ZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidleGNlbFN0eWxlRmlsdGVyJ1wiIFt1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneV09XCJjb2x1bW5WYWx1ZXNTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3k6IChjb2x1bW46IENvbHVtblR5cGUsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkUm93YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHJvd0NsaWNrKT1cInJvd0NsaWNrKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRSb3dFdmVudEFyZ3M+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmb3JtR3JvdXAgaXMgY3JlYXRlZCBvbiBlZGl0IG9mIHJvdy9jZWxsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChmb3JtR3JvdXBDcmVhdGVkKT1cImZvcm1Hcm91cENyZWF0ZWQoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZvcm1Hcm91cENyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRm9ybUdyb3VwQ3JlYXRlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkJ3MgdmFsaWRhdGlvbiBzdGF0dXMgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAodmFsaWRhdGlvblN0YXR1c0NoYW5nZSk9XCJ2YWxpZGF0aW9uU3RhdHVzQ2hhbmdlKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWxpZGF0aW9uU3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFZhbGlkYXRpb25TdGF0dXNFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHNlbGVjdGVkKT1cIm9uQ2VsbFNlbGVjdCgkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqICBFbWl0dGVkIHdoZW4gYElneEdyaWRSb3dDb21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChyb3dTZWxlY3Rpb25DaGFuZ2luZyk9XCJyb3dTZWxlY3Rpb25DaGFuZ2luZygkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93U2VsZWN0aW9uQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dTZWxlY3Rpb25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChjb2x1bW5TZWxlY3Rpb25DaGFuZ2luZyk9XCJjb2x1bW5TZWxlY3Rpb25DaGFuZ2luZygkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5TZWxlY3Rpb25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNvbHVtbiBtYXkgYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBgaW5zZXJ0QXRJbmRleGAgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNvbHVtblBpbm5pbmcoZXZlbnQpIHtcbiAgICAgKiAgICAgaWYgKGV2ZW50LmNvbHVtbi5maWVsZCA9PT0gXCJOYW1lXCIpIHtcbiAgICAgKiAgICAgICBldmVudC5pbnNlcnRBdEluZGV4ID0gMDtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uUGluID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHBpbm5lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGluZGV4IHRoYXQgdGhlIGNvbHVtbiBpcyBpbnNlcnRlZCBhdCBtYXkgYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBgaW5zZXJ0QXRJbmRleGAgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNvbHVtblBpbm5pbmcoZXZlbnQpIHtcbiAgICAgKiAgICAgaWYgKGV2ZW50LmNvbHVtbi5maWVsZCA9PT0gXCJOYW1lXCIpIHtcbiAgICAgKiAgICAgICBldmVudC5pbnNlcnRBdEluZGV4ID0gMDtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uUGlubmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluQ29sdW1uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RW50ZXIpPVwiZWRpdFN0YXJ0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBleGl0cyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEV4aXQpPVwiZWRpdEV4aXQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGhhcyBiZWVuIGVkaXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXZlbnQgaXMgZmlyZWQgYWZ0ZXIgZWRpdGluZyBpcyBjb21wbGV0ZWQsIHdoZW4gdGhlIGNlbGwgaXMgZXhpdGluZyBlZGl0IG1vZGUuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtbkluaXQpPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qIGJsYXpvckluY2x1ZGUgKi9cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5zQXV0b2dlbmVyYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbnNBdXRvR2VuZXJhdGVkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBleHByZXNzaW9ucyBhcmUgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBgSVNvcnRpbmdFdmVudEFyZ3NgIG9iamVjdC4gYHNvcnRpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZyk9XCJzb3J0aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgc29ydGluZyBpcyBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmdEb25lKT1cInNvcnRpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uIHwgSVNvcnRpbmdFeHByZXNzaW9uW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElGaWx0ZXJpbmdFdmVudEFyZ3NgIG9iamVjdC4gYGZpbHRlcmluZ0V4cHJlc3Npb25zYCBrZXkgaG9sZHMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGZpbHRlcmluZyk9XCJmaWx0ZXJpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBVSS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmdEb25lKT1cImZpbHRlcmluZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKiBibGF6b3JDU1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dBZGRlZCk9XCJyb3dBZGRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBpcyBkZWxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJUm93RGF0YUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlZCk9XCJyb3dEZWxldGVkKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiBkZWxldGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gSVJvd0RhdGFDYW5jZWxsYWJsZUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlKT1cInJvd0RlbGV0ZSgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUNhbmNlbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbW1pdGVkIGp1c3QgYmVmb3JlIHRoZSBuZXdseSBhZGRlZCByb3cgaXMgY29tbWl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBSZXR1cm5zIGFuIElSb3dEYXRhQ2FuY2VsbGFibGVFdmVudEFyZ3NgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKHJvd0FkZCk9XCJyb3dBZGQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RhdGFDYW5jZWxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBjb2x1bW4gaXMgcmVzaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0J3Mgb2xkIGFuZCBuZXcgd2lkdGguXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChjb2x1bW5SZXNpemVkKT1cInJlc2l6aW5nKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5SZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uUmVzaXplRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBvciByb3cgaXMgcmlnaHQgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYCBvYmplY3QgaWYgdGhlIGltbWVkaWF0ZSBjb250ZXh0IG1lbnUgdGFyZ2V0IGlzIGEgY2VsbCBvciBhbiBgSWd4R3JpZFJvd2Agb3RoZXJ3aXNlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDb250ZXh0TWVudUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgZG91YmxlIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAoZG91YmxlQ2xpY2spPVwiZGJsQ2xpY2soJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBjb2x1bW4gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBcmdzOiB7IGNvbHVtbjogYW55LCBuZXdWYWx1ZTogYm9vbGVhbiB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcpPVwidmlzaWJpbGl0eUNoYW5naW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2VkKT1cInZpc2liaWxpdHlDaGFuZ2VkKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3Zpbmcgc3RhcnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5Nb3ZpbmdTdGFydCk9XCJtb3ZpbmdTdGFydCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgZHVyaW5nIHRoZSBjb2x1bW4gbW92aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uTW92aW5nKT1cIm1vdmluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3ZpbmcgZW5kcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtbk1vdmluZ0VuZCk9XCJtb3ZpbmdFbmRzKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ga2V5ZG93biBpcyB0cmlnZ2VyZWQgb3ZlciBlbGVtZW50IGluc2lkZSBncmlkJ3MgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBvbmx5IGlmIHRoZSBrZXkgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBncmlkLlxuICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGUsIHRhcmdldCBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbCBldmVudC4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgKGdyaWRLZXlkb3duKT1cImN1c3RvbUtleWRvd24oJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRLZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEtleWRvd25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gc3RhcnQgZHJhZ2dpbmcgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybiB0aGUgZHJhZ2dlZCByb3cuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkcm9wcGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcm9wcGVkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb3B5IG9wZXJhdGlvbiBpcyBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmlyZWQgb25seSBpZiBjb3B5IGJlaGF2aW9yIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgW2BjbGlwYm9hcmRPcHRpb25zYF17QGxpbmsgSWd4R3JpZEJhc2VEaXJlY3RpdmUjY2xpcGJvYXJkT3B0aW9uc30uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENsaXBib2FyZEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwYW5zaW9uU3RhdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXA8YW55LCBib29sZWFuPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYSByb3cgZ2V0cyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dUb2dnbGUpPVwicm93VG9nZ2xlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dUb2dnbGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHBpbm5lZCBzdGF0ZSBvZiBhIHJvdyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dQaW5uaW5nKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1Bpbm5lZCk9XCJyb3dQaW4oJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiB0aGUgYWN0aXZlIG5vZGUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoYWN0aXZlTm9kZUNoYW5nZSk9XCJhY3RpdmVOb2RlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVOb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cInNvcnRpbmdFeHByQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYW4gZXhwb3J0IHByb2Nlc3MgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdG9vbGJhckV4cG9ydGluZyhldmVudDogSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgdG9vbGJhckV4cG9ydGluZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdG9vbGJhckV4cG9ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzPigpO1xuXG4gICAgLyogRW5kIG9mIHRvb2xiYXIgcmVsYXRlZCBkZWZpbml0aW9ucyAqL1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIG1ha2luZyBhIHJhbmdlIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmFuZ2Ugc2VsZWN0aW9uIGNhbiBiZSBtYWRlIGVpdGhlciB0aHJvdWdoIGRyYWcgc2VsZWN0aW9uIG9yIHRocm91Z2gga2V5Ym9hcmQgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByYW5nZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+KCk7XG5cbiAgICAvKiogRW1pdHRlZCBhZnRlciB0aGUgbmdBZnRlclZpZXdJbml0IGhvb2suIEF0IHRoaXMgcG9pbnQgdGhlIGdyaWQgZXhpc3RzIGluIHRoZSBET00gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBsb2NhbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSB0aGUgZ3JpZCdzIGRhdGEgdmlldyBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBkYXRhIG9wZXJhdGlvbiwgcmViaW5kaW5nLCBldGMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChkYXRhQ2hhbmdpbmcpPSdoYW5kbGVEYXRhQ2hhbmdpbmdFdmVudCgpJz48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5nZWQpPSdoYW5kbGVEYXRhQ2hhbmdlZEV2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hTbmFja2JhckNvbXBvbmVudClcbiAgICBwdWJsaWMgYWRkUm93U25hY2tiYXI6IElneFNuYWNrYmFyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyByZXNpemVMaW5lOiBJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbG9hZGluZ092ZXJsYXknLCB7IHJlYWQ6IElneFRvZ2dsZURpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdPdmVybGF5OiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneExvYWRpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ091dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qIHJlYWN0Q29udGVudENoaWxkcmVuICovXG4gICAgLyogYmxhem9ySW5jbHVkZSAqL1xuICAgIC8qIGJsYXpvclRyZWF0QXNDb2xsZWN0aW9uICovXG4gICAgLyogYmxhem9yQ29sbGVjdGlvbk5hbWU6IENvbHVtbkNvbGxlY3Rpb24gKi9cbiAgICAvKiBuZ1F1ZXJ5TGlzdE5hbWU6IGNvbHVtbkxpc3QgKi9cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgY29sdW1uTGlzdDogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qIGNvbnRlbnRDaGlsZHJlbiAqL1xuICAgIC8qIGJsYXpvckluY2x1ZGUgKi9cbiAgICAvKiBibGF6b3JUcmVhdEFzQ29sbGVjdGlvbiAqL1xuICAgIC8qIGJsYXpvckNvbGxlY3Rpb25OYW1lOiBBY3Rpb25TdHJpcENvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uSXRlbU5hbWU6IEFjdGlvblN0cmlwICovXG4gICAgLyogbmdRdWVyeUxpc3ROYW1lOiBhY3Rpb25TdHJpcENvbXBvbmVudHMgKi9cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEFjdGlvblN0cmlwVG9rZW4pXG4gICAgcHJvdGVjdGVkIGFjdGlvblN0cmlwQ29tcG9uZW50czogUXVlcnlMaXN0PElneEFjdGlvblN0cmlwVG9rZW4+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBhY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uU3RyaXBDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5RmlsdGVyZWRHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RW1wdHlHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdExvYWRpbmdHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHBhcmVudFZpcnREaXI6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnksIGFueVtdPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGhlYWRTZWxlY3RvcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgcm93U2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0Pj47XG5cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB1c2VkIGZvciByb3cgZHJhZyBnaG9zdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSB8fCB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIHJvdyBkcmFnIGdob3N0LlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RHJhZ0dob3N0PlxuICAgICAqICAgIDxpZ3gtaWNvbj5tZW51PC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55LCBhbnlbXT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsSG9sZGVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbDogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueSwgYW55W10+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzY3InLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBzY3I6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyU2VsZWN0b3JCYXNlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2Zvb3RlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBmb290ZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3c/LmhlYWRlckZvck9mO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyU2VsZWN0b3JDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJTZWxlY3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckRyYWdDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJEcmFnQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJHcm91cENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ1JvdygpOiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3c/LmZpbHRlclJvdztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRoZWFkUm93OiBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkR3JvdXBCeUFyZWFDb21wb25lbnQpXG4gICAgcHVibGljIGdyb3VwQXJlYTogSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRib2R5OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkQm9keURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgdGJvZHlDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BpbkNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBwaW5Db250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Rmb290JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGZvb3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hSb3dFZGl0aW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsIHsgcmVhZDogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG1wT3V0bGV0czogUXVlcnlMaXN0PGFueT4gPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkcmFnSW5kaWNhdG9ySWNvbkJhc2UnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25CYXNlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRDdXN0b21EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRUZXh0RGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGVkaXQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRleHRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRUZXh0VGVtcGxhdGUgfHwgdGhpcy5yb3dFZGl0VGV4dERpcmVjdGl2ZXM/LmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdFRleHQgbGV0LXJvd0NoYW5nZXNDb3VudD5cbiAgICAgKiBDaGFuZ2VzOiB7e3Jvd0NoYW5nZXNDb3VudH19XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93RWRpdFRleHRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCByb3dFZGl0VGV4dFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0VkaXRUZXh0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93QWRkVGV4dERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dBZGRUZXh0OiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGFkZCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dBZGRUZXh0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dBZGRUZXh0VGVtcGxhdGUgfHwgdGhpcy5yb3dBZGRUZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgYWRkIHRleHQgdGVtcGxhdGUuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hSb3dBZGRUZXh0PlxuICAgICAqIEFkZGluZyBSb3dcbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5yb3dBZGRUZXh0VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93QWRkVGV4dFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0FkZFRleHRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGVkaXQgYWN0aW9ucyB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdEFjdGlvbnNUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRBY3Rpb25zVGVtcGxhdGUgfHwgdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM/LmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCBhY3Rpb25zIHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdEFjdGlvbnMgbGV0LWVuZFJvd0VkaXQ+XG4gICAgICogICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiBpZ3hSb3dFZGl0VGFiU3RvcCAoY2xpY2spPVwiZW5kUm93RWRpdChmYWxzZSlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgKiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJlbmRSb3dFZGl0KHRydWUpXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5yb3dFZGl0QWN0aW9uc1RlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0VkaXRBY3Rpb25zVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwcm90ZWN0ZWQgcm93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGV4cGFuZCBpbmRpY2F0b3IgdGVtcGxhdGUuXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMucm93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hSb3dFeHBhbmRlZEluZGljYXRvcj5cbiAgICAgKiAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIj5yZW1vdmU8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHJvdGVjdGVkIHJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgY29sbGFwc2UgaW5kaWNhdG9yIHRlbXBsYXRlLlxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMucm93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hSb3dDb2xsYXBzZWRJbmRpY2F0b3I+XG4gICAgICogIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+YWRkPC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hIZWFkZXJFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBoZWFkZXJFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuaGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoZWFkZXIgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hIZWFkZXJFeHBhbmRlZEluZGljYXRvcj5cbiAgICAgKiAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIj5yZW1vdmU8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuaGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IGhlYWRlckV4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBoZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJDb2xsYXBzZUluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hIZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3I+XG4gICAgICogIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+YWRkPC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmhlYWRlckNvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkKElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGV4Y2VsIHN0eWxlIGhlYWRlciBpY29uLlxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSB8fCB0aGlzLmV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXhjZWwgc3R5bGUgaGVhZGVyIGljb24uXG4gICAgICpgYGBodG1sXG4gICAgICo8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneEV4Y2VsU3R5bGVIZWFkZXJJY29uPlxuICAgICAqIDxpZ3gtaWNvbj5maWx0ZXJfYWx0PC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICovXG4gICAgcHVibGljIHNldCBleGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBzb3J0ZWQgaW4gYXNjIG9yZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGFzYyBvcmRlci5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFNvcnRBc2NlbmRpbmdIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj5leHBhbmRfbGVzczwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3NvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnREZXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGRlc2Mgb3JkZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGRlc2Mgb3JkZXIuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb24+XG4gICAgICogICAgPGlneC1pY29uPmV4cGFuZF9tb3JlPC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnRIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHNvcnRIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBub3Qgc29ydGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0SGVhZGVySWNvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgbm90IHNvcnRlZC5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFNvcnRIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj51bmZvbGRfbW9yZTwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnRIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3NvcnRIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hEcmFnSW5kaWNhdG9ySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUpXG4gICAgcHVibGljIHJvd0VkaXRUYWJzREVGQVVMVDogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0NVU1RPTTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncm93RWRpdGluZ092ZXJsYXknLCB7IHJlYWQ6IElneFRvZ2dsZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0aW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgaG9zdFJvbGUgPSAnZ3JpZCc7XG5cbiAgICAvKiBjb250ZW50Q2hpbGRyZW4gKi9cbiAgICAvKiBibGF6b3JJbmNsdWRlICovXG4gICAgLyogYmxhem9yVHJlYXRBc0NvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uTmFtZTogR3JpZFRvb2xiYXJDb2xsZWN0aW9uICovXG4gICAgLyogbmdRdWVyeUxpc3ROYW1lOiB0b29sYmFyICovXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hUb29sYmFyVG9rZW4pXG4gICAgcHVibGljIHRvb2xiYXI6IFF1ZXJ5TGlzdDxJZ3hHcmlkVG9vbGJhckNvbXBvbmVudD47XG5cbiAgICAvKiBjb250ZW50Q2hpbGRyZW4gKi9cbiAgICAvKiBibGF6b3JJbmNsdWRlICovXG4gICAgLyogYmxhem9yVHJlYXRBc0NvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uTmFtZTogUGFnaW5hdG9yQ29sbGVjdGlvbiAqL1xuICAgIC8qIG5nUXVlcnlMaXN0TmFtZTogcGFnaW5hdGlvbkNvbXBvbmVudHMgKi9cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFBhZ2luYXRvclRva2VuKVxuICAgIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29tcG9uZW50czogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfb3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBAaWd4RWxlbWVudHNBbmNob3JcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzaW5rJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgYW5jaG9yOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3N1bW1hcnlSb3cnLCB7IHJlYWQ6IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgX3N1bW1hcnlSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4U3VtbWFyeVJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdyb3cnKVxuICAgIHByaXZhdGUgX3Jvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFJvdycpXG4gICAgcHJpdmF0ZSBfcGlubmVkUm93TGlzdDogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0Um93RWRpdFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBkZWZhdWx0Um93RWRpdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0RpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dEaXJlY3RpdmUgfSlcbiAgICBwcml2YXRlIF9kYXRhUm93TGlzdDogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT47XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkJylcbiAgICBwcm90ZWN0ZWQgYmFzZUNsYXNzID0gJ2lneC1ncmlkJztcblxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElHcmlkUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElHcmlkUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBsb2dpYyBvZiB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBBTkQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZmlsdGVyaW5nTG9naWNdPVwiZmlsdGVyaW5nXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nTG9naWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdMb2dpYyh2YWx1ZTogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyogbXVzdFNldEluQ29kZVBsYXRmb3JtczogV2ViQ29tcG9uZW50cztCbGF6b3IgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpXT1cIm1vZGVsLmZpbHRlcmluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgYmluZGluZy5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICghKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdID0gbmV3RXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuUmVndWxhcjtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWZyZXNoRXhwcmVzc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSB0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICogdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbG9naWM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdFdmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zOiB2YWx1ZSxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmZpbHRlcmluZy5lbWl0KGZpbHRlcmluZ0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGZpbHRlcmluZ0V2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuQWR2YW5jZWQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBsb2NhbGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBzZXQsIHJldHVybnMgYnJvd3NlcidzIGxhbmd1YWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZUNoYW5nZS5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ01vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKHZhbDogR3JpZFBhZ2luZ01vZGUpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nTW9kZSA9IHZhbDtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvcj8ucGFnZSB8fCAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wZXJQYWdlIHx8IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgcm93IHNlbGVjdG9ycyBhcmUgaGlkZGVuLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgQnkgZGVmYXVsdCByb3cgc2VsZWN0b3JzIGFyZSBzaG93blxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgaGlkZVJvd1NlbGVjdG9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoaWRlUm93U2VsZWN0b3JzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHJvd3MgY2FuIGJlIG1vdmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtyb3dEcmFnZ2FibGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCByb3dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dEcmFnICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dEcmFnZ2FibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Jvd0RyYWcgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRyaWdnZXIgZm9yIHZhbGlkYXRvcnMgdXNlZCB3aGVuIGVkaXRpbmcgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgdmFsaWRhdGlvblRyaWdnZXI9J2JsdXInPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmFsaWRhdGlvblRyaWdnZXI6IEdyaWRWYWxpZGF0aW9uVHJpZ2dlciA9ICdjaGFuZ2UnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGRyYWdSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgcm93cyBhcmUgZWRpdGFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbcm93RWRpdGFibGVdPVwidHJ1ZVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCByb3dFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93RWRpdGFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93RWRpdGFibGUgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgcHVibGljIGdldCBob3N0V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCB8fCB0aGlzLl9ob3N0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcldpZHRoKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIC0gMTc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtyb3dIZWlnaHRdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQgPyB0aGlzLl9yb3dIZWlnaHQgOiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dIZWlnaHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGVmYXVsdCB3aWR0aCBvZiB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbY29sdW1uV2lkdGhdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbldpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uV2lkdGggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA9IHRydWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQvU2V0cyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5R3JpZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZW1wdHlHcmlkTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlHcmlkTWVzc2FnZSB8fCB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9lbXB0eUdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBpcyBnb2luZyB0byBzaG93IGEgbG9hZGluZyBpbmRpY2F0b3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNldCBpc0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9hZGluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzTG9hZGluZyA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKiBtdXN0U2V0SW5Db2RlUGxhdGZvcm1zOiBXZWJDb21wb25lbnRzO0JsYXpvcjtSZWFjdCAqL1xuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaW5pdGlhbCBwaW5uaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsbG93cyB0byBhcHBseSBwaW5uaW5nIHRoZSBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciB0aGUgZW5kLlxuICAgICAqIE5vdGUgdGhhdCBwaW5uaW5nIHRvIGJvdGggc2lkZXMgYXQgYSB0aW1lIGlzIG5vdCBhbGxvd2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmluZ109XCJwaW5uaW5nQ29uZmlnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5pbmc7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uaW5nID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dGaWx0ZXJpbmddPVwidHJ1ZVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBhbGxvd0ZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93RmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93QWR2YW5jZWRGaWx0ZXJpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBhbGxvd0FkdmFuY2VkRmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlciBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidxdWlja0ZpbHRlcidcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCdzIHNldCB0byBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUodmFsdWU6IEZpbHRlck1vZGUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBGaWx0ZXJNb2RlLmV4Y2VsU3R5bGVGaWx0ZXI6XG4gICAgICAgICAgICBjYXNlIEZpbHRlck1vZGUucXVpY2tGaWx0ZXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyTW9kZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN1bW1hcnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeVBvc2l0aW9uPVwidG9wXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgYm90dG9tLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5UG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdW1tYXJ5UG9zaXRpb24odmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVBvc2l0aW9uID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBjYWxjdWxhdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHN1bW1hcnlDYWxjdWxhdGlvbk1vZGU9XCJyb290TGV2ZWxPbmx5XCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgcm9vdEFuZENoaWxkTGV2ZWxzIHdoaWNoIG1lYW5zIHRoZSBzdW1tYXJpZXMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRoZSByb290IGxldmVsIGFuZCBlYWNoIGNoaWxkIGxldmVsLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUodmFsdWU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXNldFN1bW1hcnlIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHN1bW1hcnkgcm93IGlzIHZpc2libGUgd2hlbiBncm91cEJ5L3BhcmVudCByb3cgaXMgY29sbGFwc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93U3VtbWFyeU9uQ29sbGFwc2VdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSBpcyBzZXQgdG8gJ2ZhbHNlJyB3aGljaCBtZWFucyB0aGF0IHRoZSBzdW1tYXJ5IHJvdyBpcyBub3QgdmlzaWJsZVxuICAgICAqIHdoZW4gdGhlIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93U3VtbWFyeU9uQ29sbGFwc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyU3RyYXRlZ3ldPVwiZmlsdGVyU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJTdHJhdGVneSgpOiBJRmlsdGVyaW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJTdHJhdGVneShjbGFzc1JlZjogSUZpbHRlcmluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlclN0cmF0ZWd5ID0gY2xhc3NSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc29ydFN0cmF0ZWd5XT1cInNvcnRTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRTdHJhdGVneSgpOiBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0U3RyYXRlZ3kodmFsdWU6IElHcmlkU29ydGluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdTdHJhdGVneSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBvcHRpb25zIC0gc2luZ2xlIG9yIG11bHRpcGxlIHNvcnRpbmcuXG4gICAgICogQWNjZXB0cyBhbiBgSVNvcnRpbmdPcHRpb25zYCBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIGBtb2RlYCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgX3NvcnRpbmdPcHRpb25zOiBJU29ydGluZ09wdGlvbnMgPSB7XG4gICAgICogICAgICBtb2RlOiAnc2luZ2xlJ1xuICAgICAqIH1cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtzb3J0aW5nT3B0aW9uc109XCJzb3J0aW5nT3B0aW9uc1wiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc29ydGluZ09wdGlvbnModmFsdWU6IElTb3J0aW5nT3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNvcnQgb25seSBpZiBvcHRpb24gaXMgY2hhbmdlZCBydW50aW1lLiBObyBuZWVkIHRvIGNsZWFyIG9uIGluaXRpYWwgbG9hZC5cbiAgICAgICAgICAgIHRoaXMuY2xlYXJTb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydGluZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NvcnRpbmdPcHRpb25zLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdPcHRpb25zO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckJ5VmFsdWVBcnJheSAqL1xuICAgIC8qIGJsYXpvckFsd2F5c1dyaXRlYmFjayAqL1xuICAgIC8qIEB0c1R3b1dheVByb3BlcnR5ICh0cnVlLCBcIlJvd1NlbGVjdGlvbkNoYW5naW5nXCIsIFwiRGV0YWlsLk5ld1NlbGVjdGlvblwiLCBmYWxzZSkgKi9cbiAgICAvKiBibGF6b3JQcmltaXRpdmVWYWx1ZSAqL1xuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIHJvd3MnIElEcyAocHJpbWFyeSBrZXkgb3Igcm93RGF0YSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgcHJpbWFyeUtleT1cIklEXCIgcm93U2VsZWN0aW9uPVwibXVsdGlwbGVcIiBbc2VsZWN0ZWRSb3dzXT1cIlswLCAxLCAyXVwiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyB8fCBbXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJvd3MoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkUm93cygpO1xuICAgIH1cblxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoZWFkZXJHcm91cHNMaXN0KCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2VsbExpc3QoKTogSWd4R3JpZEhlYWRlckNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoaGVhZGVyR3JvdXAgPT4gaGVhZGVyR3JvdXAuaGVhZGVyKS5maWx0ZXIoaGVhZGVyID0+IGhlYWRlcik7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJDZWxsTGlzdCgpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZmlsdGVyKS5maWx0ZXIoY2VsbCA9PiBjZWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzUm93TGlzdCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxhbnk+KCk7XG4gICAgICAgIGlmICghdGhpcy5fc3VtbWFyeVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3VtTGlzdCA9IHRoaXMuX3N1bW1hcnlSb3dMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCk7XG4gICAgICAgIHJlcy5yZXNldChzdW1MaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBjc1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBJZ3hHcmlkUm93Q29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJvd0xpc3QgPSB0aGlzLmdyaWQucm93TGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPigpO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9yb3dMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBjc1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGN1cnJlbnRseSByZW5kZXJlZCBgSWd4R3JpZFJvd0NvbXBvbmVudGAncy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGFMaXN0ID0gdGhpcy5ncmlkLmRhdGFSb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVJvd0xpc3QoKTogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhUm93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByTGlzdCA9IHRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgcm93IHNlbGVjdG9yIHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRTZWxlY3RvclRlbXBsYXRlIHx8IHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGVhZGVyIHJvdyBzZWxlY3RvciB0ZW1wbGF0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hIZWFkU2VsZWN0b3IgbGV0LWhlYWRDb250ZXh0PlxuICAgICAqIHt7IGhlYWRDb250ZXh0LnNlbGVjdGVkQ291bnQgfX0gLyB7eyBoZWFkQ29udGV4dC50b3RhbENvdW50ICB9fVxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuaGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGVhZFNlbGVjdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5faGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Bpbm5pbmdUb1N0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uaW5nLmNvbHVtbnMgIT09IENvbHVtblBpbm5pbmdQb3NpdGlvbi5FbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dQaW5uaW5nVG9Ub3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcucm93cyAhPT0gUm93UGlubmluZ1Bvc2l0aW9uLkJvdHRvbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgc2VsZWN0b3IgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdG9yVGVtcGxhdGUgfHwgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXM/LmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgcm93IHNlbGVjdG9ycy5cbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFJvd1NlbGVjdG9yIGxldC1yb3dDb250ZXh0PlxuICAgICAgICAgKiAgICA8aWd4LWNoZWNrYm94IFtjaGVja2VkXT1cInJvd0NvbnRleHQuc2VsZWN0ZWRcIj48L2lneC1jaGVja2JveD5cbiAgICAgICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgICAgICogdGhpcy5ncmlkLnJvd1NlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgcHVibGljIHNldCByb3dTZWxlY3RvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdEN1c3RvbSA/IHRoaXMucm93RWRpdEN1c3RvbSA6IHRoaXMuZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIHJvdyBkcmFnIGluZGljYXRvciBpY29uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXN0b21EcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlIHx8IHRoaXMuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZXM/LmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgcm93IGRyYWcgaW5kaWNhdG9yIGljb24uXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hEcmFnSW5kaWNhdG9ySWNvbj5cbiAgICAgKiAgICA8aWd4LWljb24+ZXhwYW5kX2xlc3M8L2lneC1pY29uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlKHZhbDogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9jdXN0b21EcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhc3RFZGl0YWJsZUNvbHVtbkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lZGl0YWJsZSlcbiAgICAgICAgICAgIC5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gaW5kZXgubGVuZ3RoID8gaW5kZXhbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogTmF2IHNlcnZpY2UgbG9naWMgZG9lc24ndCBoYW5kbGUgMCByZXN1bHRzIGZyb20gdGhpcyBxdWVyeWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRUYWJzKCk6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0VGFic0NVU1RPTS5sZW5ndGggPyB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NIDogdGhpcy5yb3dFZGl0VGFic0RFRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBhY3RpdmVEZXNjZW5kYW50KCkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtID0gdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtIHx8ICFPYmplY3Qua2V5cyhhY3RpdmVFbGVtKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW0ucm93IDwgMCA/XG4gICAgICAgICAgICBgJHt0aGlzLmlkfV8ke2FjdGl2ZUVsZW0ucm93fV8ke2FjdGl2ZUVsZW0ubWNoQ2FjaGUubGV2ZWx9XyR7YWN0aXZlRWxlbS5jb2x1bW59YCA6XG4gICAgICAgICAgICBgJHt0aGlzLmlkfV8ke2FjdGl2ZUVsZW0ucm93fV8ke2FjdGl2ZUVsZW0uY29sdW1ufWA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBiYW5uZXJDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3AgPyAnaWd4LWJhbm5lcl9fYm9yZGVyLXRvcCcgOiAnaWd4LWJhbm5lcl9fYm9yZGVyLWJvdHRvbSc7XG4gICAgICAgIHJldHVybiBgaWd4LWJhbm5lciAke3Bvc2l0aW9ufWA7XG4gICAgfVxuXG4gICAgLyogbXVzdFNldEluQ29kZVBsYXRmb3JtczogV2ViQ29tcG9uZW50cztCbGF6b3I7UmVhY3QgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgZGF0YSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhzb3J0aW5nRXhwcmVzc2lvbnMpXT1cIm1vZGVsLnNvcnRpbmdFeHByZXNzaW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmdFeHByZXNzaW9ucygpOiBJU29ydGluZ0V4cHJlc3Npb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0aW5nRXhwcmVzc2lvbnModmFsdWU6IElTb3J0aW5nRXhwcmVzc2lvbltdKSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyA9IGNsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICB0aGlzLnNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZS5lbWl0KHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhMZXZlbEhlYWRlckRlcHRoKCkge1xuICAgICAgICBpZiAodGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLmxldmVsKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGhpZGRlbiBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGlkZGVuQ29sID0gdGhpcy5ncmlkLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICAgKiBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkdyb3VwID09PSBmYWxzZSAmJiBjb2wuaGlkZGVuID09PSB0cnVlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBpbm5lZCBjb2x1bW5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5MYXlvdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBoYXMgYmF0Y2ggZWRpdGluZyBlbmFibGVkLlxuICAgICAqIFdoZW4gYmF0Y2ggZWRpdGluZyBpcyBlbmFibGVkLCBjaGFuZ2VzIGFyZSBub3QgbWFkZSBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqIEluc3RlYWQsIHRoZXkgYXJlIHN0b3JlZCBhcyB0cmFuc2FjdGlvbnMsIHdoaWNoIGNhbiBsYXRlciBiZSBjb21taXR0ZWQgdy8gdGhlIGBjb21taXRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbYmF0Y2hFZGl0aW5nXT1cInRydWVcIiBbZGF0YV09XCJzb21lRGF0YVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBiYXRjaEVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXRjaEVkaXRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBiYXRjaEVkaXRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwgIT09IHRoaXMuX2JhdGNoRWRpdGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX2JhdGNoRWRpdGluZyA9IHZhbDtcbiAgICAgICAgICAgIHRoaXMuc3dpdGNoVHJhbnNhY3Rpb25TZXJ2aWNlKHZhbCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBibGF6b3JTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5fZGlUcmFuc2FjdGlvbnMgJiYgIXRoaXMuYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlUcmFuc2FjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY2VsbCBzZWxlY3Rpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBtdWx0aXBsZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjZWxsU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjZWxsU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgLy8gaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICAvLyBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBwYWdpbmdTdGF0ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdTdGF0ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHZhbHVlLm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnaW5nU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0TWVzc2FnZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNXaWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNIZWlnaHQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRmb290SGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIGxhc3Qgc2VhcmNoIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdFNlYXJjaEluZm8oKTogSVNlYXJjaEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uV2lkdGhTZXRCeVVzZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5uZWRSZWNvcmRzOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZXNpemVOb3RpZnkgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJvd0FkZGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByb3dEZWxldGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlck5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhOiBhbnlbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9maWx0ZXJlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF90b3RhbFJlY29yZHMgPSAtMTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5zV2l0aE5vU2V0V2lkdGhzID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nUGlwZVRyaWdnZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcnlQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ3JvdXBhYmxlUGlwZVRyaWdnZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIEVNUFRZX0RBVEEgPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBHcmlkVHlwZVtcInR5cGVcIl0ge1xuICAgICAgICByZXR1cm4gJ2ZsYXQnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfYmFzZUZvbnRTaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ01vZGUgPSBHcmlkUGFnaW5nTW9kZS5Mb2NhbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wYWdpbmdTdGF0ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oaWRlUm93U2VsZWN0b3JzID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcm93RHJhZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF91bnBpbm5lZENvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NvcnRpbmdFeHByZXNzaW9uczogQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPiA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbkhpZGluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtblBpbm5pbmcgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfcGlubmVkUmVjb3JkSURzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICBwcm90ZWN0ZWQgX2FsbG93RmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJNb2RlOiBGaWx0ZXJNb2RlID0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjtcblxuXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyID0gMTA7XG4gICAgcHJvdGVjdGVkIF9leHBhbnNpb25TdGF0ZXM6IE1hcDxhbnksIGJvb2xlYW4+ID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgcHJvdGVjdGVkIF9pbml0ID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX2ZpcnN0QXV0b1Jlc2l6ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9hdXRvU2l6ZUNvbHVtbnNOb3RpZnkgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCBfY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3VzZXJPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG4gICAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+O1xuICAgIHByb3RlY3RlZCBfYmF0Y2hFZGl0aW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zb3J0aW5nT3B0aW9uczogSVNvcnRpbmdPcHRpb25zID0geyBtb2RlOiAnbXVsdGlwbGUnIH07XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJTdHJhdGVneTogSUZpbHRlcmluZ1N0cmF0ZWd5ID0gbmV3IEZpbHRlcmluZ1N0cmF0ZWd5KCk7XG4gICAgcHJvdGVjdGVkIF9hdXRvR2VuZXJhdGVkQ29scyA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGF0YVZpZXcgPSBbXTtcbiAgICBwcm90ZWN0ZWQgX2xhc3RTZWFyY2hJbmZvOiBJU2VhcmNoSW5mbyA9IHtcbiAgICAgICAgc2VhcmNoVGV4dDogJycsXG4gICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdLFxuICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICBjb250ZW50OiAnJ1xuICAgIH07XG4gICAgcHJvdGVjdGVkIGdyaWRDb21wdXRlZFN0eWxlcztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGFnaW5hdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uQ29tcG9uZW50cz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbE5hdGl2ZVNpemUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yb3dFZGl0YWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2N1cnJlbnRSb3dTdGF0ZTogYW55O1xuICAgIHByaXZhdGUgX2ZpbHRlcmVkU29ydGVkRGF0YSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93U2VsZWN0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX2hlYWRTZWxlY3RvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRUZXh0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93QWRkVGV4dFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX2hlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgcHJpdmF0ZSBfY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKEdyaWRSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBfZW1wdHlHcmlkTWVzc2FnZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgICBwcml2YXRlIG92ZXJsYXlJRHMgPSBbXTtcbiAgICBwcml2YXRlIF9zb3J0aW5nU3RyYXRlZ3k6IElHcmlkU29ydGluZ1N0cmF0ZWd5O1xuICAgIHByaXZhdGUgX3Bpbm5pbmc6IElQaW5uaW5nQ29uZmlnID0geyBjb2x1bW5zOiBDb2x1bW5QaW5uaW5nUG9zaXRpb24uU3RhcnQgfTtcbiAgICBwcml2YXRlIF9zaG91bGRSZWNhbGNSb3dIZWlnaHQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2hvc3RXaWR0aDtcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdQb3NpdGlvblNldHRpbmdzKSxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5MaXN0RGlmZmVyO1xuICAgIHByaXZhdGUgcm93TGlzdERpZmZlcjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfcm93SGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZvck9mczogQXJyYXk8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueSwgYW55W10+PiA9IFtdO1xuICAgIHByaXZhdGUgX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IDE7XG4gICAgLy8gQ2FjaGVzXG4gICAgcHJpdmF0ZSBfdG90YWxXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF9waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfcGlubmVkV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF92aXNpYmxlQ29sdW1ucyA9IFtdO1xuICAgIHByaXZhdGUgX2NvbHVtbkdyb3VwcyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY29sdW1uV2lkdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3N1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbiA9IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tO1xuICAgIHByaXZhdGUgX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdEFuZENoaWxkTGV2ZWxzO1xuICAgIHByaXZhdGUgX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N1bW1hcnlSb3dIZWlnaHQgPSAwO1xuICAgIHByaXZhdGUgX2NlbGxTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlO1xuICAgIHByaXZhdGUgX3Jvd1NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICBwcml2YXRlIF9zZWxlY3RSb3dPbkNsaWNrID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG5cbiAgICBwcml2YXRlIGxhc3RBZGRlZFJvd0luZGV4O1xuICAgIHByaXZhdGUgX2N1cnJlbmN5UG9zaXRpb25MZWZ0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneSA9IG5ldyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG91dGxldDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3lcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkNoYW5nZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3JlbmRlcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBEUkFHX1NDUk9MTF9ERUxUQSA9IDEwO1xuICAgIHByaXZhdGUgX2RhdGFDbG9uZVN0cmF0ZWd5OiBJRGF0YUNsb25lU3RyYXRlZ3kgPSBuZXcgRGVmYXVsdERhdGFDbG9uZVN0cmF0ZWd5KCk7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zb3J0SGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuICAgIHByaXZhdGUgX3NvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZ3JpZFNpemU6IFNpemUgPSBTaXplLkxhcmdlO1xuICAgIHByaXZhdGUgX2RlZmF1bHRSb3dIZWlnaHQgPSA1MDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBtaW5Db2x1bW5XaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIE1JTklNVU1fQ09MVU1OX1dJRFRIO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaXNDdXN0b21TZXRSb3dIZWlnaHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4odGhpcy5fcm93SGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIC8qIGJsYXpvclN1cHByZXNzICovXG4gICAgcHVibGljIGFic3RyYWN0IGRhdGE6IGFueVtdIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBkYXRhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBzb3J0ZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlcmVkU29ydGVkRGF0YSA9IHRoaXMuZ3JpZDEuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWRTb3J0ZWREYXRhKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93Q2hhbmdlc0NvdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2Uucm93KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmID0gKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlcyA9IDA7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IGlzT2JqZWN0KG9ialtrZXldKSA/IGNoYW5nZXMgKz0gZihvYmpba2V5XSkgOiBjaGFuZ2VzKyspO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZSh0aGlzLmNydWRTZXJ2aWNlLnJvdy5pZCk/LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+IGMuZmllbGQpLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByb3dDaGFuZ2VzID8gZihyb3dDaGFuZ2VzKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cygpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xvbmVBcnJheSh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZENoYW5nZXModHJ1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiB0Lm5ld1ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkU2VydmljZS5yb3cgJiYgdGhpcy5jcnVkU2VydmljZS5yb3cuZ2V0Q2xhc3NOYW1lKCkgPT09IElneEFkZFJvdy5uYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmluZGV4LCAwLCB0aGlzLmNydWRTZXJ2aWNlLnJvdy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkID8gdGhpcy5kYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MubGVuZ3RoIDogdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlciB8fCB0aGlzLmhhc05vRGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgPyB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgOiB0aGlzLmxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzWmVyb1Jlc3VsdEZpbHRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc05vRGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRPdmVybGF5TG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nICYmICF0aGlzLmhhc05vRGF0YSAmJiAhdGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZVxuICAgICAgICAgICAgfHwgdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlQ2FzY2FkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dTZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ2VsbFNlbGVjdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkluRHJhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5jbXMuY29sdW1uO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGlvbjogSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvblNlcnZpY2U6IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfU0VSVklDRV9CQVNFKSBwdWJsaWMgcmVhZG9ubHkgZ3JpZEFQSTogR3JpZFNlcnZpY2VUeXBlLFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50OiBhbnksXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgICAgICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJvdGVjdGVkIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBwdWJsaWMgbmF2aWdhdGlvbjogSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCB0ZXh0SGlnaGxpZ2h0U2VydmljZTogSWd4VGV4dEhpZ2hsaWdodFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgICAgICBwdWJsaWMgc3VtbWFyeVNlcnZpY2U6IElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgX2RpVHJhbnNhY3Rpb25zPzogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5sb2NhbGVJZDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgICAgIElnY1RyaWFsV2F0ZXJtYXJrLnJlZ2lzdGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBoaWRlQWN0aW9uU3RyaXAoKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJGZWF0dXJlc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGV0YWlsUmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHcm91cEJ5UmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR2hvc3RSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5naG9zdFJlY29yZCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FkZFJvd1JlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmFkZFJvdyAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgYSByb3cgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZ1bGwgdmlldyBkYXRhIGxpa2UgcGlubmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgcGlubmVkKSB7XG4gICAgICAgIGlmIChwaW5uZWQgJiYgIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaW5uZWQgJiYgdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdmlydHVhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIHRoZSBzdGFydCBpbmRleCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgcmVuZGVyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFZpcnRTdGF0ZSA9IHRoaXMuZ3JpZDEudmlydHVhbGl6YXRpb25TdGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZU92ZXJsYXlzKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXk/LnZpc2libGUgJiYgIW92ZXJsYXkuY2xvc2VBbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZShvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGRhdGFWaWV3YCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMudW5waW5uZWREYXRhVmlldy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGZpbHRlcmVkU29ydGVkRGF0YWAgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkKHJlYykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIFJldHVybnMgdGhlIHJlY29yZCBpbmRleCBpbiBvcmRlciBvZiBwaW5uaW5nIGJ5IHRoZSB1c2VyLiBEb2VzIG5vdCBjb25zaWRlciBzb3J0aW5nL2ZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2lkKHJlYyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUGlubmVkUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJlY29yZHNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3J1ZFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuY3J1ZFNlcnZpY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBTZXJ2aWNlcygpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbi5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbi5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3NldHVwTGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBkZXN0cnVjdG9yID0gdGFrZVVudGlsPGFueT4odGhpcy5kZXN0cm95JCk7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcpLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUpLCBkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2UuY2VsbCAmJlxuICAgICAgICAgICAgICAgICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAoKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gdGhpcy5kYXRhVmlldy5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICEodGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0VkaXRpbmdCbG9ja2VkICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dBZGRlZE5vdGlmaWVyLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5yZWZyZXNoR3JpZFN0YXRlKGFyZ3MpKTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGVkTm90aWZpZXIucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksXG4gICAgICAgICAgICB0aHJvdHRsZVRpbWUoNDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGVzdHJ1Y3RvclxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IHRyaWdnZXIgcmVmbG93IGlmIGVsZW1lbnQgaXMgZGV0YWNoZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JpZFNpemUgIT09IHRoaXMuZ3JpZFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2l6aW5nIG9jY3VycyBkdWUgdG8gdGhlIGNoYW5nZSBvZiAtLWlnLXNpemUgY3NzIHZhclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JpZFNpemUgPSB0aGlzLmdyaWRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0Um93SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZSA9IHRoaXMuaXNQZXJjZW50SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCAhPT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlck5vdGlmaWVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5waXBlVHJpZ2dlcisrKTtcbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZpbmdFbmQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0aWFsaXplKHRoaXMgYXMgYW55LCB0aGlzLm92ZXJsYXlTZXJ2aWNlLCBldmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9wZW5lZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5ncyA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQoZXZlbnQuaWQpPy5zZXR0aW5ncztcblxuICAgICAgICAgICAgLy8gZG8gbm90IGhpZGUgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBvdmVybGF5IG9uIHNjcm9sbFxuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5sYXN0QWN0aXZlTm9kZSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5xdWVyeUJ1aWxkZXIuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpO1xuICAgICAgICAgICAgaWYgKGluZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlJRHMuc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5naW5nLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5oZWFkZXJDb250YWluZXIudXBkYXRlU2Nyb2xsKCkpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5zY3JvbGxiYXJWaXNpYmlsaXR5Q2hhbmdlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzY3JvbGxiYXIgdmlzaWJpbGl0eSBhbmQgcmVjYWxjIGhlaWdodHNcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jb250ZW50U2l6ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRocm90dGxlVGltZSgzMCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG5vdGlmaWVyIGZvciBjb2x1bW4gYXV0b3NpemUgcmVxdWVzdHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVDb2x1bW5zTm90aWZ5LnBpcGUoXG4gICAgICAgICAgICB0aHJvdHRsZVRpbWUoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGVzdHJ1Y3RvclxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0QXV0b1Jlc2l6ZSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLl9zZXR1cFNlcnZpY2VzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMucm93TGlzdERpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIGNvbXBhcmUgYmFzZWQgb24gZmllbGQsIG5vdCBvbiBvYmplY3QgcmVmLlxuICAgICAgICB0aGlzLmNvbHVtbkxpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKChpbmRleCwgY29sOiBDb2x1bW5UeXBlKSA9PiBjb2wuZmllbGQpO1xuICAgICAgICB0aGlzLmNhbGNXaWR0aCA9IHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIDogMDtcbiAgICAgICAgdGhpcy5zaG91bGRHZW5lcmF0ZSA9IHRoaXMuYXV0b0dlbmVyYXRlO1xuICAgICAgICB0aGlzLmdyaWRDb21wdXRlZFN0eWxlcyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5zQ2FjaGVzKCkge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5yZXNldENhY2hlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVJvd0lEKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gdGhpcy5wcmltYXJ5S2V5KTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdGhpcy5kYXRhLmxlbmd0aCA/XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVEYXRhVHlwZXModGhpcy5kYXRhWzBdW3RoaXMucHJpbWFyeUtleV0pIDogcHJpbWFyeUNvbHVtbiA/IHByaW1hcnlDb2x1bW4uZGF0YVR5cGUgOiAnc3RyaW5nJztcbiAgICAgICAgcmV0dXJuIGlkVHlwZSA9PT0gJ3N0cmluZycgPyB1dWlkdjQoKSA6IEZBS0VfUk9XX0lELS07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldEZvck9mQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlydFJvdyA9IHRoaXMuZGF0YVJvd0xpc3QuZmlyc3Q7XG4gICAgICAgIGlmIChmaXJzdFZpcnRSb3cpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdFZpcnRSb3cudmlydERpclJvdy5hc3N1bWVNYXN0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVyZWREYXRhKGRhdGEsIHBpbm5lZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmIHBpbm5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkVW5waW5uZWQgPSB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFsuLi4gdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhLCAuLi5maWx0ZXJlZFVucGlubmVkXTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5sZW5ndGggPiAwID8gZmlsdGVyZWREYXRhIDogdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICFwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVkV2lkdGhzKCkge1xuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IE5hTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHJlY2FsY0ZlYXR1cmVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbnNDYWNoZXMoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JPZkNhY2hlKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5fY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuY29sdW1uR3JvdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5zb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnNvcnRIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB0aGlzLnRvb2xiYXIuY2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKSk7XG4gICAgICAgIHRoaXMuc2V0VXBQYWdpbmF0b3IoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRVcFBhZ2luYXRvcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAubWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSZWJpbmRpbmcoZXZlbnQ6IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncykge1xuICAgICAgICBpZiAoZXZlbnQuc3RhdGUuY2h1bmtTaXplID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlY2FsY1Jvd0hlaWdodCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdpbmcuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYm91bmQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkUmVjYWxjUm93SGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWNhbGNSb3dIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGVmYXVsdFJvd0hlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlckRyb3Bkb3duKGNvbHVtbjogQ29sdW1uVHlwZSwgb3B0aW9uczogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIG9wdGlvbnMub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG4gICAgICAgIGlmICh0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5pbml0aWFsaXplKGNvbHVtbiwgdGhpcy5vdmVybGF5U2VydmljZSk7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5vdmVybGF5Q29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB0aGlzLnZpZXdSZWYsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNldFVwUGFnaW5hdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VDaGFuZ2UucGlwZSh0YWtlV2hpbGUoKCkgPT4gISF0aGlzLnBhZ2luYXRvciksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZUNoYW5nZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkU29ydGVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgIGlmICh0aGlzLnBpbm5lZFJlY29yZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGlmIChwaW5uZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMucGlubmVkUmVjb3JkcyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/IFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGFdIDpcbiAgICAgICAgICAgICAgICAgICAgWy4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YV07XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWlsZERhdGFWaWV3KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZSB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpLFxuICAgICAgICAgICAgLi4udGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdylcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBSb3dPYnNlcnZlcnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlIHwgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCkgPT4gdGhpcy5pc0RlZmluZWQoaXRlbS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBleHRyYWN0Rm9yT2ZzID0gcGlwZShtYXAoKGNvbGxlY3Rpb246IGFueVtdKSA9PiBjb2xsZWN0aW9uLmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpKSk7XG4gICAgICAgIGNvbnN0IHJvd0xpc3RPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fZGF0YVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlSb3dPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fc3VtbWFyeVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIHJvd0xpc3RPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1bW1hcnlSb3dPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfem9uZUJlZ29uZUxpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lcj8uZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmRhdGFDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvdyByZXNpemUgb2JzZXJ2ZXIgbm90IG5lZWRlZCBiZWNhdXNlIHdoZW4geW91IHJlc2l6ZSB0aGUgd2luZG93IGVsZW1lbnQgdGhlIHRib2R5IGNvbnRhaW5lciBhbHdheXMgcmVzaXplIHNvXG4gICAgICAgICAgICAvLyBpdCB3b3VsZCBhbHdheXMgbm90aWZ5IHJlc2l6aW5nLCB0aHVzIGEgY2hhbmdlIGRldGVjdGlvbiBhbmQgcmVjYWxjdWxhdGlvbiBvZiBzaXplcyB3aWxsIG9jY3VyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMubmF0aXZlRWxlbWVudCkucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLnRib2R5Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdFBpbm5pbmcoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5yZWF0dGFjaCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFJvd09ic2VydmVycygpO1xuICAgICAgICB0aGlzLl96b25lQmVnb25lTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICB2ZXJ0U2NyREMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZFJvd0xpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXI/LmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhW3RoaXMubGFzdEFkZGVkUm93SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhyZWMsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBLZWVwIHRoZSBzdHJlYW0gb3BlbiBmb3IgZnV0dXJlIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMucmVuZGVyZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdGhpcy50b3RhbFJlY29yZHMgPyB0aGlzLnRvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcztcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5vdmVybGF5U2V0dGluZ3MgPSB7IG91dGxldDogdGhpcy5vdXRsZXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5yZW5kZXJlZC5uZXh0KHRydWUpKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeUNoYW5nZXMocmVwYWludCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSByZXBhaW50O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROb3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50bXBPdXRsZXRzLmZvckVhY2goKHRtcGxPdXRsZXQpID0+IHtcbiAgICAgICAgICAgIHRtcGxPdXRsZXQuY2xlYW5DYWNoZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQubmV4dCgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMudGV4dEhpZ2hsaWdodFNlcnZpY2UuZGVzdHJveUdyb3VwKHRoaXMuaWQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5SURzLmZvckVhY2gob3ZlcmxheUlEID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKG92ZXJsYXlJRCk7XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5ICYmICFvdmVybGF5LmRldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2gob3ZlcmxheUlEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0U2NyREMgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICAgICAgdmVydFNjckRDPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnByZXZlbnRDb250YWluZXJTY3JvbGwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBzcGVjaWZpZWQgY29sdW1uJ3MgdmlzaWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEudG9nZ2xlQ29sdW1uVmlzaWJpbGl0eSh7XG4gICAgICogICAgICAgY29sdW1uOiB0aGlzLmdyaWQxLmNvbHVtbnNbMF0sXG4gICAgICogICAgICAgbmV3VmFsdWU6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShhcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gYXJncy5jb2x1bW4gPyB0aGlzLl9jb2x1bW5zLmZpbmQoKGMpID0+IGMgPT09IGFyZ3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIWNvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbC50b2dnbGVWaXNpYmlsaXR5KGFyZ3MubmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qIGJsYXpvclN1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnMgW3JvdyBJRCwgZXhwYW5zaW9uIHN0YXRlXS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgb25seSBzdGF0ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJkYXRhXCIgWyhleHBhbnNpb25TdGF0ZXMpXT1cIm1vZGVsLmV4cGFuc2lvblN0YXRlc1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cGFuc2lvblN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvblN0YXRlcztcbiAgICB9XG5cbiAgICAvKiBibGF6b3JTdXBwcmVzcyAqL1xuICAgIHB1YmxpYyBzZXQgZXhwYW5zaW9uU3RhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPih2YWx1ZSk7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5zaW9uU3RhdGVzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZXhwYW5kQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY29sbGFwc2VBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZFJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgZmFsc2UpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9nZ2xlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19ieV9pZChyb3dJRCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlYyk7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgIXN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERlZmF1bHRFeHBhbmRTdGF0ZShfcmVjOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBvdXRsZXQgdXNlZCB0byBhdHRhY2ggdGhlIGdyaWQncyBvdmVybGF5cyB0by5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBJZiBzZXQsIHJldHVybnMgdGhlIG91dGxldCBkZWZpbmVkIG91dHNpZGUgdGhlIGdyaWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBncmlkJ3MgaW50ZXJuYWwgb3V0bGV0IGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgb3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3V0bGV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvdXRsZXQodmFsOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPSB2YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFN1bW1hcnlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmdyaWRTaXplKSB7XG4gICAgICAgICAgICBjYXNlIFNpemUuTWVkaXVtOlxuICAgICAgICAgICAgICAgIHJldHVybiAzMDtcbiAgICAgICAgICAgIGNhc2UgU2l6ZS5TbWFsbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzNjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgJ3MgbWluaW11bSBhbGxvd2VkIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlc3RyaWN0aW5nIGhlYWRlciBncm91cCBjb21wb25lbnQgd2lkdGguXG4gICAgICogVGhlIHZhbHVlcyBiZWxvdyBkZXBlbmQgb24gdGhlIGhlYWRlciBjZWxsIGRlZmF1bHQgcmlnaHQvbGVmdCBwYWRkaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5ncmlkU2l6ZSkge1xuICAgICAgICAgICAgY2FzZSBTaXplLk1lZGl1bTpcbiAgICAgICAgICAgICAgICByZXR1cm4gMzI7XG4gICAgICAgICAgICBjYXNlIFNpemUuU21hbGw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI0O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3Bpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gdGhpcy5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3VucGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gdGhpcy5nZXRVbnBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgY2VsbCBpbm5lciB3aWR0aCBmb3IgYXV0by1zaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckNlbGxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IElTaXplSW5mbyB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBoZWFkZXJXaWR0aCA9IHRoaXMucGxhdGZvcm0uZ2V0Tm9kZVNpemVWaWFSYW5nZShyYW5nZSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlclN0eWxlID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBoZWFkZXJQYWRkaW5nID0gcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGhlYWRlclN0eWxlLnBhZGRpbmdSaWdodCkgK1xuICAgICAgICAgICAgcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcblxuICAgICAgICAvLyBUYWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGUgaGVhZGVyIGdyb3VwIGVsZW1lbnQsIHNpbmNlIGNvbHVtbiBwaW5uaW5nIGFwcGxpZXMgYm9yZGVycyB0byBpdCBpZiBpdHMgbm90IGEgY29sdW1uR3JvdXAuXG4gICAgICAgIGNvbnN0IGhlYWRlckdyb3VwU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSArIHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogTWF0aC5jZWlsKGhlYWRlcldpZHRoKSwgcGFkZGluZzogTWF0aC5jZWlsKGhlYWRlclBhZGRpbmcgKyBib3JkZXJTaXplKSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgY29tYmluZWQgd2lkdGggb2YgdGhlIGNvbHVtbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGVuYWJsZWQgZ3JpZCBmZWF0dXJlcy4gVGhleSBhcmUgZml4ZWQuXG4gICAgICovXG4gICAgcHVibGljIGZlYXR1cmVDb2x1bW5zV2lkdGgoZXhwYW5kZXI/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4odGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHBsYXRmb3JtVXRpbC5pc0Jyb3dzZXIgY2hlY2tcbiAgICAgICAgICAgIGNvbnN0IHJvd1NlbGVjdEFyZWEgPSB0aGlzLmhlYWRlclNlbGVjdG9yQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCByb3dEcmFnQXJlYSA9IHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckRyYWdDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBncm91cGFibGVBcmVhID0gdGhpcy5oZWFkZXJHcm91cENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZXJXaWR0aCA9IGV4cGFuZGVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyBleHBhbmRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSByb3dTZWxlY3RBcmVhICsgcm93RHJhZ0FyZWEgKyBncm91cGFibGVBcmVhICsgZXhwYW5kZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bXMgPSB0aGlzLmdyaWQuY29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZSA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneFJvd0NvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkUm93ID0gdGhpcy5ncmlkLnBpbm5lZFJvd3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dzKCk6IElneEdyaWRSb3dDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSb3dMaXN0LnRvQXJyYXkoKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB1bnBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3VucGlubmVkVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRWaXNpYmxlID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmZpbHRlcigoY29sKSA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHdpZHRoYCB0byBiZSBzZXQgb24gYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckdyb3VwV2lkdGgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNDb2x1bW5MYXlvdXRzXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGAke01hdGgubWF4KHBhcnNlRmxvYXQoY29sdW1uLmNhbGNXaWR0aCksIHRoaXMuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGgpfXB4YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDb2wgPSB0aGlzLmdyaWQxLmdldENvbHVtbkJ5TmFtZShcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkJ5VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKChjb2wpID0+XG4gICAgICAgICAgICAhY29sLmNvbHVtbkdyb3VwICYmICFjb2wuY29sdW1uTGF5b3V0ICYmXG4gICAgICAgICAgICBjb2wudmlzaWJsZUluZGV4ID09PSBpbmRleFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyBhbGwgd2lkdGhzIG9mIGNvbHVtbnMgdGhhdCBoYXZlIHNpemUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucmVjYWxjdWxhdGVBdXRvU2l6ZXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVjYWxjdWxhdGVBdXRvU2l6ZXMoKSB7XG4gICAgICAgIC8vIHJlc2V0IGF1dG8tc2l6ZSBhbmQgY2FsY3VsYXRlIGl0IGFnYWluLlxuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goeCA9PiB4LmF1dG9TaXplID0gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2aXNpYmxlIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkLnZpc2libGVDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+ICFjLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogT25seSBmdW5jdGlvbnMgd2hlbiBwYWdpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b3RhbFJlY29yZHMgPSB0aGlzLmdyaWQudG90YWxSZWNvcmRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcyA+PSAwID8gdGhpcy5fdG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmdTdGF0ZT8ubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRvdGFsID49IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdG90YWxSZWNvcmRzID0gdG90YWw7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3RvdGFsV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUYWtlIG9ubHkgdG9wIGxldmVsIGNvbHVtbnNcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wubGV2ZWwgPT09IDAgJiYgIWNvbC5waW5uZWQpO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChpOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSBwYXJzZUludChjb2xzW2ldLmNhbGNXaWR0aCwgMTApIHx8IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IHRvdGFsV2lkdGg7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dSb3dTZWxlY3RvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUm93U2VsZWN0YWJsZSAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zICYmICF0aGlzLmhpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd0FkZEJ1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdGFibGUgJiYgdGhpcy5kYXRhVmlldy5sZW5ndGggPT09IDAgJiYgdGhpcy5fY29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dEcmFnSWNvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RyYWdnYWJsZSAmJiB0aGlzLl9jb2x1bW5zLmxlbmd0aCA+IHRoaXMuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dldERhdGFWaWV3SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBuZXdJbmRleCA9IGluZGV4O1xuICAgICAgICBpZiAoKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkgJiYgdGhpcy5wYWdpbmdNb2RlID09PSAxICYmIHRoaXMucGFnZSAhPT0gMCkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIHRoaXMucGVyUGFnZSAqIHRoaXMucGFnZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWRBUEkuZ3JpZC52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5pc1JlbW90ZSkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIHRoaXMuZ3JpZEFQSS5ncmlkLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhSW5kZXgoZGF0YVZpZXdJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gZGF0YVZpZXdJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzUmVtb3RlKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGRhdGFWaWV3SW5kZXggKyB0aGlzLmdyaWRBUEkuZ3JpZC52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWNlcyBhIGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0YXJnZXQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5tb3ZlQ29sdW1uKGNvbHVtbiwgdGFyZ2V0KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUNvbHVtbihjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgdGFyZ2V0OiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uID0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgICAgICAvLyBNLkEuIE1heSAxMXRoLCAyMDIxICM5NTA4IE1ha2UgdGhlIGV2ZW50IGNhbmNlbGFibGVcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzID0geyBzb3VyY2U6IGNvbHVtbiwgdGFyZ2V0LCBjYW5jZWw6IGZhbHNlIH07XG5cbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZpbmdFbmQuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uID09PSB0YXJnZXQgfHwgKGNvbHVtbi5sZXZlbCAhPT0gdGFyZ2V0LmxldmVsKSB8fFxuICAgICAgICAgICAgKGNvbHVtbi50b3BMZXZlbFBhcmVudCAhPT0gdGFyZ2V0LnRvcExldmVsUGFyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5sZXZlbCkge1xuICAgICAgICAgICAgdGhpcy5fbW92ZUNoaWxkQ29sdW1ucyhjb2x1bW4ucGFyZW50LCBjb2x1bW4sIHRhcmdldCwgcG9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldCBjb2x1bW5QaW5TdGF0ZUNoYW5nZWQ7XG4gICAgICAgIC8vIHBpbm5pbmcgYW5kIHVucGlubmluZyB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gd2l0aG91dCBwYXNzaW5nIGluZGV4XG4gICAgICAgIC8vIGJ1dCBpcyBlYXNpZXIgdG8gY2FsY2x1bGF0ZSB0aGUgaW5kZXggaGVyZSwgYW5kIGxhdGVyIHVzZSBpdCBpbiB0aGUgcGlubmluZyBldmVudCBhcmdzXG4gICAgICAgIGlmICh0YXJnZXQucGlubmVkICYmICFjb2x1bW4ucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgPyBwaW5uZWRJbmRleCArIDEgOiBwaW5uZWRJbmRleDtcbiAgICAgICAgICAgIGNvbHVtbi5waW4oaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQucGlubmVkICYmIGNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVucGlubmVkSW5kZXggPSB0aGlzLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgPyB1bnBpbm5lZEluZGV4ICsgMSA6IHVucGlubmVkSW5kZXg7XG4gICAgICAgICAgICBjb2x1bW4udW5waW4oaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKHRhcmdldC5waW5uZWQgJiYgY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uUGluU3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zLCB0aGlzLl9waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICghdGFyZ2V0LnBpbm5lZCAmJiAhY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uUGluU3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zLCB0aGlzLl91bnBpbm5lZENvbHVtbnMpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5fbW92ZUNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnNSZW9yZGVyZWQoY29sdW1uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqIENhbGxpbmcgbWFya0ZvckNoZWNrIGFsc28gdHJpZ2dlcnMgdGhlIGdyaWQgcGlwZXMgZXhwbGljaXRseSwgcmVzdWx0aW5nIGluIGFsbCB1cGRhdGVzIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBNYXkgZGVncmFkZSBwZXJmb3JtYW5jZSBpZiB1c2VkIHdoZW4gbm90IG5lZWRlZCwgb3IgaWYgbWlzdXNlZDpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gRE9OJ1RzOlxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIGZyb20gaW5zaWRlIGEgbG9vcFxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIHdoZW4gYSBwcmltaXRpdmUgaGFzIGNoYW5nZWRcbiAgICAgKiBncmlkLmRhdGEuZm9yRWFjaChyZWMgPT4ge1xuICAgICAqICByZWMgPSBuZXdWYWx1ZTtcbiAgICAgKiAgZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIERPc1xuICAgICAqIC8vIGNhbGwgbWFya0ZvckNoZWNrIGFmdGVyIHVwZGF0aW5nIGEgbmVzdGVkIHByb3BlcnR5XG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjLm5lc3RlZFByb3AxLm5lc3RlZFByb3AyID0gbmV3VmFsdWU7XG4gICAgICogfSk7XG4gICAgICogZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyogY3NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCBhZGRzIHRoZSBkYXRhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuYWRkUm93KHJlY29yZCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBjb21taXQgcGVuZGluZyBzdGF0ZXMgcHJpb3IgdG8gYWRkaW5nIGEgcm93XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmFkZFJvd1RvRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMucm93QWRkZWROb3RpZmllci5uZXh0KHsgZGF0YTogZGF0YSwgcm93RGF0YTogZGF0YSwgb3duZXI6IHRoaXMsIHByaW1hcnlLZXk6IGRhdGFbdGhpcy5wcmltYXJ5S2V5XSwgcm93S2V5OiBkYXRhW3RoaXMucHJpbWFyeUtleV0gfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckNTU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFRoZSBtZXRob2QgYWNjZXB0IHJvd1NlbGVjdG9yIGFzIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93SUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5kZWxldGVSb3coMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVJvdyhyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJpbWFyeUtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUm93QnlJZChyb3dTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lkOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzOiBJUm93RGF0YUNhbmNlbGFibGVFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICByb3dJRDogcm93SWQsXG4gICAgICAgICAgICBwcmltYXJ5S2V5OiByb3dJZCxcbiAgICAgICAgICAgIHJvd0tleTogcm93SWQsXG4gICAgICAgICAgICByb3dEYXRhOiB0aGlzLmdldFJvd0RhdGEocm93SWQpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5nZXRSb3dEYXRhKHJvd0lkKSxcbiAgICAgICAgICAgIG9sZFZhbHVlOiB0aGlzLmdldFJvd0RhdGEocm93SWQpLFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBpc0FkZFJvdzogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5ncmlkQVBJLmRlbGV0ZVJvd0J5SWQocm93SWQpO1xuICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsICYmIHJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByb3dEZWxldGVkRXZlbnRBcmdzOiBJUm93RGF0YUV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZWNvcmQsXG4gICAgICAgICAgICAgICAgcm93RGF0YTogcmVjb3JkLFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IHJlY29yZFt0aGlzLnByaW1hcnlLZXldLFxuICAgICAgICAgICAgICAgIHJvd0tleTogcmVjb3JkW3RoaXMucHJpbWFyeUtleV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZWQuZW1pdChyb3dEZWxldGVkRXZlbnRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckNTU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZFdpdGhQSy51cGRhdGVDZWxsKCdVcGRhdGVkJywgMSwgJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgd2hpY2ggaXMgdG8gYmUgc2V0LlxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kcyB0byByb3dJRC5cbiAgICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRzIHRvIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQ2VsbCh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55LCBjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW1wbGlmeVxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBJZiByb3cgcGFzc2VkIGlzIGludmFsaWRcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SUQ6IHJvd1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JRDogY29sLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hDZWxsKGlkLCBpbmRleCwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0sIHZhbHVlLCByb3dEYXRhLCB0aGlzIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnZhbGlkYXRpb24uZ2V0Rm9ybUNvbnRyb2woY2VsbC5pZC5yb3dJRCwgY2VsbC5jb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX2NlbGwoY2VsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgcm93IGlzIHNwZWNpZmllZCBieVxuICAgICAqIHJvd1NlbGVjdG9yIHBhcmFtZXRlciBhbmQgdGhlIGRhdGEgc291cmNlIHJlY29yZCB3aXRoIHRoZSBwYXNzZWQgdmFsdWUuXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhcHBseSByZXF1ZXN0ZWQgdXBkYXRlIG9ubHkgaWYgcHJpbWFyeSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSBncmlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQudXBkYXRlUm93KHtcbiAgICAgKiAgICAgICBQcm9kdWN0SUQ6IDEsIFByb2R1Y3ROYW1lOiAnU3BlYXJtaW50JywgSW5TdG9jazogdHJ1ZSwgVW5pdHNJblN0b2NrOiAxLCBPcmRlckRhdGU6IG5ldyBEYXRlKCcyMDA1LTAzLTIxJylcbiAgICAgKiAgIH0sIDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZeKAk1xuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kIHRvIHJvd0lEXG4gICAgICovXG4gICAgLy8gVE9ETzogcHJldmVudCBldmVudCBpbnZvY2F0aW9uXG4gICAgcHVibGljIHVwZGF0ZVJvdyh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVmaW5lZCh0aGlzLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNlbGwgPSB0aGlzLmNydWRTZXJ2aWNlLmNlbGw7XG4gICAgICAgICAgICBpZiAoZWRpdGFibGVDZWxsICYmIGVkaXRhYmxlQ2VsbC5pZC5yb3dJRCA9PT0gcm93U2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZENlbGxFZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgSWd4RWRpdFJvdyhyb3dTZWxlY3RvciwgLTEsIHRoaXMuZ3JpZEFQSS5nZXRSb3dEYXRhKHJvd1NlbGVjdG9yKSwgdGhpcyBhcyBhbnkpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9yb3cocm93LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCBmb3IgIzU5MzQgYW5kIHByb2JhYmx5IGJyZWFrIGZvciAjNTc2M1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgYWRkaW5nIG9mIHRoaXJkIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIGluIHVwZGF0ZVJvdy5cbiAgICAgICAgICAgIC8vIElmIGRldmVsb3BlciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKHRydWUpLCBhbmRcbiAgICAgICAgICAgIC8vIHZpc2UtdmVyc2EgaWYgZGV2ZWxvcGVyIHNldCBpdCB0byBmYWxzZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKGZhbHNlKS5cbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHByaW1hcnkga2V5IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHJvdyBzZWxlY3RvciBtYXRjaCB0aGUgcm93IGRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YSA9IGdyaWQuZ2V0Um93RGF0YSg5NDc0MSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGF0YShyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dTZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHt9IDogZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydCBhIHNpbmdsZSBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU29ydCB0aGUgYElneEdyaWRDb21wb25lbnRgJ3MgYElneENvbHVtbkNvbXBvbmVudGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNvcnQoeyBmaWVsZE5hbWU6IG5hbWUsIGRpcjogU29ydGluZ0RpcmVjdGlvbi5Bc2MsIGlnbm9yZUNhc2U6IGZhbHNlIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzb3J0KGV4cHJlc3Npb246IElTb3J0aW5nRXhwcmVzc2lvbiB8IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gY2xvbmVBcnJheSh0aGlzLnNvcnRpbmdFeHByZXNzaW9ucyk7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGVhY2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnRpbmdPcHRpb25zLm1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sLmZpZWxkID09PSBleHByZXNzaW9uLmZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTb3J0KGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElTb3J0aW5nRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgc29ydGluZ0V4cHJlc3Npb25zOiBzb3J0aW5nU3RhdGUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnRfbXVsdGlwbGUoZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkuc29ydChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5zb3J0aW5nRG9uZS5lbWl0KGV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGZpbHRlcih0ZXJtKSB7XG4gICAgICogICAgICB0aGlzLmdyaWQuZmlsdGVyKFwiUHJvZHVjdE5hbWVcIiwgdGVybSwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihcImNvbnRhaW5zXCIpKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZVxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcihuYW1lLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhbGwgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGluIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgd2l0aCB0aGUgc2FtZSBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmZpbHRlckdsb2JhbCgnc29tZScsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oJ2NvbnRhaW5zJykpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyR2xvYmFsKHZhbHVlLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgYXBwbGllcyB5b3VyIGN1c3RvbVN1bW1hcnkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSB0aGUgY3VzdG9tU3VtbWFyeSwgdGhlbiB0aGUgZGVmYXVsdCBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGRhdGEgdHlwZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH0sIHsgZmllbGROYW1lOiAnSUQnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKiBFbmFibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0sIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIHRydWUsIHJlc3RbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhckZpbHRlcigpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogb3RoZXJ3aXNlIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU29ydCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU29ydChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfc29ydChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoR3JpZFN0YXRlKF9hcmdzPykge1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlQaXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogV2UgaGF2ZSByZXR1cm4gdmFsdWVzIGhlcmUuIE1vdmUgdGhlbSB0byBldmVudCBhcmdzID8/XG5cbiAgICAvKipcbiAgICAgKiBQaW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wucGluKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnBpbnMgYSBjb2x1bW4gYnkgZmllbGQgbmFtZS4gUmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wudW5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBQaW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpblJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgcm93IGluIHRoZSBwaW5uZWQgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGluUm93KHJvd0lEOiBhbnksIGluZGV4PzogbnVtYmVyLCByb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0gdGhpcy5ncmlkQVBJLmdldF9waW5fcm93X2V2ZW50X2FyZ3Mocm93SUQsIGluZGV4LCByb3csIHRydWUpO1xuICAgICAgICB0aGlzLnJvd1Bpbm5pbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHR5cGVvZiBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA9PT0gJ251bWJlcicgPyBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA6IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHJvd0lEKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm93UGlubmVkLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBVbnBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudW5waW5Sb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHVucGluUm93KHJvd0lEOiBhbnksIHJvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMuZ3JpZEFQSS5nZXRfcGluX3Jvd19ldmVudF9hcmdzKHJvd0lELCBudWxsLCByb3csIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1Bpbm5lZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5waW5Db250YWluZXIgPyB0aGlzLnBpbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA6IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgPyBjb250YWluZXJIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNIZWlnaHQgPyB0aGlzLmNhbGNIZWlnaHQgKyB0aGlzLnBpbm5lZFJvd0hlaWdodCA6IHRoaXMuY2FsY0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgZ3JpZCB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2hvdWxkIGJlIHJ1biB3aGVuIGNoYW5naW5nIERPTSBlbGVtZW50cyBkaW1lbnRpb25zIG1hbnVhbGx5IHRoYXQgYWZmZWN0IHRoZSBncmlkJ3Mgc2l6ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmbG93KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlZmxvdygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZE5leHQoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE5leHQodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIDEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBwcmV2aW91cyBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZFByZXYoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kUHJldih0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQodGV4dCwgLTEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXBwbGllcyB0aGUgZXhpc3Rpbmcgc2VhcmNoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBsYXN0IHNlYXJjaC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmcmVzaFNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB1cGRhdGVBY3RpdmVJbmZvXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hTZWFyY2godXBkYXRlQWN0aXZlSW5mbz86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFjdGl2ZUluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmZvID0gdGhpcy50ZXh0SGlnaGxpZ2h0U2VydmljZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmZvckVhY2goKG1hdGNoLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jb2x1bW4gPT09IGFjdGl2ZUluZm8uY29sdW1uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5yb3cgPT09IGFjdGl2ZUluZm8ucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5pbmRleCA9PT0gYWN0aXZlSW5mby5pbmRleCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hcHMobWF0Y2gubWV0YWRhdGEsIGFjdGl2ZUluZm8ubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRoaXMuX2xhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZW5kRWRpdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRoZSBoaWdobGlnaHRzIGluIHRoZSBjZWxsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU2VhcmNoKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU2VhcmNoKCkge1xuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW10sXG4gICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGM6IElneEdyaWRDZWxsQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLmVkaXRhYmxlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzdW1tYXJpemVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuaGFzU3VtbWFyeSAmJiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiBzdW1tYXJpemVkQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290U3VtbWFyaWVzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSAhPT0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUuY2hpbGRMZXZlbHNPbmx5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNWaXNpYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zID8gdGhpcy5fY29sdW1ucy5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoYXNNb3ZhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW92aW5nO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uR3JvdXBzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uTGF5b3V0cygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtdWx0aVJvd0xheW91dFJvd1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aVJvd0xheW91dFJvd1NpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcm93QmFzZWRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZW5ndGggKiB0aGlzLnJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBpc1BlcmNlbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1BlcmNlbnRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQgJiYgdGhpcy5faGVpZ2h0LmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmRhdGFMZW5ndGg7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVkQWN0dWFsUm93SGVpZ2h0ICogTWF0aC5taW4odGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcixcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yID8gTWF0aC5taW4oYWxsSXRlbXMsIHRoaXMucGFnaW5hdG9yLnBlclBhZ2UpIDogYWxsSXRlbXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVGhlIHJvd0hlaWdodCBpbnB1dCBpcyBib3VuZCB0byBtaW4taGVpZ2h0IGNzcyBwcm9wIG9mIHJvd3MgdGhhdCBhZGRzIGEgMXB4IGJvcmRlciBpbiBhbGwgY2FzZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlbmRlcmVkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0hlaWdodCArIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG91dGVyV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgPyB0aGlzLmNhbGNXaWR0aCArIHRoaXMuc2Nyb2xsU2l6ZSA6IHRoaXMuY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgZ3JpZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZ3JpZFNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRDb21wdXRlZFN0eWxlcz8uZ2V0UHJvcGVydHlWYWx1ZSgnLS1jb21wb25lbnQtc2l6ZScpIHx8IFNpemUuTGFyZ2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSB2aXNpYmxlIGNvbnRlbnQgaGVpZ2h0IHRoYXQgaW5jbHVkZXMgaGVhZGVyICsgdGJvZHkgKyBmb290ZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFZpc2libGVDb250ZW50SGVpZ2h0KCkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gdGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCArIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLmhhc1N1bW1hcml6ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgICBoZWlnaHQgKz0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldFBvc3NpYmxlQ29sdW1uV2lkdGgoYmFzZVdpZHRoOiBudW1iZXIgPSBudWxsKSB7XG4gICAgICAgIGxldCBjb21wdXRlZFdpZHRoO1xuICAgICAgICBpZiAoYmFzZVdpZHRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gYmFzZVdpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHV0ZWRXaWR0aCA9IHRoaXMuY2FsY1dpZHRoIHx8XG4gICAgICAgICAgICAgICAgcGFyc2VJbnQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlzaWJsZUNoaWxkQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApO1xuXG5cbiAgICAgICAgLy8gQ29sdW1uIGxheW91dHMgcmVsYXRlZFxuICAgICAgICBsZXQgdmlzaWJsZUNvbHMgPSBbXTtcbiAgICAgICAgY29uc3QgY29sdW1uQmxvY2tzID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgY29sc1BlckJsb2NrID0gY29sdW1uQmxvY2tzLm1hcChibG9jayA9PiBibG9jay5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhibG9jay5jaGlsZHJlbikpO1xuICAgICAgICBjb25zdCBjb21iaW5lZEJsb2Nrc1NpemUgPSBjb2xzUGVyQmxvY2sucmVkdWNlKChhY2MsIGl0ZW0pID0+IGFjYyArIGl0ZW0ubGVuZ3RoLCAwKTtcbiAgICAgICAgY29sc1BlckJsb2NrLmZvckVhY2goYmxvY2tDb2xzID0+IHZpc2libGVDb2xzID0gdmlzaWJsZUNvbHMuY29uY2F0KGJsb2NrQ29scykpO1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNXaXRoU2V0V2lkdGhzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHZpc2libGVDb2xzLmZpbHRlcihjID0+IGMud2lkdGhTZXRCeVVzZXIpIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlciAmJiBjLndpZHRoICE9PSAnZml0LWNvbnRlbnQnKTtcblxuICAgICAgICBjb25zdCBjb2x1bW5zVG9TaXplID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIGNvbWJpbmVkQmxvY2tzU2l6ZSAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aCA6XG4gICAgICAgICAgICB2aXNpYmxlQ2hpbGRDb2x1bW5zLmxlbmd0aCAtIGNvbHVtbnNXaXRoU2V0V2lkdGhzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc3VtRXhpc3RpbmdXaWR0aHMgPSBjb2x1bW5zV2l0aFNldFdpZHRoc1xuICAgICAgICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbFdpZHRoID0gY3Vyci53aWR0aDtcbiAgICAgICAgICAgICAgICBsZXQgd2lkdGhWYWx1ZSA9IHBhcnNlSW50KGNvbFdpZHRoLCAxMCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKHdpZHRoVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVmFsdWUgPSBNSU5JTVVNX0NPTFVNTl9XSURUSDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycldpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xID9cbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSAvIDEwMCAqIGNvbXB1dGVkV2lkdGggOlxuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2ICsgY3VycldpZHRoO1xuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiBhbGwgY29sdW1ucyBhcmUgaGlkZGVuLCByZXR1cm4gMHB4IHdpZHRoXG4gICAgICAgIGlmICghc3VtRXhpc3RpbmdXaWR0aHMgJiYgIWNvbHVtbnNUb1NpemUpIHtcbiAgICAgICAgICAgIHJldHVybiAnMHB4JztcbiAgICAgICAgfVxuICAgICAgICBjb21wdXRlZFdpZHRoIC09IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gTWF0aC5mbG9vcighTnVtYmVyLmlzRmluaXRlKHN1bUV4aXN0aW5nV2lkdGhzKSA/XG4gICAgICAgICAgICBNYXRoLm1heChjb21wdXRlZFdpZHRoIC8gY29sdW1uc1RvU2l6ZSwgdGhpcy5taW5Db2x1bW5XaWR0aCkgOlxuICAgICAgICAgICAgTWF0aC5tYXgoKGNvbXB1dGVkV2lkdGggLSBzdW1FeGlzdGluZ1dpZHRocykgLyBjb2x1bW5zVG9TaXplLCB0aGlzLm1pbkNvbHVtbldpZHRoKSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbHVtbldpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNWZXJ0aWNhbFNjcm9sbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc1Njcm9sbGFibGUgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyID8gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5pc1Njcm9sbGFibGUoKSA6IGZhbHNlO1xuICAgICAgICByZXR1cm4gISEodGhpcy5jYWxjV2lkdGggJiYgdGhpcy5kYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3Lmxlbmd0aCA+IDAgJiYgaXNTY3JvbGxhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkV2lkdGggPSB0aGlzLmdyaWQuZ2V0UGlubmVkV2lkdGgoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gdGFrZUhpZGRlbiBJZiB3ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhlIGhpZGRlbiBjb2x1bW5zIGluIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZjID0gdGFrZUhpZGRlbiA/IHRoaXMuX3Bpbm5lZENvbHVtbnMgOiB0aGlzLnBpbm5lZENvbHVtbnM7XG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBmYykge1xuICAgICAgICAgICAgaWYgKGNvbC5sZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHN1bSArPSBwYXJzZUludChjb2wuY2FsY1dpZHRoLCAxMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNQaW5uaW5nVG9TdGFydCkge1xuICAgICAgICAgICAgc3VtICs9IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NvbHVtbkdyb3VwZWQoX2ZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IFJFTU9WRVxuICAgICAqL1xuICAgIHB1YmxpYyBvbkhlYWRlclNlbGVjdG9yQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVsdGlSb3dTZWxlY3Rpb25FbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJSb3dTZWxlY3Rpb24oZXZlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdEFsbFJvd3MoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRTZWxlY3RvckJhc2VBcmlhTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmlsdGVyaW5nT3BlcmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5hcmVBbGxSb3dTZWxlY3RlZCgpID8gJ0Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCcgOiAnU2VsZWN0IGFsbCBmaWx0ZXJlZCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkgPyAnRGVzZWxlY3QgYWxsJyA6ICdTZWxlY3QgYWxsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3RhbFJvd3NDb3VudEFmdGVyRmlsdGVyKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFsbERhdGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwaW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5lZFJlY29yZHMgPyB0aGlzLnBpbm5lZFJlY29yZHMgOiBbXTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHVucGlubmVkRGF0YVZpZXcoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMgPyB0aGlzLnVucGlubmVkUmVjb3JkcyA6IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXI/LmlneEZvck9mIHx8IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSB0cmFuc2Zvcm1lZCBwYWdlZC9maWx0ZXJlZC9zb3J0ZWQvZ3JvdXBlZC9waW5uZWQvdW5waW5uZWQgcm93IGRhdGEsIGRpc3BsYXllZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAgICAgY29uc3QgZGF0YVZpZXcgPSB0aGlzLmdyaWQuZGF0YVZpZXc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBkYXRhVmlldygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIGNsaWNraW5nIG92ZXIgYSByb3cgc2hvdWxkIHNlbGVjdC9kZXNlbGVjdCBpdFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byB0cnVlXG4gICAgICogQHBhcmFtIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdFJvd09uQ2xpY2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RSb3dPbkNsaWNrO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0Um93T25DbGljayhlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdFJvd09uQ2xpY2sgPSBlbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCBzcGVjaWZpZWQgcm93cyBieSBJRC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RSb3dzKFsxLDIsNV0sIHRydWUpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RSb3dzKHJvd0lEczogYW55W10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHMsIGNsZWFyQ3VycmVudFNlbGVjdGlvbik7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0Um93cyhbMSwyLDVdKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SURzXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0Um93cyhyb3dJRHM6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdFJvd3NXaXRoTm9FdmVudChyb3dJRHMpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIHNlbGVjdCBhbGwgcm93cyBpbiB0aGUgZ3JpZCBleGVwdCBkZWxldGVkIHJvd3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdEFsbFJvd3MoKTtcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cyhmYWxzZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbFJvd3Mob25seUZpbHRlckRhdGEgPSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBvbmx5RmlsdGVyRGF0YSAmJiB0aGlzLmZpbHRlcmVkRGF0YSA/IHRoaXMuZmlsdGVyZWREYXRhIDogdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSh0cnVlKTtcbiAgICAgICAgY29uc3Qgcm93SURzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFJvd0lEcyhkYXRhKS5maWx0ZXIocklEID0+ICF0aGlzLmdyaWRBUEkucm93X2RlbGV0ZWRfdHJhbnNhY3Rpb24ocklEKSk7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93cyhyb3dJRHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgcm93c1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGlmIGZpbHRlcmluZyBpcyBpbiBwbGFjZSwgc2VsZWN0QWxsUm93cygpIGFuZCBkZXNlbGVjdEFsbFJvd3MoKSBzZWxlY3QvZGVzZWxlY3QgYWxsIGZpbHRlcmVkIHJvd3MuXG4gICAgICogSWYgeW91IHNldCB0aGUgcGFyYW1ldGVyIG9ubHlGaWx0ZXJEYXRhIHRvIGZhbHNlIHRoYXQgd2lsbCBkZXNlbGVjdCBhbGwgcm93cyBpbiB0aGUgZ3JpZCBleGVwdCBkZWxldGVkIHJvd3MuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsUm93cygpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBvbmx5RmlsdGVyRGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbFJvd3Mob25seUZpbHRlckRhdGEgPSB0cnVlKSB7XG4gICAgICAgIGlmIChvbmx5RmlsdGVyRGF0YSAmJiB0aGlzLmZpbHRlcmVkRGF0YSAmJiB0aGlzLmZpbHRlcmVkRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0Um93cyh0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKHRoaXMuZmlsdGVyZWREYXRhKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJBbGxTZWxlY3RlZFJvd3MoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc2VsZWN0ZWQgY2VsbHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckNlbGxTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZHJhZ1Njcm9sbChkZWx0YTogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmdldFNjcm9sbCgpO1xuICAgICAgICBjb25zdCB2ZXJ0aWNhbCA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSBkZWx0YTtcblxuICAgICAgICBob3Jpem9udGFsLnNjcm9sbExlZnQgKz0gbGVmdCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgICAgIHZlcnRpY2FsLnNjcm9sbFRvcCArPSB0b3AgKiB0aGlzLkRSQUdfU0NST0xMX0RFTFRBO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGVmaW5lZChhcmc6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gYXJnICE9PSB1bmRlZmluZWQgJiYgYXJnICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdCByYW5nZShzKSBvZiBjZWxscyBiZXR3ZWVuIGNlcnRhaW4gcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0UmFuZ2UoYXJnOiBHcmlkU2VsZWN0aW9uUmFuZ2UgfCBHcmlkU2VsZWN0aW9uUmFuZ2VbXSB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGVmaW5lZChhcmcpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyQ2VsbFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXJnLmZvckVhY2gocmFuZ2UgPT4gdGhpcy5zZXRTZWxlY3Rpb24ocmFuZ2UpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKGFyZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uVG9WaXNpYmxlSW5kZXgoZmllbGQ6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucztcbiAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZUNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSBmaWVsZCkudmlzaWJsZUluZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGlvbihyYW5nZTogR3JpZFNlbGVjdGlvblJhbmdlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Tm9kZSA9IHsgcm93OiByYW5nZS5yb3dTdGFydCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtblN0YXJ0KSB9O1xuICAgICAgICBjb25zdCBlbmROb2RlID0geyByb3c6IHJhbmdlLnJvd0VuZCwgY29sdW1uOiB0aGlzLmNvbHVtblRvVmlzaWJsZUluZGV4KHJhbmdlLmNvbHVtbkVuZCkgfTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlLm5vZGUgPSBzdGFydE5vZGU7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RSYW5nZShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFkZFJhbmdlTWV0YShlbmROb2RlLCB0aGlzLnNlbGVjdGlvblNlcnZpY2UucG9pbnRlclN0YXRlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmluaXRQb2ludGVyU3RhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByYW5nZXMgaW4gdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkUmFuZ2VzKCk6IEdyaWRTZWxlY3Rpb25SYW5nZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uU2VydmljZS5yYW5nZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGNlbGwgc2VsZWN0aW9uIGluIHRoZSBmb3JtIG9mIGBbeyBjb2x1bW4uZmllbGQ6IGNlbGwudmFsdWUgfSwgLi4uXWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBmb3JtYXR0ZXJzYCBpcyBlbmFibGVkLCB0aGUgY2VsbCB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBpdHMgcmVzcGVjdGl2ZSBjb2x1bW4gZm9ybWF0dGVyIChpZiBhbnkpLlxuICAgICAqIElmIGBoZWFkZXJzYCBpcyBlbmFibGVkLCBpdCB3aWxsIHVzZSB0aGUgY29sdW1uIGhlYWRlciAoaWYgYW55KSBpbnN0ZWFkIG9mIHRoZSBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkRGF0YShmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tU2VsZWN0aW9uKHNvdXJjZSwgZm9ybWF0dGVycywgaGVhZGVycyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc2VsZWN0ZWQgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogUmV0dXJucyBhbiBhcnJheSB3aXRoIHNlbGVjdGVkIGNvbHVtbnNcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5ncmlkLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZENvbHVtbnMoKTogQ29sdW1uVHlwZVtdIHtcbiAgICAgICAgY29uc3QgZmllbGRzID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmaWVsZCA9PiB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZCkpLmZpbHRlcihmaWVsZCA9PiBmaWVsZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKiBAcGFyYW0gY2xlYXJDdXJyZW50U2VsZWN0aW9uIGlmIHRydWUgY2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgQ29sdW1uVHlwZVtdLCBjbGVhckN1cnJlbnRTZWxlY3Rpb24/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBmaWVsZFRvU2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvU2VsZWN0ID0gY29sdW1ucyBhcyBzdHJpbmdbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIChjb2x1bW5zIGFzIENvbHVtblR5cGVbXSkuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBjb2wuYWxsQ2hpbGRyZW4uZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXApLm1hcChjID0+IGMuZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvU2VsZWN0ID0gWy4uLmZpZWxkVG9TZWxlY3QsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvU2VsZWN0LnB1c2goY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoZmllbGRUb1NlbGVjdCwgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMgYnkgZmllbGQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RDb2x1bW5zKFsnSUQnLCdOYW1lJ10pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5zXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0Q29sdW1ucyhjb2x1bW5zOiBzdHJpbmdbXSB8IENvbHVtblR5cGVbXSkge1xuICAgICAgICBsZXQgZmllbGRUb0Rlc2VsZWN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoY29sdW1ucy5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNvbHVtbnNbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgQ29sdW1uVHlwZVtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdCA9IFsuLi5maWVsZFRvRGVzZWxlY3QsIC4uLmNoaWxkcmVuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFRvRGVzZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvRGVzZWxlY3QpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdHMgYWxsIGNvbHVtbnNcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdEFsbENvbHVtbnMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuY2xlYXJBbGxTZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxDb2x1bW5zKCkge1xuICAgICAgICB0aGlzLnNlbGVjdENvbHVtbnModGhpcy5fY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgY3VycmVudCBjb2x1bW5zIHNlbGVjdGlvbiBpbiB0aGUgZm9ybSBvZiBgW3sgY29sdW1uLmZpZWxkOiBjZWxsLnZhbHVlIH0sIC4uLl1gLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBgZm9ybWF0dGVyc2AgaXMgZW5hYmxlZCwgdGhlIGNlbGwgdmFsdWUgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgaXRzIHJlc3BlY3RpdmUgY29sdW1uIGZvcm1hdHRlciAoaWYgYW55KS5cbiAgICAgKiBJZiBgaGVhZGVyc2AgaXMgZW5hYmxlZCwgaXQgd2lsbCB1c2UgdGhlIGNvbHVtbiBoZWFkZXIgKGlmIGFueSkgaW5zdGVhZCBvZiB0aGUgY29sdW1uIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRTZWxlY3RlZENvbHVtbnNEYXRhKGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhID8gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEgOiB0aGlzLmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzKTtcbiAgICB9XG5cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YTogYW55W10sIGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzLCBjb2x1bW5EYXRhKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2ZW50Q29udGFpbmVyU2Nyb2xsID0gKGV2dCkgPT4ge1xuICAgICAgICBpZiAoZXZ0LnRhcmdldC5zY3JvbGxUb3AgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuYWRkU2Nyb2xsKGV2dC50YXJnZXQuc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgIGV2dC50YXJnZXQuc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZ0LnRhcmdldC5zY3JvbGxMZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiArPSBldnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICBldnQudGFyZ2V0LnNjcm9sbExlZnQgPSAwO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29weUhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnRQYXRoRWxlbWVudHMgPSBldmVudC5jb21wb3NlZFBhdGgoKS5tYXAoZWwgPT4gZWwudGFnTmFtZT8udG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChldmVudFBhdGhFbGVtZW50cy5pbmNsdWRlcygnaWd4LWdyaWQtZmlsdGVyaW5nLXJvdycpIHx8XG4gICAgICAgICAgICBldmVudFBhdGhFbGVtZW50cy5pbmNsdWRlcygnaWd4LWdyaWQtZmlsdGVyaW5nLWNlbGwnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5ncmlkQVBJLmdyaWQuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbkRhdGEgPSB0aGlzLmdldFNlbGVjdGVkQ29sdW1uc0RhdGEodGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRhO1xuICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NvcHknKSB7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSB0aGlzLmdldFNlbGVjdGVkRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGF0YSA9IFtdO1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIGlmIChldmVudC5jb2RlID09PSAnS2V5QycgJiYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY3VycmVudFRhcmdldC5jbGFzc05hbWUgPT09ICdpZ3gtZ3JpZC10aGVhZF9fd3JhcHBlcicpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbkRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBzZWxlY3RlZERhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLmNvbWJpbmVTZWxlY3RlZENlbGxBbmRDb2x1bW5EYXRhKGNvbHVtbkRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBjb2x1bW5EYXRhO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocmVzdWx0KS50aGVuKCkuY2F0Y2goZSA9PiBjb25zb2xlLmVycm9yKGUpKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5jbGlwYm9hcmRPcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5jcnVkU2VydmljZS5jZWxsSW5FZGl0TW9kZSB8fCBldmVudC50eXBlID09PSAna2V5ZG93bicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhWzBdLCBkYXRhWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHNlbGVjdGVkRGF0YTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByZXBhcmVDb3B5RGF0YShldmVudCwgZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhLCBrZXlzPykge1xuICAgICAgICBjb25zdCBldiA9IHsgZGF0YSwgY2FuY2VsOiBmYWxzZSB9IGFzIElHcmlkQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIHRoaXMuZ3JpZENvcHkuZW1pdChldik7XG5cbiAgICAgICAgaWYgKGV2LmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZXIgPSBuZXcgQ2hhclNlcGFyYXRlZFZhbHVlRGF0YShldi5kYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuc2VwYXJhdG9yKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGtleXMgPyB0cmFuc2Zvcm1lci5wcmVwYXJlRGF0YShrZXlzKSA6IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUhlYWRlcnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcocmVzdWx0LmluZGV4T2YoJ1xcbicpICsgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgJiYgT2JqZWN0LnZhbHVlcyhkYXRhWzBdKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCAtMik7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIC8qIE5lY2Vzc2FyeSBmb3IgdGhlIGhpZWFyYWNoaWNhbCBjYXNlIGJ1dCB3aWxsIHByb2JhYmx5IGhhdmUgdG9cbiAgICAgICAgICAgY2hhbmdlIGhvdyBnZXRTZWxlY3RlZERhdGEgaXMgcHJvcGFnYXRlZCBpbiB0aGUgaGllYXJhY2hpY2FsIGdyaWRcbiAgICAgICAgKi9cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93U25hY2tiYXJGb3IoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmFkZFJvd1NuYWNrYmFyLmFjdGlvblRleHQgPSBpbmRleCA9PT0gLTEgPyAnJyA6IHRoaXMucmVzb3VyY2VTdHJpbmdzLmlneF9ncmlkX3NuYWNrYmFyX2FkZHJvd19hY3Rpb250ZXh0O1xuICAgICAgICB0aGlzLmxhc3RBZGRlZFJvd0luZGV4ID0gaW5kZXg7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIub3BlbigpO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBiYXNlZCBvbiBwcm92aWRlZCBgcm93aW5kZXhgIGFuZCBgdmlzaWJsZUNvbHVtbkluZGV4YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQWxzbyBjYW4gZXhlY3V0ZSBhIGN1c3RvbSBsb2dpYyBvdmVyIHRoZSB0YXJnZXQgZWxlbWVudCxcbiAgICAgKiB0aHJvdWdoIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHsgdGFyZ2V0VHlwZTogR3JpZEtleWRvd25UYXJnZXRUeXBlLCB0YXJnZXQ6IE9iamVjdCB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5uYXZpZ2F0ZVRvKDEwLCAzLCAoYXJncykgPT4geyBhcmdzLnRhcmdldC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7IH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBuYXZpZ2F0ZVRvKHJvd0luZGV4OiBudW1iZXIsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gdGhpcy5kYXRhVmlldy5sZW5ndGggLSAxO1xuICAgICAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID4gdG90YWxJdGVtcyB8fCAodmlzaWJsZUNvbEluZGV4ICE9PSAtMVxuICAgICAgICAgICAgJiYgdGhpcy5fY29sdW1ucy5tYXAoY29sID0+IGNvbC52aXNpYmxlSW5kZXgpLmluZGV4T2YodmlzaWJsZUNvbEluZGV4KSA9PT0gLTEpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2Uocm93SW5kZXgsIHJvd0luZGV4ICsgMSkuZmluZChyZWMgPT4gcmVjLmV4cHJlc3Npb24gfHwgcmVjLmNoaWxkR3JpZHNEYXRhKSkge1xuICAgICAgICAgICAgdmlzaWJsZUNvbEluZGV4ID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHRhcmdldCByb3cgaXMgcGlubmVkIG5vIG5lZWQgdG8gc2Nyb2xsIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbFZlcnRpY2FsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybVZlcnRpY2FsU2Nyb2xsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBjb25zdCBzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkgPSB0aGlzLm5hdmlnYXRpb24uc2hvdWxkUGVyZm9ybUhvcml6b250YWxTY3JvbGwodmlzaWJsZUNvbEluZGV4LCByb3dJbmRleCk7XG4gICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsSG9yaXpvbnRhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtSG9yaXpvbnRhbFNjcm9sbFRvQ2VsbCh2aXNpYmxlQ29sSW5kZXgsICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkU2Nyb2xsVmVydGljYWxseSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ucGVyZm9ybVZlcnRpY2FsU2Nyb2xsVG9DZWxsKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4ZWN1dGVDYWxsYmFjayhyb3dJbmRleCwgdmlzaWJsZUNvbEluZGV4LCBjYikpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIGJsYXpvckNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBuZXh0IGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IG5leHRFZGl0YWJsZUNlbGxQb3NpdGlvbiA9IHRoaXMuZ3JpZC5nZXROZXh0Q2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXh0Q2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXdJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VyclJvd0luZGV4KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihkYXRhVmlld0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYikgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBuZXh0Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4ID4gY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoZGF0YVZpZXdJbmRleCwgZGF0YVZpZXdJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgbmV4dENlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IG5leHRDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgpXG4gICAgICAgICAgICBpZiAoY29sSW5kZXhlcy5sZW5ndGggPT09IDAgfHwgbmV4dEluZGV4ID09PSBjdXJyUm93SW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogbmV4dEluZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGNvbEluZGV4ZXNbMF0gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIGJsYXpvckNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBJQ2VsbFBvc2l0aW9uYCB3aGljaCBkZWZpbmVzIHRoZSBwcmV2aW91cyBjZWxsLFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBwb3NpdGlvbiwgdGhhdCBtYXRjaCBzcGVjaWZpYyBjcml0ZXJpYS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogWW91IGNhbiBwYXNzIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGEgdGhpcmQgcGFyYW1ldGVyIG9mIGBnZXRQcmV2aW91c0NlbGxgIG1ldGhvZC5cbiAgICAgKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gYWNjZXB0cyBJZ3hDb2x1bW5Db21wb25lbnQgYXMgYSBwYXJhbVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICBjb25zdCBwcmV2aW91c0VkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldFByZXZpb3VzQ2VsbCgwLCAzLCAoY29sdW1uKSA9PiBjb2x1bW4uZWRpdGFibGUpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcmV2aW91c0NlbGwoY3VyclJvd0luZGV4OiBudW1iZXIsIGN1clZpc2libGVDb2xJbmRleDogbnVtYmVyLFxuICAgICAgICBjYWxsYmFjazogKElneENvbHVtbkNvbXBvbmVudCkgPT4gYm9vbGVhbiA9IG51bGwpOiBJQ2VsbFBvc2l0aW9uIHtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwICYmIGNvbC52aXNpYmxlSW5kZXggPj0gMCk7XG4gICAgICAgIGNvbnN0IGRhdGFWaWV3SW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJSb3dJbmRleCk7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUG9zaXRpb24oZGF0YVZpZXdJbmRleCwgY3VyVmlzaWJsZUNvbEluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2xJbmRleGVzID0gY2FsbGJhY2sgPyBjb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjYWxsYmFjayhjb2wpKS5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpIDpcbiAgICAgICAgICAgIGNvbHVtbnMubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgY29uc3QgcHJldkNlbGxJbmRleCA9IGNvbEluZGV4ZXMuZmluZChpbmRleCA9PiBpbmRleCA8IGN1clZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNsaWNlKGRhdGFWaWV3SW5kZXgsIGRhdGFWaWV3SW5kZXggKyAxKVxuICAgICAgICAgICAgLmZpbmQocmVjID0+ICFyZWMuZXhwcmVzc2lvbiAmJiAhcmVjLnN1bW1hcmllcyAmJiAhcmVjLmNoaWxkR3JpZHNEYXRhICYmICFyZWMuZGV0YWlsc0RhdGEpICYmIHByZXZDZWxsSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBwcmV2Q2VsbEluZGV4IH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2SW5kZXggPSB0aGlzLmdldE5leHREYXRhUm93SW5kZXgoY3VyclJvd0luZGV4LCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCBwcmV2SW5kZXggPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBwcmV2SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY29sSW5kZXhlc1swXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBlbmRSb3dFZGl0VGFiU3RvcChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGNhbmNlbGVkID0gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGNvbW1pdCwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChjYW5jZWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3RpdmVDZWxsID0gdGhpcy5ncmlkQVBJLmdyaWQubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICBpZiAoYWN0aXZlQ2VsbCAmJiBhY3RpdmVDZWxsLnJvdyAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tDb2x1bW5DaGFuZ2VzKGluZGV4LCBjb2wpIHtcbiAgICAgICAgcmV0dXJuIGNvbC5maWVsZCArIGNvbC5fY2FsY1dpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNFeHBhbmRlZEdyb3VwKF9ncm91cDogSUdyb3VwQnlSZWNvcmQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIFRPRE86IE1PVkUgdG8gQ1JVRFxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuUm93T3ZlcmxheShpZCkge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KGlkLCB0aGlzLnJvd0xpc3QubGVuZ3RoIDw9IE1JTl9ST1dfRURJVElOR19DT1VOVF9USFJFU0hPTEQpO1xuXG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkub3Blbih0aGlzLnJvd0VkaXRTZXR0aW5ncyk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZVJvd0VkaXRpbmdPdmVybGF5KCkge1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLnJvd0VkaXRpbmdXaGVlbEhhbmRsZXIpO1xuICAgICAgICB0aGlzLnJvd0VkaXRQb3NpdGlvbmluZ1N0cmF0ZWd5LmlzVG9wSW5pdGlhbFBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jbG9zZSgpO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlUm93RWRpdGluZ092ZXJsYXkoc2hvdykge1xuICAgICAgICBjb25zdCByb3dTdHlsZSA9IHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5zdHlsZTtcbiAgICAgICAgaWYgKHNob3cpIHtcbiAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3c6IFJvd1R5cGUpIHtcbiAgICAgICAgaWYgKHJvdyAmJiAhdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnBhcmVudEVsZW1lbnQuc3R5bGU7XG4gICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkocm93LmtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5yZXBvc2l0aW9uKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvd1N0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjYWNoZWRWaWV3TG9hZGVkKGFyZ3M6IElDYWNoZWRWaWV3TG9hZGVkRXZlbnRBcmdzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgY29uc3QgdG1wbElkID0gYXJncy5jb250ZXh0LnRlbXBsYXRlSUQudHlwZTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYXJncy5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgYXJncy52aWV3LmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gdG1wbElkID09PSAnZGF0YVJvdycgPyB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19ieV9pbmRleChpbmRleCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlSb3cgPSB0bXBsSWQgPT09ICdzdW1tYXJ5Um93JyA/IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maW5kKChzcikgPT4gc3IuZGF0YVJvd0luZGV4ID09PSBpbmRleCkgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChyb3cgJiYgcm93IGluc3RhbmNlb2YgSWd4Um93RGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVWaXJ0U3RhdGUocm93KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN1bW1hcnlSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVZpcnRTdGF0ZShzdW1tYXJ5Um93KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZGlhbG9nLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuQWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cob3ZlcmxheVNldHRpbmdzPzogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gb3ZlcmxheVNldHRpbmdzID8gb3ZlcmxheVNldHRpbmdzIDogdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3M7XG4gICAgICAgIGlmICghdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzLnRhcmdldCA9XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgYW55KS5yb290R3JpZCA/ICh0aGlzIGFzIGFueSkucm9vdEdyaWQubmF0aXZlRWxlbWVudCA6IHRoaXMubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheVNldHRpbmdzLm91dGxldCA9IHRoaXMub3V0bGV0O1xuXG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKFxuICAgICAgICAgICAgICAgIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHRoaXMudmlld1JlZixcbiAgICAgICAgICAgICAgICBzZXR0aW5ncyk7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLnNob3codGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZGlhbG9nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFwcGx5Q2hhbmdlcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY2hhbmdlcyBzaG91bGQgYmUgYXBwbGllZFxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZUFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nKGFwcGx5Q2hhbmdlczogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgY29uc3QgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cgPSBhZHZhbmNlZEZpbHRlcmluZ092ZXJsYXkuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuXG4gICAgICAgICAgICBpZiAoYXBwbHlDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2cuYXBwbHlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZy5jbG9zZURpYWxvZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RW1wdHlSZWNvcmRPYmplY3RGb3IoaW5Sb3c6IFJvd1R5cGUpIHtcbiAgICAgICAgY29uc3Qgcm93ID0geyAuLi5pblJvdz8uZGF0YSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhyb3cpLmZvckVhY2goa2V5ID0+IHJvd1trZXldID0gdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdlbmVyYXRlUm93SUQoKTtcbiAgICAgICAgcm93W3RoaXMucHJpbWFyeUtleV0gPSBpZDtcbiAgICAgICAgcmV0dXJuIHsgcm93SUQ6IGlkLCBkYXRhOiByb3csIHJlY29yZFJlZjogcm93IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzSG9yaXpvbnRhbFNjcm9sbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXaWR0aCAtIHRoaXMudW5waW5uZWRXaWR0aCA+IDAgJiYgdGhpcy53aWR0aCAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1N1bW1hcnlSb3cocm93RGF0YSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcm93RGF0YSAmJiByb3dEYXRhLnN1bW1hcmllcyAmJiAocm93RGF0YS5zdW1tYXJpZXMgaW5zdGFuY2VvZiBNYXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRyaWdnZXJQaXBlcygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0aW5nV2hlZWxIYW5kbGVyKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5kZWx0YVkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbE5leHQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsUHJldigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRVbnBpbm5lZEluZGV4QnlJZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy51bnBpbm5lZFJlY29yZHMuZmluZEluZGV4KHggPT4geFt0aGlzLnByaW1hcnlLZXldID09PSBpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoZXMgdGhlIHJvdyB0cmFuc2FjdGlvbnMgb24gdGhlIGN1cnJlbnQgcm93IGFuZCByZXR1cm5zIHdoZXRoZXIgdGhlIGdyaWQgZWRpdGluZyB3YXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBjb21taXQgPT09IHRydWVgLCBwYXNzZXMgdGhlbSBmcm9tIHRoZSBwZW5kaW5nIHN0YXRlIHRvIHRoZSBkYXRhIChvciB0cmFuc2FjdGlvbiBzZXJ2aWNlKVxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiAoY2xpY2spPVwiZ3JpZC5lbmRFZGl0KHRydWUpXCI+Q29tbWl0IFJvdzwvYnV0dG9uPlxuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb21taXRcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBGYWNhZGUgZm9yIGNydWQgc2VydmljZSByZWZhY3RvcmluZy4gVG8gYmUgcmVtb3ZlZFxuICAgIC8vIFRPRE86IGRvIG5vdCByZW1vdmUgdGhpcywgYXMgaXQgaXMgdXNlZCBpbiByb3dFZGl0VGVtcGxhdGUsIGJ1dCBtYXJrIGlzIGFzIGludGVybmFsIGFuZCBoaWRkZW5cbiAgICAvKiBibGF6b3JDU1N1cHByZXNzICovXG4gICAgcHVibGljIGVuZEVkaXQoY29tbWl0ID0gdHJ1ZSwgZXZlbnQ/OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGNvbW1pdCwgZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVudGVycyBhZGQgbW9kZSBieSBzcGF3bmluZyB0aGUgVUkgdW5kZXIgdGhlIHNwZWNpZmllZCByb3cgYnkgcm93SUQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG51bGwgaXMgcGFzc2VkIGFzIHJvd0lELCB0aGUgcm93IGFkZGluZyBVSSBpcyBzcGF3bmVkIGFzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlld1xuICAgICAqIEByZW1hcmtzXG4gICAgICogU3Bhd25pbmcgdGhlIFVJIHRvIGFkZCBhIGNoaWxkIGZvciBhIHJlY29yZCBvbmx5IHdvcmtzIGlmIHlvdSBwcm92aWRlIGEgcm93SURcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKCdBTEZLSScpO1xuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQoJ0FMRktJJywgdHJ1ZSk7XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZChudWxsKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgLSBUaGUgcm93SUQgdG8gc3Bhd24gdGhlIGFkZCByb3cgVUkgZm9yLCBvciBudWxsIHRvIHNwYXduIGl0IGFzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlld1xuICAgICAqIEBwYXJhbSBhc0NoaWxkIC0gV2hldGhlciB0aGUgcmVjb3JkIHNob3VsZCBiZSBhZGRlZCBhcyBhIGNoaWxkLiBPbmx5IGFwcGxpY2FibGUgdG8gaWd4VHJlZUdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJZChyb3dJRDogYW55LCBhc0NoaWxkPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBsZXQgaW5kZXggPSByb3dJRDtcbiAgICAgICAgaWYgKHJvd0lEID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhc0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgcmVjb3JkIGNhbm5vdCBiZSBhZGRlZCBhcyBhIGNoaWxkIHRvIGFuIHVuc3BlY2lmaWVkIHJlY29yZC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIHRoZSBpbmRleCBvZiB0aGUgcmVjb3JkIHdpdGggdGhhdCBQS1xuICAgICAgICAgICAgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19pbmRleF9ieV9pZChyb3dJRCwgdGhpcy5kYXRhVmlldyk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyByb3cgd2l0aCB0aGUgc3BlY2lmaWVkIElEIHdhcyBmb3VuZC4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hZGRSb3dGb3JJbmRleChpbmRleCwgYXNDaGlsZCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGRSb3dGb3JJbmRleChpbmRleDogbnVtYmVyLCBhc0NoaWxkPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuZGF0YVZpZXcubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBpbmRleCBpcyB2YWxpZCAtIHdvbid0IHN1cHBvcnQgYW55dGhpbmcgb3V0c2lkZSB0aGUgZGF0YSB2aWV3XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBpbmRleCBpcyBpbiB0aGUgdmlldyBwb3J0XG4gICAgICAgICAgICBpZiAoKGluZGV4IDwgdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggfHxcbiAgICAgICAgICAgICAgICBpbmRleCA+PSB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCArIHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5jaHVua1NpemUpICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChpbmRleCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZFxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4LCBhc0NoaWxkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKGluZGV4KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4LCBhc0NoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgUEsgb3IgaW5kZXggaXMgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBkYXRhIHZpZXcuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBjc1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogRW50ZXJzIGFkZCBtb2RlIGJ5IHNwYXduaW5nIHRoZSBVSSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBY2NlcHRlZCB2YWx1ZXMgZm9yIGluZGV4IGFyZSBpbnRlZ2VycyBmcm9tIDAgdG8gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SW5kZXgoMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IHRvIHNwYXduIHRoZSBVSSBhdC4gQWNjZXB0cyBpbnRlZ2VycyBmcm9tIDAgdG8gdGhpcy5ncmlkLmRhdGFWaWV3Lmxlbmd0aFxuICAgICAqL1xuICAgIHB1YmxpYyBiZWdpbkFkZFJvd0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJlZ2luQWRkUm93QnlJZChudWxsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkUm93Rm9ySW5kZXgoaW5kZXggLSAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHByZXZlbnRIZWFkZXJTY3JvbGwoYXJncykge1xuICAgICAgICBpZiAoYXJncy50YXJnZXQuc2Nyb2xsTGVmdCAhPT0gMCkge1xuICAgICAgICAgICAgKHRoaXMubmF2aWdhdGlvbiBhcyBhbnkpLmZvck9mRGlyKCkuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdCA9IGFyZ3MudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgICAgICBhcmdzLnRhcmdldC5zY3JvbGxMZWZ0ID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWdpbkFkZFJvd0ZvckluZGV4KGluZGV4OiBudW1iZXIsIGFzQ2hpbGQgPSBmYWxzZSkge1xuICAgICAgICAvLyBUT0RPIGlzIHJvdyBmcm9tIHJvd0xpc3Qgc3VpdGFibGUgZm9yIGVudGVyQWRkUm93TW9kZVxuICAgICAgICBjb25zdCByb3cgPSBpbmRleCA9PSBudWxsID9cbiAgICAgICAgICAgIG51bGwgOiB0aGlzLnJvd0xpc3QuZmluZChyID0+IHIuaW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKHJvdyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVudGVyQWRkUm93TW9kZShyb3csIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyByb3cgd2l0aCB0aGUgc3BlY2lmaWVkIFBLIG9yIGluZGV4IHdhcyBmb3VuZC4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzd2l0Y2hUcmFuc2FjdGlvblNlcnZpY2UodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucyA9IHRoaXMudHJhbnNhY3Rpb25GYWN0b3J5LmNyZWF0ZShUUkFOU0FDVElPTl9UWVBFLkJhc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kYXRhQ2xvbmVTdHJhdGVneSkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zLmNsb25lU3RyYXRlZ3kgPSB0aGlzLmRhdGFDbG9uZVN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5uZXh0KCk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLm9uU3RhdGVVcGRhdGUucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5kZXN0cm95JCwgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQpKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy50cmFuc2FjdGlvblN0YXR1c1VwZGF0ZS5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25TdGF0dXNVcGRhdGUoZXZlbnQ6IFN0YXRlVXBkYXRlRXZlbnQpIHtcbiAgICAgICAgbGV0IGFjdGlvbnM6IEFjdGlvbjxUcmFuc2FjdGlvbj5bXSA9IFtdO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlJFRE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUpIDogW107XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgIGFjdGlvbnMgPSBldmVudC5hY3Rpb25zID8gZXZlbnQuYWN0aW9ucy5maWx0ZXIoeCA9PiB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIDogW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2UuaXNSb3dTZWxlY3RlZChhY3Rpb24udHJhbnNhY3Rpb24uaWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdFJvdyhhY3Rpb24udHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlJFRE8gfHwgZXZlbnQub3JpZ2luID09PSBUcmFuc2FjdGlvbkV2ZW50T3JpZ2luLlVORE8pIHtcbiAgICAgICAgICAgIGV2ZW50LmFjdGlvbnMuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoeC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuVVBEQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHgudHJhbnNhY3Rpb24uaWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlKHgudHJhbnNhY3Rpb24uaWQsIHZhbHVlID8/IHgucmVjb3JkUmVmKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkRFTEVURSB8fCB4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkVmFsdWUoeC50cmFuc2FjdGlvbi5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLmNyZWF0ZSh4LnRyYW5zYWN0aW9uLmlkLCB2YWx1ZSA/PyB4LnJlY29yZFJlZik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24udXBkYXRlKHgudHJhbnNhY3Rpb24uaWQsIHZhbHVlID8/IHgucmVjb3JkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi5tYXJrQXNUb3VjaGVkKHgudHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLmNsZWFyKHgudHJhbnNhY3Rpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB3cml0ZVRvRGF0YShyb3dJbmRleDogbnVtYmVyLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIG1lcmdlT2JqZWN0cyh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKClbcm93SW5kZXhdLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9yZXN0b3JlVmlydFN0YXRlKHJvdykge1xuICAgICAgICAvLyBjaGVjayB2aXJ0dWFsaXphdGlvbiBzdGF0ZSBvZiBkYXRhIHJlY29yZCBhZGRlZCBmcm9tIGNhY2hlXG4gICAgICAgIC8vIGluIGNhc2Ugc3RhdGUgaXMgbm8gbG9uZ2VyIHZhbGlkIC0gdXBkYXRlIGl0LlxuICAgICAgICBjb25zdCByb3dGb3JPZiA9IHJvdy52aXJ0RGlyUm93O1xuICAgICAgICBjb25zdCBncmlkU2NyTGVmdCA9IHJvd0Zvck9mLmdldFNjcm9sbCgpLnNjcm9sbExlZnQ7XG4gICAgICAgIHJvd0Zvck9mLm9uSFNjcm9sbChncmlkU2NyTGVmdCk7XG4gICAgICAgIHJvd0Zvck9mLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNoYW5nZVJvd0VkaXRpbmdPdmVybGF5U3RhdGVPblNjcm9sbChyb3c6IFJvd1R5cGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0VkaXRhYmxlIHx8ICF0aGlzLnJvd0VkaXRpbmdPdmVybGF5IHx8IHRoaXMucm93RWRpdGluZ092ZXJsYXkuY29sbGFwc2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZ092ZXJsYXkoZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXBvc2l0aW9uUm93RWRpdGluZ092ZXJsYXkocm93KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3VsZCBiZSBjYWxsZWQgd2hlbiBkYXRhIGFuZC9vciBpc0xvYWRpbmcgaW5wdXQgY2hhbmdlcyBzbyB0aGF0IHRoZSBvdmVybGF5IGNhbiBiZVxuICAgICAqIGhpZGRlbi9zaG93biBiYXNlZCBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBzaG91bGRPdmVybGF5TG9hZGluZ1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkT3ZlcmxheUxvYWRpbmcpIHtcbiAgICAgICAgICAgIC8vIGEgbmV3IG92ZXJsYXkgc2hvdWxkIGJlIHNob3duXG4gICAgICAgICAgICBjb25zdCBvdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgICAgICAgICBvdXRsZXQ6IHRoaXMubG9hZGluZ091dGxldCxcbiAgICAgICAgICAgICAgICBjbG9zZU9uT3V0c2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBuZXcgQ29udGFpbmVyUG9zaXRpb25TdHJhdGVneSgpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nT3ZlcmxheS5vcGVuKG92ZXJsYXlTZXR0aW5ncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBncmlkIHdpZHRoIGkuZS4gdGhpcy5jYWxjV2lkdGhcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlR3JpZFdpZHRoKCkge1xuICAgICAgICBsZXQgd2lkdGg7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50V2lkdGgpIHtcbiAgICAgICAgICAgIC8qIHdpZHRoIGluICUqL1xuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWQgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpO1xuICAgICAgICAgICAgd2lkdGggPSBjb21wdXRlZC5pbmRleE9mKCclJykgPT09IC0xID8gcGFyc2VGbG9hdChjb21wdXRlZCkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2lkdGggPSBwYXJzZUludCh0aGlzLndpZHRoLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXdpZHRoICYmIHRoaXMubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmICh0aGlzLndpZHRoID09PSBudWxsIHx8ICF3aWR0aCkge1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLmdldENvbHVtbldpZHRoU3VtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpICYmIHRoaXMud2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKE51bWJlci5pc0Zpbml0ZSh3aWR0aCkgfHwgd2lkdGggPT09IG51bGwpICYmIHdpZHRoICE9PSB0aGlzLmNhbGNXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjV2lkdGggPSB3aWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZXJpdmVQb3NzaWJsZVdpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgY29sdW1ucyBkZWZhdWx0V2lkdGggcHJvcGVydHlcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Rlcml2ZVBvc3NpYmxlV2lkdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlcikge1xuICAgICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGggPSB0aGlzLndpZHRoICE9PSBudWxsID8gdGhpcy5nZXRQb3NzaWJsZUNvbHVtbldpZHRoKCkgOiB0aGlzLm1pbkNvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzICYmIHBhcnNlSW50KHRoaXMuX2NvbHVtbldpZHRoLCAxMCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aENvbWJpbmVkID0gcGFyc2VJbnQodGhpcy5fY29sdW1uV2lkdGgsIDEwKSAqIChjb2x1bW4uY29sRW5kID8gY29sdW1uLmNvbEVuZCAtIGNvbHVtbi5jb2xTdGFydCA6IDEpO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSBjb2x1bW5XaWR0aENvbWJpbmVkICsgJ3B4JztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRC5LLiBNYXJjaCAyOXRoLCAyMDIxICM5MTQ1IENvbnNpZGVyIG1pbi9tYXggd2lkdGggd2hlbiBzZXR0aW5nIGRlZmF1bHRXaWR0aCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSB0aGlzLmdldEV4dHJlbXVtQmFzZWRDb2xXaWR0aChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RXh0cmVtdW1CYXNlZENvbFdpZHRoKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5fY29sdW1uV2lkdGg7XG4gICAgICAgIGlmICh3aWR0aCAmJiB0eXBlb2Ygd2lkdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyh3aWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWluV2lkdGggPSB3aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gY29sdW1uLm1pbldpZHRoUHggOiBjb2x1bW4ubWluV2lkdGhQZXJjZW50O1xuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBjb2x1bW4ubWF4V2lkdGhQeCA6IGNvbHVtbi5tYXhXaWR0aFBlcmNlbnQ7XG4gICAgICAgIGlmIChjb2x1bW4uaGlkZGVuKSB7XG4gICAgICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluV2lkdGggPiBwYXJzZUZsb2F0KHdpZHRoKSkge1xuICAgICAgICAgICAgd2lkdGggPSBTdHJpbmcoY29sdW1uLm1pbldpZHRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChtYXhXaWR0aCA8IHBhcnNlRmxvYXQod2lkdGgpKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyhjb2x1bW4ubWF4V2lkdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgbm8gcHggb3IgJSBhcmUgZGVmaW5lZCBpbiBtYXhXaWR0aC9taW5XaWR0aCBjb25zaWRlciBpdCBweFxuICAgICAgICBpZiAod2lkdGguaW5kZXhPZignJScpID09PSAtMSAmJiB3aWR0aC5pbmRleE9mKCdweCcpID09PSAtMSkge1xuICAgICAgICAgICAgd2lkdGggKz0gJ3B4JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlc2V0Tm90aWZ5Q2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZU91dGxldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPyB0aGlzLl91c2VyT3V0bGV0RGlyZWN0aXZlIDogdGhpcy5fb3V0bGV0RGlyZWN0aXZlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgY29sdW1ucyBpbiB0aGUgbWFpbiBjb2x1bW5MaXN0IGFuZCBfY29sdW1ucyBjb2xsZWN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21vdmVDb2x1bW5zKGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgb3JkZXJlZExpc3QgPSB0aGlzLl9waW5uZWRDb2x1bW5zLmNvbmNhdCh0aGlzLl91bnBpbm5lZENvbHVtbnMpO1xuICAgICAgICBjb25zdCBsaXN0ID0gb3JkZXJlZExpc3Q7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGZyb20sIHRvLCBwb3MsIGxpc3QpO1xuICAgICAgICBjb25zdCBuZXdMaXN0ID0gdGhpcy5fcmVzZXRDb2x1bW5MaXN0KGxpc3QpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMobmV3TGlzdCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaW50ZXJuYWwgY29sdW1uJ3MgY29sbGVjdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZUNvbHVtbnMobmV3Q29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10pIHtcbiAgICAgICAgLy8gdXBkYXRlIGludGVybmFsIGNvbGxlY3Rpb25zIHRvIHJldGFpbiBvcmRlci5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IG5ld0NvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMucGlubmVkKTtcbiAgICAgICAgdGhpcy5fdW5waW5uZWRDb2x1bW5zID0gbmV3Q29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZCk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnMgPSBuZXdDb2x1bW5zO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVzZXRDb2x1bW5MaXN0KGxpc3Q/KSB7XG4gICAgICAgIGlmICghbGlzdCkge1xuICAgICAgICAgICAgbGlzdCA9IHRoaXMuX2NvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld0xpc3QgPSBbXTtcbiAgICAgICAgbGlzdC5maWx0ZXIoYyA9PiBjLmxldmVsID09PSAwKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgbmV3TGlzdC5wdXNoKHApO1xuICAgICAgICAgICAgaWYgKHAuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBuZXdMaXN0ID0gbmV3TGlzdC5jb25jYXQocC5hbGxDaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3TGlzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW9yZGVycyBjb2x1bW5zIGluc2lkZSB0aGUgcGFzc2VkIGNvbHVtbiBjb2xsZWN0aW9uLlxuICAgICAqIFdoZW4gcmVvcmRlcmluZyBjb2x1bW4gZ3JvdXAgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb24gaXMgbm90IGZsYXR0ZW5lZC5cbiAgICAgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIHRoZSBjb2x1bW5zIGNvbGxlY3Rpb24gaXMgZmxhdHRlbmVkLCB0aGlzIGlzIHdoeSBhZGl0dGlvbmFsIGNhbGN1bGF0aW9ucyBvbiB0aGUgZHJvcEluZGV4IGFyZSBkb25lLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcmVvcmRlckNvbHVtbnMoZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3NpdGlvbjogRHJvcFBvc2l0aW9uLCBjb2x1bW5Db2xsZWN0aW9uOiBhbnlbXSxcbiAgICAgICAgaW5Hcm91cCA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGZyb21JbmRleCA9IGNvbHVtbkNvbGxlY3Rpb24uaW5kZXhPZihmcm9tKTtcbiAgICAgICAgY29uc3QgY2hpbGRDb2x1bW5zQ291bnQgPSBpbkdyb3VwID8gMSA6IGZyb20uYWxsQ2hpbGRyZW4ubGVuZ3RoICsgMTtcbiAgICAgICAgY29sdW1uQ29sbGVjdGlvbi5zcGxpY2UoZnJvbUluZGV4LCBjaGlsZENvbHVtbnNDb3VudCk7XG4gICAgICAgIGxldCBkcm9wSW5kZXggPSBjb2x1bW5Db2xsZWN0aW9uLmluZGV4T2YodG8pO1xuICAgICAgICBpZiAocG9zaXRpb24gPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIHtcbiAgICAgICAgICAgIGRyb3BJbmRleCsrO1xuICAgICAgICAgICAgaWYgKCFpbkdyb3VwICYmIHRvLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZHJvcEluZGV4ICs9IHRvLmFsbENoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5Db2xsZWN0aW9uLnNwbGljZShkcm9wSW5kZXgsIDAsIGZyb20pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgY29sdW1uIGdyb3VwIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9tb3ZlQ2hpbGRDb2x1bW5zKHBhcmVudDogSWd4Q29sdW1uQ29tcG9uZW50LCBmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHBhcmVudC5jaGlsZHJlbi50b0FycmF5KCk7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJDb2x1bW5zKGZyb20sIHRvLCBwb3MsIGJ1ZmZlciwgdHJ1ZSk7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5yZXNldChidWZmZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldHVwQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9nZW5lcmF0ZUNvbHVtbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMgPSB0aGlzLmdldENvbHVtbkxpc3QoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdENvbHVtbnModGhpcy5fY29sdW1ucywgKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB0aGlzLmNvbHVtbkluaXQuZW1pdChjb2wpKTtcbiAgICAgICAgdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYodGhpcy5jb2x1bW5MaXN0KTtcblxuICAgICAgICB0aGlzLmNvbHVtbkxpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5zQ2hhbmdlZChjaGFuZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldENvbHVtbkxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVsZXRlUm93RnJvbURhdGEocm93SUQ6IGFueSwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgKGluZGV4ICE9PSAwKSBkZWxldGUgaXRcbiAgICAgICAgLy8gIGlmIHRoZXJlIGlzIGEgcm93IGluIEFERCBvciBVUERBVEUgc3RhdGUgY2hhbmdlIGl0J3Mgc3RhdGUgdG8gREVMRVRFXG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0geyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH07XG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMuYWRkKHRyYW5zYWN0aW9uLCB0aGlzLmRhdGFbaW5kZXhdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZTogU3RhdGUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZShyb3dJRCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQoeyBpZDogcm93SUQsIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5ERUxFVEUsIG5ld1ZhbHVlOiBudWxsIH0sIHN0YXRlICYmIHN0YXRlLnJlY29yZFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgKHRoaXMuZGF0YS5sZW5ndGggPCB0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyKSA/XG4gICAgICAgICAgICAwIDogdGhpcy5kZWZhdWx0VGFyZ2V0Qm9keUhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvblBpbm5lZFJvd3NDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+KSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLnJvd0xpc3REaWZmZXIuZGlmZihjaGFuZ2UpO1xuICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNvbHVtbnNDaGFuZ2VkKGNoYW5nZTogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuY29sdW1uTGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b0dlbmVyYXRlICYmIHRoaXMuX2NvbHVtbnMubGVuZ3RoID09PSAwICYmIHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEluIEl2eSBpZiB0aGVyZSBhcmUgbmVzdGVkIGNvbmRpdGlvbmFsIHRlbXBsYXRlcyB0aGUgY29udGVudCBjaGlsZHJlbiBhcmUgcmUtZXZhbHVhdGVkXG4gICAgICAgICAgICAvLyBoZW5jZSBhdXRvZ2VuZXJhdGVkIGNvbHVtbnMgYXJlIGNsZWFyZWQgYW5kIG5lZWQgdG8gYmUgcmVzZXQuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnModGhpcy5fYXV0b0dlbmVyYXRlZENvbHMpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgcGlubmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZGlmZi5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5pdGVtLnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zLnB1c2gocmVjb3JkLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBwaW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMucHVzaChyZWNvcmQuaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5pdENvbHVtbnModGhpcy5jb2x1bW5MaXN0LnRvQXJyYXkoKSwgKGNvbDogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB0aGlzLmNvbHVtbkluaXQuZW1pdChjb2wpKTtcbiAgICAgICAgICAgIGlmIChwaW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UGlubmluZygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkaWZmLmZvckVhY2hSZW1vdmVkSXRlbSgocmVjb3JkOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxJZ3hDb2x1bW5Db21wb25lbnQgfCBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0NvbHVtbkdyb3VwID0gcmVjb3JkLml0ZW0gaW5zdGFuY2VvZiBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgR3JvdXBpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX2dyb3VwYnkocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIEZpbHRlcmluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuY2xlYXJfZmlsdGVyKHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBmaWx0ZXIgcm93XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbi5maWVsZCA9PT0gcmVjb3JkLml0ZW0uZmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBTb3J0aW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5jbGVhcl9zb3J0KHJlY29yZC5pdGVtLmZpZWxkKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgY29sdW1uIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3JlY29yZC5pdGVtLmZpZWxkXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcblxuICAgICAgICAgICAgaWYgKGFkZGVkIHx8IHJlbW92ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29sdW1uc0FkZGVkT3JSZW1vdmVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvbkNvbHVtbnNBZGRlZE9yUmVtb3ZlZCgpIHtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGBvbkNvbHVtbnNDaGFuZ2VkYCBjYW4gYmUgZXhlY3V0ZWQgbWlkd2F5IGEgY3VycmVudCBkZXRlY3RDaGFuZ2UgY3ljbGUgYW5kIG1hcmtGb3JDaGVjayB3aWxsIGJlIGlnbm9yZWQgdGhlbi5cbiAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGwgd2FpdCBmb3IgdGhlIGN1cnJlbnQgY3ljbGUgdG8gZW5kIHNvIHdlIGNhbiB0cmlnZ2VyIGEgbmV3IG9uZSBhbmQgbmdEb0NoZWNrIHRvIGZpcmUuXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlR3JpZFNpemVzKHJlY2FsY0ZlYXR1cmVXaWR0aCA9IHRydWUpIHtcbiAgICAgICAgLypcbiAgICAgICAgICAgIFRPRE86IChSLksuKSBUaGlzIGxheWVyZWQgbGFzYWduZSBzaG91bGQgYmUgcmVmYWN0b3JlZFxuICAgICAgICAgICAgQVNBUC4gVGhlIHJlYXNvbiBJIGhhdmUgdG8gcmVzZXQgdGhlIGNhY2hlcyBzbyBtYW55IHRpbWVzIGlzIGJlY2F1c2VcbiAgICAgICAgICAgIGFmdGVyIHRlYWNoIGBkZXRlY3RDaGFuZ2VzYCBjYWxsIHRoZXkgYXJlIGZpbGxlZCB3aXRoIGludmFsaWRcbiAgICAgICAgICAgIHN0YXRlLiBPZiBjb3Vyc2UgYWxsIG9mIHRoaXMgaGFwcGVucyBtaWR3YXkgdGhyb3VnaCB0aGUgZ3JpZFxuICAgICAgICAgICAgc2l6aW5nIHByb2Nlc3Mgd2hpY2ggb2YgY291cnNlLCB1c2VzIHZhbHVlcyBmcm9tIHRoZSBjYWNoZXMsIHRodXMgcmVzdWx0aW5nXG4gICAgICAgICAgICBpbiBhIGJyb2tlbiBsYXlvdXQuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICBjb25zdCBoYXNTY3JvbGwgPSB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IGhhc0hTY3JvbGwgPSAhdGhpcy5pc0hvcml6b250YWxTY3JvbGxIaWRkZW47XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFdpZHRoKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZXMocmVjYWxjRmVhdHVyZVdpZHRoKTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRIZWlnaHQoKTtcblxuICAgICAgICBpZiAodGhpcy5yb3dFZGl0YWJsZSkge1xuICAgICAgICAgICAgdGhpcy5yZXBvc2l0aW9uUm93RWRpdGluZ092ZXJsYXkodGhpcy5jcnVkU2VydmljZS5yb3dJbkVkaXRNb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1Jvdy5yZXNldENoaXBzQXJlYSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAvLyBpbiBjYXNlIHNjcm9sbGJhciBoYXMgYXBwZWFyZWQgcmVjYWxjIHRvIHNpemUgY29ycmVjdGx5LlxuICAgICAgICBpZiAoaGFzU2Nyb2xsICE9PSB0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFdpZHRoKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbiBjYXNlIGhvcml6b250YWwgc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNIU2Nyb2xsICE9PSB0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5pc0hvcml6b250YWxTY3JvbGxIaWRkZW4gPSAhdGhpcy5oYXNIb3Jpem9udGFsU2Nyb2xsKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy56b25lLmlzU3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5zVG9BdXRvc2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNvbHVtbnNOb3RpZnkubmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGNHcmlkSGVhZFJvdygpIHtcbiAgICAgICAgaWYgKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCkge1xuICAgICAgICAgICAgdGhpcy5fYmFzZUZvbnRTaXplID0gcGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKSk7XG4gICAgICAgICAgICBjb25zdCBoYXNGaWx0ZXJSb3cgPSB0aGlzLl9hbGxvd0ZpbHRlcmluZyAmJiB0aGlzLl9maWx0ZXJNb2RlID09PSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyO1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9ICh0aGlzLm1heExldmVsSGVhZGVyRGVwdGggKyAxICsgKGhhc0ZpbHRlclJvdyA/IDEgOiAwKSkgKiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQgLyB0aGlzLl9iYXNlRm9udFNpemU7XG4gICAgICAgICAgICB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gYCR7bWluU2l6ZX1yZW1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNldHMgVEJPRFkgaGVpZ2h0IGkuZS4gdGhpcy5jYWxjSGVpZ2h0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhbGN1bGF0ZUdyaWRIZWlnaHQoKSB7XG4gICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG5cbiAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID0gdGhpcy5fY2FsY3VsYXRlR3JpZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgaWYgKHRoaXMucGlubmVkUm93SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0IC09IHRoaXMucGlubmVkUm93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRHcm91cEFyZWFIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRDb21wdXRlZEhlaWdodChlbGVtKSB7XG4gICAgICAgIHJldHVybiBlbGVtLm9mZnNldEhlaWdodCA/IHBhcnNlRmxvYXQodGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpKSA6IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Rm9vdGVySGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1bW1hcnlSb3dIZWlnaHQgfHwgdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRmb290Lm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRoZWFkUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIC8vIEQuUC46IEJlZm9yZSBDU1MgbG9hZHMsdGhlYWRSb3cgY29tcHV0ZWQgaGVpZ2h0IHdpbGwgYmUgJ2F1dG8nLT5OYU4sIHNvIHVzZSAwIGZhbGxiYWNrXG4gICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZ2V0Q29tcHV0ZWRIZWlnaHQodGhpcy50aGVhZFJvdy5uYXRpdmVFbGVtZW50KSB8fCAwO1xuICAgICAgICByZXR1cm4gKCF0aGlzLmFsbG93RmlsdGVyaW5nIHx8ICh0aGlzLmFsbG93RmlsdGVyaW5nICYmIHRoaXMuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcikpID9cbiAgICAgICAgICAgIGhlaWdodCAtIHRoaXMuZ2V0RmlsdGVyQ2VsbEhlaWdodCgpIDpcbiAgICAgICAgICAgIGhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvb2xiYXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvb2xiYXJIZWlnaHQgPSAwO1xuICAgICAgICBpZiAodGhpcy50b29sYmFyLmZpcnN0KSB7XG4gICAgICAgICAgICB0b29sYmFySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRvb2xiYXIuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRvb2xiYXJIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRQYWdpbmdGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHBhZ2luZ0hlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLmZvb3Rlcikge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLmZvb3Rlci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgIHBhZ2luZ0hlaWdodCA9IHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgP1xuICAgICAgICAgICAgICAgIGhlaWdodCA6IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhZ2luZ0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEZpbHRlckNlbGxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaGVhZGVyR3JvdXBOYXRpdmVFbCA9ICh0aGlzLmhlYWRlckdyb3Vwc0xpc3QubGVuZ3RoICE9PSAwKSA/XG4gICAgICAgICAgICB0aGlzLmhlYWRlckdyb3Vwc0xpc3RbMF0ubmF0aXZlRWxlbWVudCA6IG51bGw7XG4gICAgICAgIGNvbnN0IGZpbHRlckNlbGxOYXRpdmVFbCA9IChoZWFkZXJHcm91cE5hdGl2ZUVsKSA/XG4gICAgICAgICAgICBoZWFkZXJHcm91cE5hdGl2ZUVsLnF1ZXJ5U2VsZWN0b3IoJ2lneC1ncmlkLWZpbHRlcmluZy1jZWxsJykgYXMgSFRNTEVsZW1lbnQgOiBudWxsO1xuICAgICAgICByZXR1cm4gKGZpbHRlckNlbGxOYXRpdmVFbCkgPyBmaWx0ZXJDZWxsTmF0aXZlRWwub2Zmc2V0SGVpZ2h0IDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuX2hlaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0dWFsVGhlYWRSb3cgPSB0aGlzLmdldFRoZWFkUm93SGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IGZvb3RlckhlaWdodCA9IHRoaXMuZ2V0Rm9vdGVySGVpZ2h0KCk7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJIZWlnaHQgPSB0aGlzLmdldFRvb2xiYXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgcGFnaW5nSGVpZ2h0ID0gdGhpcy5nZXRQYWdpbmdGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZ3JvdXBBcmVhSGVpZ2h0ID0gdGhpcy5nZXRHcm91cEFyZWFIZWlnaHQoKTtcbiAgICAgICAgY29uc3Qgc2NySGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnNjci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgcmVuZGVyZWRIZWlnaHQgPSB0b29sYmFySGVpZ2h0ICsgYWN0dWFsVGhlYWRSb3cgK1xuICAgICAgICAgICAgZm9vdGVySGVpZ2h0ICsgcGFnaW5nSGVpZ2h0ICsgZ3JvdXBBcmVhSGVpZ2h0ICtcbiAgICAgICAgICAgIHNjckhlaWdodDtcblxuICAgICAgICBsZXQgZ3JpZEhlaWdodCA9IDA7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQZXJjZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2hlaWdodCcpO1xuICAgICAgICAgICAgY29uc3QgYXV0b1NpemUgPSB0aGlzLl9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCk7XG4gICAgICAgICAgICBpZiAoYXV0b1NpemUgfHwgY29tcHV0ZWQuaW5kZXhPZignJScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmdldERhdGFCYXNlZEJvZHlIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGdyaWRIZWlnaHQgPSBwYXJzZUludCh0aGlzLl9oZWlnaHQsIDEwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLmFicyhncmlkSGVpZ2h0IC0gcmVuZGVyZWRIZWlnaHQpO1xuXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKGhlaWdodCkgPT09IDAgfHwgaXNOYU4oZ3JpZEhlaWdodCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHlIZWlnaHQgPSB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIGJvZHlIZWlnaHQgPiAwID8gYm9keUhlaWdodCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgfHwgKHRoaXMubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGFzIGFueSkuaG9zdDtcbiAgICAgICAgY29uc3Qgb3JpZ0hlaWdodCA9IHBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJldHVybiBvcmlnSGVpZ2h0ICE9PSBoZWlnaHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zaG91bGRBdXRvU2l6ZShyZW5kZXJlZEhlaWdodCkge1xuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgY29uc3QgcGFyZW50RWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50IHx8ICh0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBhcyBhbnkpLmhvc3Q7XG4gICAgICAgIGxldCByZXMgPSAhcGFyZW50RWxlbWVudCB8fFxuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IDAgfHxcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuY2xpZW50SGVpZ2h0ID09PSByZW5kZXJlZEhlaWdodDtcbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgJiYgKHJlcyB8fCB0aGlzLl9hdXRvU2l6ZSkpIHtcbiAgICAgICAgICAgIC8vIElmIGdyaWQgY2F1c2VzIHRoZSBwYXJlbnQgY29udGFpbmVyIHRvIGV4dGVuZCAoZm9yIGV4YW1wbGUgd2hlbiBjb250YWluZXIgaXMgZmxleClcbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgYXV0by1zaXplIHNpbmNlIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29udGFpbmVyIHdpbGwgY29udGludW91c2x5IGNoYW5nZSBhcyB0aGUgZ3JpZCByZW5kZXJzIGVsZW1lbnRzLlxuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlcyA9IHRoaXMuY2hlY2tDb250YWluZXJTaXplQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0cyBjYWxjdWxhdGVkIHdpZHRoIG9mIHRoZSB1bnBpbm5lZCBhcmVhXG4gICAgICogQHBhcmFtIHRha2VIaWRkZW4gSWYgd2Ugc2hvdWxkIHRha2UgaW50byBhY2NvdW50IHRoZSBoaWRkZW4gY29sdW1ucyBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFVucGlubmVkV2lkdGgodGFrZUhpZGRlbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuaXNQZXJjZW50V2lkdGggP1xuICAgICAgICAgICAgdGhpcy5jYWxjV2lkdGggOlxuICAgICAgICAgICAgcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIHx8IHBhcnNlSW50KHRoaXMuaG9zdFdpZHRoLCAxMCkgfHwgdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgJiYgIXRoaXMuaXNQZXJjZW50V2lkdGgpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNQaW5uaW5nVG9TdGFydCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2lkdGggLSB0aGlzLmdldFBpbm5lZFdpZHRoKHRha2VIaWRkZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3N1bW1hcmllcyhmaWVsZE5hbWU6IHN0cmluZywgaGFzU3VtbWFyeTogYm9vbGVhbiwgc3VtbWFyeU9wZXJhbmQ/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5ncmlkQVBJLmdldF9jb2x1bW5fYnlfbmFtZShmaWVsZE5hbWUpO1xuICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICBjb2x1bW4uaGFzU3VtbWFyeSA9IGhhc1N1bW1hcnk7XG4gICAgICAgICAgICBpZiAoc3VtbWFyeU9wZXJhbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnJldHJpZ2dlclJvb3RQaXBlKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbHVtbi5zdW1tYXJpZXMgPSBzdW1tYXJ5T3BlcmFuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX211bHRpcGxlU3VtbWFyaWVzKGV4cHJlc3Npb25zOiBJU3VtbWFyeUV4cHJlc3Npb25bXSwgaGFzU3VtbWFyeTogYm9vbGVhbikge1xuICAgICAgICBleHByZXNzaW9ucy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMoZWxlbWVudC5maWVsZE5hbWUsIGhhc1N1bW1hcnksIGVsZW1lbnQuY3VzdG9tU3VtbWFyeSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMoZXhwcmVzc2lvbnMpIHtcbiAgICAgICAgZXhwcmVzc2lvbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lID0gY29sdW1uICYmIGNvbHVtbi5maWVsZE5hbWUgPyBjb2x1bW4uZmllbGROYW1lIDogY29sdW1uO1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKGNvbHVtbk5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByZXNvbHZlRGF0YVR5cGVzKHJlYykge1xuICAgICAgICBpZiAodHlwZW9mIHJlYyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdvYmplY3QnICYmIHJlYyBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmVjID09PSAnc3RyaW5nJyAmJiAoL1xcLihnaWZ8anBlP2d8dGlmZj98cG5nfHdlYnB8Ym1wKSQvaSkudGVzdChyZWMpKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLkltYWdlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXV0b2dlbmVyYXRlQ29sdW1ucygpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ3JpZEFQSS5nZXRfZGF0YSgpO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmdlbmVyYXRlRGF0YUZpZWxkcyhkYXRhKTtcbiAgICAgICAgY29uc3QgY29sdW1ucyA9IFtdO1xuXG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gY3JlYXRlQ29tcG9uZW50KElneENvbHVtbkNvbXBvbmVudCwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudkluamVjdG9yLCBlbGVtZW50SW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSk7XG4gICAgICAgICAgICByZWYuaW5zdGFuY2UuZmllbGQgPSBmaWVsZDtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5kYXRhVHlwZSA9IHRoaXMucmVzb2x2ZURhdGFUeXBlcyhkYXRhWzBdW2ZpZWxkXSk7XG4gICAgICAgICAgICByZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKHJlZi5pbnN0YW5jZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyA9IGNvbHVtbnM7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKGNvbHVtbnMpO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdWxkR2VuZXJhdGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbHVtbnNBdXRvZ2VuZXJhdGVkLmVtaXQoeyBjb2x1bW5zOiB0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhRmllbGRzKGRhdGE6IGFueVtdKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSAmJiBkYXRhLmxlbmd0aCAhPT0gMCA/IGRhdGFbMF0gOiBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+ICF0aGlzLmF1dG9HZW5lcmF0ZUV4Y2x1ZGUuaW5jbHVkZXMoa2V5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpbml0Q29sdW1ucyhjb2xsZWN0aW9uOiBJZ3hDb2x1bW5Db21wb25lbnRbXSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtbkdyb3VwcyA9IGNvbGxlY3Rpb24uc29tZShjb2wgPT4gY29sLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgLy8gU2V0IG92ZXJhbGwgcm93IGxheW91dCBzaXplXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb2wuY29sdW1uTGF5b3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheW91dFNpemUgPSBjb2wuY2hpbGRyZW4gP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLnJlZHVjZSgoYWNjLCB2YWwpID0+IE1hdGgubWF4KHZhbC5yb3dTdGFydCArIHZhbC5ncmlkUm93U3BhbiAtIDEsIGFjYyksIDEpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IE1hdGgubWF4KGxheW91dFNpemUsIHRoaXMuX211bHRpUm93TGF5b3V0Um93U2l6ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cyAmJiB0aGlzLmhhc0NvbHVtbkdyb3Vwcykge1xuICAgICAgICAgICAgLy8gaW52YWxpZCBjb25maWd1cmF0aW9uIC0gbXVsdGktcm93IGFuZCBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICAvLyByZW1vdmUgY29sdW1uIGdyb3Vwc1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTGF5b3V0Q29sdW1ucyA9IGNvbGxlY3Rpb24uZmlsdGVyKChjb2wpID0+IGNvbC5jb2x1bW5MYXlvdXQgfHwgY29sLmNvbHVtbkxheW91dENoaWxkKTtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBjb2x1bW5MYXlvdXRDb2x1bW5zO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICBjb2x1bW4uZGVmYXVsdFdpZHRoID0gdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA/IHRoaXMuX2NvbHVtbldpZHRoIDogY29sdW1uLmRlZmF1bHRXaWR0aCA/IGNvbHVtbi5kZWZhdWx0V2lkdGggOiAnJztcblxuICAgICAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICAgICAgY2IoY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb2x1bW5zKGNvbGxlY3Rpb24pO1xuXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb2x1bW4ucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlaW5pdFBpblN0YXRlcygpIHtcbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMucGlubmVkKS5zb3J0KChhLCBiKSA9PiB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YoYSkgLSB0aGlzLl9waW5uZWRDb2x1bW5zLmluZGV4T2YoYikpO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSB0aGlzLmhhc0NvbHVtbkdyb3VwcyA/IHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpIDpcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5waW5uZWQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuX3VucGlubmVkQ29sdW1ucy5pbmRleE9mKGEpIC0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YoYikpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UsIGNvbHVtbkRhdGE/OiBhbnlbXSk6IGFueVtdIHtcbiAgICAgICAgbGV0IGNvbHVtbnNBcnJheTogSWd4Q29sdW1uQ29tcG9uZW50W107XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3Rpb25Db2xsZWN0aW9uID0gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBrZXlzQW5kRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdoaWVyYXJjaGljYWwnKSB7XG4gICAgICAgICAgICBjb25zdCBleHBhbnNpb25Sb3dJbmRleGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmV4cGFuc2lvblN0YXRlcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19pbmRleF9ieV9pZChrZXksIHRoaXMuZGF0YVZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLnB1c2gocm93SW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBkYXRlZEtleSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdWJ0cmFjdCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkS2V5ID4gTnVtYmVyKHJvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJhY3QrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNvbGxlY3Rpb24uc2V0KHVwZGF0ZWRLZXkgLSBzdWJ0cmFjdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3RpdmVFbCkge1xuICAgICAgICAgICAgICAgIGxldCBzdWJ0cmFjdCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGV4cGFuc2lvblJvd0luZGV4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbnNpb25Sb3dJbmRleGVzLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVFbC5yb3cgPiBOdW1iZXIocm93KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyYWN0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVFbC5yb3cgLT0gc3VidHJhY3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9ICh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3QgaXNSZW1vdGUgPSB0b3RhbEl0ZW1zICYmIHRvdGFsSXRlbXMgPiB0aGlzLmRhdGFWaWV3Lmxlbmd0aDtcbiAgICAgICAgbGV0IHNlbGVjdGlvbk1hcDtcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2hpZXJhcmNoaWNhbCcgJiYgc2VsZWN0aW9uQ29sbGVjdGlvbi5zaXplID4gMCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwID0gaXNSZW1vdGUgPyBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pIDpcbiAgICAgICAgICAgICAgICBBcnJheS5mcm9tKHNlbGVjdGlvbkNvbGxlY3Rpb24pLmZpbHRlcigodHVwbGUpID0+IHR1cGxlWzBdIDwgc291cmNlLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAgPSBpc1JlbW90ZSA/IEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikgOlxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbikuZmlsdGVyKCh0dXBsZSkgPT4gdHVwbGVbMF0gPCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLnNpbmdsZSAmJiBhY3RpdmVFbCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1c2goW2FjdGl2ZUVsLnJvdywgbmV3IFNldDxudW1iZXI+KCkuYWRkKGFjdGl2ZUVsLmNvbHVtbildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNlbGxTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmUgJiYgYWN0aXZlRWwpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5wdXNoKFthY3RpdmVFbC5yb3csIG5ldyBTZXQ8bnVtYmVyPigpLmFkZChhY3RpdmVFbC5jb2x1bW4pXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRhID0gY29sdW1uRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgZm9yIChsZXQgW3Jvdywgc2V0XSBvZiBzZWxlY3Rpb25NYXApIHtcbiAgICAgICAgICAgIHJvdyA9IHRoaXMucGFnaW5hdG9yICYmICh0aGlzLnBhZ2luZ01vZGUgPT09IEdyaWRQYWdpbmdNb2RlLkxvY2FsICYmIHNvdXJjZSA9PT0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEpID8gcm93ICsgKHRoaXMucGVyUGFnZSAqIHRoaXMucGFnZSkgOiByb3c7XG4gICAgICAgICAgICByb3cgPSBpc1JlbW90ZSA/IHJvdyAtIHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4IDogcm93O1xuICAgICAgICAgICAgaWYgKCFzb3VyY2Vbcm93XSB8fCBzb3VyY2Vbcm93XS5kZXRhaWxzRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gQXJyYXkuZnJvbShzZXQpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIHRlbXApIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkgPSB0aGlzLmdldFNlbGVjdGFibGVDb2x1bW5zQXQoZWFjaCk7XG4gICAgICAgICAgICAgICAgY29sdW1uc0FycmF5LmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnR5cGUgIT09ICdwaXZvdCcgJiYgaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93RGF0YSA9IHNvdXJjZVtyb3ddLmdob3N0UmVjb3JkID8gc291cmNlW3Jvd10ucmVjb3JkUmVmIDogc291cmNlW3Jvd107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHlwZSA9PT0gJ3Bpdm90JyA/IHJvd0RhdGEuYWdncmVnYXRpb25WYWx1ZXMuZ2V0KGNvbC5maWVsZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdmVOZXN0ZWRQYXRoKHJvd0RhdGEsIGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGZvcm1hdHRlcnMgJiYgY29sLmZvcm1hdHRlciA/IGNvbC5mb3JtYXR0ZXIodmFsdWUsIHJvd0RhdGEpIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSByZWNvcmRba2V5XS50b1N0cmluZygpLmNvbmNhdCgncmVjb3JkUm93LScgKyByb3cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gT2JqZWN0LmtleXMoY29sdW1uRGF0YVswXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjOiBhbnkgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvd051bWJlciA9ICtjLnNwbGl0KCdyZWNvcmRSb3ctJylbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjID0gYy5zcGxpdCgncmVjb3JkUm93LScpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBjO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkT2JqID0gT2JqZWN0LmFzc2lnbihzZWxlY3RlZERhdGFbcm93TnVtYmVyXSwgcmVjb3JkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdID0gbWVyZ2VkT2JqO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhLnB1c2gocmVjb3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAga2V5c0FuZERhdGEucHVzaChzZWxlY3RlZERhdGEpO1xuICAgICAgICAgICAga2V5c0FuZERhdGEucHVzaChrZXlzKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzQW5kRGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZERhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0U2VsZWN0YWJsZUNvbHVtbnNBdChpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlTGF5b3V0Q29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbExheW91dCA9IHZpc2libGVMYXlvdXRDb2x1bW5zW2luZGV4XTtcbiAgICAgICAgICAgIHJldHVybiBjb2xMYXlvdXQgPyBjb2xMYXlvdXQuY2hpbGRyZW4udG9BcnJheSgpIDogW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IHRoaXMudmlzaWJsZUNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbCA9PiAhY29sLmNvbHVtbkdyb3VwKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLnZpc2libGVJbmRleCAtIGIudmlzaWJsZUluZGV4KTtcbiAgICAgICAgICAgIHJldHVybiBbdmlzaWJsZUNvbHVtbnNbaW5kZXhdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhdXRvU2l6ZUNvbHVtbnNJblZpZXcoKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW5zVG9BdXRvc2l6ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCB2U3RhdGUgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5zdGF0ZTtcbiAgICAgICAgbGV0IGNvbFJlc2l6ZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdW5waW5uZWRJblZpZXcgPSB0aGlzLmhlYWRlckNvbnRhaW5lci5pZ3hHcmlkRm9yT2Yuc2xpY2UodlN0YXRlLnN0YXJ0SW5kZXgsIHZTdGF0ZS5zdGFydEluZGV4ICsgdlN0YXRlLmNodW5rU2l6ZSkuZmxhdE1hcCh4ID0+IHguY29sdW1uR3JvdXAgPyB4LmFsbENoaWxkcmVuIDogeCk7XG4gICAgICAgIGNvbnN0IGNvbHVtbnNJblZpZXcgPSB0aGlzLnBpbm5lZENvbHVtbnMuY29uY2F0KHVucGlubmVkSW5WaWV3IGFzIElneENvbHVtbkNvbXBvbmVudFtdKTtcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1uc0luVmlldykge1xuICAgICAgICAgICAgaWYgKCFjb2wuYXV0b1NpemUgJiYgY29sLmhlYWRlckNlbGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsc0NvbnRlbnRXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAoY29sLl9jZWxscy5sZW5ndGggIT09IHRoaXMucm93TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dMaXN0LmZvckVhY2goeCA9PiB4LmNkci5kZXRlY3RDaGFuZ2VzKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjZWxscyA9IHRoaXMuX2RhdGFSb3dMaXN0Lm1hcCh4ID0+IHguY2VsbHMuZmluZChjID0+IGMuY29sdW1uID09PSBjb2wpKTtcbiAgICAgICAgICAgICAgICBjZWxscy5mb3JFYWNoKChjZWxsKSA9PiBjZWxsc0NvbnRlbnRXaWR0aHMucHVzaChjZWxsPy5uYXRpdmVFbGVtZW50Py5vZmZzZXRXaWR0aCB8fCAwKSk7XG4gICAgICAgICAgICAgICAgbGV0IG1heEZvckNlbGxzID0gTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmhlYWRlckNlbGxMaXN0LmZpbmQoeCA9PiB4LmNvbHVtbiA9PT0gY29sKTtcbiAgICAgICAgICAgICAgICBjZWxsc0NvbnRlbnRXaWR0aHMucHVzaChoZWFkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKTtcbiAgICAgICAgICAgICAgICAvLyBpbiBjYXNlcyB3aXRoIHRlbXBsYXRlIGNvbnRhaW5zIHNvbWV0aGluZywgbGlrZSBhIHdlYmNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAvLyB0aGF0IHJlbmRlcnMgZnVsbHkgb25seSBhZnRlciBpdCBpcyBhbHJlYWR5IGluamVjdGVkIGluIHRoZSBET00sXG4gICAgICAgICAgICAgICAgLy8gYW5kIGluaXRpYWxseSByZW5kZXJzIGFzIGVtcHR5LCBza2lwIG1lYXN1cmluZyBpdC5cbiAgICAgICAgICAgICAgICBsZXQgZW1wdHlDZWxsV2l0aFBhZGRpbmdPbmx5ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID4gMCAmJiAhIWNvbC5ib2R5VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGNlbGxzWzBdLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBlbXB0eUNlbGxXaXRoUGFkZGluZ09ubHkgPSBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nUmlnaHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1heEZvckNlbGxzID0gbWF4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IDAgfHwgKG1heEZvckNlbGxzIDw9IGVtcHR5Q2VsbFdpdGhQYWRkaW5nT25seSAmJiB0aGlzLl9maXJzdEF1dG9SZXNpemUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNlbGxzIG5vdCBpbiBET00geWV0IG9yIGNvbnRlbnQgbm90IGZ1bGx5IGluaXRpYWxpemVkLlxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG1heFNpemUgPSBNYXRoLmNlaWwoTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKSkgKyAxO1xuICAgICAgICAgICAgICAgIGlmIChjb2wubWF4V2lkdGggJiYgbWF4U2l6ZSA+IGNvbC5tYXhXaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSBjb2wubWF4V2lkdGhQeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1heFNpemUgPCBjb2wubWluV2lkdGhQeCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhTaXplID0gY29sLm1pbldpZHRoUHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbC5hdXRvU2l6ZSA9IG1heFNpemU7XG4gICAgICAgICAgICAgICAgY29sLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgICAgICAgICAgY29sUmVzaXplZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbFJlc2l6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHRyYWN0RGF0YUZyb21Db2x1bW5zU2VsZWN0aW9uKHNvdXJjZTogYW55W10sIGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKTogYW55W10ge1xuICAgICAgICBsZXQgcmVjb3JkID0ge307XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0YSA9IFtdO1xuICAgICAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLnNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIHNvdXJjZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLmZvckVhY2goKGNvbCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlcnMgPyBjb2wuaGVhZGVyIHx8IGNvbC5maWVsZCA6IGNvbC5maWVsZDtcbiAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGZvcm1hdHRlcnMgJiYgY29sLmZvcm1hdHRlciA/IGNvbC5mb3JtYXR0ZXIoZGF0YVtjb2wuZmllbGRdLCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IGRhdGFbY29sLmZpZWxkXTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocmVjb3JkKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVjb3JkID0ge307XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRQaW5uaW5nKCkge1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRXaWR0aCgpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29sdW1uUGlubmluZ0Zvckdyb3VwcygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNjcm9sbFRvKHJvdzogYW55IHwgbnVtYmVyLCBjb2x1bW46IGFueSB8IG51bWJlciwgaW5Db2xsZWN0aW9uID0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGRlbGF5U2Nyb2xsaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yICYmIHR5cGVvZiAocm93KSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaW5Db2xsZWN0aW9uLmluZGV4T2Yocm93KTtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLmZsb29yKHJvd0luZGV4IC8gdGhpcy5wZXJQYWdlKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucGFnZSAhPT0gcGFnZSkge1xuICAgICAgICAgICAgICAgIGRlbGF5U2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRlbGF5U2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRhdGFDaGFuZ2VkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpcmVjdGl2ZSh0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgdHlwZW9mIChyb3cpID09PSAnbnVtYmVyJyA/IHJvdyA6IHRoaXMudW5waW5uZWREYXRhVmlldy5pbmRleE9mKHJvdykpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY3JvbGxUb0hvcml6b250YWxseShjb2x1bW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsVG9Ib3Jpem9udGFsbHkoY29sdW1uOiBhbnkgfCBudW1iZXIpIHtcbiAgICAgICAgbGV0IGNvbHVtbkluZGV4ID0gdHlwZW9mIGNvbHVtbiA9PT0gJ251bWJlcicgPyBjb2x1bW4gOiB0aGlzLmdldENvbHVtbkJ5TmFtZShjb2x1bW4pLnZpc2libGVJbmRleDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUm93ID0gdGhpcy5yb3dMaXN0LmZpbmQociA9PiAhIXIudmlydERpclJvdyk7XG4gICAgICAgIGNvbnN0IHZpcnREaXIgPSBzY3JvbGxSb3cgPyBzY3JvbGxSb3cudmlydERpclJvdyA6IG51bGw7XG4gICAgICAgIGlmICh0aGlzLmlzUGlubmluZ1RvU3RhcnQgJiYgdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4ID49IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCAtPSB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHZpcnREaXIsIGNvbHVtbkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsRGlyZWN0aXZlKGRpcmVjdGl2ZTogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueSwgYW55W10+LCBnb2FsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFkaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXJlY3RpdmUuc2Nyb2xsVG8oZ29hbCk7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldENvbHVtbldpZHRoU3VtKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBjb2xTdW0gPSAwO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5oYXNDb2x1bW5MYXlvdXRzID9cbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpIDogdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIGNvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgY29sU3VtICs9IHBhcnNlSW50KChpdGVtLmNhbGNXaWR0aCB8fCBpdGVtLmRlZmF1bHRXaWR0aCksIDEwKSB8fCB0aGlzLm1pbkNvbHVtbldpZHRoO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb2xTdW0pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgY29sU3VtICs9IHRoaXMuZmVhdHVyZUNvbHVtbnNXaWR0aCgpO1xuICAgICAgICByZXR1cm4gY29sU3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmeSBjaGFuZ2VzLCByZXNldCBjYWNoZSBhbmQgcG9wdWxhdGVWaXNpYmxlSW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jb2x1bW5zUmVvcmRlcmVkKGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAvLyBhZnRlciByZW9yZGVyaW5nIGlzIGRvbmUgcmVzZXQgY2FjaGVkIGNvbHVtbiBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIGNvbHVtbi5yZXNldENhY2hlcygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZERhdGFWaWV3KF9kYXRhOiBhbnlbXSkge1xuICAgICAgICB0aGlzLl9kYXRhVmlldyA9IHRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgP1xuICAgICAgICAgICAgWy4uLnRoaXMucGlubmVkRGF0YVZpZXcsIC4uLnRoaXMudW5waW5uZWREYXRhVmlld10gOlxuICAgICAgICAgICAgWy4uLnRoaXMudW5waW5uZWREYXRhVmlldywgLi4udGhpcy5waW5uZWREYXRhVmlld107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCkge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLl93aWR0aDtcbiAgICAgICAgaWYgKHdpZHRoID09PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY3VycmVudFdpZHRoID0gdGhpcy5jYWxjV2lkdGg7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNWZXJ0aWNhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFdpZHRoICs9IHRoaXMuc2Nyb2xsU2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpZHRoID0gY3VycmVudFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9ob3N0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHZlcnRpY2FsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLm9uU2Nyb2xsKGV2ZW50KTtcbiAgICAgICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbnMgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmNodW5rTG9hZC5lbWl0KHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlUm93RWRpdGluZ092ZXJsYXlTdGF0ZU9uU2Nyb2xsKHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuaGlkZU92ZXJsYXlzKCk7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAuY29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJnczogSUdyaWRTY3JvbGxFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBkaXJlY3Rpb246ICd2ZXJ0aWNhbCcsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ3JpZFNjcm9sbC5lbWl0KGFyZ3MpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBob3Jpem9udGFsU2Nyb2xsSGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gZXZlbnQudGFyZ2V0LnNjcm9sbExlZnQ7XG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLm9uSFNjcm9sbChzY3JvbGxMZWZ0KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcy5mb3JFYWNoKHZmb3IgPT4gdmZvci5vbkhTY3JvbGwoc2Nyb2xsTGVmdCkpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRWaXJ0RGlyLmNodW5rTG9hZC5lbWl0KHRoaXMuaGVhZGVyQ29udGFpbmVyLnN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbi5pc0NvbHVtbkZ1bGx5VmlzaWJsZSh0aGlzLm5hdmlnYXRpb24ubGFzdENvbHVtbkluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJR3JpZFNjcm9sbEV2ZW50QXJncyA9IHsgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcsIGV2ZW50LCBzY3JvbGxQb3NpdGlvbjogdGhpcy5oZWFkZXJDb250YWluZXIuc2Nyb2xsUG9zaXRpb24gfTtcbiAgICAgICAgdGhpcy5ncmlkU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByZW5kZXJlZEFjdHVhbFJvd0hlaWdodCgpIHtcbiAgICAgICAgbGV0IGJvcmRlciA9IDE7XG4gICAgICAgIGlmICh0aGlzLnJvd0xpc3QudG9BcnJheSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd1N0eWxlcyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5yb3dMaXN0LmZpcnN0Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgYm9yZGVyID0gcm93U3R5bGVzLmJvcmRlckJvdHRvbVdpZHRoID8gTWF0aC5jZWlsKHBhcnNlRmxvYXQocm93U3R5bGVzLmJvcmRlckJvdHRvbVdpZHRoKSkgOiBib3JkZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucm93SGVpZ2h0ICsgYm9yZGVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXggPSAtMSwgY2I6IChhcmdzOiBhbnkpID0+IHZvaWQgPSBudWxsKSB7XG4gICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcm93ID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5maW5kKHIgPT4gci5pbmRleCA9PT0gcm93SW5kZXgpO1xuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkudG90YWxJdGVtQ291bnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmRhdGFDaGFuZ2VkLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNiQXJncyA9IHRoaXMuZ2V0TmF2aWdhdGlvbkFyZ3VtZW50cyhyb3csIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNiKGNiQXJncyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlld0luZGV4ID0gdGhpcy5fZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XS5kZXRhaWxzRGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5zZXRBY3RpdmVOb2RlKHsgcm93OiByb3dJbmRleCB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzID0gdGhpcy5nZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgY2IoYXJncyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KSB7XG4gICAgICAgIGxldCB0YXJnZXRUeXBlOiBHcmlkS2V5ZG93blRhcmdldFR5cGU7IGxldCB0YXJnZXQ7XG4gICAgICAgIHN3aXRjaCAocm93Lm5hdGl2ZUVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlICdpZ3gtZ3JpZC1ncm91cGJ5LXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdncm91cFJvdyc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaWd4LWdyaWQtc3VtbWFyeS1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnc3VtbWFyeUNlbGwnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHZpc2libGVDb2xJbmRleCAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICByb3cuc3VtbWFyeUNlbGxzLmZpbmQoYyA9PiBjLnZpc2libGVDb2x1bW5JbmRleCA9PT0gdmlzaWJsZUNvbEluZGV4KSA6IHJvdy5zdW1tYXJ5Q2VsbHMuZmlyc3Q7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpZ3gtY2hpbGQtZ3JpZC1yb3cnOlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnaGllcmFyY2hpY2FsUm93JztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRhcmdldFR5cGUgPSAnZGF0YUNlbGwnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHZpc2libGVDb2xJbmRleCAhPT0gLTEgPyByb3cuY2VsbHMuZmluZChjID0+IGMudmlzaWJsZUNvbHVtbkluZGV4ID09PSB2aXNpYmxlQ29sSW5kZXgpIDogcm93LmNlbGxzLmZpcnN0O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRhcmdldFR5cGUsIHRhcmdldCB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyZW50Um93SW5kZXgsIHByZXZpb3VzID0gZmFsc2UpOiBudW1iZXIge1xuICAgICAgICBjb25zdCByZXNvbHZlZEluZGV4ID0gdGhpcy5fZ2V0RGF0YVZpZXdJbmRleChjdXJyZW50Um93SW5kZXgpO1xuICAgICAgICBpZiAoY3VycmVudFJvd0luZGV4IDwgMCB8fCAoY3VycmVudFJvd0luZGV4ID09PSAwICYmIHByZXZpb3VzKSB8fCAocmVzb2x2ZWRJbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDEgJiYgIXByZXZpb3VzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3dJbmRleDtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5kIG5leHQvcHJldiByZWNvcmQgdGhhdCBpcyBlZGl0YWJsZS5cbiAgICAgICAgY29uc3QgbmV4dFJvd0luZGV4ID0gcHJldmlvdXMgPyB0aGlzLmZpbmRQcmV2RWRpdGFibGVEYXRhUm93SW5kZXgoY3VycmVudFJvd0luZGV4KSA6XG4gICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmZpbmRJbmRleCgocmVjLCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICBpbmRleCA+IHJlc29sdmVkSW5kZXggJiYgdGhpcy5pc0VkaXRhYmxlRGF0YVJlY29yZEF0SW5kZXgoaW5kZXgpKTtcbiAgICAgICAgY29uc3QgbmV4dERhdGFJbmRleCA9IHRoaXMuZ2V0RGF0YUluZGV4KG5leHRSb3dJbmRleCk7XG4gICAgICAgIHJldHVybiBuZXh0RGF0YUluZGV4ICE9PSAtMSA/IG5leHREYXRhSW5kZXggOiBjdXJyZW50Um93SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgZWRpdGFibGUgcm93IGluZGV4IG9yIC0xIGlmIG5vIHN1Y2ggcm93IGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGN1cnJlbnRJbmRleCBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWRpdGFibGUgcmVjb3JkLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFByZXZFZGl0YWJsZURhdGFSb3dJbmRleChjdXJyZW50SW5kZXgpOiBudW1iZXIge1xuICAgICAgICBsZXQgaSA9IHRoaXMuZGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICBjb25zdCByZXNvbHZlZEluZGV4ID0gdGhpcy5fZ2V0RGF0YVZpZXdJbmRleChjdXJyZW50SW5kZXgpO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHJlc29sdmVkSW5kZXggJiYgdGhpcy5pc0VkaXRhYmxlRGF0YVJlY29yZEF0SW5kZXgoaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSByZWNvcmQgYXQgdGhlIHNwZWNpZmllZCBkYXRhIHZpZXcgaW5kZXggaXMgYSBhbiBlZGl0YWJsZSBkYXRhIHJlY29yZC5cbiAgICAgKiBJZiByZWNvcmQgaXMgZ3JvdXAgcmVjLCBzdW1tYXJ5IHJlYywgY2hpbGQgcmVjLCBnaG9zdCByZWMuIGV0Yy4gaXQgaXMgbm90IGVkaXRhYmxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGRhdGFWaWV3SW5kZXggVGhlIGluZGV4IG9mIHRoYXQgcmVjb3JkIGluIHRoZSBkYXRhIHZpZXcuXG4gICAgICpcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgaXQgaW50byBDUlVEXG4gICAgcHJpdmF0ZSBpc0VkaXRhYmxlRGF0YVJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdO1xuICAgICAgICByZXR1cm4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSAmJlxuICAgICAgICAgICAgIXRoaXMuaXNHaG9zdFJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgcmVjb3JkIGF0IHRoZSBzcGVjaWZpZWQgZGF0YSB2aWV3IGluZGV4IGlzIGEgZ2hvc3QuXG4gICAgICogSWYgcmVjb3JkIGlzIHBpbm5lZCBidXQgaXMgbm90IGluIHBpbm5lZCBhcmVhIHRoZW4gaXQgaXMgYSBnaG9zdCByZWNvcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVZpZXdJbmRleCBUaGUgaW5kZXggb2YgdGhhdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlldy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzR2hvc3RSZWNvcmRBdEluZGV4KGRhdGFWaWV3SW5kZXgpIHtcbiAgICAgICAgY29uc3QgaXNQaW5uZWQgPSB0aGlzLmlzUmVjb3JkUGlubmVkKHRoaXMuZGF0YVZpZXdbZGF0YVZpZXdJbmRleF0pO1xuICAgICAgICBjb25zdCBpc0luUGlubmVkQXJlYSA9IHRoaXMuaXNSZWNvcmRQaW5uZWRCeVZpZXdJbmRleChkYXRhVmlld0luZGV4KTtcbiAgICAgICAgcmV0dXJuIGlzUGlubmVkICYmICFpc0luUGlubmVkQXJlYTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVmFsaWRQb3NpdGlvbihyb3dJbmRleCwgY29sSW5kZXgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qgcm93cyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkubGVuZ3RoO1xuICAgICAgICBjb25zdCBjb2xzID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwICYmICFjb2wuaGlkZGVuKS5sZW5ndGg7XG4gICAgICAgIGlmIChyb3dzIDwgMSB8fCBjb2xzIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyb3dJbmRleCA+IC0xICYmIHJvd0luZGV4IDwgdGhpcy5kYXRhVmlldy5sZW5ndGggJiZcbiAgICAgICAgICAgIGNvbEluZGV4ID4gLSAxICYmIGNvbEluZGV4IDw9IE1hdGgubWF4KC4uLnRoaXMudmlzaWJsZUNvbHVtbnMubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZCh0ZXh0OiBzdHJpbmcsIGluY3JlbWVudDogbnVtYmVyLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4sIHNjcm9sbD86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3dMaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmRFZGl0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCA9IGNhc2VTZW5zaXRpdmUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGNvbnN0IGV4YWN0TWF0Y2hSZXNvbHZlZCA9IGV4YWN0TWF0Y2ggPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIGxldCByZWJ1aWxkQ2FjaGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCAhPT0gdGV4dCB8fFxuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZSAhPT0gY2FzZVNlbnNpdGl2ZVJlc29sdmVkIHx8XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5leGFjdE1hdGNoICE9PSBleGFjdE1hdGNoUmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvID0ge1xuICAgICAgICAgICAgICAgIHNlYXJjaFRleHQ6IHRleHQsXG4gICAgICAgICAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgZXhhY3RNYXRjaDogZXhhY3RNYXRjaFJlc29sdmVkLFxuICAgICAgICAgICAgICAgIG1hdGNoSW5mb0NhY2hlOiBbXSxcbiAgICAgICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZWJ1aWxkQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVidWlsZENhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5jZWxscykge1xuICAgICAgICAgICAgICAgICAgICByb3cuY2VsbHMuZm9yRWFjaCgoYzogSWd4R3JpZENlbGxDb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuaGlnaGxpZ2h0VGV4dCh0ZXh0LCBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQsIGV4YWN0TWF0Y2hSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRNYXRjaENhY2hlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA+PSB0aGlzLl9sYXN0U2VhcmNoSW5mby5tYXRjaENvdW50KSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8uYWN0aXZlTWF0Y2hJbmRleCA9IHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoQ291bnQgLSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEluZm8gPSB0aGlzLl9sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZVt0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvID0geyAuLi50aGlzLl9sYXN0U2VhcmNoSW5mbyB9O1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8obWF0Y2hJbmZvLnJvdywgbWF0Y2hJbmZvLmNvbHVtbik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGV4dEhpZ2hsaWdodFNlcnZpY2Uuc2V0QWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQsIHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IG1hdGNoSW5mby5jb2x1bW4sXG4gICAgICAgICAgICAgICAgcm93OiBtYXRjaEluZm8ucm93LFxuICAgICAgICAgICAgICAgIGluZGV4OiBtYXRjaEluZm8uaW5kZXgsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IG1hdGNoSW5mby5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRleHRIaWdobGlnaHRTZXJ2aWNlLmNsZWFyQWN0aXZlSGlnaGxpZ2h0KHRoaXMuaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoQ291bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWJ1aWxkTWF0Y2hDYWNoZSgpIHtcbiAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUgPSBbXTtcblxuICAgICAgICBjb25zdCBjYXNlU2Vuc2l0aXZlID0gdGhpcy5fbGFzdFNlYXJjaEluZm8uY2FzZVNlbnNpdGl2ZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaCA9IHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2g7XG4gICAgICAgIGNvbnN0IHNlYXJjaFRleHQgPSBjYXNlU2Vuc2l0aXZlID8gdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dCA6IHRoaXMuX2xhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICBjb25zdCBjb2x1bW5JdGVtcyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKChjKSA9PiAhYy5jb2x1bW5Hcm91cCkuc29ydCgoYzEsIGMyKSA9PiBjMS52aXNpYmxlSW5kZXggLSBjMi52aXNpYmxlSW5kZXgpO1xuXG4gICAgICAgIGRhdGEuZm9yRWFjaCgoZGF0YVJvdywgcm93SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbkl0ZW1zLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXBlQXJncyA9IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGMuZmllbGQpLnBpcGVBcmdzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYy5mb3JtYXR0ZXIgPyBjLmZvcm1hdHRlcihyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgZGF0YVJvdykgOlxuICAgICAgICAgICAgICAgICAgICBjLmRhdGFUeXBlID09PSAnbnVtYmVyJyA/IGZvcm1hdE51bWJlcihyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgdGhpcy5sb2NhbGUsIHBpcGVBcmdzLmRpZ2l0c0luZm8pIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZGF0YVR5cGUgPT09ICdkYXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm9ybWF0RGF0ZShyZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKSwgcGlwZUFyZ3MuZm9ybWF0LCB0aGlzLmxvY2FsZSwgcGlwZUFyZ3MudGltZXpvbmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZXNvbHZlTmVzdGVkUGF0aChkYXRhUm93LCBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBjLnNlYXJjaGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaFZhbHVlID0gY2FzZVNlbnNpdGl2ZSA/IFN0cmluZyh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hWYWx1ZSA9PT0gc2VhcmNoVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pYzogSU1hdGNoSW5mb0NhY2hlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oW1sncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpXV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2gobWljKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvY2N1cnJlbmNlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlYXJjaEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pYzogSU1hdGNoSW5mb0NhY2hlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IGRhdGFSb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogYy5maWVsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG9jY3VycmVuY2VJbmRleCsrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KFtbJ3Bpbm5lZCcsIHRoaXMuaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4KV1dKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZS5wdXNoKG1pYyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZSA9IHNlYXJjaFZhbHVlLnN1YnN0cmluZyhzZWFyY2hJbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IHNlYXJjaFZhbHVlLmluZGV4T2Yoc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA9IHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRGVmYXVsdFJvd0hlaWdodCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVJvd0xpc3QubGVuZ3RoID4gMCAmJiB0aGlzLmRhdGFSb3dMaXN0LmZpcnN0LmNlbGxzICYmIHRoaXMuZGF0YVJvd0xpc3QuZmlyc3QuY2VsbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VGbG9hdCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5kYXRhUm93TGlzdC5maXJzdC5jZWxscy5maXJzdC5uYXRpdmVFbGVtZW50KT8uZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpO1xuICAgICAgICAgICAgaWYgKGhlaWdodCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRSb3dIZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlY2FsY1Jvd0hlaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBBYm91dCB0byBNb3ZlIHRvIENSVURcbiAgICBwcml2YXRlIGNvbmZpZ3VyZVJvd0VkaXRpbmdPdmVybGF5KHJvd0lEOiBhbnksIHVzZU91dGVyID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHNldHRpbmdzID0gdGhpcy5yb3dFZGl0U2V0dGluZ3M7XG4gICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKHRoaXMucm93RWRpdGluZ092ZXJsYXkub3ZlcmxheUlkKTtcbiAgICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgICAgIHNldHRpbmdzID0gb3ZlcmxheS5zZXR0aW5ncztcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy5vdXRsZXQgPSB1c2VPdXRlciA/IHRoaXMucGFyZW50Um93T3V0bGV0RGlyZWN0aXZlIDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmU7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuc2V0dGluZ3MuY29udGFpbmVyID0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBwaW5uZWQgPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xO1xuICAgICAgICBjb25zdCB0YXJnZXRSb3cgPSAhcGlubmVkID9cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2tleShyb3dJRCkgYXMgSWd4Um93RGlyZWN0aXZlXG4gICAgICAgICAgICA6IHRoaXMucGlubmVkUm93cy5maW5kKHggPT4geC5rZXkgPT09IHJvd0lEKSBhcyBJZ3hSb3dEaXJlY3RpdmU7XG4gICAgICAgIGlmICghdGFyZ2V0Um93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc2V0dGluZ3MudGFyZ2V0ID0gdGFyZ2V0Um93LmVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheSh0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUNvbHVtblBpbm5pbmdGb3JHcm91cHMoKTogdm9pZCB7XG4gICAgICAgIC8vIFdoZW4gYSBjb2x1bW4gaXMgYSBncm91cCBvciBpcyBpbnNpZGUgYSBncm91cCwgcGluIGFsbCByZWxhdGVkLlxuICAgICAgICBjb25zdCBwaW5uZWRDb2x1bW5zID0gW107XG4gICAgICAgIGNvbnN0IHVucGlubmVkQ29sdW1ucyA9IFtdO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb2wucGFyZW50LnBpbm5lZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgY29sLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gY2hpbGQucGlubmVkID0gdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBleGNlZWQgdW5waW5uZWQgYXJlYSBtaW4gd2lkdGggYW5kIGdldCBwaW5uZWQgYW5kIHVucGlubmVkIGNvbCBjb2xsZWN0aW9ucy5cbiAgICAgICAgLy8gV2UgdGFrZSBpbnRvIGFjY291bnQgdG9wIGxldmVsIGNvbHVtbnMgKHRvcCBsZXZlbCBncm91cHMgYW5kIG5vbiBncm91cHMpLlxuICAgICAgICAvLyBJZiB0b3AgbGV2ZWwgaXMgdW5waW5uZWQgdGhlIHBpbm5pbmcgaGFuZGxlcyBhbGwgY2hpbGRyZW4gdG8gYmUgdW5waW5uZWQgYXMgd2VsbC5cbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5fY29sdW1ucykge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5waW5uZWQgJiYgIWNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnBpbm5lZCAmJiBjb2x1bW4ucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi50b3BMZXZlbFBhcmVudC5waW5uZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLnBpbm5lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBBc3NpZ24gdGhlIGFwcGxpY2FibGUgY29sbGVjdGlvbnMuXG4gICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSB1bnBpbm5lZENvbHVtbnM7XG4gICAgfVxufVxuIl19
6945
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1iYXNlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9ncmlkLWJhc2UuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFHSCxnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLGVBQWUsRUFDZixlQUFlLEVBQ2YsU0FBUyxFQUVULFVBQVUsRUFFVixZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixNQUFNLEVBRU4sS0FBSyxFQUdMLFNBQVMsRUFJVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxP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LEtBQUs7Z0JBZ0NLLGVBQWU7c0JBRHpCLEtBQUs7Z0JBcUJLLHNCQUFzQjtzQkFEaEMsS0FBSztnQkEwQksscUJBQXFCO3NCQUQvQixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1CM0IsY0FBYztzQkFEeEIsS0FBSztnQkFrQkssWUFBWTtzQkFEdEIsS0FBSztnQkF1QkssY0FBYztzQkFEeEIsS0FBSztnQkE0QkssWUFBWTtzQkFEdEIsS0FBSztnQkFrRkssb0JBQW9CO3NCQUQ5QixLQUFLO2dCQTBDSyxtQkFBbUI7c0JBRDdCLEtBQUs7Z0JBMkRLLHlCQUF5QjtzQkFEbkMsS0FBSztnQkFnRkssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQXNESyxZQUFZO3NCQUR0QixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQXNEM0IsYUFBYTtzQkFEdkIsS0FBSztnQkFzQkssWUFBWTtzQkFEdEIsS0FBSztnQkFzQkssZUFBZTtzQkFEekIsS0FBSztnQkEraEJDLGVBQWU7c0JBRHJCLFlBQVk7dUJBQUMsWUFBWTtnQkFzdEJmLGVBQWU7c0JBRHpCLEtBQUs7Z0JBb0hLLE1BQU07c0JBRGhCLEtBQUs7Z0JBOFBLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBcWdDSyxnQkFBZ0I7c0JBRDFCLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgZm9ybWF0TnVtYmVyLCBnZXRMb2NhbGVOdW1iZXJGb3JtYXQsIE51bWJlckZvcm1hdFN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIGJvb2xlYW5BdHRyaWJ1dGUsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBjcmVhdGVDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIERvQ2hlY2ssXG4gICAgRWxlbWVudFJlZixcbiAgICBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkLFxuICAgIEl0ZXJhYmxlRGlmZmVycyxcbiAgICBMT0NBTEVfSUQsXG4gICAgTmdab25lLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCByZXNpemVPYnNlcnZhYmxlIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJZ2NUcmlhbFdhdGVybWFyayB9IGZyb20gJ2lnbml0ZXVpLXRyaWFsLXdhdGVybWFyayc7XG5pbXBvcnQgeyBTdWJqZWN0LCBwaXBlLCBmcm9tRXZlbnQsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBtZXJnZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCBmaXJzdCwgZmlsdGVyLCB0aHJvdHRsZVRpbWUsIG1hcCwgc2hhcmVSZXBsYXksIHRha2VXaGlsZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lQXJyYXksIG1lcmdlT2JqZWN0cywgY29tcGFyZU1hcHMsIHJlc29sdmVOZXN0ZWRQYXRoLCBpc09iamVjdCwgUGxhdGZvcm1VdGlsIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBHcmlkQ29sdW1uRGF0YVR5cGUgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS11dGlsJztcbmltcG9ydCB7IEZpbHRlcmluZ0xvZ2ljLCBJRmlsdGVyaW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUdyb3VwQnlSZWNvcmQgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZ3JvdXBieS1yZWNvcmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncywgSWd4R3JpZEZvck9mRGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9mb3Itb2YvZm9yX29mLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hUZXh0SGlnaGxpZ2h0U2VydmljZSB9IGZyb20gJy4uL2RpcmVjdGl2ZXMvdGV4dC1oaWdobGlnaHQvdGV4dC1oaWdobGlnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBJU3VtbWFyeUV4cHJlc3Npb24gfSBmcm9tICcuL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHsgSWd4R3JpZEJvZHlEaXJlY3RpdmUsIFJvd0VkaXRQb3NpdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi9ncmlkLmNvbW1vbic7XG5pbXBvcnQgdHlwZSB7IElneEdyaWRUb29sYmFyQ29tcG9uZW50IH0gZnJvbSAnLi90b29sYmFyL2dyaWQtdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VG9vbGJhclRva2VuIH0gZnJvbSAnLi90b29sYmFyL3Rva2VuJztcbmltcG9ydCB7IElneFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4vcm93LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBJZ3hUb2dnbGVEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RvZ2dsZS90b2dnbGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gICAgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLCBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVUeXBlXG59IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9maWx0ZXJpbmctZXhwcmVzc2lvbnMtdHJlZSc7XG5pbXBvcnQgeyBJRmlsdGVyaW5nT3BlcmF0aW9uIH0gZnJvbSAnLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uVHlwZSwgVHJhbnNhY3Rpb25TZXJ2aWNlLCBTdGF0ZSB9IGZyb20gJy4uL3NlcnZpY2VzL3B1YmxpY19hcGknO1xuaW1wb3J0IHtcbiAgICBJZ3hSb3dBZGRUZXh0RGlyZWN0aXZlLFxuICAgIElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSxcbiAgICBJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQucm93RWRpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLCBJQWN0aXZlTm9kZSB9IGZyb20gJy4vZ3JpZC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4RmlsdGVyaW5nU2VydmljZSB9IGZyb20gJy4vZmlsdGVyaW5nL2dyaWQtZmlsdGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFdhdGNoQ2hhbmdlcyB9IGZyb20gJy4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEdyaWRSZXNvdXJjZVN0cmluZ3NFTiwgSUdyaWRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vZ3JpZC1yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSWd4R3JpZFN1bW1hcnlTZXJ2aWNlIH0gZnJvbSAnLi9zdW1tYXJpZXMvZ3JpZC1zdW1tYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCB9IGZyb20gJy4vc3VtbWFyaWVzL3N1bW1hcnktcm93LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElneEVkaXRSb3csIElneENlbGwsIElneEFkZFJvdyB9IGZyb20gJy4vY29tbW9uL2NydWQuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2FjaGVkVmlld0xvYWRlZEV2ZW50QXJncywgSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3RlbXBsYXRlLW91dGxldC90ZW1wbGF0ZV9vdXRsZXQuZGlyZWN0aXZlJztcbmltcG9ydCB7IElneEV4Y2VsU3R5bGVMb2FkaW5nVmFsdWVzVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50IH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvY3N2L2NoYXItc2VwYXJhdGVkLXZhbHVlLWRhdGEnO1xuaW1wb3J0IHsgSWd4Q29sdW1uUmVzaXppbmdTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemluZy9yZXNpemluZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlcmluZ1N0cmF0ZWd5LCBJRmlsdGVyaW5nU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZmlsdGVyaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7XG4gICAgSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIElneFJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSwgSWd4SGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsXG4gICAgSWd4SGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCBJZ3hFeGNlbFN0eWxlSGVhZGVySWNvbkRpcmVjdGl2ZSwgSWd4U29ydEFzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmUsXG4gICAgSWd4U29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlLCBJZ3hTb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVxufSBmcm9tICcuL2dyaWQuZGlyZWN0aXZlcyc7XG5pbXBvcnQge1xuICAgIEdyaWRLZXlkb3duVGFyZ2V0VHlwZSxcbiAgICBHcmlkU2VsZWN0aW9uTW9kZSxcbiAgICBHcmlkU3VtbWFyeVBvc2l0aW9uLFxuICAgIEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlLFxuICAgIEZpbHRlck1vZGUsXG4gICAgQ29sdW1uUGlubmluZ1Bvc2l0aW9uLFxuICAgIFJvd1Bpbm5pbmdQb3NpdGlvbixcbiAgICBHcmlkUGFnaW5nTW9kZSxcbiAgICBHcmlkVmFsaWRhdGlvblRyaWdnZXIsXG4gICAgU2l6ZVxufSBmcm9tICcuL2NvbW1vbi9lbnVtcyc7XG5pbXBvcnQge1xuICAgIElHcmlkQ2VsbEV2ZW50QXJncyxcbiAgICBJUm93U2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Db2x1bW5FdmVudEFyZ3MsXG4gICAgSVJvd0RhdGFFdmVudEFyZ3MsXG4gICAgSUNvbHVtblJlc2l6ZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nU3RhcnRFdmVudEFyZ3MsXG4gICAgSUNvbHVtbk1vdmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkS2V5ZG93bkV2ZW50QXJncyxcbiAgICBJUm93RHJhZ1N0YXJ0RXZlbnRBcmdzLFxuICAgIElSb3dEcmFnRW5kRXZlbnRBcmdzLFxuICAgIElHcmlkQ2xpcGJvYXJkRXZlbnQsXG4gICAgSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzLFxuICAgIElTZWFyY2hJbmZvLFxuICAgIElDZWxsUG9zaXRpb24sXG4gICAgSVJvd1RvZ2dsZUV2ZW50QXJncyxcbiAgICBJQ29sdW1uU2VsZWN0aW9uRXZlbnRBcmdzLFxuICAgIElQaW5Sb3dFdmVudEFyZ3MsXG4gICAgSUdyaWRTY3JvbGxFdmVudEFyZ3MsXG4gICAgSUFjdGl2ZU5vZGVDaGFuZ2VFdmVudEFyZ3MsXG4gICAgSVNvcnRpbmdFdmVudEFyZ3MsXG4gICAgSUZpbHRlcmluZ0V2ZW50QXJncyxcbiAgICBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MsXG4gICAgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncyxcbiAgICBJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3MsXG4gICAgSUdyaWRFZGl0RXZlbnRBcmdzLFxuICAgIElSb3dEYXRhQ2FuY2VsYWJsZUV2ZW50QXJncyxcbiAgICBJR3JpZEVkaXREb25lRXZlbnRBcmdzLFxuICAgIElHcmlkUm93RXZlbnRBcmdzLFxuICAgIElHcmlkQ29udGV4dE1lbnVFdmVudEFyZ3MsXG4gICAgSUNvbHVtbnNBdXRvR2VuZXJhdGVkRXZlbnRBcmdzXG59IGZyb20gJy4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBJZ3hBZHZhbmNlZEZpbHRlcmluZ0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vZmlsdGVyaW5nL2FkdmFuY2VkLWZpbHRlcmluZy9hZHZhbmNlZC1maWx0ZXJpbmctZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIENvbHVtblR5cGUsXG4gICAgR3JpZFNlcnZpY2VUeXBlLFxuICAgIEdyaWRUeXBlLFxuICAgIElHcmlkRm9ybUdyb3VwQ3JlYXRlZEV2ZW50QXJncyxcbiAgICBJR3JpZFZhbGlkYXRpb25TdGF0dXNFdmVudEFyZ3MsXG4gICAgSWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4R3JpZFJvd0RyYWdHaG9zdENvbnRleHQsXG4gICAgSWd4R3JpZFJvd0VkaXRBY3Rpb25zVGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dCxcbiAgICBJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0LFxuICAgIElneEdyaWRUZW1wbGF0ZUNvbnRleHQsXG4gICAgSWd4SGVhZFNlbGVjdG9yVGVtcGxhdGVDb250ZXh0LFxuICAgIElneFJvd1NlbGVjdG9yVGVtcGxhdGVDb250ZXh0LFxuICAgIElHWF9HUklEX1NFUlZJQ0VfQkFTRSxcbiAgICBJU2l6ZUluZm8sXG4gICAgUm93VHlwZSxcbiAgICBJUGlubmluZ0NvbmZpZyxcbiAgICBJQ2xpcGJvYXJkT3B0aW9uc1xufSBmcm9tICcuL2NvbW1vbi9ncmlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEcm9wUG9zaXRpb24gfSBmcm9tICcuL21vdmluZy9tb3Zpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBJZ3hIZWFkU2VsZWN0b3JEaXJlY3RpdmUsIElneFJvd1NlbGVjdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi9zZWxlY3Rpb24vcm93LXNlbGVjdG9ycyc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuL2NvbHVtbnMvY29sdW1uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hDb2x1bW5Hcm91cENvbXBvbmVudCB9IGZyb20gJy4vY29sdW1ucy9jb2x1bW4tZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgSWd4RHJhZ0luZGljYXRvckljb25EaXJlY3RpdmUgfSBmcm9tICcuL3Jvdy1kcmFnLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hTbmFja2JhckNvbXBvbmVudCB9IGZyb20gJy4uL3NuYWNrYmFyL3NuYWNrYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IElneEFjdGlvblN0cmlwVG9rZW4gfSBmcm9tICcuLi9hY3Rpb24tc3RyaXAvdG9rZW4nO1xuaW1wb3J0IHsgSWd4R3JpZFJvd0NvbXBvbmVudCB9IGZyb20gJy4vZ3JpZC9ncmlkLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUgeyBJZ3hQYWdpbmF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0b3IvcGFnaW5hdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hQYWdpbmF0b3JUb2tlbiB9IGZyb20gJy4uL3BhZ2luYXRvci90b2tlbic7XG5pbXBvcnQgeyBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50IH0gZnJvbSAnLi9oZWFkZXJzL2dyaWQtaGVhZGVyLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50IH0gZnJvbSAnLi9ncm91cGluZy9ncmlkLWdyb3VwLWJ5LWFyZWEuY29tcG9uZW50JztcbmltcG9ydCB7IElneEZsYXRUcmFuc2FjdGlvbkZhY3RvcnksIFRSQU5TQUNUSU9OX1RZUEUgfSBmcm9tICcuLi9zZXJ2aWNlcy90cmFuc2FjdGlvbi90cmFuc2FjdGlvbi1mYWN0b3J5LnNlcnZpY2UnO1xuaW1wb3J0IHsgSVNvcnRpbmdPcHRpb25zIH0gZnJvbSAnLi9jb2x1bW5zL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgR3JpZFNlbGVjdGlvblJhbmdlLCBJZ3hHcmlkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBWZXJ0aWNhbEFsaWdubWVudCwgSG9yaXpvbnRhbEFsaWdubWVudCwgUG9zaXRpb25TZXR0aW5ncywgT3ZlcmxheVNldHRpbmdzIH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS91dGlsaXRpZXMnO1xuaW1wb3J0IHsgSWd4T3ZlcmxheVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L292ZXJsYXknO1xuaW1wb3J0IHsgQ29ubmVjdGVkUG9zaXRpb25pbmdTdHJhdGVneSB9IGZyb20gJy4uL3NlcnZpY2VzL292ZXJsYXkvcG9zaXRpb24vY29ubmVjdGVkLXBvc2l0aW9uaW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IENvbnRhaW5lclBvc2l0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9zZXJ2aWNlcy9vdmVybGF5L3Bvc2l0aW9uL2NvbnRhaW5lci1wb3NpdGlvbi1zdHJhdGVneSc7XG5pbXBvcnQgeyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5IH0gZnJvbSAnLi4vc2VydmljZXMvb3ZlcmxheS9zY3JvbGwvYWJzb2x1dGUtc2Nyb2xsLXN0cmF0ZWd5JztcbmltcG9ydCB7IEFjdGlvbiwgU3RhdGVVcGRhdGVFdmVudCwgVHJhbnNhY3Rpb25FdmVudE9yaWdpbiB9IGZyb20gJy4uL3NlcnZpY2VzL3RyYW5zYWN0aW9uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IElTb3J0aW5nRXhwcmVzc2lvbiB9IGZyb20gJy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IElHcmlkU29ydGluZ1N0cmF0ZWd5IH0gZnJvbSAnLi9jb21tb24vc3RyYXRlZ3knO1xuaW1wb3J0IHsgSWd4R3JpZEV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9leGNlbC1zdHlsZS9leGNlbC1zdHlsZS1maWx0ZXJpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuL2hlYWRlcnMvZ3JpZC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRGaWx0ZXJpbmdSb3dDb21wb25lbnQgfSBmcm9tICcuL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLXJvdy5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGVmYXVsdERhdGFDbG9uZVN0cmF0ZWd5LCBJRGF0YUNsb25lU3RyYXRlZ3kgfSBmcm9tICcuLi9kYXRhLW9wZXJhdGlvbnMvZGF0YS1jbG9uZS1zdHJhdGVneSc7XG5pbXBvcnQgeyBJZ3hHcmlkQ2VsbENvbXBvbmVudCB9IGZyb20gJy4vY2VsbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9ncmlkL2dyaWQtdmFsaWRhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcblxuaW50ZXJmYWNlIElNYXRjaEluZm9DYWNoZSB7XG4gICAgcm93OiBhbnk7XG4gICAgaW5kZXg6IG51bWJlcjtcbiAgICBjb2x1bW46IHN0cmluZztcbiAgICBtZXRhZGF0YTogTWFwPHN0cmluZywgYm9vbGVhbj47XG59XG5cbmxldCBGQUtFX1JPV19JRCA9IC0xO1xuY29uc3QgREVGQVVMVF9JVEVNU19QRVJfUEFHRSA9IDE1O1xuY29uc3QgTUlOSU1VTV9DT0xVTU5fV0lEVEggPSAxMzY7XG4vLyBCeSBkZWZhdWx0IHJvdyBlZGl0aW5nIG92ZXJsYXkgb3V0bGV0IGlzIGluc2lkZSBncmlkIGJvZHkgc28gdGhhdCBvdmVybGF5IGlzIGhpZGRlbiBiZWxvdyBncmlkIGhlYWRlciB3aGVuIHNjcm9sbGluZy5cbi8vIEluIGNhc2VzIHdoZW4gZ3JpZCBoYXMgMS0yIHJvd3MgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIGluIGdyaWQgYm9keSBhbmQgcm93IGVkaXRpbmcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd24gYWJvdmUgaGVhZGVyLlxuLy8gRGVmYXVsdCByb3cgZWRpdGluZyBvdmVybGF5IGhlaWdodCBpcyBoaWdoZXIgdGhlbiByb3cgaGVpZ2h0IHRoYXQgaXMgd2h5IHRoZSBjYXNlIGlzIHZhbGlkIGFsc28gZm9yIHJvdyB3aXRoIDIgcm93cy5cbi8vIE1vcmUgYWNjdXJhdGUgY2FsY3VsYXRpb24gaXMgbm90IHBvc3NpYmxlLCBjYXVzZSByb3cgZWRpdGluZyBvdmVybGF5IGlzIHN0aWxsIG5vdCBzaG93biBhbmQgd2UgZG9uJ3Qga25vdyBpdHMgaGVpZ2h0LFxuLy8gYnV0IGluIHRoZSBzYW1lIHRpbWUgd2UgbmVlZCB0byBzZXQgcm93IGVkaXRpbmcgb3ZlcmxheSBvdXRsZXQgYmVmb3JlIG9wZW5pbmcgdGhlIG92ZXJsYXkgaXRzZWxmLlxuY29uc3QgTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCA9IDI7XG5cbi8qIGJsYXpvckluZGlyZWN0UmVuZGVyXG4gICBibGF6b3JDb21wb25lbnRcbiAgIG9taXRNb2R1bGVcbiAgIHdjU2tpcENvbXBvbmVudFN1ZmZpeCAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4R3JpZEJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBHcmlkVHlwZSxcbiAgICBPbkluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRpc3BsYXkgdGltZSBmb3IgdGhlIHJvdyBhZGRpbmcgc25hY2tiYXIgbm90aWZpY2F0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IGlzIDYwMDBtcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzbmFja2JhckRpc3BsYXlUaW1lID0gNjAwMDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRvIGF1dG8tZ2VuZXJhdGUgdGhlIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLiBXaGVuIHNldCB0byB0cnVlLCBpdCB3aWxsIG92ZXJyaWRlIGFsbCBjb2x1bW5zIGRlY2xhcmVkIHRocm91Z2ggY29kZSBvciBpbiBtYXJrdXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBhdXRvR2VuZXJhdGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSBleGNsdWRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgY29sdW1uIGNvbGxlY3Rpb25cbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBjb2xsZWN0aW9uIGlzIG9ubHkgdXNlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGNoYW5naW5nIGl0IHdpbGwgbm90IGNhdXNlIGFueSBjaGFuZ2VzIGluIHRoZSBnZW5lcmF0ZWQgY29sdW1ucyBhdCBydW50aW1lXG4gICAgICogdW5sZXNzIHRoZSBncmlkIGlzIGRlc3Ryb3llZCBhbmQgcmVjcmVhdGVkLiBUbyBtb2RpZnkgdGhlIGNvbHVtbnMgdmlzaWJsZSBpbiB0aGUgVUkgYXQgcnVudGltZSwgcGxlYXNlIHVzZSB0aGVpclxuICAgICAqIFtoaWRkZW5dKGh0dHBzOi8vd3d3LmluZnJhZ2lzdGljcy5jb20vcHJvZHVjdHMvaWduaXRlLXVpLWFuZ3VsYXIvZG9jcy90eXBlc2NyaXB0L2xhdGVzdC9jbGFzc2VzL0lneENvbHVtbkNvbXBvbmVudC5odG1sI2hpZGRlbikgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIGRhdGE9W0RhdGFdIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVFeGNsdWRlXT1cIlsnUHJvZHVjdE5hbWUnLCAnQ291bnQnXVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IERhdGEgPSBbeyAnSWQnOiAnMScsICdQcm9kdWN0TmFtZSc6ICduYW1lMScsICdEZXNjcmlwdGlvbic6ICdkZXNjcmlwdGlvbjEnLCAnQ291bnQnOiA1IH1dXG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXV0b0dlbmVyYXRlRXhjbHVkZTogc3RyaW5nW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgY29sdW1ucyBtb3ZpbmcgaXMgZW5hYmxlZCBpbiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBtb3ZpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtpZF09XCInaWd4LWdyaWQtMSdcIiBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZFRlbXBsYXRlXT1cIm15VGVtcGxhdGVcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtcHR5R3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgYWRkaW5nIHJvdyBVSSB3aGVuIGdyaWQgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbYWRkUm93RW1wdHlUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhZGRSb3dFbXB0eVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB3aGVuIGxvYWRpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2lkXT1cIidpZ3gtZ3JpZC0xJ1wiIFtkYXRhXT1cIkRhdGFcIiBbbG9hZGluZ0dyaWRUZW1wbGF0ZV09XCJteVRlbXBsYXRlXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsb2FkaW5nR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEdldC9TZXQgSWd4U3VtbWFyeVJvdyBoZWlnaHRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc3VtbWFyeVJvd0hlaWdodCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgPSB2YWx1ZSB8IDA7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IHZhbHVlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmbG93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHN1bW1hcnlSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3VtbWFyaXplZENvbHVtbnMgJiYgdGhpcy5yb290U3VtbWFyaWVzRW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgfHwgdGhpcy5zdW1tYXJ5U2VydmljZS5jYWxjTWF4U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uc1RvQXV0b3NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoeCA9PiB4LndpZHRoID09PSAnZml0LWNvbnRlbnQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGRhdGEgY2xvbmUgc3RyYXRlZ3kgb2YgdGhlIGdyaWQgd2hlbiBpbiBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtkYXRhQ2xvbmVTdHJhdGVneV09XCJjdXN0b21DbG9uZVN0cmF0ZWd5XCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGF0YUNsb25lU3RyYXRlZ3koKTogSURhdGFDbG9uZVN0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFDbG9uZVN0cmF0ZWd5O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZGF0YUNsb25lU3RyYXRlZ3koc3RyYXRlZ3k6IElEYXRhQ2xvbmVTdHJhdGVneSkge1xuICAgICAgICBpZiAoc3RyYXRlZ3kpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFDbG9uZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMuY2xvbmVTdHJhdGVneSA9IHN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIGNvcHkgYmVoYXZpb3Igb2YgdGhlIGdyaWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2xpcGJvYXJkT3B0aW9uczogSUNsaXBib2FyZE9wdGlvbnMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGVzL2Rpc2FibGVzIHRoZSBjb3B5IGJlaGF2aW9yXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAvKipcbiAgICAgICAgICogSW5jbHVkZSB0aGUgY29sdW1ucyBoZWFkZXJzIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUhlYWRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcHBseSB0aGUgY29sdW1ucyBmb3JtYXR0ZXJzIChpZiBhbnkpIG9uIHRoZSBkYXRhIGluIHRoZSBjbGlwYm9hcmQgb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgY29weUZvcm1hdHRlcnM6IHRydWUsXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgc2VwYXJhdG9yIHVzZWQgZm9yIGZvcm1hdHRpbmcgdGhlIGNvcHkgb3V0cHV0LiBEZWZhdWx0cyB0byBgXFx0YC5cbiAgICAgICAgICovXG4gICAgICAgIHNlcGFyYXRvcjogJ1xcdCdcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZSBvZiB0aGUgY29sdW1uIGZvciB3aGljaCBmaWx0ZXJpbmcgd2FzIHBlcmZvcm1lZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUNoYW5nZSk9XCJmaWx0ZXJpbmdFeHByVHJlZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBhZHZhbmNlZCBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgdHJlZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgKGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlKT1cImFkdmFuY2VkRmlsdGVyaW5nRXhwclRyZWVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGdyaWQgaXMgc2Nyb2xsZWQgaG9yaXpvbnRhbGx5L3ZlcnRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCJcbiAgICAgKiAgICAgICAgICAgICAgKGdyaWRTY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkU2Nyb2xsRXZlbnRBcmdzPigpO1xuXG4gICAgLyogdHJlYXRBc1JlZiAqL1xuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb25kaXRpb25hbCBjbGFzcyBzZWxlY3RvciB0byB0aGUgZ3JpZCdzIHJvdyBlbGVtZW50LlxuICAgICAqIEFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwsIGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIENTUyBjbGFzcyBhbmQgdGhlIHZhbHVlIGlzXG4gICAgICogZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbiwgb3IgYm9vbGVhbiwgbGlrZSBzbzpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY2FsbGJhY2sgPSAocm93OiBSb3dUeXBlKSA9PiB7IHJldHVybiByb3cuc2VsZWN0ZWQgPiA2OyB9XG4gICAgICogcm93Q2xhc3NlcyA9IHsgJ2NsYXNzTmFtZScgOiB0aGlzLmNhbGxiYWNrIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW3Jvd0NsYXNzZXNdID0gXCJyb3dDbGFzc2VzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dDbGFzc2VzOiBhbnk7XG5cbiAgICAvKiB0cmVhdEFzUmVmICovXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25kaXRpb25hbCBzdHlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBncmlkIHJvdyBlbGVtZW50LlxuICAgICAqIEl0IGFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAgICogdGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc3R5bGVzID0ge1xuICAgICAqICBiYWNrZ3JvdW5kOiAneWVsbG93JyxcbiAgICAgKiAgY29sb3I6IChyb3c6IFJvd1R5cGUpID0+IHJvdy5zZWxlY3RlZCA6ICdyZWQnOiAnd2hpdGUnXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtyb3dTdHlsZXNdPVwic3R5bGVzXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dTdHlsZXMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJpbWFyeUtleTogc3RyaW5nO1xuXG4gICAgLyogYmxhem9yU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgYSB1bmlxdWUgdmFsdWVzIHN0cmF0ZWd5IHVzZWQgYnkgdGhlIEV4Y2VsIFN0eWxlIEZpbHRlcmluZ1xuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIGNhbGxiYWNrIGZvciBsb2FkaW5nIHVuaXF1ZSBjb2x1bW4gdmFsdWVzIG9uIGRlbWFuZC5cbiAgICAgKiBJZiB0aGlzIHByb3BlcnR5IGlzIHByb3ZpZGVkLCB0aGUgdW5pcXVlIHZhbHVlcyBpdCBnZW5lcmF0ZXMgd2lsbCBiZSB1c2VkIGJ5IHRoZSBFeGNlbCBTdHlsZSBGaWx0ZXJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidleGNlbFN0eWxlRmlsdGVyJ1wiIFt1bmlxdWVDb2x1bW5WYWx1ZXNTdHJhdGVneV09XCJjb2x1bW5WYWx1ZXNTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdW5pcXVlQ29sdW1uVmFsdWVzU3RyYXRlZ3k6IChjb2x1bW46IENvbHVtblR5cGUsXG4gICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZTogSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgZG9uZTogKHZhbHVlczogYW55W10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB7IHJlYWQ6IElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudHM6IFF1ZXJ5TGlzdDxJZ3hHcmlkRXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKGNlbGxDbGljayk9XCJjZWxsQ2xpY2soJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDZWxsRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkUm93YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHJvd0NsaWNrKT1cInJvd0NsaWNrKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRSb3dFdmVudEFyZ3M+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBmb3JtR3JvdXAgaXMgY3JlYXRlZCBvbiBlZGl0IG9mIHJvdy9jZWxsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChmb3JtR3JvdXBDcmVhdGVkKT1cImZvcm1Hcm91cENyZWF0ZWQoJGV2ZW50KVwiIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZvcm1Hcm91cENyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRm9ybUdyb3VwQ3JlYXRlZEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBncmlkJ3MgdmFsaWRhdGlvbiBzdGF0dXMgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCAodmFsaWRhdGlvblN0YXR1c0NoYW5nZSk9XCJ2YWxpZGF0aW9uU3RhdHVzQ2hhbmdlKCRldmVudClcIiBbZGF0YV09XCJsb2NhbERhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2YWxpZGF0aW9uU3RhdHVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZFZhbGlkYXRpb25TdGF0dXNFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjZWxsIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgKHNlbGVjdGVkKT1cIm9uQ2VsbFNlbGVjdCgkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkQ2VsbEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqICBFbWl0dGVkIHdoZW4gYElneEdyaWRSb3dDb21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChyb3dTZWxlY3Rpb25DaGFuZ2luZyk9XCJyb3dTZWxlY3Rpb25DaGFuZ2luZygkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93U2VsZWN0aW9uQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dTZWxlY3Rpb25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiAgRW1pdHRlZCB3aGVuIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHNlbGVjdGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIChjb2x1bW5TZWxlY3Rpb25DaGFuZ2luZyk9XCJjb2x1bW5TZWxlY3Rpb25DaGFuZ2luZygkZXZlbnQpXCIgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uU2VsZWN0aW9uQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5TZWxlY3Rpb25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBpcyBwaW5uZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNvbHVtbiBtYXkgYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBgaW5zZXJ0QXRJbmRleGAgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNvbHVtblBpbm5pbmcoZXZlbnQpIHtcbiAgICAgKiAgICAgaWYgKGV2ZW50LmNvbHVtbi5maWVsZCA9PT0gXCJOYW1lXCIpIHtcbiAgICAgKiAgICAgICBldmVudC5pbnNlcnRBdEluZGV4ID0gMDtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uUGluID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGBJZ3hDb2x1bW5Db21wb25lbnRgIGlzIHBpbm5lZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhlIGluZGV4IHRoYXQgdGhlIGNvbHVtbiBpcyBpbnNlcnRlZCBhdCBtYXkgYmUgY2hhbmdlZCB0aHJvdWdoIHRoZSBgaW5zZXJ0QXRJbmRleGAgcHJvcGVydHkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGNvbHVtblBpbm5pbmcoZXZlbnQpIHtcbiAgICAgKiAgICAgaWYgKGV2ZW50LmNvbHVtbi5maWVsZCA9PT0gXCJOYW1lXCIpIHtcbiAgICAgKiAgICAgICBldmVudC5pbnNlcnRBdEluZGV4ID0gMDtcbiAgICAgKiAgICAgfVxuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uUGlubmVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUGluQ29sdW1uRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNlbGwgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0RW50ZXIpPVwiZWRpdFN0YXJ0KCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEVkaXRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gY2VsbCBleGl0cyBlZGl0IG1vZGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChjZWxsRWRpdEV4aXQpPVwiZWRpdEV4aXQoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNlbGxFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjZWxsIGhhcyBiZWVuIGVkaXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRXZlbnQgaXMgZmlyZWQgYWZ0ZXIgZWRpdGluZyBpcyBjb21wbGV0ZWQsIHdoZW4gdGhlIGNlbGwgaXMgZXhpdGluZyBlZGl0IG1vZGUuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKGNlbGxFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RXZlbnRBcmdzPigpO1xuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgY2VsbCBoYXMgYmVlbiBlZGl0ZWQgYW5kIGVkaXRpbmcgaGFzIGJlZW4gY29tbWl0dGVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAoY2VsbEVkaXREb25lKT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjZWxsRWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSByb3cgZW50ZXJzIGVkaXQgbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIuXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZDMgKHJvd0VkaXRFbnRlcik9XCJlZGl0U3RhcnQoJGV2ZW50KVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBleGl0aW5nIGVkaXQgbW9kZSBmb3IgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXR0ZWQgd2hlbiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiICYgYGVuZEVkaXQodHJ1ZSlgIGlzIGNhbGxlZC5cbiAgICAgKiBFbWl0dGVkIHdoZW4gY2hhbmdpbmcgcm93cyBkdXJpbmcgZWRpdCBtb2RlLCBzZWxlY3RpbmcgYW4gdW4tZWRpdGFibGUgY2VsbCBpbiB0aGUgZWRpdGVkIHJvdyxcbiAgICAgKiBwZXJmb3JtaW5nIHBhZ2luZyBvcGVyYXRpb24sIGNvbHVtbiByZXNpemluZywgcGlubmluZywgbW92aW5nIG9yIGhpdHRpbmcgYERvbmVgXG4gICAgICogYnV0dG9uIGluc2lkZSBvZiB0aGUgcm93RWRpdGluZ092ZXJsYXksIG9yIGhpdHRpbmcgdGhlIGBFbnRlcmAga2V5IHdoaWxlIGVkaXRpbmcgYSBjZWxsLlxuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0KT1cImVkaXREb25lKCRldmVudClcIiBbZGF0YV09XCJkYXRhXCIgW3ByaW1hcnlLZXldPVwiJ1Byb2R1Y3RJRCdcIiBbcm93RWRpdGFibGVdPVwidHJ1ZVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZXhpdGluZyBlZGl0IG1vZGUgZm9yIGEgcm93IGFuZCBlZGl0aW5nIGhhcyBiZWVuIGNvbW1pdHRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRW1pdHRlZCB3aGVuIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCIgJiBgZW5kRWRpdCh0cnVlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyByb3dzIGR1cmluZyBlZGl0IG1vZGUsIHNlbGVjdGluZyBhbiB1bi1lZGl0YWJsZSBjZWxsIGluIHRoZSBlZGl0ZWQgcm93LFxuICAgICAqIHBlcmZvcm1pbmcgcGFnaW5nIG9wZXJhdGlvbiwgY29sdW1uIHJlc2l6aW5nLCBwaW5uaW5nLCBtb3Zpbmcgb3IgaGl0dGluZyBgRG9uZWBcbiAgICAgKiBidXR0b24gaW5zaWRlIG9mIHRoZSByb3dFZGl0aW5nT3ZlcmxheSwgb3IgaGl0dGluZyB0aGUgYEVudGVyYCBrZXkgd2hpbGUgZWRpdGluZyBhIGNlbGwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkMyAocm93RWRpdERvbmUpPVwiZWRpdERvbmUoJGV2ZW50KVwiIFtkYXRhXT1cImRhdGFcIiBbcHJpbWFyeUtleV09XCInUHJvZHVjdElEJ1wiIFtyb3dFZGl0YWJsZV09XCJ0cnVlXCI+XG4gICAgICogPC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RWRpdERvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElHcmlkRWRpdERvbmVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gcm93IGVkaXRpbmcgaXMgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEVtaXRzIHdoZW4gW3Jvd0VkaXRhYmxlXT1cInRydWVcIiAmIGBlbmRFZGl0KGZhbHNlKWAgaXMgY2FsbGVkLlxuICAgICAqIEVtaXR0ZWQgd2hlbiBjaGFuZ2luZyBoaXR0aW5nIGBFc2NgIGtleSBkdXJpbmcgY2VsbCBlZGl0aW5nIGFuZCB3aGVuIGNsaWNrIG9uIHRoZSBgQ2FuY2VsYCBidXR0b25cbiAgICAgKiBpbiB0aGUgcm93IGVkaXRpbmcgb3ZlcmxheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQzIChyb3dFZGl0RXhpdCk9XCJlZGl0RXhpdCgkZXZlbnQpXCIgW2RhdGFdPVwiZGF0YVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgW3Jvd0VkaXRhYmxlXT1cInRydWVcIj5cbiAgICAgKiA8L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dFZGl0RXhpdCA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRFZGl0RG9uZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNvbHVtbiBpcyBpbml0aWFsaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgY29sdW1uIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbHVtbkluaXQpPVwiaW5pdENvbHVtbnMoJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qIGJsYXpvckluY2x1ZGUgKi9cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5zQXV0b2dlbmVyYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtbnNBdXRvR2VuZXJhdGVkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBiZWZvcmUgc29ydGluZyBleHByZXNzaW9ucyBhcmUgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyBhbiBgSVNvcnRpbmdFdmVudEFyZ3NgIG9iamVjdC4gYHNvcnRpbmdFeHByZXNzaW9uc2Aga2V5IGhvbGRzIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZyk9XCJzb3J0aW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJU29ydGluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgc29ydGluZyBpcyBjb21wbGV0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIHNvcnRpbmcgZXhwcmVzc2lvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKHNvcnRpbmdEb25lKT1cInNvcnRpbmdEb25lKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8SVNvcnRpbmdFeHByZXNzaW9uIHwgSVNvcnRpbmdFeHByZXNzaW9uW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbnMgYXJlIGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgYW4gYElGaWx0ZXJpbmdFdmVudEFyZ3NgIG9iamVjdC4gYGZpbHRlcmluZ0V4cHJlc3Npb25zYCBrZXkgaG9sZHMgdGhlIGZpbHRlcmluZyBleHByZXNzaW9ucyBmb3IgdGhlIGNvbHVtbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgKGZpbHRlcmluZyk9XCJmaWx0ZXJpbmcoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUZpbHRlcmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBVSS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb25zIHRyZWUgb2YgdGhlIGNvbHVtbiBmb3Igd2hpY2ggZmlsdGVyaW5nIHdhcyBwZXJmb3JtZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChmaWx0ZXJpbmdEb25lKT1cImZpbHRlcmluZ0RvbmUoJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGZpbHRlcmluZ0RvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPElGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU+KCk7XG5cbiAgICAvKiBibGF6b3JDU1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZvciB0aGUgbmV3IGBJZ3hHcmlkUm93Q29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChyb3dBZGRlZCk9XCJyb3dBZGRlZCgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dEYXRhRXZlbnRBcmdzPigpO1xuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIHJvdyBpcyBkZWxldGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGFuIGBJUm93RGF0YUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlZCk9XCJyb3dEZWxldGVkKCRldmVudClcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiBkZWxldGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIFJldHVybnMgYW4gSVJvd0RhdGFDYW5jZWxsYWJsZUV2ZW50QXJnc2Agb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAocm93RGVsZXRlKT1cInJvd0RlbGV0ZSgkZXZlbnQpXCIgW2hlaWdodF09XCInMzA1cHgnXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxJUm93RGF0YUNhbmNlbGFibGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbW1pdGVkIGp1c3QgYmVmb3JlIHRoZSBuZXdseSBhZGRlZCByb3cgaXMgY29tbWl0ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgZXZlbnQgaXMgY2FuY2VsYWJsZS5cbiAgICAgKiBSZXR1cm5zIGFuIElSb3dEYXRhQ2FuY2VsbGFibGVFdmVudEFyZ3NgIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKHJvd0FkZCk9XCJyb3dBZGQoJGV2ZW50KVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0FkZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RhdGFDYW5jZWxhYmxlRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCBhZnRlciBjb2x1bW4gaXMgcmVzaXplZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0J3Mgb2xkIGFuZCBuZXcgd2lkdGguXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIChjb2x1bW5SZXNpemVkKT1cInJlc2l6aW5nKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5SZXNpemVkID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uUmVzaXplRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGEgY2VsbCBvciByb3cgaXMgcmlnaHQgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgYElneEdyaWRDZWxsYCBvYmplY3QgaWYgdGhlIGltbWVkaWF0ZSBjb250ZXh0IG1lbnUgdGFyZ2V0IGlzIGEgY2VsbCBvciBhbiBgSWd4R3JpZFJvd2Agb3RoZXJ3aXNlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgKGNvbnRleHRNZW51KT1cImNvbnRleHRNZW51KCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb250ZXh0TWVudSA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRDb250ZXh0TWVudUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNlbGwgaXMgZG91YmxlIGNsaWNrZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkQ2VsbGAgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiAoZG91YmxlQ2xpY2spPVwiZGJsQ2xpY2soJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENlbGxFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSBjb2x1bW4gdmlzaWJpbGl0eSBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBcmdzOiB7IGNvbHVtbjogYW55LCBuZXdWYWx1ZTogYm9vbGVhbiB9XG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcpPVwidmlzaWJpbGl0eUNoYW5naW5nKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGFmdGVyIGNvbHVtbiB2aXNpYmlsaXR5IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFyZ3M6IHsgY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQsIG5ld1ZhbHVlOiBib29sZWFuIH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtblZpc2liaWxpdHlDaGFuZ2VkKT1cInZpc2liaWxpdHlDaGFuZ2VkKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SUNvbHVtblZpc2liaWxpdHlDaGFuZ2VkRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3Zpbmcgc3RhcnRzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBtb3ZlZCBgSWd4Q29sdW1uQ29tcG9uZW50YCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIChjb2x1bW5Nb3ZpbmdTdGFydCk9XCJtb3ZpbmdTdGFydCgkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgZHVyaW5nIHRoZSBjb2x1bW4gbW92aW5nIG9wZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAoY29sdW1uTW92aW5nKT1cIm1vdmluZygkZXZlbnQpXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sdW1uTW92aW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJQ29sdW1uTW92aW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGNvbHVtbiBtb3ZpbmcgZW5kcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlIGFuZCB0YXJnZXQgYElneENvbHVtbkNvbXBvbmVudGAgb2JqZWN0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgKGNvbHVtbk1vdmluZ0VuZCk9XCJtb3ZpbmdFbmRzKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5Nb3ZpbmdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElDb2x1bW5Nb3ZpbmdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4ga2V5ZG93biBpcyB0cmlnZ2VyZWQgb3ZlciBlbGVtZW50IGluc2lkZSBncmlkJ3MgYm9keS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBvbmx5IGlmIHRoZSBrZXkgY29tYmluYXRpb24gaXMgc3VwcG9ydGVkIGluIHRoZSBncmlkLlxuICAgICAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGUsIHRhcmdldCBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbCBldmVudC4gVGhpcyBldmVudCBpcyBjYW5jZWxhYmxlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWdyaWQgKGdyaWRLZXlkb3duKT1cImN1c3RvbUtleWRvd24oJGV2ZW50KVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRLZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZEtleWRvd25FdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gc3RhcnQgZHJhZ2dpbmcgYSByb3cuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybiB0aGUgZHJhZ2dlZCByb3cuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd0RyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdTdGFydEV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiBkcm9wcGluZyBhIHJvdy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmV0dXJuIHRoZSBkcm9wcGVkIHJvdy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVJvd0RyYWdFbmRFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYSBjb3B5IG9wZXJhdGlvbiBpcyBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRmlyZWQgb25seSBpZiBjb3B5IGJlaGF2aW9yIGlzIGVuYWJsZWQgdGhyb3VnaCB0aGUgW2BjbGlwYm9hcmRPcHRpb25zYF17QGxpbmsgSWd4R3JpZEJhc2VEaXJlY3RpdmUjY2xpcGJvYXJkT3B0aW9uc30uXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGdyaWRDb3B5ID0gbmV3IEV2ZW50RW1pdHRlcjxJR3JpZENsaXBib2FyZEV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwYW5zaW9uU3RhdGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNYXA8YW55LCBib29sZWFuPj4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgZXhwYW5kZWQgc3RhdGUgb2YgYSByb3cgZ2V0cyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dUb2dnbGUpPVwicm93VG9nZ2xlKCRldmVudClcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByb3dUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyPElSb3dUb2dnbGVFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIHBpbm5lZCBzdGF0ZSBvZiBhIHJvdyBpcyBjaGFuZ2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImVtcGxveWVlRGF0YVwiIChyb3dQaW5uaW5nKT1cInJvd1BpbigkZXZlbnQpXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcm93UGlubmluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgd2hlbiB0aGUgcGlubmVkIHN0YXRlIG9mIGEgcm93IGlzIGNoYW5nZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwiZW1wbG95ZWVEYXRhXCIgKHJvd1Bpbm5lZCk9XCJyb3dQaW4oJGV2ZW50KVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHJvd1Bpbm5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVBpblJvd0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtbWl0ZWQgd2hlbiB0aGUgYWN0aXZlIG5vZGUgaXMgY2hhbmdlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cImRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoYWN0aXZlTm9kZUNoYW5nZSk9XCJhY3RpdmVOb2RlQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBhY3RpdmVOb2RlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJQWN0aXZlTm9kZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYmVmb3JlIHNvcnRpbmcgaXMgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3J0aW5nIGV4cHJlc3Npb25zLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoc29ydGluZ0V4cHJlc3Npb25zQ2hhbmdlKT1cInNvcnRpbmdFeHByQ2hhbmdlKCRldmVudClcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBzb3J0aW5nRXhwcmVzc2lvbnNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElTb3J0aW5nRXhwcmVzc2lvbltdPigpO1xuXG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIHdoZW4gYW4gZXhwb3J0IHByb2Nlc3MgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdG9vbGJhckV4cG9ydGluZyhldmVudDogSUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzKXtcbiAgICAgKiAgICAgY29uc3QgdG9vbGJhckV4cG9ydGluZyA9IGV2ZW50O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdG9vbGJhckV4cG9ydGluZyA9IG5ldyBFdmVudEVtaXR0ZXI8SUdyaWRUb29sYmFyRXhwb3J0RXZlbnRBcmdzPigpO1xuXG4gICAgLyogRW5kIG9mIHRvb2xiYXIgcmVsYXRlZCBkZWZpbml0aW9ucyAqL1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIG1ha2luZyBhIHJhbmdlIHNlbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUmFuZ2Ugc2VsZWN0aW9uIGNhbiBiZSBtYWRlIGVpdGhlciB0aHJvdWdoIGRyYWcgc2VsZWN0aW9uIG9yIHRocm91Z2gga2V5Ym9hcmQgc2VsZWN0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyByYW5nZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxHcmlkU2VsZWN0aW9uUmFuZ2U+KCk7XG5cbiAgICAvKiogRW1pdHRlZCBhZnRlciB0aGUgbmdBZnRlclZpZXdJbml0IGhvb2suIEF0IHRoaXMgcG9pbnQgdGhlIGdyaWQgZXhpc3RzIGluIHRoZSBET00gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVuZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBsb2NhbGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFbWl0dGVkIGJlZm9yZSB0aGUgZ3JpZCdzIGRhdGEgdmlldyBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBkYXRhIG9wZXJhdGlvbiwgcmViaW5kaW5nLCBldGMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiIChkYXRhQ2hhbmdpbmcpPSdoYW5kbGVEYXRhQ2hhbmdpbmdFdmVudCgpJz48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBkYXRhQ2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEVtaXR0ZWQgYWZ0ZXIgdGhlIGdyaWQncyBkYXRhIHZpZXcgaXMgY2hhbmdlZCBiZWNhdXNlIG9mIGEgZGF0YSBvcGVyYXRpb24sIHJlYmluZGluZywgZXRjLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiAoZGF0YUNoYW5nZWQpPSdoYW5kbGVEYXRhQ2hhbmdlZEV2ZW50KCknPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGRhdGFDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZChJZ3hTbmFja2JhckNvbXBvbmVudClcbiAgICBwdWJsaWMgYWRkUm93U25hY2tiYXI6IElneFNuYWNrYmFyQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRDb2x1bW5SZXNpemVyQ29tcG9uZW50KVxuICAgIHB1YmxpYyByZXNpemVMaW5lOiBJZ3hHcmlkQ29sdW1uUmVzaXplckNvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnbG9hZGluZ092ZXJsYXknLCB7IHJlYWQ6IElneFRvZ2dsZURpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdPdmVybGF5OiBJZ3hUb2dnbGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneExvYWRpbmdPdmVybGF5T3V0bGV0JywgeyByZWFkOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgbG9hZGluZ091dGxldDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZTtcblxuICAgIC8qIHJlYWN0Q29udGVudENoaWxkcmVuICovXG4gICAgLyogYmxhem9ySW5jbHVkZSAqL1xuICAgIC8qIGJsYXpvclRyZWF0QXNDb2xsZWN0aW9uICovXG4gICAgLyogYmxhem9yQ29sbGVjdGlvbk5hbWU6IENvbHVtbkNvbGxlY3Rpb24gKi9cbiAgICAvKiBuZ1F1ZXJ5TGlzdE5hbWU6IGNvbHVtbkxpc3QgKi9cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q29sdW1uQ29tcG9uZW50LCB7IHJlYWQ6IElneENvbHVtbkNvbXBvbmVudCwgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgY29sdW1uTGlzdDogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4gPSBuZXcgUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4oKTtcblxuICAgIC8qIGNvbnRlbnRDaGlsZHJlbiAqL1xuICAgIC8qIGJsYXpvckluY2x1ZGUgKi9cbiAgICAvKiBibGF6b3JUcmVhdEFzQ29sbGVjdGlvbiAqL1xuICAgIC8qIGJsYXpvckNvbGxlY3Rpb25OYW1lOiBBY3Rpb25TdHJpcENvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uSXRlbU5hbWU6IEFjdGlvblN0cmlwICovXG4gICAgLyogbmdRdWVyeUxpc3ROYW1lOiBhY3Rpb25TdHJpcENvbXBvbmVudHMgKi9cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEFjdGlvblN0cmlwVG9rZW4pXG4gICAgcHJvdGVjdGVkIGFjdGlvblN0cmlwQ29tcG9uZW50czogUXVlcnlMaXN0PElneEFjdGlvblN0cmlwVG9rZW4+O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBhY3Rpb25TdHJpcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9uU3RyaXBDb21wb25lbnRzPy5maXJzdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hFeGNlbFN0eWxlTG9hZGluZ1ZhbHVlc1RlbXBsYXRlRGlyZWN0aXZlLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTogSWd4RXhjZWxTdHlsZUxvYWRpbmdWYWx1ZXNUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBWaWV3Q2hpbGQoJ2VtcHR5RmlsdGVyZWRHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5RmlsdGVyZWRHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RW1wdHlHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdExvYWRpbmdHcmlkJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHBhcmVudFZpcnREaXI6IElneEdyaWRGb3JPZkRpcmVjdGl2ZTxhbnksIGFueVtdPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneEhlYWRTZWxlY3RvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGhlYWRTZWxlY3RvcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd1NlbGVjdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBkZXNjZW5kYW50czogZmFsc2UgfSlcbiAgICBwdWJsaWMgcm93U2VsZWN0b3JzVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0RyYWdHaG9zdERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0Pj47XG5cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB1c2VkIGZvciByb3cgZHJhZyBnaG9zdC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSB8fCB0aGlzLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlcz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIHJvdyBkcmFnIGdob3N0LlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RHJhZ0dob3N0PlxuICAgICAqICAgIDxpZ3gtaWNvbj5tZW51PC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRyYWdHaG9zdEN1c3RvbVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RHJhZ0dob3N0Q29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgndmVydGljYWxTY3JvbGxDb250YWluZXInLCB7IHJlYWQ6IElneEdyaWRGb3JPZkRpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55LCBhbnlbXT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3ZlcnRpY2FsU2Nyb2xsSG9sZGVyJywgeyByZWFkOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyB2ZXJ0aWNhbFNjcm9sbDogSWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueSwgYW55W10+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzY3InLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHB1YmxpYyBzY3I6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKCdoZWFkU2VsZWN0b3JCYXNlVGVtcGxhdGUnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgaGVhZGVyU2VsZWN0b3JCYXNlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2Zvb3RlcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBmb290ZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckNvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3c/LmhlYWRlckZvck9mO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyU2VsZWN0b3JDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJTZWxlY3RvckNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckRyYWdDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJEcmFnQ29udGFpbmVyO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXBDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZWFkUm93Py5oZWFkZXJHcm91cENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlcmluZ1JvdygpOiBJZ3hHcmlkRmlsdGVyaW5nUm93Q29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3c/LmZpbHRlclJvdztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAVmlld0NoaWxkKElneEdyaWRIZWFkZXJSb3dDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRoZWFkUm93OiBJZ3hHcmlkSGVhZGVyUm93Q29tcG9uZW50O1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkR3JvdXBCeUFyZWFDb21wb25lbnQpXG4gICAgcHVibGljIGdyb3VwQXJlYTogSWd4R3JpZEdyb3VwQnlBcmVhQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCd0Ym9keScsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHRib2R5OiBFbGVtZW50UmVmO1xuXG4gICAgQFZpZXdDaGlsZChJZ3hHcmlkQm9keURpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBwcm90ZWN0ZWQgdGJvZHlDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3BpbkNvbnRhaW5lcicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHB1YmxpYyBwaW5Db250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3Rmb290JywgeyBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgdGZvb3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpZ3hSb3dFZGl0aW5nT3ZlcmxheU91dGxldCcsIHsgcmVhZDogSWd4T3ZlcmxheU91dGxldERpcmVjdGl2ZSwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIHJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUsIHsgcmVhZDogSWd4VGVtcGxhdGVPdXRsZXREaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgdG1wT3V0bGV0czogUXVlcnlMaXN0PGFueT4gPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkcmFnSW5kaWNhdG9ySWNvbkJhc2UnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgZHJhZ0luZGljYXRvckljb25CYXNlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFJvd0VkaXRUZW1wbGF0ZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRDdXN0b21EaXJlY3RpdmVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGV4dERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRUZXh0RGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGVkaXQgdGV4dCB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdFRleHRUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRUZXh0VGVtcGxhdGUgfHwgdGhpcy5yb3dFZGl0VGV4dERpcmVjdGl2ZXM/LmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdFRleHQgbGV0LXJvd0NoYW5nZXNDb3VudD5cbiAgICAgKiBDaGFuZ2VzOiB7e3Jvd0NoYW5nZXNDb3VudH19XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93RWRpdFRleHRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCByb3dFZGl0VGV4dFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRleHRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0VkaXRUZXh0VGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93QWRkVGV4dERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyByb3dBZGRUZXh0OiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGFkZCB0ZXh0IHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dBZGRUZXh0VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dBZGRUZXh0VGVtcGxhdGUgfHwgdGhpcy5yb3dBZGRUZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgYWRkIHRleHQgdGVtcGxhdGUuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hSb3dBZGRUZXh0PlxuICAgICAqIEFkZGluZyBSb3dcbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5yb3dBZGRUZXh0VGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93QWRkVGV4dFRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0FkZFRleHRUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogZmFsc2UsIHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHJvd0VkaXRBY3Rpb25zRGlyZWN0aXZlczogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD4+O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGVkaXQgYWN0aW9ucyB0ZW1wbGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdEFjdGlvbnNUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRBY3Rpb25zVGVtcGxhdGUgfHwgdGhpcy5yb3dFZGl0QWN0aW9uc0RpcmVjdGl2ZXM/LmZpcnN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZWRpdCBhY3Rpb25zIHRlbXBsYXRlLlxuICAgICAqYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGUgaWd4Um93RWRpdEFjdGlvbnMgbGV0LWVuZFJvd0VkaXQ+XG4gICAgICogICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlneEJ1dHRvbiBpZ3hSb3dFZGl0VGFiU3RvcCAoY2xpY2spPVwiZW5kUm93RWRpdChmYWxzZSlcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgKiAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIGlneFJvd0VkaXRUYWJTdG9wIChjbGljayk9XCJlbmRSb3dFZGl0KHRydWUpXCI+QXBwbHk8L2J1dHRvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ3RlbXBsYXRlJywge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5yb3dFZGl0QWN0aW9uc1RlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0VkaXRBY3Rpb25zVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fcm93RWRpdEFjdGlvbnNUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBjdXN0b20gdGVtcGxhdGUsIGlmIGFueSwgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyBhIHJvdyBleHBhbmQgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmUsIHsgcmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICBwcm90ZWN0ZWQgcm93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGV4cGFuZCBpbmRpY2F0b3IgdGVtcGxhdGUuXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMucm93RXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByb3cgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hSb3dFeHBhbmRlZEluZGljYXRvcj5cbiAgICAgKiAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIj5yZW1vdmU8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQucm93RXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IHJvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0V4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSByb3cgY29sbGFwc2UgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Um93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHJvdGVjdGVkIHJvd0NvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgY29sbGFwc2UgaW5kaWNhdG9yIHRlbXBsYXRlLlxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMucm93Q29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hSb3dDb2xsYXBzZWRJbmRpY2F0b3I+XG4gICAgICogIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+YWRkPC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnJvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAqL1xuICAgIHB1YmxpYyBzZXQgcm93Q29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3Jvd0NvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hIZWFkZXJFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBoZWFkZXJFeHBhbmRlZEluZGljYXRvckRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkZXJFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuaGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoZWFkZXIgZXhwYW5kIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hIZWFkZXJFeHBhbmRlZEluZGljYXRvcj5cbiAgICAgKiAgPGlneC1pY29uIHJvbGU9XCJidXR0b25cIj5yZW1vdmU8L2lneC1pY29uPlxuICAgICAqPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKmBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCd0ZW1wbGF0ZScsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuaGVhZGVyRXhwYW5kZWRJbmRpY2F0b3JUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgKi9cbiAgICBwdWJsaWMgc2V0IGhlYWRlckV4cGFuZGVkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hlYWRlckV4cGFuZEluZGljYXRvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIGNvbGxhcHNlIGluZGljYXRvci5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEhlYWRlckNvbGxhcHNlZEluZGljYXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHByb3RlY3RlZCBoZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JEaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJDb2xsYXBzZUluZGljYXRvclRlbXBsYXRlIHx8IHRoaXMuaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm93IGNvbGxhcHNlIGluZGljYXRvciB0ZW1wbGF0ZS5cbiAgICAgKmBgYGh0bWxcbiAgICAgKjxuZy10ZW1wbGF0ZSBpZ3hIZWFkZXJDb2xsYXBzZWRJbmRpY2F0b3I+XG4gICAgICogIDxpZ3gtaWNvbiByb2xlPVwiYnV0dG9uXCI+YWRkPC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmhlYWRlckNvbGxhcHNlZEluZGljYXRvclRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGVhZGVyQ29sbGFwc2VkSW5kaWNhdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2hlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkKElneEV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIGV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGV4Y2VsIHN0eWxlIGhlYWRlciBpY29uLlxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZSB8fCB0aGlzLmV4Y2VsU3R5bGVIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXhjZWwgc3R5bGUgaGVhZGVyIGljb24uXG4gICAgICpgYGBodG1sXG4gICAgICo8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneEV4Y2VsU3R5bGVIZWFkZXJJY29uPlxuICAgICAqIDxpZ3gtaWNvbj5maWx0ZXJfYWx0PC9pZ3gtaWNvbj5cbiAgICAgKjwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZCgndGVtcGxhdGUnLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLmV4Y2VsU3R5bGVIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICovXG4gICAgcHVibGljIHNldCBleGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9leGNlbFN0eWxlSGVhZGVySWNvblRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBzb3J0ZWQgaW4gYXNjIG9yZGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGFzYyBvcmRlci5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFNvcnRBc2NlbmRpbmdIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj5leHBhbmRfbGVzczwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0QXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3NvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnREZXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgIHB1YmxpYyBzb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGN1c3RvbSB0ZW1wbGF0ZSwgaWYgYW55LCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGRlc2Mgb3JkZXIuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc29ydERlc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgc29ydGVkIGluIGRlc2Mgb3JkZXIuXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hTb3J0RGVzY2VuZGluZ0hlYWRlckljb24+XG4gICAgICogICAgPGlneC1pY29uPmV4cGFuZF9tb3JlPC9pZ3gtaWNvbj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3RlbXBsYXRlJ1wiLCB7cmVhZDogVGVtcGxhdGVSZWYgfSlcbiAgICAgKiBwdWJsaWMgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5ncmlkLnNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFNvcnRIZWFkZXJJY29uRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgcHVibGljIHNvcnRIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+ID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBoZWFkZXIgc29ydGluZyBpbmRpY2F0b3Igd2hlbiBjb2x1bW5zIGFyZSBub3Qgc29ydGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzb3J0SGVhZGVySWNvblRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRIZWFkZXJJY29uVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGN1c3RvbSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gcmVuZGVyaW5nIGEgaGVhZGVyIHNvcnRpbmcgaW5kaWNhdG9yIHdoZW4gY29sdW1ucyBhcmUgbm90IHNvcnRlZC5cbiAgICAgKmBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFNvcnRIZWFkZXJJY29uPlxuICAgICAqICAgIDxpZ3gtaWNvbj51bmZvbGRfbW9yZTwvaWd4LWljb24+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuZ3JpZC5zb3J0SGVhZGVySWNvblRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNvcnRIZWFkZXJJY29uVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRIZWFkZXJUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX3NvcnRIZWFkZXJJY29uVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hEcmFnSW5kaWNhdG9ySWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHVibGljIGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pj47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4Um93RWRpdFRhYlN0b3BEaXJlY3RpdmUpXG4gICAgcHVibGljIHJvd0VkaXRUYWJzREVGQVVMVDogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0VGFic0NVU1RPTTogUXVlcnlMaXN0PElneFJvd0VkaXRUYWJTdG9wRGlyZWN0aXZlPjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncm93RWRpdGluZ092ZXJsYXknLCB7IHJlYWQ6IElneFRvZ2dsZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyByb3dFZGl0aW5nT3ZlcmxheTogSWd4VG9nZ2xlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIudGFiaW5kZXgnKVxuICAgIHB1YmxpYyB0YWJpbmRleCA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgaG9zdFJvbGUgPSAnZ3JpZCc7XG5cbiAgICAvKiBjb250ZW50Q2hpbGRyZW4gKi9cbiAgICAvKiBibGF6b3JJbmNsdWRlICovXG4gICAgLyogYmxhem9yVHJlYXRBc0NvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uTmFtZTogR3JpZFRvb2xiYXJDb2xsZWN0aW9uICovXG4gICAgLyogbmdRdWVyeUxpc3ROYW1lOiB0b29sYmFyICovXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihJZ3hUb29sYmFyVG9rZW4pXG4gICAgcHVibGljIHRvb2xiYXI6IFF1ZXJ5TGlzdDxJZ3hHcmlkVG9vbGJhckNvbXBvbmVudD47XG5cbiAgICAvKiBjb250ZW50Q2hpbGRyZW4gKi9cbiAgICAvKiBibGF6b3JJbmNsdWRlICovXG4gICAgLyogYmxhem9yVHJlYXRBc0NvbGxlY3Rpb24gKi9cbiAgICAvKiBibGF6b3JDb2xsZWN0aW9uTmFtZTogUGFnaW5hdG9yQ29sbGVjdGlvbiAqL1xuICAgIC8qIG5nUXVlcnlMaXN0TmFtZTogcGFnaW5hdGlvbkNvbXBvbmVudHMgKi9cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneFBhZ2luYXRvclRva2VuKVxuICAgIHByb3RlY3RlZCBwYWdpbmF0aW9uQ29tcG9uZW50czogUXVlcnlMaXN0PElneFBhZ2luYXRvckNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2lneEZpbHRlcmluZ092ZXJsYXlPdXRsZXQnLCB7IHJlYWQ6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmUsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBfb3V0bGV0RGlyZWN0aXZlOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBAaWd4RWxlbWVudHNBbmNob3JcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzaW5rJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwdWJsaWMgYW5jaG9yOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RXhwYW5kZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdENvbGxhcHNlZFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRDb2xsYXBzZWRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnZGVmYXVsdEVTRkhlYWRlckljb24nLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEVTRkhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3N1bW1hcnlSb3cnLCB7IHJlYWQ6IElneFN1bW1hcnlSb3dDb21wb25lbnQgfSlcbiAgICBwcm90ZWN0ZWQgX3N1bW1hcnlSb3dMaXN0OiBRdWVyeUxpc3Q8SWd4U3VtbWFyeVJvd0NvbXBvbmVudD47XG5cbiAgICBAVmlld0NoaWxkcmVuKCdyb3cnKVxuICAgIHByaXZhdGUgX3Jvd0xpc3Q6IFF1ZXJ5TGlzdDxJZ3hHcmlkUm93Q29tcG9uZW50PjtcblxuICAgIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFJvdycpXG4gICAgcHJpdmF0ZSBfcGlubmVkUm93TGlzdDogUXVlcnlMaXN0PElneEdyaWRSb3dDb21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0Um93RWRpdFRlbXBsYXRlJywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJpdmF0ZSBkZWZhdWx0Um93RWRpdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93RWRpdFRlbXBsYXRlQ29udGV4dD47XG5cbiAgICBAVmlld0NoaWxkcmVuKElneFJvd0RpcmVjdGl2ZSwgeyByZWFkOiBJZ3hSb3dEaXJlY3RpdmUgfSlcbiAgICBwcml2YXRlIF9kYXRhUm93TGlzdDogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT47XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1ncmlkJylcbiAgICBwcm90ZWN0ZWQgYmFzZUNsYXNzID0gJ2lneC1ncmlkJztcblxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgRU4gcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCByZXNvdXJjZVN0cmluZ3ModmFsdWU6IElHcmlkUmVzb3VyY2VTdHJpbmdzKSB7XG4gICAgICAgIHRoaXMuX3Jlc291cmNlU3RyaW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3Jlc291cmNlU3RyaW5ncywgdmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElHcmlkUmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBsb2dpYyBvZiB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgZGVmYXVsdCBpcyBBTkQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtkYXRhXT1cIkRhdGFcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIiBbZmlsdGVyaW5nTG9naWNdPVwiZmlsdGVyaW5nXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nTG9naWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUub3BlcmF0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJpbmdMb2dpYyh2YWx1ZTogRmlsdGVyaW5nTG9naWMpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLm9wZXJhdG9yID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyogbXVzdFNldEluQ29kZVBsYXRmb3JtczogV2ViQ29tcG9uZW50cztCbGF6b3IgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlcmluZyBzdGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpXT1cIm1vZGVsLmZpbHRlcmluZ0V4cHJlc3Npb25zXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgYmluZGluZy5cbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlIGFzIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsLmZpbHRlcmluZ09wZXJhbmRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmICghKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gaW5zdGFuY2VvZiBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V4cHJlc3Npb25zVHJlZSA9IG5ldyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoRmlsdGVyaW5nTG9naWMuQW5kLCB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdLmZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5wdXNoKHZhbC5maWx0ZXJpbmdPcGVyYW5kc1tpbmRleF0gYXMgSUZpbHRlcmluZ0V4cHJlc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICB2YWwuZmlsdGVyaW5nT3BlcmFuZHNbaW5kZXhdID0gbmV3RXhwcmVzc2lvbnNUcmVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuUmVndWxhcjtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmlzRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlRW1wdHkodGhpcy5fZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWZyZXNoRXhwcmVzc2lvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBhZHZhbmNlZCBmaWx0ZXJpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSB0aGlzLmdyaWQuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICogdGhpcy5ncmlkLmFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbG9naWM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGFkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBhZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBmaWx0ZXJpbmdFdmVudEFyZ3M6IElGaWx0ZXJpbmdFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICBvd25lcjogdGhpcyxcbiAgICAgICAgICAgIGZpbHRlcmluZ0V4cHJlc3Npb25zOiB2YWx1ZSxcbiAgICAgICAgICAgIGNhbmNlbDogZmFsc2VcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmZpbHRlcmluZy5lbWl0KGZpbHRlcmluZ0V2ZW50QXJncyk7XG5cbiAgICAgICAgaWYgKGZpbHRlcmluZ0V2ZW50QXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkge1xuICAgICAgICAgICAgdmFsdWUudHlwZSA9IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZVR5cGUuQWR2YW5jZWQ7XG4gICAgICAgICAgICB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdQaXBlVHJpZ2dlcisrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWR2YW5jZWRGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWVDaGFuZ2UuZW1pdCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSkgJiZcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZUVtcHR5KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWREYXRhID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcblxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgY2hhbmdlIGRldGVjdGlvbiB0byB1cGRhdGUgZmlsdGVyZWQgZGF0YSB0aHJvdWdoIHRoZSBwaXBlcyBhbmQgdGhlbiBlbWl0IHRoZSBldmVudC5cbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuZmlsdGVyaW5nRG9uZS5lbWl0KHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBsb2NhbGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIG5vdCBzZXQsIHJldHVybnMgYnJvd3NlcidzIGxhbmd1YWdlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fbG9jYWxlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsZUNoYW5nZS5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGFnaW5nTW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2luZ01vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwYWdpbmdNb2RlKHZhbDogR3JpZFBhZ2luZ01vZGUpIHtcbiAgICAgICAgdGhpcy5fcGFnaW5nTW9kZSA9IHZhbDtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBwYWdlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2luYXRvcj8ucGFnZSB8fCAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGFnZSh2YWw6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UgPSB2YWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdG9yPy5wZXJQYWdlIHx8IERFRkFVTFRfSVRFTVNfUEVSX1BBR0U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBwZXJQYWdlKHZhbDogbnVtYmVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBpZiB0aGUgcm93IHNlbGVjdG9ycyBhcmUgaGlkZGVuLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiAgQnkgZGVmYXVsdCByb3cgc2VsZWN0b3JzIGFyZSBzaG93blxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgaGlkZVJvd1NlbGVjdG9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBoaWRlUm93U2VsZWN0b3JzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2hpZGVSb3dTZWxlY3RvcnMgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHJvd3MgY2FuIGJlIG1vdmVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtyb3dEcmFnZ2FibGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCByb3dEcmFnZ2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dEcmFnICYmIHRoaXMuaGFzVmlzaWJsZUNvbHVtbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dEcmFnZ2FibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Jvd0RyYWcgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHRyaWdnZXIgZm9yIHZhbGlkYXRvcnMgdXNlZCB3aGVuIGVkaXRpbmcgdGhlIGdyaWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgdmFsaWRhdGlvblRyaWdnZXI9J2JsdXInPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdmFsaWRhdGlvblRyaWdnZXI6IEdyaWRWYWxpZGF0aW9uVHJpZ2dlciA9ICdjaGFuZ2UnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGRyYWdSb3dJRCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgcm93cyBhcmUgZWRpdGFibGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbcm93RWRpdGFibGVdPVwidHJ1ZVwiIFtwcmltYXJ5S2V5XT1cIidQcm9kdWN0SUQnXCIgPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCByb3dFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd0VkaXRhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93RWRpdGFibGUodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoR3JpZFN0YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93RWRpdGFibGUgPSB2YWw7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cIkRhdGFcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuaGVpZ2h0JylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZWlnaHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aCcpXG4gICAgcHVibGljIGdldCBob3N0V2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aCB8fCB0aGlzLl9ob3N0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSB3aWR0aCBvZiB0aGUgZ3JpZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBncmlkV2lkdGggPSB0aGlzLmdyaWQud2lkdGg7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5fd2lkdGggIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcldpZHRoKCkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIC0gMTc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSByb3cgaGVpZ2h0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtyb3dIZWlnaHRdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQgPyB0aGlzLl9yb3dIZWlnaHQgOiB0aGlzLmRlZmF1bHRSb3dIZWlnaHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb3dIZWlnaHQodmFsdWU6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSwgMTApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZGVmYXVsdCB3aWR0aCBvZiB0aGUgY29sdW1ucy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbY29sdW1uV2lkdGhdPVwiMTAwXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAV2F0Y2hDaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgY29sdW1uV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbldpZHRoO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGNvbHVtbldpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uV2lkdGggPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb2x1bW5XaWR0aFNldEJ5VXNlciA9IHRydWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQvU2V0cyB0aGUgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5R3JpZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbXB0eUdyaWRNZXNzYWdlID0gdmFsdWU7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZW1wdHlHcmlkTWVzc2FnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW1wdHlHcmlkTWVzc2FnZSB8fCB0aGlzLnJlc291cmNlU3RyaW5ncy5pZ3hfZ3JpZF9lbXB0eUdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBpcyBnb2luZyB0byBzaG93IGEgbG9hZGluZyBpbmRpY2F0b3IuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwiRGF0YVwiIFtpc0xvYWRpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNldCBpc0xvYWRpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9hZGluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzTG9hZGluZyA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZhbHVhdGVMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBjdXJyZW50IGRldGVjdGlvbiBjeWNsZSB0byBlbmQgYmVmb3JlIHRyaWdnZXJpbmcgYSBuZXcgb25lLlxuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMb2FkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW5zIHNob3VsZCBiZSBhdXRvLWdlbmVyYXRlZCBvbmNlIGFnYWluIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ3JpZFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHdpbGwgYWxsb3cgdG8gYmluZCB0aGUgZ3JpZCB0byByZW1vdGUgZGF0YSBhbmQgaGF2aW5nIGF1dG8tZ2VuZXJhdGVkIGNvbHVtbnMgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKiBOb3RlIHRoYXQgYWZ0ZXIgZ2VuZXJhdGluZyB0aGUgY29sdW1ucywgdGhpcyBwcm9wZXJ0eSB3b3VsZCBiZSBkaXNhYmxlZCB0byBhdm9pZCByZS1jcmVhdGluZ1xuICAgICAqIGNvbHVtbnMgZWFjaCB0aW1lIGEgbmV3IGRhdGEgaXMgYXNzaWduZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIHRoaXMuZ3JpZC5zaG91bGRHZW5lcmF0ZSA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNob3VsZEdlbmVyYXRlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZXJlIGFyZSBubyByZWNvcmRzIGFuZCB0aGUgZ3JpZCBpcyBmaWx0ZXJlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2VtcHR5R3JpZE1lc3NhZ2VdPVwiJ1RoZSBncmlkIGlzIGVtcHR5J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGVtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2VtcHR5RmlsdGVyZWRHcmlkTWVzc2FnZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbXB0eUZpbHRlcmVkR3JpZE1lc3NhZ2UgfHwgdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfZW1wdHlGaWx0ZXJlZEdyaWRfbWVzc2FnZTtcbiAgICB9XG5cbiAgICAvKiBtdXN0U2V0SW5Db2RlUGxhdGZvcm1zOiBXZWJDb21wb25lbnRzO0JsYXpvcjtSZWFjdCAqL1xuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgaW5pdGlhbCBwaW5uaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFsbG93cyB0byBhcHBseSBwaW5uaW5nIHRoZSBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciB0aGUgZW5kLlxuICAgICAqIE5vdGUgdGhhdCBwaW5uaW5nIHRvIGJvdGggc2lkZXMgYXQgYSB0aW1lIGlzIG5vdCBhbGxvd2VkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbcGlubmluZ109XCJwaW5uaW5nQ29uZmlnXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgcGlubmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5pbmc7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgcGlubmluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bpbm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9waW5uaW5nID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGlmIHRoZSBmaWx0ZXJpbmcgaXMgZW5hYmxlZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbYWxsb3dGaWx0ZXJpbmddPVwidHJ1ZVwiIFtoZWlnaHRdPVwiJzMwNXB4J1wiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBhbGxvd0ZpbHRlcmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93RmlsdGVyaW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgYWxsb3dGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93RmlsdGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fYWxsb3dGaWx0ZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5yZWdpc3RlclNWR0ljb25zKCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY0dyaWRIZWFkUm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtbiA9IG51bGw7XG5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgYWR2YW5jZWQgZmlsdGVyaW5nIGlzIGVuYWJsZWQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgW2FsbG93QWR2YW5jZWRGaWx0ZXJpbmddPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBhbGxvd0FkdmFuY2VkRmlsdGVyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWxsb3dBZHZhbmNlZEZpbHRlcmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGFsbG93QWR2YW5jZWRGaWx0ZXJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FsbG93QWR2YW5jZWRGaWx0ZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UucmVnaXN0ZXJTVkdJY29ucygpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIGZpbHRlciBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtmaWx0ZXJNb2RlXT1cIidxdWlja0ZpbHRlcidcIiBbaGVpZ2h0XT1cIiczMDVweCdcIiBbYXV0b0dlbmVyYXRlXT1cInRydWVcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpdCdzIHNldCB0byBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGZpbHRlck1vZGUodmFsdWU6IEZpbHRlck1vZGUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBGaWx0ZXJNb2RlLmV4Y2VsU3R5bGVGaWx0ZXI6XG4gICAgICAgICAgICBjYXNlIEZpbHRlck1vZGUucXVpY2tGaWx0ZXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyTW9kZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmluZ1NlcnZpY2UuaXNGaWx0ZXJSb3dWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmluZ1Jvdy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHN1bW1hcnkgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgI2dyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgc3VtbWFyeVBvc2l0aW9uPVwidG9wXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgYm90dG9tLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5UG9zaXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdW1tYXJ5UG9zaXRpb247XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzdW1tYXJ5UG9zaXRpb24odmFsdWU6IEdyaWRTdW1tYXJ5UG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVBvc2l0aW9uID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc3VtbWFyeSBjYWxjdWxhdGlvbiBtb2RlLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIHN1bW1hcnlDYWxjdWxhdGlvbk1vZGU9XCJyb290TGV2ZWxPbmx5XCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCI+PC9pZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgcm9vdEFuZENoaWxkTGV2ZWxzIHdoaWNoIG1lYW5zIHRoZSBzdW1tYXJpZXMgYXJlIGNhbGN1bGF0ZWQgZm9yIHRoZSByb290IGxldmVsIGFuZCBlYWNoIGNoaWxkIGxldmVsLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeUNhbGN1bGF0aW9uTW9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlDYWxjdWxhdGlvbk1vZGUodmFsdWU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5yZXNldFN1bW1hcnlIZWlnaHQoKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHN1bW1hcnkgcm93IGlzIHZpc2libGUgd2hlbiBncm91cEJ5L3BhcmVudCByb3cgaXMgY29sbGFwc2VkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkICNncmlkIFtkYXRhXT1cImxvY2FsRGF0YVwiIFtzaG93U3VtbWFyeU9uQ29sbGFwc2VdPVwidHJ1ZVwiIFthdXRvR2VuZXJhdGVdPVwidHJ1ZVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHNob3dTdW1tYXJ5T25Db2xsYXBzZSBpcyBzZXQgdG8gJ2ZhbHNlJyB3aGljaCBtZWFucyB0aGF0IHRoZSBzdW1tYXJ5IHJvdyBpcyBub3QgdmlzaWJsZVxuICAgICAqIHdoZW4gdGhlIGdyb3VwQnkvcGFyZW50IHJvdyBpcyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaG93U3VtbWFyeU9uQ29sbGFwc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzaG93U3VtbWFyeU9uQ29sbGFwc2UodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2hvd1N1bW1hcnlPbkNvbGxhcHNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgZmlsdGVyaW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbZmlsdGVyU3RyYXRlZ3ldPVwiZmlsdGVyU3RyYXRlZ3lcIj48L2lneC1ncmlkPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJTdHJhdGVneSgpOiBJRmlsdGVyaW5nU3RyYXRlZ3kge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVyU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBmaWx0ZXJTdHJhdGVneShjbGFzc1JlZjogSUZpbHRlcmluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlclN0cmF0ZWd5ID0gY2xhc3NSZWY7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBzb3J0aW5nIHN0cmF0ZWd5IG9mIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJsb2NhbERhdGFcIiBbc29ydFN0cmF0ZWd5XT1cInNvcnRTdHJhdGVneVwiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRTdHJhdGVneSgpOiBJR3JpZFNvcnRpbmdTdHJhdGVneSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nU3RyYXRlZ3k7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0U3RyYXRlZ3kodmFsdWU6IElHcmlkU29ydGluZ1N0cmF0ZWd5KSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdTdHJhdGVneSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgc29ydGluZyBvcHRpb25zIC0gc2luZ2xlIG9yIG11bHRpcGxlIHNvcnRpbmcuXG4gICAgICogQWNjZXB0cyBhbiBgSVNvcnRpbmdPcHRpb25zYCBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIGBtb2RlYCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgX3NvcnRpbmdPcHRpb25zOiBJU29ydGluZ09wdGlvbnMgPSB7XG4gICAgICogICAgICBtb2RlOiAnc2luZ2xlJ1xuICAgICAqIH1cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1ncmlkIFtzb3J0aW5nT3B0aW9uc109XCJzb3J0aW5nT3B0aW9uc1wiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc29ydGluZ09wdGlvbnModmFsdWU6IElTb3J0aW5nT3B0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIC8vIGNsZWFyIHNvcnQgb25seSBpZiBvcHRpb24gaXMgY2hhbmdlZCBydW50aW1lLiBObyBuZWVkIHRvIGNsZWFyIG9uIGluaXRpYWwgbG9hZC5cbiAgICAgICAgICAgIHRoaXMuY2xlYXJTb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc29ydGluZ09wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3NvcnRpbmdPcHRpb25zLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzb3J0aW5nT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRpbmdPcHRpb25zO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckJ5VmFsdWVBcnJheSAqL1xuICAgIC8qIGJsYXpvckFsd2F5c1dyaXRlYmFjayAqL1xuICAgIC8qIEB0c1R3b1dheVByb3BlcnR5ICh0cnVlLCBcIlJvd1NlbGVjdGlvbkNoYW5naW5nXCIsIFwiRGV0YWlsLk5ld1NlbGVjdGlvblwiLCBmYWxzZSkgKi9cbiAgICAvKiBibGF6b3JQcmltaXRpdmVWYWx1ZSAqL1xuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJlcHJlc2VudHMgdGhlIHNlbGVjdGVkIHJvd3MnIElEcyAocHJpbWFyeSBrZXkgb3Igcm93RGF0YSlcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWdyaWQgW2RhdGFdPVwibG9jYWxEYXRhXCIgcHJpbWFyeUtleT1cIklEXCIgcm93U2VsZWN0aW9uPVwibXVsdGlwbGVcIiBbc2VsZWN0ZWRSb3dzXT1cIlswLCAxLCAyXVwiPjxpZ3gtZ3JpZD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgc2VsZWN0ZWRSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyB8fCBbXSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZFJvd3MoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdGVkUm93cygpO1xuICAgIH1cblxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoZWFkZXJHcm91cHNMaXN0KCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGhlYWRSb3cuZ3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2VsbExpc3QoKTogSWd4R3JpZEhlYWRlckNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoaGVhZGVyR3JvdXAgPT4gaGVhZGVyR3JvdXAuaGVhZGVyKS5maWx0ZXIoaGVhZGVyID0+IGhlYWRlcik7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJDZWxsTGlzdCgpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5tYXAoZ3JvdXAgPT4gZ3JvdXAuZmlsdGVyKS5maWx0ZXIoY2VsbCA9PiBjZWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzUm93TGlzdCgpIHtcbiAgICAgICAgY29uc3QgcmVzID0gbmV3IFF1ZXJ5TGlzdDxhbnk+KCk7XG4gICAgICAgIGlmICghdGhpcy5fc3VtbWFyeVJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3VtTGlzdCA9IHRoaXMuX3N1bW1hcnlSb3dMaXN0LmZpbHRlcigoaXRlbSkgPT4gaXRlbS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gbnVsbCk7XG4gICAgICAgIHJlcy5yZXNldChzdW1MaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBjc1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGBJZ3hHcmlkUm93Q29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJvd0xpc3QgPSB0aGlzLmdyaWQucm93TGlzdDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0xpc3QoKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBRdWVyeUxpc3Q8SWd4Um93RGlyZWN0aXZlPigpO1xuICAgICAgICBpZiAoIXRoaXMuX3Jvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgckxpc3QgPSB0aGlzLl9yb3dMaXN0XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSBudWxsKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKiBjc1N1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGN1cnJlbnRseSByZW5kZXJlZCBgSWd4R3JpZFJvd0NvbXBvbmVudGAncy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGRhdGFMaXN0ID0gdGhpcy5ncmlkLmRhdGFSb3dMaXN0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGF0YVJvd0xpc3QoKTogUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT4ge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUXVlcnlMaXN0PElneFJvd0RpcmVjdGl2ZT4oKTtcbiAgICAgICAgaWYgKCF0aGlzLl9kYXRhUm93TGlzdCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByTGlzdCA9IHRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgcmVzLnJlc2V0KHJMaXN0KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgcm93IHNlbGVjdG9yIHRlbXBsYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBoZWFkU2VsZWN0b3JUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWRTZWxlY3RvclRlbXBsYXRlIHx8IHRoaXMuaGVhZFNlbGVjdG9yc1RlbXBsYXRlcz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGVhZGVyIHJvdyBzZWxlY3RvciB0ZW1wbGF0ZS5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hIZWFkU2VsZWN0b3IgbGV0LWhlYWRDb250ZXh0PlxuICAgICAqIHt7IGhlYWRDb250ZXh0LnNlbGVjdGVkQ291bnQgfX0gLyB7eyBoZWFkQ29udGV4dC50b3RhbENvdW50ICB9fVxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuaGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGVhZFNlbGVjdG9yVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEhlYWRTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5faGVhZFNlbGVjdG9yVGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc1Bpbm5pbmdUb1N0YXJ0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uaW5nLmNvbHVtbnMgIT09IENvbHVtblBpbm5pbmdQb3NpdGlvbi5FbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dQaW5uaW5nVG9Ub3AoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpbm5pbmcucm93cyAhPT0gUm93UGlubmluZ1Bvc2l0aW9uLkJvdHRvbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByb3cgc2VsZWN0b3IgdGVtcGxhdGUuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvd1NlbGVjdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1NlbGVjdG9yVGVtcGxhdGUgfHwgdGhpcy5yb3dTZWxlY3RvcnNUZW1wbGF0ZXM/LmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBTZXRzIGEgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgcm93IHNlbGVjdG9ycy5cbiAgICAgICAgICogYGBgaHRtbFxuICAgICAgICAgKiA8bmctdGVtcGxhdGUgI3RlbXBsYXRlIGlneFJvd1NlbGVjdG9yIGxldC1yb3dDb250ZXh0PlxuICAgICAgICAgKiAgICA8aWd4LWNoZWNrYm94IFtjaGVja2VkXT1cInJvd0NvbnRleHQuc2VsZWN0ZWRcIj48L2lneC1jaGVja2JveD5cbiAgICAgICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgICAgICogQFZpZXdDaGlsZChcIid0ZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgICAgICogdGhpcy5ncmlkLnJvd1NlbGVjdG9yVGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlO1xuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgcHVibGljIHNldCByb3dTZWxlY3RvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hSb3dTZWxlY3RvclRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fcm93U2VsZWN0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dPdXRsZXREaXJlY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRpbmdPdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhcmVudFJvd091dGxldERpcmVjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3V0bGV0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb3dFZGl0Q3VzdG9tKCk6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzICYmIHRoaXMucm93RWRpdEN1c3RvbURpcmVjdGl2ZXMuZmlyc3QpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvd0VkaXRDdXN0b21EaXJlY3RpdmVzLmZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRDb250YWluZXIoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd0VkaXRUZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdEN1c3RvbSA/IHRoaXMucm93RWRpdEN1c3RvbSA6IHRoaXMuZGVmYXVsdFJvd0VkaXRUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgY3VzdG9tIHRlbXBsYXRlLCBpZiBhbnksIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiByZW5kZXJpbmcgdGhlIHJvdyBkcmFnIGluZGljYXRvciBpY29uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXN0b21EcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlIHx8IHRoaXMuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZXM/LmZpcnN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjdXN0b20gdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIHJlbmRlcmluZyB0aGUgcm93IGRyYWcgaW5kaWNhdG9yIGljb24uXG4gICAgICpgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBpZ3hEcmFnSW5kaWNhdG9ySWNvbj5cbiAgICAgKiAgICA8aWd4LWljb24+ZXhwYW5kX2xlc3M8L2lneC1pY29uPlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCIndGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmdyaWQuZHJhZ0luZGljYXRvckljb25UZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBkcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlKHZhbDogVGVtcGxhdGVSZWY8SWd4R3JpZEVtcHR5VGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9jdXN0b21EcmFnSW5kaWNhdG9ySWNvblRlbXBsYXRlID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaXJzdEVkaXRhYmxlQ29sdW1uSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVkaXRhYmxlKVxuICAgICAgICAgICAgLm1hcChjID0+IGMudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIHJldHVybiBpbmRleC5sZW5ndGggPyBpbmRleFswXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxhc3RFZGl0YWJsZUNvbHVtbkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lZGl0YWJsZSlcbiAgICAgICAgICAgIC5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYSA+IGIgPyAtMSA6IDEpO1xuICAgICAgICByZXR1cm4gaW5kZXgubGVuZ3RoID8gaW5kZXhbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogTmF2IHNlcnZpY2UgbG9naWMgZG9lc24ndCBoYW5kbGUgMCByZXN1bHRzIGZyb20gdGhpcyBxdWVyeWxpc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJvd0VkaXRUYWJzKCk6IFF1ZXJ5TGlzdDxJZ3hSb3dFZGl0VGFiU3RvcERpcmVjdGl2ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFZGl0VGFic0NVU1RPTS5sZW5ndGggPyB0aGlzLnJvd0VkaXRUYWJzQ1VTVE9NIDogdGhpcy5yb3dFZGl0VGFic0RFRkFVTFQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBhY3RpdmVEZXNjZW5kYW50KCkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtID0gdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVFbGVtIHx8ICFPYmplY3Qua2V5cyhhY3RpdmVFbGVtKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUVsZW0ucm93IDwgMCA/XG4gICAgICAgICAgICBgJHt0aGlzLmlkfV8ke2FjdGl2ZUVsZW0ucm93fV8ke2FjdGl2ZUVsZW0ubWNoQ2FjaGUubGV2ZWx9XyR7YWN0aXZlRWxlbS5jb2x1bW59YCA6XG4gICAgICAgICAgICBgJHt0aGlzLmlkfV8ke2FjdGl2ZUVsZW0ucm93fV8ke2FjdGl2ZUVsZW0uY29sdW1ufWA7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBiYW5uZXJDbGFzcygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3AgPyAnaWd4LWJhbm5lcl9fYm9yZGVyLXRvcCcgOiAnaWd4LWJhbm5lcl9fYm9yZGVyLWJvdHRvbSc7XG4gICAgICAgIHJldHVybiBgaWd4LWJhbm5lciAke3Bvc2l0aW9ufWA7XG4gICAgfVxuXG4gICAgLyogbXVzdFNldEluQ29kZVBsYXRmb3JtczogV2ViQ29tcG9uZW50cztCbGF6b3I7UmVhY3QgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgdGhlIHNvcnRpbmcgc3RhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFN1cHBvcnRzIHR3by13YXkgZGF0YSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJEYXRhXCIgW2F1dG9HZW5lcmF0ZV09XCJ0cnVlXCIgWyhzb3J0aW5nRXhwcmVzc2lvbnMpXT1cIm1vZGVsLnNvcnRpbmdFeHByZXNzaW9uc1wiPjwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFdhdGNoQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRpbmdFeHByZXNzaW9ucygpOiBJU29ydGluZ0V4cHJlc3Npb25bXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3J0aW5nRXhwcmVzc2lvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzb3J0aW5nRXhwcmVzc2lvbnModmFsdWU6IElTb3J0aW5nRXhwcmVzc2lvbltdKSB7XG4gICAgICAgIHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyA9IGNsb25lQXJyYXkodmFsdWUpO1xuICAgICAgICB0aGlzLnNvcnRpbmdFeHByZXNzaW9uc0NoYW5nZS5lbWl0KHRoaXMuX3NvcnRpbmdFeHByZXNzaW9ucyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhMZXZlbEhlYWRlckRlcHRoKCkge1xuICAgICAgICBpZiAodGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IHRoaXMuaGFzQ29sdW1uTGF5b3V0cyA/XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5yZWR1Y2UoKGFjYywgY29sKSA9PiBNYXRoLm1heChhY2MsIGNvbC5yb3dTdGFydCksIDApIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wpID0+IE1hdGgubWF4KGFjYywgY29sLmxldmVsKSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21heExldmVsSGVhZGVyRGVwdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGhpZGRlbiBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgaGlkZGVuQ29sID0gdGhpcy5ncmlkLmhpZGRlbkNvbHVtbnNDb3VudDtcbiAgICAgKiBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGlkZGVuQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkdyb3VwID09PSBmYWxzZSAmJiBjb2wuaGlkZGVuID09PSB0cnVlKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBpbm5lZCBjb2x1bW5zLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1uc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWRDb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5MYXlvdXQpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgd2hldGhlciB0aGUgZ3JpZCBoYXMgYmF0Y2ggZWRpdGluZyBlbmFibGVkLlxuICAgICAqIFdoZW4gYmF0Y2ggZWRpdGluZyBpcyBlbmFibGVkLCBjaGFuZ2VzIGFyZSBub3QgbWFkZSBkaXJlY3RseSB0byB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqIEluc3RlYWQsIHRoZXkgYXJlIHN0b3JlZCBhcyB0cmFuc2FjdGlvbnMsIHdoaWNoIGNhbiBsYXRlciBiZSBjb21taXR0ZWQgdy8gdGhlIGBjb21taXRgIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCBbYmF0Y2hFZGl0aW5nXT1cInRydWVcIiBbZGF0YV09XCJzb21lRGF0YVwiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBiYXRjaEVkaXRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYXRjaEVkaXRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBiYXRjaEVkaXRpbmcodmFsOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh2YWwgIT09IHRoaXMuX2JhdGNoRWRpdGluZykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICAgICAgICAgIHRoaXMuX2JhdGNoRWRpdGluZyA9IHZhbDtcbiAgICAgICAgICAgIHRoaXMuc3dpdGNoVHJhbnNhY3Rpb25TZXJ2aWNlKHZhbCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBibGF6b3JTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIEdldCB0cmFuc2FjdGlvbnMgc2VydmljZSBmb3IgdGhlIGdyaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0cmFuc2FjdGlvbnMoKTogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4ge1xuICAgICAgICBpZiAodGhpcy5fZGlUcmFuc2FjdGlvbnMgJiYgIXRoaXMuYmF0Y2hFZGl0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlUcmFuc2FjdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3VycmVudFJvd1N0YXRlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50Um93U3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbmN5UG9zaXRpb25MZWZ0KCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbmN5UG9zaXRpb25MZWZ0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdCh0aGlzLmxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3kpO1xuICAgICAgICBjb25zdCBmb3JtYXRQYXJ0cyA9IGZvcm1hdC5zcGxpdCgnLCcpO1xuICAgICAgICBjb25zdCBpID0gZm9ybWF0UGFydHMuaW5kZXhPZihmb3JtYXRQYXJ0cy5maW5kKGMgPT4gYy5pbmNsdWRlcygnwqQnKSkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVuY3lQb3NpdGlvbkxlZnQgPSBpIDwgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgY2VsbCBzZWxlY3Rpb24gbW9kZS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCB0aGUgY2VsbCBzZWxlY3Rpb24gbW9kZSBpcyBtdWx0aXBsZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjZWxsU2VsZWN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFNlbGVjdGlvbk1vZGU7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBjZWxsU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NlbGxTZWxlY3Rpb25Nb2RlID0gc2VsZWN0aW9uTW9kZTtcbiAgICAgICAgLy8gaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL1NldHMgcm93IHNlbGVjdGlvbiBtb2RlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhlIHJvdyBzZWxlY3Rpb24gbW9kZSBpcyAnbm9uZSdcbiAgICAgKiBOb3RlIHRoYXQgaW4gSWd4R3JpZCBhbmQgSWd4SGllcmFyY2hpY2FsR3JpZCAnbXVsdGlwbGVDYXNjYWRlJyBiZWhhdmVzIGxpa2UgJ211bHRpcGxlJ1xuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCByb3dTZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb3dTZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm93U2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX3Jvd1NlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICBpZiAoIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGNvbHVtbiBzZWxlY3Rpb24gbW9kZVxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSByb3cgc2VsZWN0aW9uIG1vZGUgaXMgbm9uZVxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBjb2x1bW5TZWxlY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5TZWxlY3Rpb25Nb2RlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgY29sdW1uU2VsZWN0aW9uKHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblNlbGVjdGlvbk1vZGUgPSBzZWxlY3Rpb25Nb2RlO1xuICAgICAgICAvLyBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyQWxsU2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldCBwYWdpbmdTdGF0ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9wYWdpbmdTdGF0ZSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgIXRoaXMuX2luaXQpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHZhbHVlLm1ldGFkYXRhLmNvdW50UmVjb3JkcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFnaW5nU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdpbmdTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByb3dFZGl0TWVzc2FnZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNXaWR0aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhbGNIZWlnaHQgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHRmb290SGVpZ2h0OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlVHJhbnNpdGlvbnMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgdGhlIGxhc3Qgc2VhcmNoIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGFzdFNlYXJjaEluZm8oKTogSVNlYXJjaEluZm8ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm87XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sdW1uV2lkdGhTZXRCeVVzZXIgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHBpbm5lZFJlY29yZHM6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdW5waW5uZWRSZWNvcmRzOiBhbnlbXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlbmRlcmVkJCA9IHRoaXMucmVuZGVyZWQuYXNPYnNlcnZhYmxlKCkucGlwZShzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZXNpemVOb3RpZnkgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHJvd0FkZGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByb3dEZWxldGVkTm90aWZpZXIgPSBuZXcgU3ViamVjdDxJUm93RGF0YUV2ZW50QXJncz4oKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlck5vdGlmaWVyID0gbmV3IFN1YmplY3QoKTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhOiBhbnlbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIF9maWx0ZXJlZFBpbm5lZERhdGE6IGFueVtdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBfZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX2Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIF90b3RhbFJlY29yZHMgPSAtMTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5zV2l0aE5vU2V0V2lkdGhzID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyaW5nUGlwZVRyaWdnZXIgPSAwO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHN1bW1hcnlQaXBlVHJpZ2dlciA9IDA7XG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ3JvdXBhYmxlUGlwZVRyaWdnZXIgPSAwO1xuXG4gICAgLyoqXG4gICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICovXG4gICAgcHVibGljIEVNUFRZX0RBVEEgPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdHlwZSgpOiBHcmlkVHlwZVtcInR5cGVcIl0ge1xuICAgICAgICByZXR1cm4gJ2ZsYXQnO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfYmFzZUZvbnRTaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3BhZ2luZ01vZGUgPSBHcmlkUGFnaW5nTW9kZS5Mb2NhbDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9wYWdpbmdTdGF0ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oaWRlUm93U2VsZWN0b3JzID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcm93RHJhZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfcGlubmVkQ29sdW1uczogSWd4Q29sdW1uQ29tcG9uZW50W10gPSBbXTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF91bnBpbm5lZENvbHVtbnM6IElneENvbHVtbkNvbXBvbmVudFtdID0gW107XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlID0gbmV3IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZShGaWx0ZXJpbmdMb2dpYy5BbmQpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FkdmFuY2VkRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlOiBJRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NvcnRpbmdFeHByZXNzaW9uczogQXJyYXk8SVNvcnRpbmdFeHByZXNzaW9uPiA9IFtdO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21heExldmVsSGVhZGVyRGVwdGggPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtbkhpZGluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbHVtblBpbm5pbmcgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfcGlubmVkUmVjb3JkSURzID0gW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICBwcm90ZWN0ZWQgX2FsbG93RmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9hbGxvd0FkdmFuY2VkRmlsdGVyaW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJNb2RlOiBGaWx0ZXJNb2RlID0gRmlsdGVyTW9kZS5xdWlja0ZpbHRlcjtcblxuXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyID0gMTA7XG4gICAgcHJvdGVjdGVkIF9leHBhbnNpb25TdGF0ZXM6IE1hcDxhbnksIGJvb2xlYW4+ID0gbmV3IE1hcDxhbnksIGJvb2xlYW4+KCk7XG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0RXhwYW5kU3RhdGUgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2hlYWRlckZlYXR1cmVzV2lkdGggPSBOYU47XG4gICAgcHJvdGVjdGVkIF9pbml0ID0gdHJ1ZTtcbiAgICBwcm90ZWN0ZWQgX2ZpcnN0QXV0b1Jlc2l6ZSA9IHRydWU7XG4gICAgcHJvdGVjdGVkIF9hdXRvU2l6ZUNvbHVtbnNOb3RpZnkgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCBfY2RyUmVxdWVzdFJlcGFpbnQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3VzZXJPdXRsZXREaXJlY3RpdmU6IElneE92ZXJsYXlPdXRsZXREaXJlY3RpdmU7XG4gICAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbnM6IFRyYW5zYWN0aW9uU2VydmljZTxUcmFuc2FjdGlvbiwgU3RhdGU+O1xuICAgIHByb3RlY3RlZCBfYmF0Y2hFZGl0aW5nID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9zb3J0aW5nT3B0aW9uczogSVNvcnRpbmdPcHRpb25zID0geyBtb2RlOiAnbXVsdGlwbGUnIH07XG4gICAgcHJvdGVjdGVkIF9maWx0ZXJTdHJhdGVneTogSUZpbHRlcmluZ1N0cmF0ZWd5ID0gbmV3IEZpbHRlcmluZ1N0cmF0ZWd5KCk7XG4gICAgcHJvdGVjdGVkIF9hdXRvR2VuZXJhdGVkQ29scyA9IFtdO1xuICAgIHByb3RlY3RlZCBfZGF0YVZpZXcgPSBbXTtcbiAgICBwcm90ZWN0ZWQgX2xhc3RTZWFyY2hJbmZvOiBJU2VhcmNoSW5mbyA9IHtcbiAgICAgICAgc2VhcmNoVGV4dDogJycsXG4gICAgICAgIGNhc2VTZW5zaXRpdmU6IGZhbHNlLFxuICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgYWN0aXZlTWF0Y2hJbmRleDogMCxcbiAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdLFxuICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICBjb250ZW50OiAnJ1xuICAgIH07XG4gICAgcHJvdGVjdGVkIGdyaWRDb21wdXRlZFN0eWxlcztcblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgcGFnaW5hdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uQ29tcG9uZW50cz8uZmlyc3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNjcm9sbFNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmdldFNjcm9sbE5hdGl2ZVNpemUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yb3dFZGl0YWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2N1cnJlbnRSb3dTdGF0ZTogYW55O1xuICAgIHByaXZhdGUgX2ZpbHRlcmVkU29ydGVkRGF0YSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZmlsdGVyZWREYXRhID0gbnVsbDtcblxuICAgIHByaXZhdGUgX2N1c3RvbURyYWdJbmRpY2F0b3JJY29uVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRFbXB0eVRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZXhjZWxTdHlsZUhlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93U2VsZWN0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Um93U2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX2hlYWRTZWxlY3RvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hIZWFkU2VsZWN0b3JUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRUZXh0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0VGV4dFRlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfcm93QWRkVGV4dFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkRW1wdHlUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX3Jvd0VkaXRBY3Rpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dFZGl0QWN0aW9uc1RlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfZHJhZ0dob3N0Q3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRSb3dEcmFnR2hvc3RDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dFeHBhbmRlZEluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkUm93VGVtcGxhdGVDb250ZXh0PjtcbiAgICBwcml2YXRlIF9yb3dDb2xsYXBzZWRJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZFJvd1RlbXBsYXRlQ29udGV4dD47XG4gICAgcHJpdmF0ZSBfaGVhZGVyRXhwYW5kSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIHByaXZhdGUgX2hlYWRlckNvbGxhcHNlSW5kaWNhdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneEdyaWRUZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgcHJpdmF0ZSBfY2RyUmVxdWVzdHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKEdyaWRSZXNvdXJjZVN0cmluZ3NFTik7XG4gICAgcHJpdmF0ZSBfZW1wdHlHcmlkTWVzc2FnZSA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZW1wdHlGaWx0ZXJlZEdyaWRNZXNzYWdlID0gbnVsbDtcbiAgICBwcml2YXRlIF9pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9sb2NhbGU6IHN0cmluZztcbiAgICBwcml2YXRlIG92ZXJsYXlJRHMgPSBbXTtcbiAgICBwcml2YXRlIF9zb3J0aW5nU3RyYXRlZ3k6IElHcmlkU29ydGluZ1N0cmF0ZWd5O1xuICAgIHByaXZhdGUgX3Bpbm5pbmc6IElQaW5uaW5nQ29uZmlnID0geyBjb2x1bW5zOiBDb2x1bW5QaW5uaW5nUG9zaXRpb24uU3RhcnQgfTtcbiAgICBwcml2YXRlIF9zaG91bGRSZWNhbGNSb3dIZWlnaHQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgX2hvc3RXaWR0aDtcbiAgICBwcml2YXRlIF9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyaW5nUG9zaXRpb25TZXR0aW5nczogUG9zaXRpb25TZXR0aW5ncyA9IHtcbiAgICAgICAgdmVydGljYWxEaXJlY3Rpb246IFZlcnRpY2FsQWxpZ25tZW50Lk1pZGRsZSxcbiAgICAgICAgaG9yaXpvbnRhbERpcmVjdGlvbjogSG9yaXpvbnRhbEFsaWdubWVudC5DZW50ZXIsXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkNlbnRlcixcbiAgICAgICAgdmVydGljYWxTdGFydFBvaW50OiBWZXJ0aWNhbEFsaWdubWVudC5NaWRkbGVcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgcG9zaXRpb25TdHJhdGVneTogbmV3IENvbm5lY3RlZFBvc2l0aW9uaW5nU3RyYXRlZ3kodGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdQb3NpdGlvblNldHRpbmdzKSxcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb2x1bW5MaXN0RGlmZmVyO1xuICAgIHByaXZhdGUgcm93TGlzdERpZmZlcjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IHN0cmluZyB8IG51bGwgPSAnMTAwJSc7XG4gICAgcHJpdmF0ZSBfcm93SGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBfaG9yaXpvbnRhbEZvck9mczogQXJyYXk8SWd4R3JpZEZvck9mRGlyZWN0aXZlPGFueSwgYW55W10+PiA9IFtdO1xuICAgIHByaXZhdGUgX211bHRpUm93TGF5b3V0Um93U2l6ZSA9IDE7XG4gICAgLy8gQ2FjaGVzXG4gICAgcHJpdmF0ZSBfdG90YWxXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF9waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRWaXNpYmxlID0gW107XG4gICAgcHJpdmF0ZSBfcGlubmVkV2lkdGggPSBOYU47XG4gICAgcHJpdmF0ZSBfdW5waW5uZWRXaWR0aCA9IE5hTjtcbiAgICBwcml2YXRlIF92aXNpYmxlQ29sdW1ucyA9IFtdO1xuICAgIHByaXZhdGUgX2NvbHVtbkdyb3VwcyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfY29sdW1uV2lkdGg6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3N1bW1hcnlQb3NpdGlvbjogR3JpZFN1bW1hcnlQb3NpdGlvbiA9IEdyaWRTdW1tYXJ5UG9zaXRpb24uYm90dG9tO1xuICAgIHByaXZhdGUgX3N1bW1hcnlDYWxjdWxhdGlvbk1vZGU6IEdyaWRTdW1tYXJ5Q2FsY3VsYXRpb25Nb2RlID0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUucm9vdEFuZENoaWxkTGV2ZWxzO1xuICAgIHByaXZhdGUgX3Nob3dTdW1tYXJ5T25Db2xsYXBzZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3N1bW1hcnlSb3dIZWlnaHQgPSAwO1xuICAgIHByaXZhdGUgX2NlbGxTZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlO1xuICAgIHByaXZhdGUgX3Jvd1NlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZTtcbiAgICBwcml2YXRlIF9zZWxlY3RSb3dPbkNsaWNrID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSA9IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG5cbiAgICBwcml2YXRlIGxhc3RBZGRlZFJvd0luZGV4O1xuICAgIHByaXZhdGUgX2N1cnJlbmN5UG9zaXRpb25MZWZ0OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneSA9IG5ldyBSb3dFZGl0UG9zaXRpb25TdHJhdGVneSh7XG4gICAgICAgIGhvcml6b250YWxEaXJlY3Rpb246IEhvcml6b250YWxBbGlnbm1lbnQuUmlnaHQsXG4gICAgICAgIHZlcnRpY2FsRGlyZWN0aW9uOiBWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b20sXG4gICAgICAgIGhvcml6b250YWxTdGFydFBvaW50OiBIb3Jpem9udGFsQWxpZ25tZW50LkxlZnQsXG4gICAgICAgIHZlcnRpY2FsU3RhcnRQb2ludDogVmVydGljYWxBbGlnbm1lbnQuQm90dG9tLFxuICAgICAgICBjbG9zZUFuaW1hdGlvbjogbnVsbFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSByb3dFZGl0U2V0dGluZ3M6IE92ZXJsYXlTZXR0aW5ncyA9IHtcbiAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IG5ldyBBYnNvbHV0ZVNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgIG1vZGFsOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIG91dGxldDogdGhpcy5yb3dPdXRsZXREaXJlY3RpdmUsXG4gICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3lcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkNoYW5nZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByaXZhdGUgX3JlbmRlcmVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSBEUkFHX1NDUk9MTF9ERUxUQSA9IDEwO1xuICAgIHByaXZhdGUgX2RhdGFDbG9uZVN0cmF0ZWd5OiBJRGF0YUNsb25lU3RyYXRlZ3kgPSBuZXcgRGVmYXVsdERhdGFDbG9uZVN0cmF0ZWd5KCk7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemUgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9zb3J0SGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfc29ydEFzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4R3JpZEhlYWRlclRlbXBsYXRlQ29udGV4dD4gPSBudWxsO1xuICAgIHByaXZhdGUgX3NvcnREZXNjZW5kaW5nSGVhZGVySWNvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hHcmlkSGVhZGVyVGVtcGxhdGVDb250ZXh0PiA9IG51bGw7XG4gICAgcHJpdmF0ZSBfZ3JpZFNpemU6IFNpemUgPSBTaXplLkxhcmdlO1xuICAgIHByaXZhdGUgX2RlZmF1bHRSb3dIZWlnaHQgPSA1MDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBtaW5Db2x1bW5XaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIE1JTklNVU1fQ09MVU1OX1dJRFRIO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgaXNDdXN0b21TZXRSb3dIZWlnaHQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhaXNOYU4odGhpcy5fcm93SGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBpZDogc3RyaW5nO1xuICAgIC8qIGJsYXpvclN1cHByZXNzICovXG4gICAgcHVibGljIGFic3RyYWN0IGRhdGE6IGFueVtdIHwgbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBkYXRhLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGZpbHRlcmVkRGF0YSA9IHRoaXMuZ3JpZC5maWx0ZXJlZERhdGE7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJlZERhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJlZERhdGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBmaWx0ZXJlZCBzb3J0ZWQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGZpbHRlcmVkU29ydGVkRGF0YSA9IHRoaXMuZ3JpZDEuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyZWRTb3J0ZWREYXRhKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcmVkU29ydGVkRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcm93Q2hhbmdlc0NvdW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2Uucm93KSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmID0gKG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hhbmdlcyA9IDA7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IGlzT2JqZWN0KG9ialtrZXldKSA/IGNoYW5nZXMgKz0gZihvYmpba2V5XSkgOiBjaGFuZ2VzKyspO1xuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9ucy5nZXRTdGF0ZSh0aGlzLmNydWRTZXJ2aWNlLnJvdy5pZCk/LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BREQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+IGMuZmllbGQpLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb3dDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZFZhbHVlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmlkLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiByb3dDaGFuZ2VzID8gZihyb3dDaGFuZ2VzKSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFXaXRoQWRkZWRJblRyYW5zYWN0aW9uUm93cygpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2xvbmVBcnJheSh0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKCkpO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4udGhpcy50cmFuc2FjdGlvbnMuZ2V0QWdncmVnYXRlZENoYW5nZXModHJ1ZSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHQgPT4gdC50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQUREKVxuICAgICAgICAgICAgICAgIC5tYXAodCA9PiB0Lm5ld1ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jcnVkU2VydmljZS5yb3cgJiYgdGhpcy5jcnVkU2VydmljZS5yb3cuZ2V0Q2xhc3NOYW1lKCkgPT09IElneEFkZFJvdy5uYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuc3BsaWNlKHRoaXMuY3J1ZFNlcnZpY2Uucm93LmluZGV4LCAwLCB0aGlzLmNydWRTZXJ2aWNlLnJvdy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkID8gdGhpcy5kYXRhV2l0aEFkZGVkSW5UcmFuc2FjdGlvblJvd3MubGVuZ3RoIDogdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSgpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4R3JpZFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgJiYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlciB8fCB0aGlzLmhhc05vRGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgPyB0aGlzLmxvYWRpbmdHcmlkVGVtcGxhdGUgOiB0aGlzLmxvYWRpbmdHcmlkRGVmYXVsdFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzWmVyb1Jlc3VsdEZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgPyB0aGlzLmVtcHR5R3JpZFRlbXBsYXRlIDogdGhpcy5lbXB0eUZpbHRlcmVkR3JpZFRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzTm9EYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUdyaWRUZW1wbGF0ZSA/IHRoaXMuZW1wdHlHcmlkVGVtcGxhdGUgOiB0aGlzLmVtcHR5R3JpZERlZmF1bHRUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXQgaGFzWmVyb1Jlc3VsdEZpbHRlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGhhc05vRGF0YSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmRhdGEgfHwgdGhpcy5kYXRhTGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBzaG91bGRPdmVybGF5TG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNMb2FkaW5nICYmICF0aGlzLmhhc05vRGF0YSAmJiAhdGhpcy5oYXNaZXJvUmVzdWx0RmlsdGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBpc011bHRpUm93U2VsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0aW9uID09PSBHcmlkU2VsZWN0aW9uTW9kZS5tdWx0aXBsZVxuICAgICAgICAgICAgfHwgdGhpcy5yb3dTZWxlY3Rpb24gPT09IEdyaWRTZWxlY3Rpb25Nb2RlLm11bHRpcGxlQ2FzY2FkZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXNSb3dTZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzQ2VsbFNlbGVjdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGxTZWxlY3Rpb24gIT09IEdyaWRTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbkluRHJhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEFQSS5jbXMuY29sdW1uO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGlvbjogSWd4R3JpZFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGlvblNlcnZpY2U6IElneEdyaWRTZWxlY3Rpb25TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgY29sUmVzaXppbmdTZXJ2aWNlOiBJZ3hDb2x1bW5SZXNpemluZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfU0VSVklDRV9CQVNFKSBwdWJsaWMgcmVhZG9ubHkgZ3JpZEFQSTogR3JpZFNlcnZpY2VUeXBlLFxuICAgICAgICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb25GYWN0b3J5OiBJZ3hGbGF0VHJhbnNhY3Rpb25GYWN0b3J5LFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcm90ZWN0ZWQgem9uZTogTmdab25lLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHVibGljIGRvY3VtZW50OiBhbnksXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgZGlmZmVyczogSXRlcmFibGVEaWZmZXJzLFxuICAgICAgICBwcm90ZWN0ZWQgdmlld1JlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICAgICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJvdGVjdGVkIGVudkluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBwdWJsaWMgbmF2aWdhdGlvbjogSWd4R3JpZE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICAgICAgcHVibGljIGZpbHRlcmluZ1NlcnZpY2U6IElneEZpbHRlcmluZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCB0ZXh0SGlnaGxpZ2h0U2VydmljZTogSWd4VGV4dEhpZ2hsaWdodFNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoSWd4T3ZlcmxheVNlcnZpY2UpIHByb3RlY3RlZCBvdmVybGF5U2VydmljZTogSWd4T3ZlcmxheVNlcnZpY2UsXG4gICAgICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgICAgICBwdWJsaWMgc3VtbWFyeVNlcnZpY2U6IElneEdyaWRTdW1tYXJ5U2VydmljZSxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlSWQ6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHBsYXRmb3JtOiBQbGF0Zm9ybVV0aWwsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSWd4R3JpZFRyYW5zYWN0aW9uKSBwcm90ZWN0ZWQgX2RpVHJhbnNhY3Rpb25zPzogVHJhbnNhY3Rpb25TZXJ2aWNlPFRyYW5zYWN0aW9uLCBTdGF0ZT4sXG4gICAgKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5sb2NhbGUgfHwgdGhpcy5sb2NhbGVJZDtcbiAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuTm9uZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zYWN0aW9ucy5jbG9uZVN0cmF0ZWd5ID0gdGhpcy5kYXRhQ2xvbmVTdHJhdGVneTtcbiAgICAgICAgdGhpcy5jZHIuZGV0YWNoKCk7XG4gICAgICAgIElnY1RyaWFsV2F0ZXJtYXJrLnJlZ2lzdGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbGVhdmUnKVxuICAgIHB1YmxpYyBoaWRlQWN0aW9uU3RyaXAoKSB7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RyaXA/LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJGZWF0dXJlc1dpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzRGV0YWlsUmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNHcm91cEJ5UmVjb3JkKF9yZWMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzR2hvc3RSZWNvcmQocmVjb3JkOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZC5naG9zdFJlY29yZCAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc0FkZFJvd1JlY29yZChyZWNvcmQ6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLmFkZFJvdyAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSByb3cgaW5kZXggb2YgYSByb3cgdGhhdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZ1bGwgdmlldyBkYXRhIGxpa2UgcGlubmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RGF0YVZpZXdJbmRleChyb3dJbmRleCwgcGlubmVkKSB7XG4gICAgICAgIGlmIChwaW5uZWQgJiYgIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3ApIHtcbiAgICAgICAgICAgIHJvd0luZGV4ID0gcm93SW5kZXggKyB0aGlzLnVucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9IGVsc2UgaWYgKCFwaW5uZWQgJiYgdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCkge1xuICAgICAgICAgICAgcm93SW5kZXggPSByb3dJbmRleCArIHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNEZXRhaWxzKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGdyaWQgdmlydHVhbGl6YXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEluY2x1ZGVzIHRoZSBzdGFydCBpbmRleCBhbmQgaG93IG1hbnkgcmVjb3JkcyBhcmUgcmVuZGVyZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZ3JpZFZpcnRTdGF0ZSA9IHRoaXMuZ3JpZDEudmlydHVhbGl6YXRpb25TdGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHZpcnR1YWxpemF0aW9uU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnN0YXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaGlkZU92ZXJsYXlzKCkge1xuICAgICAgICB0aGlzLm92ZXJsYXlJRHMuZm9yRWFjaChvdmVybGF5SUQgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQob3ZlcmxheUlEKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJsYXk/LnZpc2libGUgJiYgIW92ZXJsYXkuY2xvc2VBbmltYXRpb25QbGF5ZXI/Lmhhc1N0YXJ0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2UuaGlkZShvdmVybGF5SUQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGRhdGFWaWV3YCBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBpc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMucGlubmVkRGF0YVZpZXcubGVuZ3RoKSB8fFxuICAgICAgICAgICAgKCF0aGlzLmlzUm93UGlubmluZ1RvVG9wICYmIHJvd0luZGV4ID49IHRoaXMudW5waW5uZWREYXRhVmlldy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgcmVjb3JkIGlzIHBpbm5lZCBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcm93SW5kZXggSW5kZXggb2YgdGhlIHJlY29yZCBpbiB0aGUgYGZpbHRlcmVkU29ydGVkRGF0YWAgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNSZWNvcmRQaW5uZWRCeUluZGV4KHJvd0luZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUGlubmVkUmVjb3JkcyAmJiAodGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCAmJiByb3dJbmRleCA8IHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoIXRoaXMuaXNSb3dQaW5uaW5nVG9Ub3AgJiYgcm93SW5kZXggPj0gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzUmVjb3JkUGlubmVkKHJlYykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJbml0aWFsUGlubmVkSW5kZXgocmVjKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqIFJldHVybnMgdGhlIHJlY29yZCBpbmRleCBpbiBvcmRlciBvZiBwaW5uaW5nIGJ5IHRoZSB1c2VyLiBEb2VzIG5vdCBjb25zaWRlciBzb3J0aW5nL2ZpbHRlcmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5pdGlhbFBpbm5lZEluZGV4KHJlYykge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2lkKHJlYyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihpZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGFzUGlubmVkUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJlY29yZHNDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY3J1ZFNlcnZpY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRBUEkuY3J1ZFNlcnZpY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBTZXJ2aWNlcygpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmdyaWQgPSB0aGlzIGFzIGFueTtcbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMudmFsaWRhdGlvbi5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbi5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5ncmlkID0gdGhpcyBhcyBhbnk7XG4gICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UuZ3JpZCA9IHRoaXMgYXMgYW55O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgX3NldHVwTGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBkZXN0cnVjdG9yID0gdGFrZVVudGlsPGFueT4odGhpcy5kZXN0cm95JCk7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsICdmb2N1c291dCcpLnBpcGUoZmlsdGVyKCgpID0+ICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUpLCBkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3J1ZFNlcnZpY2UuY2VsbCAmJlxuICAgICAgICAgICAgICAgICEhdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAoKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA+PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA8IHRoaXMuZGF0YVZpZXcubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGUucm93ID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy50Zm9vdC5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlLnJvdyA9PT0gdGhpcy5kYXRhVmlldy5sZW5ndGgpKSAmJlxuICAgICAgICAgICAgICAgICEodGhpcy5yb3dFZGl0YWJsZSAmJiB0aGlzLmNydWRTZXJ2aWNlLnJvd0VkaXRpbmdCbG9ja2VkICYmIHRoaXMuY3J1ZFNlcnZpY2Uucm93SW5FZGl0TW9kZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24ubGFzdEFjdGl2ZU5vZGUgPSB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24uYWN0aXZlTm9kZSA9IHt9IGFzIElBY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yb3dBZGRlZE5vdGlmaWVyLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKGFyZ3MgPT4gdGhpcy5yZWZyZXNoR3JpZFN0YXRlKGFyZ3MpKTtcbiAgICAgICAgdGhpcy5yb3dEZWxldGVkTm90aWZpZXIucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmRlbGV0ZU9wZXJhdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKGFyZ3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnNjcmliZVRvVHJhbnNhY3Rpb25zKCk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVOb3RpZnkucGlwZShcbiAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksXG4gICAgICAgICAgICB0aHJvdHRsZVRpbWUoNDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGVzdHJ1Y3RvclxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IHRyaWdnZXIgcmVmbG93IGlmIGVsZW1lbnQgaXMgZGV0YWNoZWQuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRSZXNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2l6aW5nIG9jY3VycyBkdWUgdG8gdGhlIGNoYW5nZSBvZiAtLWlnLXNpemUgY3NzIHZhclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JpZFNpemUgPSB0aGlzLmdyaWRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZWZhdWx0Um93SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZSA9IHRoaXMuaXNQZXJjZW50SGVpZ2h0ICYmIHRoaXMuY2FsY0hlaWdodCAhPT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N1bW1hcnlSb3dIZWlnaHQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLnN1bW1hcnlIZWlnaHQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlck5vdGlmaWVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5waXBlVHJpZ2dlcisrKTtcbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZpbmdFbmQucGlwZShkZXN0cnVjdG9yKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKSk7XG5cbiAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5vcGVuaW5nLnBpcGUoZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5pbml0aWFsaXplKHRoaXMgYXMgYW55LCB0aGlzLm92ZXJsYXlTZXJ2aWNlLCBldmVudC5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLm9wZW5lZC5waXBlKGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5ncyA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQoZXZlbnQuaWQpPy5zZXR0aW5ncztcblxuICAgICAgICAgICAgLy8gZG8gbm90IGhpZGUgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBvdmVybGF5IG9uIHNjcm9sbFxuICAgICAgICAgICAgaWYgKHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gZXZlbnQuY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIElneEFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5sYXN0QWN0aXZlTm9kZSA9IHRoaXMubmF2aWdhdGlvbi5hY3RpdmVOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5xdWVyeUJ1aWxkZXIuc2V0QWRkQnV0dG9uRm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkbyBub3QgaGlkZSB0aGUgb3ZlcmxheSBpZiBpdCdzIGF0dGFjaGVkIHRvIGEgcm93XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dFZGl0aW5nT3ZlcmxheT8ub3ZlcmxheUlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG92ZXJsYXlTZXR0aW5ncz8ub3V0bGV0ID09PSB0aGlzLm91dGxldCAmJiB0aGlzLm92ZXJsYXlJRHMuaW5kZXhPZihldmVudC5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5SURzLnB1c2goZXZlbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCA9PT0gZXZlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmRldGFjaCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgaW5kID0gdGhpcy5vdmVybGF5SURzLmluZGV4T2YoZXZlbnQuaWQpO1xuICAgICAgICAgICAgaWYgKGluZCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlJRHMuc3BsaWNlKGluZCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5naW5nLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY2FsY1NpemUgPSB0aGlzLmlzUGVyY2VudEhlaWdodCAmJlxuICAgICAgICAgICAgICAgICghdGhpcy5jYWxjSGVpZ2h0IHx8IHRoaXMuY2FsY0hlaWdodCA9PT0gdGhpcy5nZXREYXRhQmFzZWRCb2R5SGVpZ2h0KCkgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjSGVpZ2h0ID09PSB0aGlzLnJlbmRlcmVkUm93SGVpZ2h0ICogdGhpcy5fZGVmYXVsdFRhcmdldFJlY29yZE51bWJlcik7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUmVjYWxjU2l6ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgICAgICRldmVudC5jb250YWluZXJTaXplID0gdGhpcy5jYWxjSGVpZ2h0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ldmFsdWF0ZUxvYWRpbmdTdGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLnNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSwgZGVzdHJ1Y3Rvcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGNhbGxlZCB0byByZWNhbGMgYWxsIHdpZHRocyB0aGF0IG1heSBoYXZlIGNoYW5nZXMgYXMgYSByZXN1bHQgb2ZcbiAgICAgICAgICAgIC8vIHRoZSB2ZXJ0LiBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5oZWFkZXJDb250YWluZXIudXBkYXRlU2Nyb2xsKCkpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5zY3JvbGxiYXJWaXNpYmlsaXR5Q2hhbmdlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgc2hvd2luZy9oaWRpbmdcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBzY3JvbGxiYXIgdmlzaWJpbGl0eSBhbmQgcmVjYWxjIGhlaWdodHNcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5jb250ZW50U2l6ZUNoYW5nZS5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRocm90dGxlVGltZSgzMCksIGRlc3RydWN0b3IpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG5vdGlmaWVyIGZvciBjb2x1bW4gYXV0b3NpemUgcmVxdWVzdHNcbiAgICAgICAgdGhpcy5fYXV0b1NpemVDb2x1bW5zTm90aWZ5LnBpcGUoXG4gICAgICAgICAgICB0aHJvdHRsZVRpbWUoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0pLFxuICAgICAgICAgICAgZGVzdHJ1Y3RvclxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0QXV0b1Jlc2l6ZSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLl9zZXR1cFNlcnZpY2VzKCk7XG4gICAgICAgIHRoaXMuX3NldHVwTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMucm93TGlzdERpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gICAgICAgIC8vIGNvbXBhcmUgYmFzZWQgb24gZmllbGQsIG5vdCBvbiBvYmplY3QgcmVmLlxuICAgICAgICB0aGlzLmNvbHVtbkxpc3REaWZmZXIgPSB0aGlzLmRpZmZlcnMuZmluZChbXSkuY3JlYXRlKChpbmRleCwgY29sOiBDb2x1bW5UeXBlKSA9PiBjb2wuZmllbGQpO1xuICAgICAgICB0aGlzLmNhbGNXaWR0aCA9IHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgPT09IC0xID8gcGFyc2VJbnQodGhpcy53aWR0aCwgMTApIDogMDtcbiAgICAgICAgdGhpcy5zaG91bGRHZW5lcmF0ZSA9IHRoaXMuYXV0b0dlbmVyYXRlO1xuICAgICAgICB0aGlzLmdyaWRDb21wdXRlZFN0eWxlcyA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5zQ2FjaGVzKCkge1xuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5yZXNldENhY2hlcygpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVJvd0lEKCk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5maWVsZCA9PT0gdGhpcy5wcmltYXJ5S2V5KTtcbiAgICAgICAgY29uc3QgaWRUeXBlID0gdGhpcy5kYXRhLmxlbmd0aCA/XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVEYXRhVHlwZXModGhpcy5kYXRhWzBdW3RoaXMucHJpbWFyeUtleV0pIDogcHJpbWFyeUNvbHVtbiA/IHByaW1hcnlDb2x1bW4uZGF0YVR5cGUgOiAnc3RyaW5nJztcbiAgICAgICAgcmV0dXJuIGlkVHlwZSA9PT0gJ3N0cmluZycgPyB1dWlkdjQoKSA6IEZBS0VfUk9XX0lELS07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldEZvck9mQ2FjaGUoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlydFJvdyA9IHRoaXMuZGF0YVJvd0xpc3QuZmlyc3Q7XG4gICAgICAgIGlmIChmaXJzdFZpcnRSb3cpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jZHJSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIGZpcnN0VmlydFJvdy52aXJ0RGlyUm93LmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaXJzdFZpcnRSb3cudmlydERpclJvdy5hc3N1bWVNYXN0ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RmlsdGVyZWREYXRhKGRhdGEsIHBpbm5lZDogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmIHBpbm5lZCkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkVW5waW5uZWQgPSB0aGlzLl9maWx0ZXJlZFVucGlubmVkRGF0YSB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFsuLi4gdGhpcy5fZmlsdGVyZWRQaW5uZWREYXRhLCAuLi5maWx0ZXJlZFVucGlubmVkXTtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5sZW5ndGggPiAwID8gZmlsdGVyZWREYXRhIDogdGhpcy5fZmlsdGVyZWRVbnBpbm5lZERhdGE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNQaW5uZWRSZWNvcmRzICYmICFwaW5uZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkVW5waW5uZWREYXRhID0gZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlcmVkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZS5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl91bnBpbm5lZFZpc2libGUubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVkV2lkdGhzKCkge1xuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gTmFOO1xuICAgICAgICB0aGlzLl9waW5uZWRXaWR0aCA9IE5hTjtcbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IE5hTjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCA9IHRydWUpIHtcbiAgICAgICAgaWYgKHJlY2FsY0ZlYXR1cmVXaWR0aCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCA9IE5hTjtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2Uuc3VtbWFyeUhlaWdodCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldENvbHVtbnNDYWNoZXMoKTtcbiAgICAgICAgdGhpcy5yZXNldENvbHVtbkNvbGxlY3Rpb25zKCk7XG4gICAgICAgIHRoaXMucmVzZXRGb3JPZkNhY2hlKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZWRXaWR0aHMoKTtcbiAgICAgICAgdGhpcy5oYXNWaXNpYmxlQ29sdW1ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gdGhpcy5fY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuY29sdW1uR3JvdXApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5zb3J0SGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnNvcnRIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0QXNjZW5kaW5nSGVhZGVySWNvbkRpcmVjdGl2ZVRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uVGVtcGxhdGUgPSB0aGlzLnNvcnRBc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25EaXJlY3RpdmVUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0RGVzY2VuZGluZ0hlYWRlckljb25UZW1wbGF0ZSA9IHRoaXMuc29ydERlc2NlbmRpbmdIZWFkZXJJY29uRGlyZWN0aXZlVGVtcGxhdGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwQ29sdW1ucygpO1xuICAgICAgICB0aGlzLnRvb2xiYXIuY2hhbmdlcy5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKSk7XG4gICAgICAgIHRoaXMuc2V0VXBQYWdpbmF0b3IoKTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ29tcG9uZW50cy5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRVcFBhZ2luYXRvcigpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuYWN0aW9uU3RyaXApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RyaXAubWVudU92ZXJsYXlTZXR0aW5ncy5vdXRsZXQgPSB0aGlzLm91dGxldDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRhdGFSZWJpbmRpbmcoZXZlbnQ6IElGb3JPZkRhdGFDaGFuZ2luZ0V2ZW50QXJncykge1xuICAgICAgICBpZiAoZXZlbnQuc3RhdGUuY2h1bmtTaXplID09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Nob3VsZFJlY2FsY1Jvd0hlaWdodCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhQ2hhbmdpbmcuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0YVJlYm91bmQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5fc2hvdWxkUmVjYWxjUm93SGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWNhbGNSb3dIZWlnaHQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRGVmYXVsdFJvd0hlaWdodCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGNyZWF0ZUZpbHRlckRyb3Bkb3duKGNvbHVtbjogQ29sdW1uVHlwZSwgb3B0aW9uczogT3ZlcmxheVNldHRpbmdzKSB7XG4gICAgICAgIG9wdGlvbnMub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG4gICAgICAgIGlmICh0aGlzLmV4Y2VsU3R5bGVGaWx0ZXJpbmdDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5pbml0aWFsaXplKGNvbHVtbiwgdGhpcy5vdmVybGF5U2VydmljZSk7XG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5lbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZXhjZWxTdHlsZUZpbHRlcmluZ0NvbXBvbmVudC5vdmVybGF5Q29tcG9uZW50SWQgPSBpZDtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZCA9IHRoaXMub3ZlcmxheVNlcnZpY2UuYXR0YWNoKElneEdyaWRFeGNlbFN0eWxlRmlsdGVyaW5nQ29tcG9uZW50LCB0aGlzLnZpZXdSZWYsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIHNldFVwUGFnaW5hdG9yKCkge1xuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2VDaGFuZ2UucGlwZSh0YWtlV2hpbGUoKCkgPT4gISF0aGlzLnBhZ2luYXRvciksIGZpbHRlcigoKSA9PiAhdGhpcy5faW5pdCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhcih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IucGVyUGFnZUNoYW5nZS5waXBlKHRha2VXaGlsZSgoKSA9PiAhIXRoaXMucGFnaW5hdG9yKSwgZmlsdGVyKCgpID0+ICF0aGlzLl9pbml0KSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNldEZpbHRlcmVkU29ydGVkRGF0YShkYXRhLCBwaW5uZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgIGlmICh0aGlzLnBpbm5lZFJlY29yZHNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGlmIChwaW5uZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJlZFNvcnRlZFBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgICAgIHRoaXMucGlubmVkUmVjb3JkcyA9IGRhdGE7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/IFsuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRQaW5uZWREYXRhLCAuLi4gdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGFdIDpcbiAgICAgICAgICAgICAgICAgICAgWy4uLiB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSwgLi4uIHRoaXMuX2ZpbHRlcmVkU29ydGVkUGlubmVkRGF0YV07XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWRVbnBpbm5lZERhdGEgPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyZWRTb3J0ZWREYXRhID0gZGF0YTtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFNlYXJjaCh0cnVlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWlsZERhdGFWaWV3KGRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlc2V0SG9yaXpvbnRhbFZpcnR1YWxpemF0aW9uKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50RmlsdGVyID0gKGl0ZW06IElneFJvd0RpcmVjdGl2ZSB8IElneFN1bW1hcnlSb3dDb21wb25lbnQpID0+IHRoaXMuaXNEZWZpbmVkKGl0ZW0ubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5faG9yaXpvbnRhbEZvck9mcyA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGFSb3dMaXN0LmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpLFxuICAgICAgICAgICAgLi4udGhpcy5fc3VtbWFyeVJvd0xpc3QuZmlsdGVyKGVsZW1lbnRGaWx0ZXIpLm1hcChpdGVtID0+IGl0ZW0udmlydERpclJvdylcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfc2V0dXBSb3dPYnNlcnZlcnMoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRGaWx0ZXIgPSAoaXRlbTogSWd4Um93RGlyZWN0aXZlIHwgSWd4U3VtbWFyeVJvd0NvbXBvbmVudCkgPT4gdGhpcy5pc0RlZmluZWQoaXRlbS5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBleHRyYWN0Rm9yT2ZzID0gcGlwZShtYXAoKGNvbGxlY3Rpb246IGFueVtdKSA9PiBjb2xsZWN0aW9uLmZpbHRlcihlbGVtZW50RmlsdGVyKS5tYXAoaXRlbSA9PiBpdGVtLnZpcnREaXJSb3cpKSk7XG4gICAgICAgIGNvbnN0IHJvd0xpc3RPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fZGF0YVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlSb3dPYnNlcnZlciA9IGV4dHJhY3RGb3JPZnModGhpcy5fc3VtbWFyeVJvd0xpc3QuY2hhbmdlcyk7XG4gICAgICAgIHJvd0xpc3RPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1bW1hcnlSb3dPYnNlcnZlci5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVzZXRIb3Jpem9udGFsVmlydHVhbGl6YXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBfem9uZUJlZ29uZUxpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy52ZXJ0aWNhbFNjcm9sbEhhbmRsZXIuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckNvbnRhaW5lcj8uZ2V0U2Nyb2xsKCkuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXI/LmRhdGFDaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5vblN0YWJsZS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TaXplQ29sdW1uc0luVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdpbmRvdyByZXNpemUgb2JzZXJ2ZXIgbm90IG5lZWRlZCBiZWNhdXNlIHdoZW4geW91IHJlc2l6ZSB0aGUgd2luZG93IGVsZW1lbnQgdGhlIHRib2R5IGNvbnRhaW5lciBhbHdheXMgcmVzaXplIHNvXG4gICAgICAgICAgICAvLyBpdCB3b3VsZCBhbHdheXMgbm90aWZ5IHJlc2l6aW5nLCB0aHVzIGEgY2hhbmdlIGRldGVjdGlvbiBhbmQgcmVjYWxjdWxhdGlvbiBvZiBzaXplcyB3aWxsIG9jY3VyXG4gICAgICAgICAgICByZXNpemVPYnNlcnZhYmxlKHRoaXMubmF0aXZlRWxlbWVudCkucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlc2l6ZU5vdGlmeS5uZXh0KCkpO1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLnRib2R5Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZXNpemVOb3RpZnkubmV4dCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdFBpbm5pbmcoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNkci5yZWF0dGFjaCgpO1xuICAgICAgICB0aGlzLl9zZXR1cFJvd09ic2VydmVycygpO1xuICAgICAgICB0aGlzLl96b25lQmVnb25lTGlzdGVuZXJzKCk7XG5cbiAgICAgICAgY29uc3QgdmVydFNjckRDID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICB2ZXJ0U2NyREMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5wcmV2ZW50Q29udGFpbmVyU2Nyb2xsLmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZFJvd0xpc3QuY2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXI/LmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhW3RoaXMubGFzdEFkZGVkUm93SW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhyZWMsIDApO1xuICAgICAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5jbG9zZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBLZWVwIHRoZSBzdHJlYW0gb3BlbiBmb3IgZnV0dXJlIHN1YnNjcmliZXJzXG4gICAgICAgIHRoaXMucmVuZGVyZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IudG90YWxSZWNvcmRzID0gdGhpcy50b3RhbFJlY29yZHMgPyB0aGlzLnRvdGFsUmVjb3JkcyA6IHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcztcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRvci5vdmVybGF5U2V0dGluZ3MgPSB7IG91dGxldDogdGhpcy5vdXRsZXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5yZW5kZXJlZC5uZXh0KHRydWUpKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIG5vdGlmeUNoYW5nZXMocmVwYWludCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2NkclJlcXVlc3RzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQgPSByZXBhaW50O1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbml0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY2RyUmVxdWVzdFJlcGFpbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXROb3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUdyaWRTaXplcygpO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoU2VhcmNoKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NkclJlcXVlc3RzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcmFnR2hvc3RDdXN0b21UZW1wbGF0ZSgpIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnR2hvc3RDdXN0b21UZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy50bXBPdXRsZXRzLmZvckVhY2goKHRtcGxPdXRsZXQpID0+IHtcbiAgICAgICAgICAgIHRtcGxPdXRsZXQuY2xlYW5DYWNoZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkNoYW5nZSQubmV4dCgpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMudGV4dEhpZ2hsaWdodFNlcnZpY2UuZGVzdHJveUdyb3VwKHRoaXMuaWQpO1xuXG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2godGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5SWQpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdmVybGF5SURzLmZvckVhY2gob3ZlcmxheUlEID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLmdldE92ZXJsYXlCeUlkKG92ZXJsYXlJRCk7XG5cbiAgICAgICAgICAgIGlmIChvdmVybGF5ICYmICFvdmVybGF5LmRldGFjaGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5kZXRhY2gob3ZlcmxheUlEKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uZ2V0U2Nyb2xsKCk/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudmVydGljYWxTY3JvbGxIYW5kbGVyKTtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyPy5nZXRTY3JvbGwoKT8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5ob3Jpem9udGFsU2Nyb2xsSGFuZGxlcik7XG4gICAgICAgICAgICBjb25zdCB2ZXJ0U2NyREMgPSB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyPy5kaXNwbGF5Q29udGFpbmVyO1xuICAgICAgICAgICAgdmVydFNjckRDPy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnByZXZlbnRDb250YWluZXJTY3JvbGwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHRoZSBzcGVjaWZpZWQgY29sdW1uJ3MgdmlzaWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEudG9nZ2xlQ29sdW1uVmlzaWJpbGl0eSh7XG4gICAgICogICAgICAgY29sdW1uOiB0aGlzLmdyaWQxLmNvbHVtbnNbMF0sXG4gICAgICogICAgICAgbmV3VmFsdWU6IHRydWVcbiAgICAgKiB9KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlQ29sdW1uVmlzaWJpbGl0eShhcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5nZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29sID0gYXJncy5jb2x1bW4gPyB0aGlzLl9jb2x1bW5zLmZpbmQoKGMpID0+IGMgPT09IGFyZ3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoIWNvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbC50b2dnbGVWaXNpYmlsaXR5KGFyZ3MubmV3VmFsdWUpO1xuICAgIH1cblxuICAgIC8qIGJsYXpvclN1cHByZXNzICovXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIGEgbGlzdCBvZiBrZXktdmFsdWUgcGFpcnMgW3JvdyBJRCwgZXhwYW5zaW9uIHN0YXRlXS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSW5jbHVkZXMgb25seSBzdGF0ZXMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgZGVmYXVsdCBvbmUuXG4gICAgICogU3VwcG9ydHMgdHdvLXdheSBiaW5kaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZ3JpZCAjZ3JpZCBbZGF0YV09XCJkYXRhXCIgWyhleHBhbnNpb25TdGF0ZXMpXT1cIm1vZGVsLmV4cGFuc2lvblN0YXRlc1wiPlxuICAgICAqIDwvaWd4LWdyaWQ+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGV4cGFuc2lvblN0YXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuc2lvblN0YXRlcztcbiAgICB9XG5cbiAgICAvKiBibGF6b3JTdXBwcmVzcyAqL1xuICAgIHB1YmxpYyBzZXQgZXhwYW5zaW9uU3RhdGVzKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2V4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPih2YWx1ZSk7XG4gICAgICAgIHRoaXMuZXhwYW5zaW9uU3RhdGVzQ2hhbmdlLmVtaXQodGhpcy5fZXhwYW5zaW9uU3RhdGVzKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZXhwYW5kQWxsKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGV4cGFuZEFsbCgpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEV4cGFuZFN0YXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5leHBhbnNpb25TdGF0ZXMgPSBuZXcgTWFwPGFueSwgYm9vbGVhbj4oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgYWxsIHJvd3MuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY29sbGFwc2VBbGwoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgY29sbGFwc2VBbGwoKSB7XG4gICAgICAgIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV4cGFuc2lvblN0YXRlcyA9IG5ldyBNYXA8YW55LCBib29sZWFuPigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cGFuZHMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmV4cGFuZFJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZXhwYW5kUm93KHJvd0lEOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ncmlkQVBJLnNldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJvd0lELCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsYXBzZXMgdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNvbGxhcHNlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjb2xsYXBzZVJvdyhyb3dJRDogYW55KSB7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgZmFsc2UpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlcyB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudG9nZ2xlUm93KHJvd0lEKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gcm93SUQgVGhlIHJvdyBpZCAtIHByaW1hcnlLZXkgdmFsdWUgb3IgdGhlIGRhdGEgcmVjb3JkIGluc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3cocm93SUQ6IGFueSkge1xuICAgICAgICBjb25zdCByZWMgPSB0aGlzLmdyaWRBUEkuZ2V0X3JlY19ieV9pZChyb3dJRCk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ncmlkQVBJLmdldF9yb3dfZXhwYW5zaW9uX3N0YXRlKHJlYyk7XG4gICAgICAgIHRoaXMuZ3JpZEFQSS5zZXRfcm93X2V4cGFuc2lvbl9zdGF0ZShyb3dJRCwgIXN0YXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldERlZmF1bHRFeHBhbmRTdGF0ZShfcmVjOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFeHBhbmRTdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuYXRpdmUgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IG5hdGl2ZUVsID0gdGhpcy5ncmlkLm5hdGl2ZUVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHRoZSBvdXRsZXQgdXNlZCB0byBhdHRhY2ggdGhlIGdyaWQncyBvdmVybGF5cyB0by5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBJZiBzZXQsIHJldHVybnMgdGhlIG91dGxldCBkZWZpbmVkIG91dHNpZGUgdGhlIGdyaWQuIE90aGVyd2lzZSByZXR1cm5zIHRoZSBncmlkJ3MgaW50ZXJuYWwgb3V0bGV0IGRpcmVjdGl2ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgb3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlT3V0bGV0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBvdXRsZXQodmFsOiBJZ3hPdmVybGF5T3V0bGV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgPSB2YWw7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdyBoZWlnaHQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCByb3dIZWlnaCA9IHRoaXMuZ3JpZC5kZWZhdWx0Um93SGVpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFJvd0hlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZGVmYXVsdFN1bW1hcnlIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmdyaWRTaXplKSB7XG4gICAgICAgICAgICBjYXNlIFNpemUuTWVkaXVtOlxuICAgICAgICAgICAgICAgIHJldHVybiAzMDtcbiAgICAgICAgICAgIGNhc2UgU2l6ZS5TbWFsbDpcbiAgICAgICAgICAgICAgICByZXR1cm4gMjQ7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAzNjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBJZ3hHcmlkSGVhZGVyR3JvdXBDb21wb25lbnRgJ3MgbWluaW11bSBhbGxvd2VkIHdpZHRoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHJlc3RyaWN0aW5nIGhlYWRlciBncm91cCBjb21wb25lbnQgd2lkdGguXG4gICAgICogVGhlIHZhbHVlcyBiZWxvdyBkZXBlbmQgb24gdGhlIGhlYWRlciBjZWxsIGRlZmF1bHQgcmlnaHQvbGVmdCBwYWRkaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRIZWFkZXJHcm91cE1pbldpZHRoKCk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5ncmlkU2l6ZSkge1xuICAgICAgICAgICAgY2FzZSBTaXplLk1lZGl1bTpcbiAgICAgICAgICAgICAgICByZXR1cm4gMzI7XG4gICAgICAgICAgICBjYXNlIFNpemUuU21hbGw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIDI0O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gNDg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3Bpbm5lZFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bpbm5lZFdpZHRoID0gdGhpcy5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fcGlubmVkV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCB1bnBpbm5lZFdpZHRoKCkge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3VucGlubmVkV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdW5waW5uZWRXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnBpbm5lZFdpZHRoID0gdGhpcy5nZXRVbnBpbm5lZFdpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBoZWFkZXIgY2VsbCBpbm5lciB3aWR0aCBmb3IgYXV0by1zaXppbmcuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckNlbGxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IElTaXplSW5mbyB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgICBjb25zdCBoZWFkZXJXaWR0aCA9IHRoaXMucGxhdGZvcm0uZ2V0Tm9kZVNpemVWaWFSYW5nZShyYW5nZSxcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlclN0eWxlID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBoZWFkZXJQYWRkaW5nID0gcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGhlYWRlclN0eWxlLnBhZGRpbmdSaWdodCkgK1xuICAgICAgICAgICAgcGFyc2VGbG9hdChoZWFkZXJTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcblxuICAgICAgICAvLyBUYWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGUgaGVhZGVyIGdyb3VwIGVsZW1lbnQsIHNpbmNlIGNvbHVtbiBwaW5uaW5nIGFwcGxpZXMgYm9yZGVycyB0byBpdCBpZiBpdHMgbm90IGEgY29sdW1uR3JvdXAuXG4gICAgICAgIGNvbnN0IGhlYWRlckdyb3VwU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgYm9yZGVyU2l6ZSA9IHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJSaWdodFdpZHRoKSArIHBhcnNlRmxvYXQoaGVhZGVyR3JvdXBTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpO1xuICAgICAgICByZXR1cm4geyB3aWR0aDogTWF0aC5jZWlsKGhlYWRlcldpZHRoKSwgcGFkZGluZzogTWF0aC5jZWlsKGhlYWRlclBhZGRpbmcgKyBib3JkZXJTaXplKSB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogR2V0cyB0aGUgY29tYmluZWQgd2lkdGggb2YgdGhlIGNvbHVtbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIGVuYWJsZWQgZ3JpZCBmZWF0dXJlcy4gVGhleSBhcmUgZml4ZWQuXG4gICAgICovXG4gICAgcHVibGljIGZlYXR1cmVDb2x1bW5zV2lkdGgoZXhwYW5kZXI/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4odGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aCkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHBsYXRmb3JtVXRpbC5pc0Jyb3dzZXIgY2hlY2tcbiAgICAgICAgICAgIGNvbnN0IHJvd1NlbGVjdEFyZWEgPSB0aGlzLmhlYWRlclNlbGVjdG9yQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyU2VsZWN0b3JDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCByb3dEcmFnQXJlYSA9IHRoaXMucm93RHJhZ2dhYmxlICYmIHRoaXMuaGVhZGVyRHJhZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckRyYWdDb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA6IDA7XG4gICAgICAgICAgICBjb25zdCBncm91cGFibGVBcmVhID0gdGhpcy5oZWFkZXJHcm91cENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckdyb3VwQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggOiAwO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kZXJXaWR0aCA9IGV4cGFuZGVyPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyBleHBhbmRlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDogMDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZlYXR1cmVzV2lkdGggPSByb3dTZWxlY3RBcmVhICsgcm93RHJhZ0FyZWEgKyBncm91cGFibGVBcmVhICsgZXhwYW5kZXJXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyRmVhdHVyZXNXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc3VtbWFyaWVzTWFyZ2luKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bXMgPSB0aGlzLmdyaWQuY29sdW1ucy5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucyB8fCBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcGlubmVkQ29sdW1ucygpOiBJZ3hDb2x1bW5Db21wb25lbnRbXSB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRWaXNpYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcGlubmVkVmlzaWJsZSA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRWaXNpYmxlO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRoZSBwaW5uZWQgYElneFJvd0NvbXBvbmVudGBzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlubmVkUm93ID0gdGhpcy5ncmlkLnBpbm5lZFJvd3M7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uZWRSb3dzKCk6IElneEdyaWRSb3dDb21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWRSb3dMaXN0LnRvQXJyYXkoKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbiBhcnJheSBvZiB1bnBpbm5lZCBgSWd4Q29sdW1uQ29tcG9uZW50YHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWRDb2x1bW5zKCk6IElneENvbHVtbkNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuX3VucGlubmVkVmlzaWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5waW5uZWRWaXNpYmxlID0gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmZpbHRlcigoY29sKSA9PiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl91bnBpbm5lZFZpc2libGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHdpZHRoYCB0byBiZSBzZXQgb24gYElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudGAuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckdyb3VwV2lkdGgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNDb2x1bW5MYXlvdXRzXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGAke01hdGgubWF4KHBhcnNlRmxvYXQoY29sdW1uLmNhbGNXaWR0aCksIHRoaXMuZGVmYXVsdEhlYWRlckdyb3VwTWluV2lkdGgpfXB4YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgSWd4Q29sdW1uQ29tcG9uZW50YCBieSBmaWVsZCBuYW1lLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbXlDb2wgPSB0aGlzLmdyaWQxLmdldENvbHVtbkJ5TmFtZShcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGdldENvbHVtbkJ5TmFtZShuYW1lOiBzdHJpbmcpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1ucy5maW5kKChjb2wpID0+IGNvbC5maWVsZCA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbHVtbkJ5VmlzaWJsZUluZGV4KGluZGV4OiBudW1iZXIpOiBJZ3hDb2x1bW5Db21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlQ29sdW1ucy5maW5kKChjb2wpID0+XG4gICAgICAgICAgICAhY29sLmNvbHVtbkdyb3VwICYmICFjb2wuY29sdW1uTGF5b3V0ICYmXG4gICAgICAgICAgICBjb2wudmlzaWJsZUluZGV4ID09PSBpbmRleFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY2FsY3VsYXRlcyBhbGwgd2lkdGhzIG9mIGNvbHVtbnMgdGhhdCBoYXZlIHNpemUgc2V0IHRvIGBhdXRvYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEucmVjYWxjdWxhdGVBdXRvU2l6ZXMoKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVjYWxjdWxhdGVBdXRvU2l6ZXMoKSB7XG4gICAgICAgIC8vIHJlc2V0IGF1dG8tc2l6ZSBhbmQgY2FsY3VsYXRlIGl0IGFnYWluLlxuICAgICAgICB0aGlzLl9jb2x1bW5zLmZvckVhY2goeCA9PiB4LmF1dG9TaXplID0gdW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2l6ZUNvbHVtbnNJblZpZXcoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2aXNpYmxlIGBJZ3hDb2x1bW5Db21wb25lbnRgcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy5ncmlkLnZpc2libGVDb2x1bW5zLlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUNvbHVtbnMoKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5fdmlzaWJsZUNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlzaWJsZUNvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlzaWJsZUNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+ICFjLmhpZGRlbik7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3Jkcy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogT25seSBmdW5jdGlvbnMgd2hlbiBwYWdpbmcgaXMgZW5hYmxlZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCB0b3RhbFJlY29yZHMgPSB0aGlzLmdyaWQudG90YWxSZWNvcmRzO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB0b3RhbFJlY29yZHMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcyA+PSAwID8gdGhpcy5fdG90YWxSZWNvcmRzIDogdGhpcy5wYWdpbmdTdGF0ZT8ubWV0YWRhdGEuY291bnRSZWNvcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgdG90YWxSZWNvcmRzKHRvdGFsOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKHRvdGFsID49IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcyA9IHRvdGFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdG90YWxSZWNvcmRzID0gdG90YWw7XG4gICAgICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICBpZiAoIWlzTmFOKHRoaXMuX3RvdGFsV2lkdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUYWtlIG9ubHkgdG9wIGxldmVsIGNvbHVtbnNcbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMudmlzaWJsZUNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wubGV2ZWwgPT09IDAgJiYgIWNvbC5waW5uZWQpO1xuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgZm9yIChpOyBpIDwgY29scy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG90YWxXaWR0aCArPSBwYXJzZUludChjb2xzW2ldLmNhbGNXaWR0aCwgMTApIHx8IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdG90YWxXaWR0aCA9IHRvdGFsV2lkdGg7XG4gICAgICAgIHJldHVybiB0b3RhbFdpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dSb3dTZWxlY3RvcnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUm93U2VsZWN0YWJsZSAmJiB0aGlzLmhhc1Zpc2libGVDb2x1bW5zICYmICF0aGlzLmhpZGVSb3dTZWxlY3RvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2hvd0FkZEJ1dHRvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93RWRpdGFibGUgJiYgdGhpcy5kYXRhVmlldy5sZW5ndGggPT09IDAgJiYgdGhpcy5fY29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3dEcmFnSWNvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvd0RyYWdnYWJsZSAmJiB0aGlzLl9jb2x1bW5zLmxlbmd0aCA+IHRoaXMuaGlkZGVuQ29sdW1uc0NvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dldERhdGFWaWV3SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGxldCBuZXdJbmRleCA9IGluZGV4O1xuICAgICAgICBpZiAoKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkgJiYgdGhpcy5wYWdpbmdNb2RlID09PSAxICYmIHRoaXMucGFnZSAhPT0gMCkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIHRoaXMucGVyUGFnZSAqIHRoaXMucGFnZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdyaWRBUEkuZ3JpZC52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5pc1JlbW90ZSkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIHRoaXMuZ3JpZEFQSS5ncmlkLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3SW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXREYXRhSW5kZXgoZGF0YVZpZXdJbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gZGF0YVZpZXdJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzUmVtb3RlKSB7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGRhdGFWaWV3SW5kZXggKyB0aGlzLmdyaWRBUEkuZ3JpZC52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWNlcyBhIGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0YXJnZXQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5tb3ZlQ29sdW1uKGNvbHVtbiwgdGFyZ2V0KTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZUNvbHVtbihjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCwgdGFyZ2V0OiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvczogRHJvcFBvc2l0aW9uID0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgICAgICAvLyBNLkEuIE1heSAxMXRoLCAyMDIxICM5NTA4IE1ha2UgdGhlIGV2ZW50IGNhbmNlbGFibGVcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ29sdW1uTW92aW5nRW5kRXZlbnRBcmdzID0geyBzb3VyY2U6IGNvbHVtbiwgdGFyZ2V0LCBjYW5jZWw6IGZhbHNlIH07XG5cbiAgICAgICAgdGhpcy5jb2x1bW5Nb3ZpbmdFbmQuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uID09PSB0YXJnZXQgfHwgKGNvbHVtbi5sZXZlbCAhPT0gdGFyZ2V0LmxldmVsKSB8fFxuICAgICAgICAgICAgKGNvbHVtbi50b3BMZXZlbFBhcmVudCAhPT0gdGFyZ2V0LnRvcExldmVsUGFyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5sZXZlbCkge1xuICAgICAgICAgICAgdGhpcy5fbW92ZUNoaWxkQ29sdW1ucyhjb2x1bW4ucGFyZW50LCBjb2x1bW4sIHRhcmdldCwgcG9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxldCBjb2x1bW5QaW5TdGF0ZUNoYW5nZWQ7XG4gICAgICAgIC8vIHBpbm5pbmcgYW5kIHVucGlubmluZyB3aWxsIHdvcmsgY29ycmVjdGx5IGV2ZW4gd2l0aG91dCBwYXNzaW5nIGluZGV4XG4gICAgICAgIC8vIGJ1dCBpcyBlYXNpZXIgdG8gY2FsY2x1bGF0ZSB0aGUgaW5kZXggaGVyZSwgYW5kIGxhdGVyIHVzZSBpdCBpbiB0aGUgcGlubmluZyBldmVudCBhcmdzXG4gICAgICAgIGlmICh0YXJnZXQucGlubmVkICYmICFjb2x1bW4ucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCBwaW5uZWRJbmRleCA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgPyBwaW5uZWRJbmRleCArIDEgOiBwaW5uZWRJbmRleDtcbiAgICAgICAgICAgIGNvbHVtbi5waW4oaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQucGlubmVkICYmIGNvbHVtbi5waW5uZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHVucGlubmVkSW5kZXggPSB0aGlzLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwb3MgPT09IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgPyB1bnBpbm5lZEluZGV4ICsgMSA6IHVucGlubmVkSW5kZXg7XG4gICAgICAgICAgICBjb2x1bW4udW5waW4oaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKHRhcmdldC5waW5uZWQgJiYgY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uUGluU3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zLCB0aGlzLl9waW5uZWRDb2x1bW5zKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICghdGFyZ2V0LnBpbm5lZCAmJiAhY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uUGluU3RhdGVDaGFuZ2VkKSB7XG4gICAgICAgIC8vICAgICB0aGlzLl9yZW9yZGVyQ29sdW1ucyhjb2x1bW4sIHRhcmdldCwgcG9zLCB0aGlzLl91bnBpbm5lZENvbHVtbnMpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5fbW92ZUNvbHVtbnMoY29sdW1uLCB0YXJnZXQsIHBvcyk7XG4gICAgICAgIHRoaXMuX2NvbHVtbnNSZW9yZGVyZWQoY29sdW1uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciB0aGUgYElneEdyaWRDb21wb25lbnRgLlxuICAgICAqIENhbGxpbmcgbWFya0ZvckNoZWNrIGFsc28gdHJpZ2dlcnMgdGhlIGdyaWQgcGlwZXMgZXhwbGljaXRseSwgcmVzdWx0aW5nIGluIGFsbCB1cGRhdGVzIGJlaW5nIHByb2Nlc3NlZC5cbiAgICAgKiBNYXkgZGVncmFkZSBwZXJmb3JtYW5jZSBpZiB1c2VkIHdoZW4gbm90IG5lZWRlZCwgb3IgaWYgbWlzdXNlZDpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogLy8gRE9OJ1RzOlxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIGZyb20gaW5zaWRlIGEgbG9vcFxuICAgICAqIC8vIGRvbid0IGNhbGwgbWFya0ZvckNoZWNrIHdoZW4gYSBwcmltaXRpdmUgaGFzIGNoYW5nZWRcbiAgICAgKiBncmlkLmRhdGEuZm9yRWFjaChyZWMgPT4ge1xuICAgICAqICByZWMgPSBuZXdWYWx1ZTtcbiAgICAgKiAgZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIC8vIERPc1xuICAgICAqIC8vIGNhbGwgbWFya0ZvckNoZWNrIGFmdGVyIHVwZGF0aW5nIGEgbmVzdGVkIHByb3BlcnR5XG4gICAgICogZ3JpZC5kYXRhLmZvckVhY2gocmVjID0+IHtcbiAgICAgKiAgcmVjLm5lc3RlZFByb3AxLm5lc3RlZFByb3AyID0gbmV3VmFsdWU7XG4gICAgICogfSk7XG4gICAgICogZ3JpZC5tYXJrRm9yQ2hlY2soKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQubWFya0ZvckNoZWNrKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG1hcmtGb3JDaGVjaygpIHtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyogY3NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYElneEdyaWRSb3dDb21wb25lbnRgIGFuZCBhZGRzIHRoZSBkYXRhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIHNvdXJjZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZDEuYWRkUm93KHJlY29yZCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkUm93KGRhdGE6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBjb21taXQgcGVuZGluZyBzdGF0ZXMgcHJpb3IgdG8gYWRkaW5nIGEgcm93XG4gICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdCh0cnVlKTtcbiAgICAgICAgdGhpcy5ncmlkQVBJLmFkZFJvd1RvRGF0YShkYXRhKTtcblxuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMucm93QWRkZWROb3RpZmllci5uZXh0KHsgZGF0YTogZGF0YSwgcm93RGF0YTogZGF0YSwgb3duZXI6IHRoaXMsIHByaW1hcnlLZXk6IGRhdGFbdGhpcy5wcmltYXJ5S2V5XSwgcm93S2V5OiBkYXRhW3RoaXMucHJpbWFyeUtleV0gfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckNTU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIFRoZSBtZXRob2QgYWNjZXB0IHJvd1NlbGVjdG9yIGFzIGEgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgcm93SUQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkMS5kZWxldGVSb3coMCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVJvdyhyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMucHJpbWFyeUtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucHJpbWFyeUtleSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlUm93QnlJZChyb3dTZWxlY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHB1YmxpYyBkZWxldGVSb3dCeUlkKHJvd0lkOiBhbnkpOiBhbnkge1xuICAgICAgICBjb25zdCBhcmdzOiBJUm93RGF0YUNhbmNlbGFibGVFdmVudEFyZ3MgPSB7XG4gICAgICAgICAgICByb3dJRDogcm93SWQsXG4gICAgICAgICAgICBwcmltYXJ5S2V5OiByb3dJZCxcbiAgICAgICAgICAgIHJvd0tleTogcm93SWQsXG4gICAgICAgICAgICByb3dEYXRhOiB0aGlzLmdldFJvd0RhdGEocm93SWQpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy5nZXRSb3dEYXRhKHJvd0lkKSxcbiAgICAgICAgICAgIG9sZFZhbHVlOiB0aGlzLmdldFJvd0RhdGEocm93SWQpLFxuICAgICAgICAgICAgb3duZXI6IHRoaXMsXG4gICAgICAgICAgICBpc0FkZFJvdzogZmFsc2UsXG4gICAgICAgICAgICBjYW5jZWw6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucm93RGVsZXRlLmVtaXQoYXJncyk7XG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5ncmlkQVBJLmRlbGV0ZVJvd0J5SWQocm93SWQpO1xuICAgICAgICBpZiAocmVjb3JkICE9PSBudWxsICYmIHJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCByb3dEZWxldGVkRXZlbnRBcmdzOiBJUm93RGF0YUV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZWNvcmQsXG4gICAgICAgICAgICAgICAgcm93RGF0YTogcmVjb3JkLFxuICAgICAgICAgICAgICAgIG93bmVyOiB0aGlzLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXk6IHJlY29yZFt0aGlzLnByaW1hcnlLZXldLFxuICAgICAgICAgICAgICAgIHJvd0tleTogcmVjb3JkW3RoaXMucHJpbWFyeUtleV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnJvd0RlbGV0ZWQuZW1pdChyb3dEZWxldGVkRXZlbnRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgIH1cblxuICAgIC8qIGJsYXpvckNTU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBgSWd4R3JpZFJvd0NvbXBvbmVudGAgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgcmVjb3JkIGJ5IHByaW1hcnkga2V5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXF1aXJlcyB0aGF0IHRoZSBgcHJpbWFyeUtleWAgcHJvcGVydHkgaXMgc2V0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZFdpdGhQSy51cGRhdGVDZWxsKCdVcGRhdGVkJywgMSwgJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgd2hpY2ggaXMgdG8gYmUgc2V0LlxuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kcyB0byByb3dJRC5cbiAgICAgKiBAcGFyYW0gY29sdW1uIGNvcnJlc3BvbmRzIHRvIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQ2VsbCh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55LCBjb2x1bW46IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc0RlZmluZWQodGhpcy5wcmltYXJ5S2V5KSkge1xuICAgICAgICAgICAgY29uc3QgY29sID0gdGhpcy5fY29sdW1ucy5maW5kKGMgPT4gYy5maWVsZCA9PT0gY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW1wbGlmeVxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd0RhdGEgPSB0aGlzLmdyaWRBUEkuZ2V0Um93RGF0YShyb3dTZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICAvLyBJZiByb3cgcGFzc2VkIGlzIGludmFsaWRcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SUQ6IHJvd1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW5JRDogY29sLmluZGV4LFxuICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogaW5kZXhcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hDZWxsKGlkLCBpbmRleCwgY29sLCByb3dEYXRhW2NvbC5maWVsZF0sIHZhbHVlLCByb3dEYXRhLCB0aGlzIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLnZhbGlkYXRpb24uZ2V0Rm9ybUNvbnRyb2woY2VsbC5pZC5yb3dJRCwgY2VsbC5jb2x1bW4uZmllbGQpO1xuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkudXBkYXRlX2NlbGwoY2VsbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogYmxhem9yQ1NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGBJZ3hHcmlkUm93Q29tcG9uZW50YFxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGUgcm93IGlzIHNwZWNpZmllZCBieVxuICAgICAqIHJvd1NlbGVjdG9yIHBhcmFtZXRlciBhbmQgdGhlIGRhdGEgc291cmNlIHJlY29yZCB3aXRoIHRoZSBwYXNzZWQgdmFsdWUuXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCBhcHBseSByZXF1ZXN0ZWQgdXBkYXRlIG9ubHkgaWYgcHJpbWFyeSBrZXkgaXMgc3BlY2lmaWVkIGluIHRoZSBncmlkLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGdyaWQudXBkYXRlUm93KHtcbiAgICAgKiAgICAgICBQcm9kdWN0SUQ6IDEsIFByb2R1Y3ROYW1lOiAnU3BlYXJtaW50JywgSW5TdG9jazogdHJ1ZSwgVW5pdHNJblN0b2NrOiAxLCBPcmRlckRhdGU6IG5ldyBEYXRlKCcyMDA1LTAzLTIxJylcbiAgICAgKiAgIH0sIDEpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZeKAk1xuICAgICAqIEBwYXJhbSByb3dTZWxlY3RvciBjb3JyZXNwb25kIHRvIHJvd0lEXG4gICAgICovXG4gICAgLy8gVE9ETzogcHJldmVudCBldmVudCBpbnZvY2F0aW9uXG4gICAgcHVibGljIHVwZGF0ZVJvdyh2YWx1ZTogYW55LCByb3dTZWxlY3RvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzRGVmaW5lZCh0aGlzLnByaW1hcnlLZXkpKSB7XG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZUNlbGwgPSB0aGlzLmNydWRTZXJ2aWNlLmNlbGw7XG4gICAgICAgICAgICBpZiAoZWRpdGFibGVDZWxsICYmIGVkaXRhYmxlQ2VsbC5pZC5yb3dJRCA9PT0gcm93U2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZENlbGxFZGl0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgSWd4RWRpdFJvdyhyb3dTZWxlY3RvciwgLTEsIHRoaXMuZ3JpZEFQSS5nZXRSb3dEYXRhKHJvd1NlbGVjdG9yKSwgdGhpcyBhcyBhbnkpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnVwZGF0ZV9yb3cocm93LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IGZpeCBmb3IgIzU5MzQgYW5kIHByb2JhYmx5IGJyZWFrIGZvciAjNTc2M1xuICAgICAgICAgICAgLy8gY29uc2lkZXIgYWRkaW5nIG9mIHRoaXJkIG9wdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIGluIHVwZGF0ZVJvdy5cbiAgICAgICAgICAgIC8vIElmIGRldmVsb3BlciBzZXQgdGhpcyBwYXJhbWV0ZXIgdG8gdHJ1ZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKHRydWUpLCBhbmRcbiAgICAgICAgICAgIC8vIHZpc2UtdmVyc2EgaWYgZGV2ZWxvcGVyIHNldCBpdCB0byBmYWxzZSB3ZSBzaG91bGQgY2FsbCBub3RpZnlDaGFuZ2VzKGZhbHNlKS5cbiAgICAgICAgICAgIC8vIFRoZSBwYXJhbWV0ZXIgc2hvdWxkIGRlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcm93IGNvbXBvbmVudC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgdGhlIHByaW1hcnkga2V5IGlzIG5vdCBzcGVjaWZpZWQgdGhlIHJvdyBzZWxlY3RvciBtYXRjaCB0aGUgcm93IGRhdGEuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgZGF0YSA9IGdyaWQuZ2V0Um93RGF0YSg5NDc0MSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd1NlbGVjdG9yIGNvcnJlc3BvbmQgdG8gcm93SURcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Um93RGF0YShyb3dTZWxlY3RvcjogYW55KTogYW55IHtcbiAgICAgICAgaWYgKCF0aGlzLnByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgIHJldHVybiByb3dTZWxlY3RvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmdldF9hbGxfZGF0YSh0aGlzLnRyYW5zYWN0aW9ucy5lbmFibGVkKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmdyaWRBUEkuZ2V0X3Jvd19pbmRleF9pbl9kYXRhKHJvd1NlbGVjdG9yKTtcbiAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHt9IDogZGF0YVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU29ydCBhIHNpbmdsZSBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU29ydCB0aGUgYElneEdyaWRDb21wb25lbnRgJ3MgYElneENvbHVtbkNvbXBvbmVudGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFycmF5IG9mIHNvcnRpbmcgZXhwcmVzc2lvbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNvcnQoeyBmaWVsZE5hbWU6IG5hbWUsIGRpcjogU29ydGluZ0RpcmVjdGlvbi5Bc2MsIGlnbm9yZUNhc2U6IGZhbHNlIH0pO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzb3J0KGV4cHJlc3Npb246IElTb3J0aW5nRXhwcmVzc2lvbiB8IEFycmF5PElTb3J0aW5nRXhwcmVzc2lvbj4pOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc29ydGluZ1N0YXRlID0gY2xvbmVBcnJheSh0aGlzLnNvcnRpbmdFeHByZXNzaW9ucyk7XG5cbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlYWNoIG9mIGV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkucHJlcGFyZV9zb3J0aW5nX2V4cHJlc3Npb24oW3NvcnRpbmdTdGF0ZV0sIGVhY2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvcnRpbmdPcHRpb25zLm1vZGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5mb3JFYWNoKChjb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29sLmZpZWxkID09PSBleHByZXNzaW9uLmZpZWxkTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTb3J0KGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZEFQSS5wcmVwYXJlX3NvcnRpbmdfZXhwcmVzc2lvbihbc29ydGluZ1N0YXRlXSwgZXhwcmVzc2lvbik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElTb3J0aW5nRXZlbnRBcmdzID0geyBvd25lcjogdGhpcywgc29ydGluZ0V4cHJlc3Npb25zOiBzb3J0aW5nU3RhdGUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5zb3J0aW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLnNvcnRfbXVsdGlwbGUoZXhwcmVzc2lvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRBUEkuc29ydChleHByZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5zb3J0aW5nRG9uZS5lbWl0KGV4cHJlc3Npb24pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIGEgc2luZ2xlIGBJZ3hDb2x1bW5Db21wb25lbnRgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogcHVibGljIGZpbHRlcih0ZXJtKSB7XG4gICAgICogICAgICB0aGlzLmdyaWQuZmlsdGVyKFwiUHJvZHVjdE5hbWVcIiwgdGVybSwgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpLmNvbmRpdGlvbihcImNvbnRhaW5zXCIpKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG5hbWVcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcGFyYW0gY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZVxuICAgICAqIEBwYXJhbSBpZ25vcmVDYXNlXG4gICAgICovXG4gICAgcHVibGljIGZpbHRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGNvbmRpdGlvbk9yRXhwcmVzc2lvblRyZWU/OiBJRmlsdGVyaW5nT3BlcmF0aW9uIHwgSUZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSxcbiAgICAgICAgaWdub3JlQ2FzZT86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcihuYW1lLCB2YWx1ZSwgY29uZGl0aW9uT3JFeHByZXNzaW9uVHJlZSwgaWdub3JlQ2FzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVycyBhbGwgdGhlIGBJZ3hDb2x1bW5Db21wb25lbnRgIGluIHRoZSBgSWd4R3JpZENvbXBvbmVudGAgd2l0aCB0aGUgc2FtZSBjb25kaXRpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmZpbHRlckdsb2JhbCgnc29tZScsIElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKS5jb25kaXRpb24oJ2NvbnRhaW5zJykpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqIEBwYXJhbSBjb25kaXRpb25cbiAgICAgKiBAcGFyYW0gaWdub3JlQ2FzZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJHbG9iYWwodmFsdWU6IGFueSwgY29uZGl0aW9uLCBpZ25vcmVDYXNlPykge1xuICAgICAgICB0aGlzLmZpbHRlcmluZ1NlcnZpY2UuZmlsdGVyR2xvYmFsKHZhbHVlLCBjb25kaXRpb24sIGlnbm9yZUNhc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgc3VtbWFyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgYXBwbGllcyB5b3VyIGN1c3RvbVN1bW1hcnkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIHlvdSBkbyBub3QgcHJvdmlkZSB0aGUgY3VzdG9tU3VtbWFyeSwgdGhlbiB0aGUgZGVmYXVsdCBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGRhdGEgdHlwZSB3aWxsIGJlIGFwcGxpZWQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH0sIHsgZmllbGROYW1lOiAnSUQnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKiBFbmFibGUgc3VtbWFyaWVzIGZvciB0aGUgbGlzdGVkIGNvbHVtbnMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5lbmFibGVTdW1tYXJpZXMoJ1Byb2R1Y3ROYW1lJyk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJlc3RcbiAgICAgKi9cbiAgICBwdWJsaWMgZW5hYmxlU3VtbWFyaWVzKC4uLnJlc3QpIHtcbiAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkocmVzdFswXSkpIHtcbiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlU3VtbWFyaWVzKHJlc3RbMF0sIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzKHJlc3RbMF0sIHRydWUsIHJlc3RbMV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogZ3JpZC5kaXNhYmxlU3VtbWFyaWVzKCdQcm9kdWN0TmFtZScpO1xuICAgICAqIGBgYFxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGlzYWJsZSBzdW1tYXJpZXMgZm9yIHRoZSBsaXN0ZWQgY29sdW1ucy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBncmlkLmRpc2FibGVTdW1tYXJpZXMoW3sgZmllbGROYW1lOiAnUHJvZHVjdE5hbWUnIH1dKTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzYWJsZVN1bW1hcmllcyguLi5yZXN0KSB7XG4gICAgICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KHJlc3RbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXNhYmxlTXVsdGlwbGVTdW1tYXJpZXMocmVzdFswXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMocmVzdFswXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSWYgbmFtZSBpcyBwcm92aWRlZCwgY2xlYXJzIHRoZSBmaWx0ZXJpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIE90aGVyd2lzZSBjbGVhcnMgdGhlIGZpbHRlcmluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGBzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5jbGVhckZpbHRlcigpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyRmlsdGVyKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmNsZWFyRmlsdGVyKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIG5hbWUgaXMgcHJvdmlkZWQsIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBgSWd4Q29sdW1uQ29tcG9uZW50YC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogb3RoZXJ3aXNlIGNsZWFycyB0aGUgc29ydGluZyBzdGF0ZSBvZiBhbGwgYElneENvbHVtbkNvbXBvbmVudGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU29ydCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBuYW1lXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU29ydChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgdGhpcy5zb3J0aW5nRXhwcmVzc2lvbnMgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZ3JpZEFQSS5nZXRfY29sdW1uX2J5X25hbWUobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfc29ydChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoR3JpZFN0YXRlKF9hcmdzPykge1xuICAgICAgICB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckhlYWRlckNCU3RhdGUoKTtcbiAgICAgICAgdGhpcy5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlQaXBlVHJpZ2dlcisrO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogV2UgaGF2ZSByZXR1cm4gdmFsdWVzIGhlcmUuIE1vdmUgdGhlbSB0byBldmVudCBhcmdzID8/XG5cbiAgICAvKipcbiAgICAgKiBQaW5zIGEgY29sdW1uIGJ5IGZpZWxkIG5hbWUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpbkNvbHVtbihcIklEXCIpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSBjb2x1bW5OYW1lXG4gICAgICogQHBhcmFtIGluZGV4XG4gICAgICovXG4gICAgcHVibGljIHBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wucGluKGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnBpbnMgYSBjb2x1bW4gYnkgZmllbGQgbmFtZS4gUmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5waW5Db2x1bW4oXCJJRFwiKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uTmFtZVxuICAgICAqIEBwYXJhbSBpbmRleFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbkNvbHVtbihjb2x1bW5OYW1lOiBzdHJpbmcgfCBJZ3hDb2x1bW5Db21wb25lbnQsIGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbk5hbWUgaW5zdGFuY2VvZiBJZ3hDb2x1bW5Db21wb25lbnQgPyBjb2x1bW5OYW1lIDogdGhpcy5nZXRDb2x1bW5CeU5hbWUoY29sdW1uTmFtZSk7XG4gICAgICAgIHJldHVybiBjb2wudW5waW4oaW5kZXgpO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBQaW4gdGhlIHJvdyBieSBpdHMgaWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElEIGlzIGVpdGhlciB0aGUgcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnBpblJvdyhyb3dJRCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEIFRoZSByb3cgaWQgLSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgcm93IGluIHRoZSBwaW5uZWQgY29sbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGluUm93KHJvd0lEOiBhbnksIGluZGV4PzogbnVtYmVyLCByb3c/OiBSb3dUeXBlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0gdGhpcy5ncmlkQVBJLmdldF9waW5fcm93X2V2ZW50X2FyZ3Mocm93SUQsIGluZGV4LCByb3csIHRydWUpO1xuICAgICAgICB0aGlzLnJvd1Bpbm5pbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IHR5cGVvZiBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA9PT0gJ251bWJlcicgPyBldmVudEFyZ3MuaW5zZXJ0QXRJbmRleCA6IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5sZW5ndGg7XG4gICAgICAgIHRoaXMuX3Bpbm5lZFJlY29yZElEcy5zcGxpY2UoaW5zZXJ0SW5kZXgsIDAsIHJvd0lEKTtcbiAgICAgICAgdGhpcy5waXBlVHJpZ2dlcisrO1xuICAgICAgICBpZiAodGhpcy5ncmlkQVBJLmdyaWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMucm93UGlubmVkLmVtaXQoZXZlbnRBcmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBVbnBpbiB0aGUgcm93IGJ5IGl0cyBpZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSUQgaXMgZWl0aGVyIHRoZSBwcmltYXJ5S2V5IHZhbHVlIG9yIHRoZSBkYXRhIHJlY29yZCBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQudW5waW5Sb3cocm93SUQpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCBUaGUgcm93IGlkIC0gcHJpbWFyeUtleSB2YWx1ZSBvciB0aGUgZGF0YSByZWNvcmQgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHVucGluUm93KHJvd0lEOiBhbnksIHJvdz86IFJvd1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9waW5uZWRSZWNvcmRJRHMuaW5kZXhPZihyb3dJRCk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHRoaXMuZ3JpZEFQSS5nZXRfcGluX3Jvd19ldmVudF9hcmdzKHJvd0lELCBudWxsLCByb3csIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yb3dQaW5uaW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcGlubmVkUmVjb3JkSURzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgaWYgKHRoaXMuZ3JpZEFQSS5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnJvd1Bpbm5lZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZFJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVySGVpZ2h0ID0gdGhpcy5waW5Db250YWluZXIgPyB0aGlzLnBpbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA6IDA7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1Bpbm5lZFJlY29yZHMgPyBjb250YWluZXJIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdG90YWxIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGNIZWlnaHQgPyB0aGlzLmNhbGNIZWlnaHQgKyB0aGlzLnBpbm5lZFJvd0hlaWdodCA6IHRoaXMuY2FsY0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNhbGN1bGF0ZXMgZ3JpZCB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogU2hvdWxkIGJlIHJ1biB3aGVuIGNoYW5naW5nIERPTSBlbGVtZW50cyBkaW1lbnRpb25zIG1hbnVhbGx5IHRoYXQgYWZmZWN0IHRoZSBncmlkJ3Mgc2l6ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmbG93KCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHJlZmxvdygpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkU2l6ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZE5leHQoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmluZE5leHQodGV4dDogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlPzogYm9vbGVhbiwgZXhhY3RNYXRjaD86IGJvb2xlYW4pOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRleHQsIDEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBwcmV2aW91cyBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIGluIHRoZSBncmlkIGFuZCBzY3JvbGxzIHRvIHRoZSBjZWxsIGlmIGl0IGlzbid0IHZpc2libGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFJldHVybnMgaG93IG1hbnkgdGltZXMgdGhlIGdyaWQgY29udGFpbnMgdGhlIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZmluZFByZXYoXCJmaW5hbmNpYWxcIik7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBzZWFyY2guXG4gICAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgb3B0aW9uYWxseSwgaWYgdGhlIHNlYXJjaCBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUgKGRlZmF1bHRzIHRvIGZhbHNlKS5cbiAgICAgKiBAcGFyYW0gZXhhY3RNYXRjaCBvcHRpb25hbGx5LCBpZiB0aGUgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGVudGlyZSB2YWx1ZSAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kUHJldih0ZXh0OiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmQodGV4dCwgLTEsIGNhc2VTZW5zaXRpdmUsIGV4YWN0TWF0Y2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlYXBwbGllcyB0aGUgZXhpc3Rpbmcgc2VhcmNoLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBSZXR1cm5zIGhvdyBtYW55IHRpbWVzIHRoZSBncmlkIGNvbnRhaW5zIHRoZSBsYXN0IHNlYXJjaC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQucmVmcmVzaFNlYXJjaCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB1cGRhdGVBY3RpdmVJbmZvXG4gICAgICovXG4gICAgcHVibGljIHJlZnJlc2hTZWFyY2godXBkYXRlQWN0aXZlSW5mbz86IGJvb2xlYW4sIGVuZEVkaXQgPSB0cnVlKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcblxuICAgICAgICAgICAgaWYgKHVwZGF0ZUFjdGl2ZUluZm8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmZvID0gdGhpcy50ZXh0SGlnaGxpZ2h0U2VydmljZS5oaWdobGlnaHRHcm91cHNNYXAuZ2V0KHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLmZvckVhY2goKG1hdGNoLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5jb2x1bW4gPT09IGFjdGl2ZUluZm8uY29sdW1uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5yb3cgPT09IGFjdGl2ZUluZm8ucm93ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5pbmRleCA9PT0gYWN0aXZlSW5mby5pbmRleCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU1hcHMobWF0Y2gubWV0YWRhdGEsIGFjdGl2ZUluZm8ubWV0YWRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kKHRoaXMuX2xhc3RTZWFyY2hJbmZvLnNlYXJjaFRleHQsXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlLFxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2gsXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgZW5kRWRpdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIHRoZSBoaWdobGlnaHRzIGluIHRoZSBjZWxsLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmNsZWFyU2VhcmNoKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyU2VhcmNoKCkge1xuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mbyA9IHtcbiAgICAgICAgICAgIHNlYXJjaFRleHQ6ICcnLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBleGFjdE1hdGNoOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZU1hdGNoSW5kZXg6IDAsXG4gICAgICAgICAgICBtYXRjaEluZm9DYWNoZTogW10sXG4gICAgICAgICAgICBtYXRjaENvdW50OiAwLFxuICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgcm93LmNlbGxzLmZvckVhY2goKGM6IElneEdyaWRDZWxsQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoYXNFZGl0YWJsZUNvbHVtbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLmVkaXRhYmxlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcml6ZWRDb2x1bW5zKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzdW1tYXJpemVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuaGFzU3VtbWFyeSAmJiAhY29sLmhpZGRlbik7XG4gICAgICAgIHJldHVybiBzdW1tYXJpemVkQ29sdW1ucy5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCByb290U3VtbWFyaWVzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeUNhbGN1bGF0aW9uTW9kZSAhPT0gR3JpZFN1bW1hcnlDYWxjdWxhdGlvbk1vZGUuY2hpbGRMZXZlbHNPbmx5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBoYXNWaXNpYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5zID8gdGhpcy5fY29sdW1ucy5zb21lKGMgPT4gIWMuaGlkZGVuKSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNWaXNpYmxlQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGhhc1Zpc2libGVDb2x1bW5zKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1Zpc2libGVDb2x1bW5zID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXG4gICAgcHVibGljIGdldCBoYXNNb3ZhYmxlQ29sdW1ucygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW92aW5nO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uR3JvdXBzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uR3JvdXBzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgaGFzQ29sdW1uTGF5b3V0cygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fY29sdW1ucy5zb21lKGNvbCA9PiBjb2wuY29sdW1uTGF5b3V0KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBtdWx0aVJvd0xheW91dFJvd1NpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdWx0aVJvd0xheW91dFJvd1NpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXQgcm93QmFzZWRIZWlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFMZW5ndGggKiB0aGlzLnJvd0hlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBpc1BlcmNlbnRXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2lkdGggJiYgdGhpcy53aWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc2hvdWxkUmVzaXplKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JpZFNpemUgIT09IHRoaXMuZ3JpZFNpemU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGlzUGVyY2VudEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodCAmJiB0aGlzLl9oZWlnaHQuaW5kZXhPZignJScpICE9PSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBkZWZhdWx0VGFyZ2V0Qm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHRoaXMuZGF0YUxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZWRBY3R1YWxSb3dIZWlnaHQgKiBNYXRoLm1pbih0aGlzLl9kZWZhdWx0VGFyZ2V0UmVjb3JkTnVtYmVyLFxuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPyBNYXRoLm1pbihhbGxJdGVtcywgdGhpcy5wYWdpbmF0b3IucGVyUGFnZSkgOiBhbGxJdGVtcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBUaGUgcm93SGVpZ2h0IGlucHV0IGlzIGJvdW5kIHRvIG1pbi1oZWlnaHQgY3NzIHByb3Agb2Ygcm93cyB0aGF0IGFkZHMgYSAxcHggYm9yZGVyIGluIGFsbCBjYXNlc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVuZGVyZWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm93SGVpZ2h0ICsgMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgb3V0ZXJXaWR0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSA/IHRoaXMuY2FsY1dpZHRoICsgdGhpcy5zY3JvbGxTaXplIDogdGhpcy5jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSBncmlkXG4gICAgICovXG4gICAgcHVibGljIGdldCBncmlkU2l6ZSgpOiBTaXplIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZENvbXB1dGVkU3R5bGVzPy5nZXRQcm9wZXJ0eVZhbHVlKCctLWNvbXBvbmVudC1zaXplJykgfHwgU2l6ZS5MYXJnZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqIEdldHMgdGhlIHZpc2libGUgY29udGVudCBoZWlnaHQgdGhhdCBpbmNsdWRlcyBoZWFkZXIgKyB0Ym9keSArIGZvb3Rlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmlzaWJsZUNvbnRlbnRIZWlnaHQoKSB7XG4gICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgaWYgKHRoaXMuaGFzU3VtbWFyaXplZENvbHVtbnMpIHtcbiAgICAgICAgICAgIGhlaWdodCArPSB0aGlzLnRmb290Lm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UG9zc2libGVDb2x1bW5XaWR0aChiYXNlV2lkdGg6IG51bWJlciA9IG51bGwpIHtcbiAgICAgICAgbGV0IGNvbXB1dGVkV2lkdGg7XG4gICAgICAgIGlmIChiYXNlV2lkdGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXB1dGVkV2lkdGggPSBiYXNlV2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdXRlZFdpZHRoID0gdGhpcy5jYWxjV2lkdGggfHxcbiAgICAgICAgICAgICAgICBwYXJzZUludCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aXNpYmxlQ2hpbGRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCk7XG5cblxuICAgICAgICAvLyBDb2x1bW4gbGF5b3V0cyByZWxhdGVkXG4gICAgICAgIGxldCB2aXNpYmxlQ29scyA9IFtdO1xuICAgICAgICBjb25zdCBjb2x1bW5CbG9ja3MgPSB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcihjID0+IGMuY29sdW1uR3JvdXApO1xuICAgICAgICBjb25zdCBjb2xzUGVyQmxvY2sgPSBjb2x1bW5CbG9ja3MubWFwKGJsb2NrID0+IGJsb2NrLmdldEluaXRpYWxDaGlsZENvbHVtblNpemVzKGJsb2NrLmNoaWxkcmVuKSk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQmxvY2tzU2l6ZSA9IGNvbHNQZXJCbG9jay5yZWR1Y2UoKGFjYywgaXRlbSkgPT4gYWNjICsgaXRlbS5sZW5ndGgsIDApO1xuICAgICAgICBjb2xzUGVyQmxvY2suZm9yRWFjaChibG9ja0NvbHMgPT4gdmlzaWJsZUNvbHMgPSB2aXNpYmxlQ29scy5jb25jYXQoYmxvY2tDb2xzKSk7XG4gICAgICAgIC8vXG5cbiAgICAgICAgY29uc3QgY29sdW1uc1dpdGhTZXRXaWR0aHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdmlzaWJsZUNvbHMuZmlsdGVyKGMgPT4gYy53aWR0aFNldEJ5VXNlcikgOlxuICAgICAgICAgICAgdmlzaWJsZUNoaWxkQ29sdW1ucy5maWx0ZXIoYyA9PiBjLndpZHRoU2V0QnlVc2VyICYmIGMud2lkdGggIT09ICdmaXQtY29udGVudCcpO1xuXG4gICAgICAgIGNvbnN0IGNvbHVtbnNUb1NpemUgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgY29tYmluZWRCbG9ja3NTaXplIC0gY29sdW1uc1dpdGhTZXRXaWR0aHMubGVuZ3RoIDpcbiAgICAgICAgICAgIHZpc2libGVDaGlsZENvbHVtbnMubGVuZ3RoIC0gY29sdW1uc1dpdGhTZXRXaWR0aHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBzdW1FeGlzdGluZ1dpZHRocyA9IGNvbHVtbnNXaXRoU2V0V2lkdGhzXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sV2lkdGggPSBjdXJyLndpZHRoO1xuICAgICAgICAgICAgICAgIGxldCB3aWR0aFZhbHVlID0gcGFyc2VJbnQoY29sV2lkdGgsIDEwKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNOYU4od2lkdGhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhWYWx1ZSA9IE1JTklNVU1fQ09MVU1OX1dJRFRIO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyV2lkdGggPSBjb2xXaWR0aCAmJiB0eXBlb2YgY29sV2lkdGggPT09ICdzdHJpbmcnICYmIGNvbFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTEgP1xuICAgICAgICAgICAgICAgICAgICB3aWR0aFZhbHVlIC8gMTAwICogY29tcHV0ZWRXaWR0aCA6XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXYgKyBjdXJyV2lkdGg7XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAvLyBXaGVuIGFsbCBjb2x1bW5zIGFyZSBoaWRkZW4sIHJldHVybiAwcHggd2lkdGhcbiAgICAgICAgaWYgKCFzdW1FeGlzdGluZ1dpZHRocyAmJiAhY29sdW1uc1RvU2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuICcwcHgnO1xuICAgICAgICB9XG4gICAgICAgIGNvbXB1dGVkV2lkdGggLT0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG5cbiAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSBNYXRoLmZsb29yKCFOdW1iZXIuaXNGaW5pdGUoc3VtRXhpc3RpbmdXaWR0aHMpID9cbiAgICAgICAgICAgIE1hdGgubWF4KGNvbXB1dGVkV2lkdGggLyBjb2x1bW5zVG9TaXplLCB0aGlzLm1pbkNvbHVtbldpZHRoKSA6XG4gICAgICAgICAgICBNYXRoLm1heCgoY29tcHV0ZWRXaWR0aCAtIHN1bUV4aXN0aW5nV2lkdGhzKSAvIGNvbHVtbnNUb1NpemUsIHRoaXMubWluQ29sdW1uV2lkdGgpKTtcblxuICAgICAgICByZXR1cm4gY29sdW1uV2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGhhc1ZlcnRpY2FsU2Nyb2xsKCkge1xuICAgICAgICBpZiAodGhpcy5faW5pdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsYWJsZSA9IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIgPyB0aGlzLnZlcnRpY2FsU2Nyb2xsQ29udGFpbmVyLmlzU2Nyb2xsYWJsZSgpIDogZmFsc2U7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmNhbGNXaWR0aCAmJiB0aGlzLmRhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcubGVuZ3RoID4gMCAmJiBpc1Njcm9sbGFibGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaW5uZWRXaWR0aCA9IHRoaXMuZ3JpZC5nZXRQaW5uZWRXaWR0aCgpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSB0YWtlSGlkZGVuIElmIHdlIHNob3VsZCB0YWtlIGludG8gYWNjb3VudCB0aGUgaGlkZGVuIGNvbHVtbnMgaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQaW5uZWRXaWR0aCh0YWtlSGlkZGVuID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZmMgPSB0YWtlSGlkZGVuID8gdGhpcy5fcGlubmVkQ29sdW1ucyA6IHRoaXMucGlubmVkQ29sdW1ucztcbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGZjKSB7XG4gICAgICAgICAgICBpZiAoY29sLmxldmVsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1Bpbm5pbmdUb1N0YXJ0KSB7XG4gICAgICAgICAgICBzdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzQ29sdW1uR3JvdXBlZChfZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogUkVNT1ZFXG4gICAgICovXG4gICAgcHVibGljIG9uSGVhZGVyU2VsZWN0b3JDbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aVJvd1NlbGVjdGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhclJvd1NlbGVjdGlvbihldmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0QWxsUm93cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZFNlbGVjdG9yQmFzZUFyaWFMYWJlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZS5maWx0ZXJpbmdPcGVyYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFyZUFsbFJvd1NlbGVjdGVkKCkgPyAnRGVzZWxlY3QgYWxsIGZpbHRlcmVkJyA6ICdTZWxlY3QgYWxsIGZpbHRlcmVkJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYXJlQWxsUm93U2VsZWN0ZWQoKSA/ICdEZXNlbGVjdCBhbGwnIDogJ1NlbGVjdCBhbGwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHRvdGFsUm93c0NvdW50QWZ0ZXJGaWx0ZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWxsRGF0YS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5lZERhdGFWaWV3KCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGlubmVkUmVjb3JkcyA/IHRoaXMucGlubmVkUmVjb3JkcyA6IFtdO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBnZXQgdW5waW5uZWREYXRhVmlldygpOiBhbnlbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3JkcyA/IHRoaXMudW5waW5uZWRSZWNvcmRzIDogdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcj8uaWd4Rm9yT2YgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHRyYW5zZm9ybWVkIHBhZ2VkL2ZpbHRlcmVkL3NvcnRlZC9ncm91cGVkL3Bpbm5lZC91bnBpbm5lZCByb3cgZGF0YSwgZGlzcGxheWVkIGluIHRoZSBncmlkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogICAgICBjb25zdCBkYXRhVmlldyA9IHRoaXMuZ3JpZC5kYXRhVmlldztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRhdGFWaWV3KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9TZXRzIHdoZXRoZXIgY2xpY2tpbmcgb3ZlciBhIHJvdyBzaG91bGQgc2VsZWN0L2Rlc2VsZWN0IGl0XG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIHRydWVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZDogYm9vbGVhblxuICAgICAqL1xuICAgIEBXYXRjaENoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgc2VsZWN0Um93T25DbGljaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdFJvd09uQ2xpY2s7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBzZWxlY3RSb3dPbkNsaWNrKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Um93T25DbGljayA9IGVuYWJsZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHNwZWNpZmllZCByb3dzIGJ5IElELlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLnNlbGVjdFJvd3MoWzEsMiw1XSwgdHJ1ZSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHJvd0lEc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdFJvd3Mocm93SURzOiBhbnlbXSwgY2xlYXJDdXJyZW50U2VsZWN0aW9uPzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcywgY2xlYXJDdXJyZW50U2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3Qgc3BlY2lmaWVkIHJvd3MgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RSb3dzKFsxLDIsNV0pO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRHNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RSb3dzKHJvd0lEczogYW55W10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93c1dpdGhOb0V2ZW50KHJvd0lEcyk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdHMgYWxsIHJvd3NcbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogQnkgZGVmYXVsdCBpZiBmaWx0ZXJpbmcgaXMgaW4gcGxhY2UsIHNlbGVjdEFsbFJvd3MoKSBhbmQgZGVzZWxlY3RBbGxSb3dzKCkgc2VsZWN0L2Rlc2VsZWN0IGFsbCBmaWx0ZXJlZCByb3dzLlxuICAgICAqIElmIHlvdSBzZXQgdGhlIHBhcmFtZXRlciBvbmx5RmlsdGVyRGF0YSB0byBmYWxzZSB0aGF0IHdpbGwgc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0QWxsUm93cygpO1xuICAgICAqIHRoaXMuZ3JpZC5zZWxlY3RBbGxSb3dzKGZhbHNlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gb25seUZpbHRlckRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhID8gdGhpcy5maWx0ZXJlZERhdGEgOiB0aGlzLmdyaWRBUEkuZ2V0X2FsbF9kYXRhKHRydWUpO1xuICAgICAgICBjb25zdCByb3dJRHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0Um93SURzKGRhdGEpLmZpbHRlcihySUQgPT4gIXRoaXMuZ3JpZEFQSS5yb3dfZGVsZXRlZF90cmFuc2FjdGlvbihySUQpKTtcbiAgICAgICAgdGhpcy5zZWxlY3RSb3dzKHJvd0lEcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZWxlY3RzIGFsbCByb3dzXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgaWYgZmlsdGVyaW5nIGlzIGluIHBsYWNlLCBzZWxlY3RBbGxSb3dzKCkgYW5kIGRlc2VsZWN0QWxsUm93cygpIHNlbGVjdC9kZXNlbGVjdCBhbGwgZmlsdGVyZWQgcm93cy5cbiAgICAgKiBJZiB5b3Ugc2V0IHRoZSBwYXJhbWV0ZXIgb25seUZpbHRlckRhdGEgdG8gZmFsc2UgdGhhdCB3aWxsIGRlc2VsZWN0IGFsbCByb3dzIGluIHRoZSBncmlkIGV4ZXB0IGRlbGV0ZWQgcm93cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxSb3dzKCk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIG9ubHlGaWx0ZXJEYXRhXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0QWxsUm93cyhvbmx5RmlsdGVyRGF0YSA9IHRydWUpIHtcbiAgICAgICAgaWYgKG9ubHlGaWx0ZXJEYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhICYmIHRoaXMuZmlsdGVyZWREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RSb3dzKHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRSb3dJRHModGhpcy5maWx0ZXJlZERhdGEpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkUm93cygpO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzZWxlY3RlZCBjZWxscy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuY2xlYXJDZWxsU2VsZWN0aW9uKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyQ2VsbFNlbGVjdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFyKHRydWUpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkcmFnU2Nyb2xsKGRlbHRhOiB7IGxlZnQ6IG51bWJlcjsgdG9wOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBob3Jpem9udGFsID0gdGhpcy5oZWFkZXJDb250YWluZXIuZ2V0U2Nyb2xsKCk7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsID0gdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5nZXRTY3JvbGwoKTtcbiAgICAgICAgY29uc3QgeyBsZWZ0LCB0b3AgfSA9IGRlbHRhO1xuXG4gICAgICAgIGhvcml6b250YWwuc2Nyb2xsTGVmdCArPSBsZWZ0ICogdGhpcy5EUkFHX1NDUk9MTF9ERUxUQTtcbiAgICAgICAgdmVydGljYWwuc2Nyb2xsVG9wICs9IHRvcCAqIHRoaXMuRFJBR19TQ1JPTExfREVMVEE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNEZWZpbmVkKGFyZzogYW55KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBhcmcgIT09IHVuZGVmaW5lZCAmJiBhcmcgIT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0IHJhbmdlKHMpIG9mIGNlbGxzIGJldHdlZW4gY2VydGFpbiByb3dzIGFuZCBjb2x1bW5zIG9mIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RSYW5nZShhcmc6IEdyaWRTZWxlY3Rpb25SYW5nZSB8IEdyaWRTZWxlY3Rpb25SYW5nZVtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNEZWZpbmVkKGFyZykpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDZWxsU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBhcmcuZm9yRWFjaChyYW5nZSA9PiB0aGlzLnNldFNlbGVjdGlvbihyYW5nZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oYXJnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb2x1bW5Ub1Zpc2libGVJbmRleChmaWVsZDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNvbHVtbnMgPSB0aGlzLnZpc2libGVDb2x1bW5zO1xuICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2aXNpYmxlQ29sdW1ucy5maW5kKGNvbHVtbiA9PiBjb2x1bW4uZmllbGQgPT09IGZpZWxkKS52aXNpYmxlSW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2VsZWN0aW9uKHJhbmdlOiBHcmlkU2VsZWN0aW9uUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RhcnROb2RlID0geyByb3c6IHJhbmdlLnJvd1N0YXJ0LCBjb2x1bW46IHRoaXMuY29sdW1uVG9WaXNpYmxlSW5kZXgocmFuZ2UuY29sdW1uU3RhcnQpIH07XG4gICAgICAgIGNvbnN0IGVuZE5vZGUgPSB7IHJvdzogcmFuZ2Uucm93RW5kLCBjb2x1bW46IHRoaXMuY29sdW1uVG9WaXNpYmxlSW5kZXgocmFuZ2UuY29sdW1uRW5kKSB9O1xuXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUubm9kZSA9IHN0YXJ0Tm9kZTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdFJhbmdlKGVuZE5vZGUsIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuYWRkUmFuZ2VNZXRhKGVuZE5vZGUsIHRoaXMuc2VsZWN0aW9uU2VydmljZS5wb2ludGVyU3RhdGUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2UuaW5pdFBvaW50ZXJTdGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJhbmdlcyBpbiB0aGUgZ3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWRSYW5nZXMoKTogR3JpZFNlbGVjdGlvblJhbmdlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnJhbmdlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgY2VsbCBzZWxlY3Rpb24gaW4gdGhlIGZvcm0gb2YgYFt7IGNvbHVtbi5maWVsZDogY2VsbC52YWx1ZSB9LCAuLi5dYC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGZvcm1hdHRlcnNgIGlzIGVuYWJsZWQsIHRoZSBjZWxsIHZhbHVlIHdpbGwgYmUgZm9ybWF0dGVkIGJ5IGl0cyByZXNwZWN0aXZlIGNvbHVtbiBmb3JtYXR0ZXIgKGlmIGFueSkuXG4gICAgICogSWYgYGhlYWRlcnNgIGlzIGVuYWJsZWQsIGl0IHdpbGwgdXNlIHRoZSBjb2x1bW4gaGVhZGVyIChpZiBhbnkpIGluc3RlYWQgb2YgdGhlIGNvbHVtbiBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2VsZWN0ZWREYXRhKGZvcm1hdHRlcnMgPSBmYWxzZSwgaGVhZGVycyA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuZmlsdGVyZWRTb3J0ZWREYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5leHRyYWN0RGF0YUZyb21TZWxlY3Rpb24oc291cmNlLCBmb3JtYXR0ZXJzLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBzZWxlY3RlZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHdpdGggc2VsZWN0ZWQgY29sdW1uc1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmdyaWQuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkQ29sdW1ucygpOiBDb2x1bW5UeXBlW10ge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIHJldHVybiBmaWVsZHMubWFwKGZpZWxkID0+IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGZpZWxkKSkuZmlsdGVyKGZpZWxkID0+IGZpZWxkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3Qgc3BlY2lmaWVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuc2VsZWN0Q29sdW1ucyhbJ0lEJywnTmFtZSddLCB0cnVlKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gY29sdW1uc1xuICAgICAqIEBwYXJhbSBjbGVhckN1cnJlbnRTZWxlY3Rpb24gaWYgdHJ1ZSBjbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdENvbHVtbnMoY29sdW1uczogc3RyaW5nW10gfCBDb2x1bW5UeXBlW10sIGNsZWFyQ3VycmVudFNlbGVjdGlvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgbGV0IGZpZWxkVG9TZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBjb2x1bW5zIGFzIHN0cmluZ1tdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgKGNvbHVtbnMgYXMgQ29sdW1uVHlwZVtdKS5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNvbC5hbGxDaGlsZHJlbi5maWx0ZXIoYyA9PiAhYy5jb2x1bW5Hcm91cCkubWFwKGMgPT4gYy5maWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QgPSBbLi4uZmllbGRUb1NlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9TZWxlY3QucHVzaChjb2wuZmllbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChmaWVsZFRvU2VsZWN0LCBjbGVhckN1cnJlbnRTZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlbGVjdCBzcGVjaWZpZWQgY29sdW1ucyBieSBmaWVsZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5kZXNlbGVjdENvbHVtbnMoWydJRCcsJ05hbWUnXSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbHVtbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RDb2x1bW5zKGNvbHVtbnM6IHN0cmluZ1tdIHwgQ29sdW1uVHlwZVtdKSB7XG4gICAgICAgIGxldCBmaWVsZFRvRGVzZWxlY3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY29sdW1uc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdCA9IGNvbHVtbnMgYXMgc3RyaW5nW107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAoY29sdW1ucyBhcyBDb2x1bW5UeXBlW10pLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29sLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY29sLmFsbENoaWxkcmVuLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKS5tYXAoYyA9PiBjLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRUb0Rlc2VsZWN0ID0gWy4uLmZpZWxkVG9EZXNlbGVjdCwgLi4uY2hpbGRyZW5dO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVG9EZXNlbGVjdC5wdXNoKGNvbC5maWVsZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Q29sdW1uc1dpdGhOb0V2ZW50KGZpZWxkVG9EZXNlbGVjdCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VsZWN0cyBhbGwgY29sdW1uc1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmRlc2VsZWN0QWxsQ29sdW1ucygpO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBkZXNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckFsbFNlbGVjdGVkQ29sdW1ucygpO1xuICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIGFsbCBjb2x1bW5zXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmdyaWQuZGVzZWxlY3RBbGxDb2x1bW5zKCk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEFsbENvbHVtbnMoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Q29sdW1ucyh0aGlzLl9jb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IGNvbHVtbnMgc2VsZWN0aW9uIGluIHRoZSBmb3JtIG9mIGBbeyBjb2x1bW4uZmllbGQ6IGNlbGwudmFsdWUgfSwgLi4uXWAuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIElmIGBmb3JtYXR0ZXJzYCBpcyBlbmFibGVkLCB0aGUgY2VsbCB2YWx1ZSB3aWxsIGJlIGZvcm1hdHRlZCBieSBpdHMgcmVzcGVjdGl2ZSBjb2x1bW4gZm9ybWF0dGVyIChpZiBhbnkpLlxuICAgICAqIElmIGBoZWFkZXJzYCBpcyBlbmFibGVkLCBpdCB3aWxsIHVzZSB0aGUgY29sdW1uIGhlYWRlciAoaWYgYW55KSBpbnN0ZWFkIG9mIHRoZSBjb2x1bW4gZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNlbGVjdGVkQ29sdW1uc0RhdGEoZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGEgPyB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSA6IHRoaXMuZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdERhdGFGcm9tQ29sdW1uc1NlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMpO1xuICAgIH1cblxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBjb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2UsIGZvcm1hdHRlcnMsIGhlYWRlcnMsIGNvbHVtbkRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHByZXZlbnRDb250YWluZXJTY3JvbGwgPSAoZXZ0KSA9PiB7XG4gICAgICAgIGlmIChldnQudGFyZ2V0LnNjcm9sbFRvcCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5hZGRTY3JvbGwoZXZ0LnRhcmdldC5zY3JvbGxUb3ApO1xuICAgICAgICAgICAgZXZ0LnRhcmdldC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldnQudGFyZ2V0LnNjcm9sbExlZnQgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyQ29udGFpbmVyLnNjcm9sbFBvc2l0aW9uICs9IGV2dC50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIGV2dC50YXJnZXQuc2Nyb2xsTGVmdCA9IDA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBjb3B5SGFuZGxlcihldmVudCkge1xuICAgICAgICBjb25zdCBldmVudFBhdGhFbGVtZW50cyA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpLm1hcChlbCA9PiBlbC50YWdOYW1lPy50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGV2ZW50UGF0aEVsZW1lbnRzLmluY2x1ZGVzKCdpZ3gtZ3JpZC1maWx0ZXJpbmctcm93JykgfHxcbiAgICAgICAgICAgIGV2ZW50UGF0aEVsZW1lbnRzLmluY2x1ZGVzKCdpZ3gtZ3JpZC1maWx0ZXJpbmctY2VsbCcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZENvbHVtbnMgPSB0aGlzLmdyaWRBUEkuZ3JpZC5zZWxlY3RlZENvbHVtbnMoKTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRDb2x1bW5zRGF0YSh0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgIGxldCBzZWxlY3RlZERhdGE7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnY29weScpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWREYXRhKHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5Rm9ybWF0dGVycywgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhID0gW107XG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdLZXlDJyAmJiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBldmVudC5jdXJyZW50VGFyZ2V0LmNsYXNzTmFtZSA9PT0gJ2lneC1ncmlkLXRoZWFkX193cmFwcGVyJykge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuY29tYmluZVNlbGVjdGVkQ2VsbEFuZENvbHVtbkRhdGEoY29sdW1uRGF0YSwgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRPcHRpb25zLmNvcHlIZWFkZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGFbMF0sIGRhdGFbMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGNvbHVtbkRhdGE7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChyZXN1bHQpLnRoZW4oKS5jYXRjaChlID0+IGNvbnNvbGUuZXJyb3IoZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmNsaXBib2FyZE9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLmNydWRTZXJ2aWNlLmNlbGxJbkVkaXRNb2RlIHx8IGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5jb21iaW5lU2VsZWN0ZWRDZWxsQW5kQ29sdW1uRGF0YShjb2x1bW5EYXRhLCB0aGlzLmNsaXBib2FyZE9wdGlvbnMuY29weUZvcm1hdHRlcnMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycyk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGFbMF0sIGRhdGFbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gc2VsZWN0ZWREYXRhO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlcGFyZUNvcHlEYXRhKGV2ZW50LCBkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVwYXJlQ29weURhdGEoZXZlbnQsIGRhdGEsIGtleXM/KSB7XG4gICAgICAgIGNvbnN0IGV2ID0geyBkYXRhLCBjYW5jZWw6IGZhbHNlIH0gYXMgSUdyaWRDbGlwYm9hcmRFdmVudDtcbiAgICAgICAgdGhpcy5ncmlkQ29weS5lbWl0KGV2KTtcblxuICAgICAgICBpZiAoZXYuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBDaGFyU2VwYXJhdGVkVmFsdWVEYXRhKGV2LmRhdGEsIHRoaXMuY2xpcGJvYXJkT3B0aW9ucy5zZXBhcmF0b3IpO1xuICAgICAgICBsZXQgcmVzdWx0ID0ga2V5cyA/IHRyYW5zZm9ybWVyLnByZXBhcmVEYXRhKGtleXMpIDogdHJhbnNmb3JtZXIucHJlcGFyZURhdGEoKTtcblxuICAgICAgICBpZiAoIXRoaXMuY2xpcGJvYXJkT3B0aW9ucy5jb3B5SGVhZGVycykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXhPZignXFxuJykgKyAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiBPYmplY3QudmFsdWVzKGRhdGFbMF0pLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLyogTmVjZXNzYXJ5IGZvciB0aGUgaGllYXJhY2hpY2FsIGNhc2UgYnV0IHdpbGwgcHJvYmFibHkgaGF2ZSB0b1xuICAgICAgICAgICBjaGFuZ2UgaG93IGdldFNlbGVjdGVkRGF0YSBpcyBwcm9wYWdhdGVkIGluIHRoZSBoaWVhcmFjaGljYWwgZ3JpZFxuICAgICAgICAqL1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHNob3dTbmFja2JhckZvcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuYWRkUm93U25hY2tiYXIuYWN0aW9uVGV4dCA9IGluZGV4ID09PSAtMSA/ICcnIDogdGhpcy5yZXNvdXJjZVN0cmluZ3MuaWd4X2dyaWRfc25hY2tiYXJfYWRkcm93X2FjdGlvbnRleHQ7XG4gICAgICAgIHRoaXMubGFzdEFkZGVkUm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgdGhpcy5hZGRSb3dTbmFja2Jhci5vcGVuKCk7XG4gICAgfVxuXG4gICAgLyogYmxhem9yQ3NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlcyB0byBhIHBvc2l0aW9uIGluIHRoZSBncmlkIGJhc2VkIG9uIHByb3ZpZGVkIGByb3dpbmRleGAgYW5kIGB2aXNpYmxlQ29sdW1uSW5kZXhgLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBBbHNvIGNhbiBleGVjdXRlIGEgY3VzdG9tIGxvZ2ljIG92ZXIgdGhlIHRhcmdldCBlbGVtZW50LFxuICAgICAqIHRocm91Z2ggYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgeyB0YXJnZXRUeXBlOiBHcmlkS2V5ZG93blRhcmdldFR5cGUsIHRhcmdldDogT2JqZWN0IH1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgdGhpcy5ncmlkLm5hdmlnYXRlVG8oMTAsIDMsIChhcmdzKSA9PiB7IGFyZ3MudGFyZ2V0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsgfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIG5hdmlnYXRlVG8ocm93SW5kZXg6IG51bWJlciwgdmlzaWJsZUNvbEluZGV4ID0gLTEsIGNiOiAoYXJnczogYW55KSA9PiB2b2lkID0gbnVsbCkge1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChyb3dJbmRleCA8IDAgfHwgcm93SW5kZXggPiB0b3RhbEl0ZW1zIHx8ICh2aXNpYmxlQ29sSW5kZXggIT09IC0xXG4gICAgICAgICAgICAmJiB0aGlzLl9jb2x1bW5zLm1hcChjb2wgPT4gY29sLnZpc2libGVJbmRleCkuaW5kZXhPZih2aXNpYmxlQ29sSW5kZXgpID09PSAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShyb3dJbmRleCwgcm93SW5kZXggKyAxKS5maW5kKHJlYyA9PiByZWMuZXhwcmVzc2lvbiB8fCByZWMuY2hpbGRHcmlkc0RhdGEpKSB7XG4gICAgICAgICAgICB2aXNpYmxlQ29sSW5kZXggPSAtMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IHJvdyBpcyBwaW5uZWQgbm8gbmVlZCB0byBzY3JvbGwgYXMgd2VsbC5cbiAgICAgICAgY29uc3Qgc2hvdWxkU2Nyb2xsVmVydGljYWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtVmVydGljYWxTY3JvbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCk7XG4gICAgICAgIGNvbnN0IHNob3VsZFNjcm9sbEhvcml6b250YWxseSA9IHRoaXMubmF2aWdhdGlvbi5zaG91bGRQZXJmb3JtSG9yaXpvbnRhbFNjcm9sbCh2aXNpYmxlQ29sSW5kZXgsIHJvd0luZGV4KTtcbiAgICAgICAgaWYgKHNob3VsZFNjcm9sbFZlcnRpY2FsbHkpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxIb3Jpem9udGFsbHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFNjcm9sbEhvcml6b250YWxseSkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnBlcmZvcm1Ib3Jpem9udGFsU2Nyb2xsVG9DZWxsKHZpc2libGVDb2xJbmRleCwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTY3JvbGxWZXJ0aWNhbGx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvbi5wZXJmb3JtVmVydGljYWxTY3JvbGxUb0NlbGwocm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZUNhbGxiYWNrKHJvd0luZGV4LCB2aXNpYmxlQ29sSW5kZXgsIGNiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCwgY2IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogYmxhem9yQ3NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIG5leHQgY2VsbCxcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24sIHRoYXQgbWF0Y2ggc3BlY2lmaWMgY3JpdGVyaWEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFlvdSBjYW4gcGFzcyBjYWxsYmFjayBmdW5jdGlvbiBhcyBhIHRoaXJkIHBhcmFtZXRlciBvZiBgZ2V0UHJldmlvdXNDZWxsYCBtZXRob2QuXG4gICAgICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGFjY2VwdHMgSWd4Q29sdW1uQ29tcG9uZW50IGFzIGEgcGFyYW1cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgY29uc3QgbmV4dEVkaXRhYmxlQ2VsbFBvc2l0aW9uID0gdGhpcy5ncmlkLmdldE5leHRDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldE5leHRDZWxsKGN1cnJSb3dJbmRleDogbnVtYmVyLCBjdXJWaXNpYmxlQ29sSW5kZXg6IG51bWJlcixcbiAgICAgICAgY2FsbGJhY2s6IChJZ3hDb2x1bW5Db21wb25lbnQpID0+IGJvb2xlYW4gPSBudWxsKTogSUNlbGxQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDApO1xuICAgICAgICBjb25zdCBkYXRhVmlld0luZGV4ID0gdGhpcy5fZ2V0RGF0YVZpZXdJbmRleChjdXJyUm93SW5kZXgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZFBvc2l0aW9uKGRhdGFWaWV3SW5kZXgsIGN1clZpc2libGVDb2xJbmRleCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29sSW5kZXhlcyA9IGNhbGxiYWNrID8gY29sdW1ucy5maWx0ZXIoKGNvbCkgPT4gY2FsbGJhY2soY29sKSkubWFwKGVkaXRDb2wgPT4gZWRpdENvbC52aXNpYmxlSW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSA6XG4gICAgICAgICAgICBjb2x1bW5zLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgIGNvbnN0IG5leHRDZWxsSW5kZXggPSBjb2xJbmRleGVzLmZpbmQoaW5kZXggPT4gaW5kZXggPiBjdXJWaXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zbGljZShkYXRhVmlld0luZGV4LCBkYXRhVmlld0luZGV4ICsgMSlcbiAgICAgICAgICAgIC5maW5kKHJlYyA9PiAhcmVjLmV4cHJlc3Npb24gJiYgIXJlYy5zdW1tYXJpZXMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSAmJiAhcmVjLmRldGFpbHNEYXRhKSAmJiBuZXh0Q2VsbEluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogbmV4dENlbGxJbmRleCB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5nZXROZXh0RGF0YVJvd0luZGV4KGN1cnJSb3dJbmRleClcbiAgICAgICAgICAgIGlmIChjb2xJbmRleGVzLmxlbmd0aCA9PT0gMCB8fCBuZXh0SW5kZXggPT09IGN1cnJSb3dJbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBjdXJyUm93SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY3VyVmlzaWJsZUNvbEluZGV4IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJvd0luZGV4OiBuZXh0SW5kZXgsIHZpc2libGVDb2x1bW5JbmRleDogY29sSW5kZXhlc1swXSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyogYmxhem9yQ3NTdXBwcmVzcyAqL1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYElDZWxsUG9zaXRpb25gIHdoaWNoIGRlZmluZXMgdGhlIHByZXZpb3VzIGNlbGwsXG4gICAgICogYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aGF0IG1hdGNoIHNwZWNpZmljIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBZb3UgY2FuIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYXMgYSB0aGlyZCBwYXJhbWV0ZXIgb2YgYGdldFByZXZpb3VzQ2VsbGAgbWV0aG9kLlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBhY2NlcHRzIElneENvbHVtbkNvbXBvbmVudCBhcyBhIHBhcmFtXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGNvbnN0IHByZXZpb3VzRWRpdGFibGVDZWxsUG9zaXRpb24gPSB0aGlzLmdyaWQuZ2V0UHJldmlvdXNDZWxsKDAsIDMsIChjb2x1bW4pID0+IGNvbHVtbi5lZGl0YWJsZSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldFByZXZpb3VzQ2VsbChjdXJyUm93SW5kZXg6IG51bWJlciwgY3VyVmlzaWJsZUNvbEluZGV4OiBudW1iZXIsXG4gICAgICAgIGNhbGxiYWNrOiAoSWd4Q29sdW1uQ29tcG9uZW50KSA9PiBib29sZWFuID0gbnVsbCk6IElDZWxsUG9zaXRpb24ge1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXAgJiYgY29sLnZpc2libGVJbmRleCA+PSAwKTtcbiAgICAgICAgY29uc3QgZGF0YVZpZXdJbmRleCA9IHRoaXMuX2dldERhdGFWaWV3SW5kZXgoY3VyclJvd0luZGV4KTtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQb3NpdGlvbihkYXRhVmlld0luZGV4LCBjdXJWaXNpYmxlQ29sSW5kZXgpKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IGN1clZpc2libGVDb2xJbmRleCB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbEluZGV4ZXMgPSBjYWxsYmFjayA/IGNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNhbGxiYWNrKGNvbCkpLm1hcChlZGl0Q29sID0+IGVkaXRDb2wudmlzaWJsZUluZGV4KS5zb3J0KChhLCBiKSA9PiBiIC0gYSkgOlxuICAgICAgICAgICAgY29sdW1ucy5tYXAoZWRpdENvbCA9PiBlZGl0Q29sLnZpc2libGVJbmRleCkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBjb25zdCBwcmV2Q2VsbEluZGV4ID0gY29sSW5kZXhlcy5maW5kKGluZGV4ID0+IGluZGV4IDwgY3VyVmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuc2xpY2UoZGF0YVZpZXdJbmRleCwgZGF0YVZpZXdJbmRleCArIDEpXG4gICAgICAgICAgICAuZmluZChyZWMgPT4gIXJlYy5leHByZXNzaW9uICYmICFyZWMuc3VtbWFyaWVzICYmICFyZWMuY2hpbGRHcmlkc0RhdGEgJiYgIXJlYy5kZXRhaWxzRGF0YSkgJiYgcHJldkNlbGxJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyByb3dJbmRleDogY3VyclJvd0luZGV4LCB2aXNpYmxlQ29sdW1uSW5kZXg6IHByZXZDZWxsSW5kZXggfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByZXZJbmRleCA9IHRoaXMuZ2V0TmV4dERhdGFSb3dJbmRleChjdXJyUm93SW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGNvbEluZGV4ZXMubGVuZ3RoID09PSAwIHx8IHByZXZJbmRleCA9PT0gY3VyclJvd0luZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IGN1cnJSb3dJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjdXJWaXNpYmxlQ29sSW5kZXggfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcm93SW5kZXg6IHByZXZJbmRleCwgdmlzaWJsZUNvbHVtbkluZGV4OiBjb2xJbmRleGVzWzBdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGVuZFJvd0VkaXRUYWJTdG9wKGNvbW1pdCA9IHRydWUsIGV2ZW50PzogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgY2FuY2VsZWQgPSB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoY29tbWl0LCBldmVudCk7XG5cbiAgICAgICAgaWYgKGNhbmNlbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSB0aGlzLmdyaWRBUEkuZ3JpZC5uYXZpZ2F0aW9uLmFjdGl2ZU5vZGU7XG4gICAgICAgIGlmIChhY3RpdmVDZWxsICYmIGFjdGl2ZUNlbGwucm93ICE9PSAtMSkge1xuICAgICAgICAgICAgdGhpcy50Ym9keS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFja0NvbHVtbkNoYW5nZXMoaW5kZXgsIGNvbCkge1xuICAgICAgICByZXR1cm4gY29sLmZpZWxkICsgY29sLl9jYWxjV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0V4cGFuZGVkR3JvdXAoX2dyb3VwOiBJR3JvdXBCeVJlY29yZCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICogVE9ETzogTU9WRSB0byBDUlVEXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Sb3dPdmVybGF5KGlkKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkoaWQsIHRoaXMucm93TGlzdC5sZW5ndGggPD0gTUlOX1JPV19FRElUSU5HX0NPVU5UX1RIUkVTSE9MRCk7XG5cbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vcGVuKHRoaXMucm93RWRpdFNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5yb3dFZGl0aW5nV2hlZWxIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlUm93RWRpdGluZ092ZXJsYXkoKSB7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMucm93RWRpdGluZ1doZWVsSGFuZGxlcik7XG4gICAgICAgIHRoaXMucm93RWRpdFBvc2l0aW9uaW5nU3RyYXRlZ3kuaXNUb3BJbml0aWFsUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNsb3NlKCk7XG4gICAgICAgIHRoaXMucm93RWRpdGluZ092ZXJsYXkuZWxlbWVudC5wYXJlbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShzaG93KSB7XG4gICAgICAgIGNvbnN0IHJvd1N0eWxlID0gdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5lbGVtZW50LnN0eWxlO1xuICAgICAgICBpZiAoc2hvdykge1xuICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwb3NpdGlvblJvd0VkaXRpbmdPdmVybGF5KHJvdzogUm93VHlwZSkge1xuICAgICAgICBpZiAocm93ICYmICF0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmNvbGxhcHNlZCkge1xuICAgICAgICAgICAgY29uc3Qgcm93U3R5bGUgPSB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LmVsZW1lbnQucGFyZW50RWxlbWVudC5zdHlsZTtcbiAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICByb3dTdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVSb3dFZGl0aW5nT3ZlcmxheShyb3cua2V5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0VkaXRpbmdPdmVybGF5LnJlcG9zaXRpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm93U3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGNhY2hlZFZpZXdMb2FkZWQoYXJnczogSUNhY2hlZFZpZXdMb2FkZWRFdmVudEFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICBjb25zdCB0bXBsSWQgPSBhcmdzLmNvbnRleHQudGVtcGxhdGVJRC50eXBlO1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBhcmdzLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICBhcmdzLnZpZXcuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSB0bXBsSWQgPT09ICdkYXRhUm93JyA/IHRoaXMuZ3JpZEFQSS5nZXRfcm93X2J5X2luZGV4KGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtbWFyeVJvdyA9IHRtcGxJZCA9PT0gJ3N1bW1hcnlSb3cnID8gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbmQoKHNyKSA9PiBzci5kYXRhUm93SW5kZXggPT09IGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHJvdyAmJiByb3cgaW5zdGFuY2VvZiBJZ3hSb3dEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzdG9yZVZpcnRTdGF0ZShyb3cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3VtbWFyeVJvdykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXN0b3JlVmlydFN0YXRlKHN1bW1hcnlSb3cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICovXG4gICAgcHVibGljIG9wZW5BZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyhvdmVybGF5U2V0dGluZ3M/OiBPdmVybGF5U2V0dGluZ3MpIHtcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBvdmVybGF5U2V0dGluZ3MgPyBvdmVybGF5U2V0dGluZ3MgOiB0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlTZXR0aW5ncztcbiAgICAgICAgaWYgKCF0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3MudGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpLnJvb3RHcmlkID8gKHRoaXMgYXMgYW55KS5yb290R3JpZC5uYXRpdmVFbGVtZW50IDogdGhpcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5fYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5U2V0dGluZ3Mub3V0bGV0ID0gdGhpcy5vdXRsZXQ7XG5cbiAgICAgICAgICAgIHRoaXMuX2FkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheUlkID0gdGhpcy5vdmVybGF5U2VydmljZS5hdHRhY2goXG4gICAgICAgICAgICAgICAgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgdGhpcy52aWV3UmVmLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzKTtcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uuc2hvdyh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZXMgdGhlIGFkdmFuY2VkIGZpbHRlcmluZyBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXBwbHlDaGFuZ2VzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGFuZ2VzIHNob3VsZCBiZSBhcHBsaWVkXG4gICAgICovXG4gICAgcHVibGljIGNsb3NlQWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2coYXBwbHlDaGFuZ2VzOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCkge1xuICAgICAgICAgICAgY29uc3QgYWR2YW5jZWRGaWx0ZXJpbmdPdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5nZXRPdmVybGF5QnlJZCh0aGlzLl9hZHZhbmNlZEZpbHRlcmluZ092ZXJsYXlJZCk7XG4gICAgICAgICAgICBjb25zdCBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZyA9IGFkdmFuY2VkRmlsdGVyaW5nT3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UgYXMgSWd4QWR2YW5jZWRGaWx0ZXJpbmdEaWFsb2dDb21wb25lbnQ7XG5cbiAgICAgICAgICAgIGlmIChhcHBseUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEZpbHRlcmluZ0RpYWxvZy5hcHBseUNoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkdmFuY2VkRmlsdGVyaW5nRGlhbG9nLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRFbXB0eVJlY29yZE9iamVjdEZvcihpblJvdzogUm93VHlwZSkge1xuICAgICAgICBjb25zdCByb3cgPSB7IC4uLmluUm93Py5kYXRhIH07XG4gICAgICAgIE9iamVjdC5rZXlzKHJvdykuZm9yRWFjaChrZXkgPT4gcm93W2tleV0gPSB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVSb3dJRCgpO1xuICAgICAgICByb3dbdGhpcy5wcmltYXJ5S2V5XSA9IGlkO1xuICAgICAgICByZXR1cm4geyByb3dJRDogaWQsIGRhdGE6IHJvdywgcmVjb3JkUmVmOiByb3cgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNIb3Jpem9udGFsU2Nyb2xsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b3RhbFdpZHRoIC0gdGhpcy51bnBpbm5lZFdpZHRoID4gMCAmJiB0aGlzLndpZHRoICE9PSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGlzU3VtbWFyeVJvdyhyb3dEYXRhKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiByb3dEYXRhICYmIHJvd0RhdGEuc3VtbWFyaWVzICYmIChyb3dEYXRhLnN1bW1hcmllcyBpbnN0YW5jZW9mIE1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJpZ2dlclBpcGVzKCkge1xuICAgICAgICB0aGlzLnBpcGVUcmlnZ2VyKys7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJvd0VkaXRpbmdXaGVlbEhhbmRsZXIoZXZlbnQ6IFdoZWVsRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsTmV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zY3JvbGxQcmV2KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldFVucGlubmVkSW5kZXhCeUlkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVucGlubmVkUmVjb3Jkcy5maW5kSW5kZXgoeCA9PiB4W3RoaXMucHJpbWFyeUtleV0gPT09IGlkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyB0aGUgcm93IHRyYW5zYWN0aW9ucyBvbiB0aGUgY3VycmVudCByb3cgYW5kIHJldHVybnMgd2hldGhlciB0aGUgZ3JpZCBlZGl0aW5nIHdhcyBjYW5jZWxlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgYGNvbW1pdCA9PT0gdHJ1ZWAsIHBhc3NlcyB0aGVtIGZyb20gdGhlIHBlbmRpbmcgc3RhdGUgdG8gdGhlIGRhdGEgKG9yIHRyYW5zYWN0aW9uIHNlcnZpY2UpXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWd4QnV0dG9uIChjbGljayk9XCJncmlkLmVuZEVkaXQodHJ1ZSlcIj5Db21taXQgUm93PC9idXR0b24+XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIGNvbW1pdFxuICAgICAqL1xuICAgIC8vIFRPRE86IEZhY2FkZSBmb3IgY3J1ZCBzZXJ2aWNlIHJlZmFjdG9yaW5nLiBUbyBiZSByZW1vdmVkXG4gICAgLy8gVE9ETzogZG8gbm90IHJlbW92ZSB0aGlzLCBhcyBpdCBpcyB1c2VkIGluIHJvd0VkaXRUZW1wbGF0ZSwgYnV0IG1hcmsgaXMgYXMgaW50ZXJuYWwgYW5kIGhpZGRlblxuICAgIC8qIGJsYXpvckNTU3VwcHJlc3MgKi9cbiAgICBwdWJsaWMgZW5kRWRpdChjb21taXQgPSB0cnVlLCBldmVudD86IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNydWRTZXJ2aWNlLmVuZEVkaXQoY29tbWl0LCBldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW50ZXJzIGFkZCBtb2RlIGJ5IHNwYXduaW5nIHRoZSBVSSB1bmRlciB0aGUgc3BlY2lmaWVkIHJvdyBieSByb3dJRC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbnVsbCBpcyBwYXNzZWQgYXMgcm93SUQsIHRoZSByb3cgYWRkaW5nIFVJIGlzIHNwYXduZWQgYXMgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3XG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTcGF3bmluZyB0aGUgVUkgdG8gYWRkIGEgY2hpbGQgZm9yIGEgcmVjb3JkIG9ubHkgd29ya3MgaWYgeW91IHByb3ZpZGUgYSByb3dJRFxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuZ3JpZC5iZWdpbkFkZFJvd0J5SWQoJ0FMRktJJyk7XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJZCgnQUxGS0knLCB0cnVlKTtcbiAgICAgKiB0aGlzLmdyaWQuYmVnaW5BZGRSb3dCeUlkKG51bGwpO1xuICAgICAqIGBgYFxuICAgICAqIEBwYXJhbSByb3dJRCAtIFRoZSByb3dJRCB0byBzcGF3biB0aGUgYWRkIHJvdyBVSSBmb3IsIG9yIG51bGwgdG8gc3Bhd24gaXQgYXMgdGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3XG4gICAgICogQHBhcmFtIGFzQ2hpbGQgLSBXaGV0aGVyIHRoZSByZWNvcmQgc2hvdWxkIGJlIGFkZGVkIGFzIGEgY2hpbGQuIE9ubHkgYXBwbGljYWJsZSB0byBpZ3hUcmVlR3JpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYmVnaW5BZGRSb3dCeUlkKHJvd0lEOiBhbnksIGFzQ2hpbGQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBpbmRleCA9IHJvd0lEO1xuICAgICAgICBpZiAocm93SUQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGFzQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1RoZSByZWNvcmQgY2Fubm90IGJlIGFkZGVkIGFzIGEgY2hpbGQgdG8gYW4gdW5zcGVjaWZpZWQgcmVjb3JkLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGluZGV4IG9mIHRoZSByZWNvcmQgd2l0aCB0aGF0IFBLXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcmVjX2luZGV4X2J5X2lkKHJvd0lELCB0aGlzLmRhdGFWaWV3KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgd2FzIGZvdW5kLicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FkZFJvd0ZvckluZGV4KGluZGV4LCBhc0NoaWxkKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2FkZFJvd0ZvckluZGV4KGluZGV4OiBudW1iZXIsIGFzQ2hpbGQ/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICghdGhpcy5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYmVnaW5BZGRSb3dGb3JJbmRleChpbmRleCwgYXNDaGlsZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIHZhbGlkIC0gd29uJ3Qgc3VwcG9ydCBhbnl0aGluZyBvdXRzaWRlIHRoZSBkYXRhIHZpZXdcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGluZGV4IGlzIGluIHRoZSB2aWV3IHBvcnRcbiAgICAgICAgICAgIGlmICgoaW5kZXggPCB0aGlzLnZpcnR1YWxpemF0aW9uU3RhdGUuc3RhcnRJbmRleCB8fFxuICAgICAgICAgICAgICAgIGluZGV4ID49IHRoaXMudmlydHVhbGl6YXRpb25TdGF0ZS5zdGFydEluZGV4ICsgdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLmNodW5rU2l6ZSkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGluZGV4KSkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuY2h1bmtMb2FkXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG8oaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXgsIGFzQ2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgcm93IHdpdGggdGhlIHNwZWNpZmllZCBQSyBvciBpbmRleCBpcyBvdXRzaWRlIG9mIHRoZSBjdXJyZW50IGRhdGEgdmlldy4nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qIGNzU3VwcHJlc3MgKi9cbiAgICAvKipcbiAgICAgKiBFbnRlcnMgYWRkIG1vZGUgYnkgc3Bhd25pbmcgdGhlIFVJIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEFjY2VwdGVkIHZhbHVlcyBmb3IgaW5kZXggYXJlIGludGVnZXJzIGZyb20gMCB0byB0aGlzLmdyaWQuZGF0YVZpZXcubGVuZ3RoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5ncmlkLmJlZ2luQWRkUm93QnlJbmRleCgwKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggdG8gc3Bhd24gdGhlIFVJIGF0LiBBY2NlcHRzIGludGVnZXJzIGZyb20gMCB0byB0aGlzLmdyaWQuZGF0YVZpZXcubGVuZ3RoXG4gICAgICovXG4gICAgcHVibGljIGJlZ2luQWRkUm93QnlJbmRleChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmVnaW5BZGRSb3dCeUlkKG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRSb3dGb3JJbmRleChpbmRleCAtIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmVudEhlYWRlclNjcm9sbChhcmdzKSB7XG4gICAgICAgIGlmIChhcmdzLnRhcmdldC5zY3JvbGxMZWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICAodGhpcy5uYXZpZ2F0aW9uIGFzIGFueSkuZm9yT2ZEaXIoKS5nZXRTY3JvbGwoKS5zY3JvbGxMZWZ0ID0gYXJncy50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgIGFyZ3MudGFyZ2V0LnNjcm9sbExlZnQgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJlZ2luQWRkUm93Rm9ySW5kZXgoaW5kZXg6IG51bWJlciwgYXNDaGlsZCA9IGZhbHNlKSB7XG4gICAgICAgIC8vIFRPRE8gaXMgcm93IGZyb20gcm93TGlzdCBzdWl0YWJsZSBmb3IgZW50ZXJBZGRSb3dNb2RlXG4gICAgICAgIGNvbnN0IHJvdyA9IGluZGV4ID09IG51bGwgP1xuICAgICAgICAgICAgbnVsbCA6IHRoaXMucm93TGlzdC5maW5kKHIgPT4gci5pbmRleCA9PT0gaW5kZXgpO1xuICAgICAgICBpZiAocm93ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW50ZXJBZGRSb3dNb2RlKHJvdywgYXNDaGlsZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIHJvdyB3aXRoIHRoZSBzcGVjaWZpZWQgUEsgb3IgaW5kZXggd2FzIGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN3aXRjaFRyYW5zYWN0aW9uU2VydmljZSh2YWw6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgICAgdGhpcy5fdHJhbnNhY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbkZhY3RvcnkuY3JlYXRlKFRSQU5TQUNUSU9OX1RZUEUuQmFzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uRmFjdG9yeS5jcmVhdGUoVFJBTlNBQ1RJT05fVFlQRS5Ob25lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRhdGFDbG9uZVN0cmF0ZWd5KSB7XG4gICAgICAgICAgICB0aGlzLl90cmFuc2FjdGlvbnMuY2xvbmVTdHJhdGVneSA9IHRoaXMuZGF0YUNsb25lU3RyYXRlZ3k7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3Vic2NyaWJlVG9UcmFuc2FjdGlvbnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25DaGFuZ2UkLm5leHQoKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMub25TdGF0ZVVwZGF0ZS5waXBlKHRha2VVbnRpbChtZXJnZSh0aGlzLmRlc3Ryb3kkLCB0aGlzLnRyYW5zYWN0aW9uQ2hhbmdlJCkpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB0cmFuc2FjdGlvblN0YXR1c1VwZGF0ZShldmVudDogU3RhdGVVcGRhdGVFdmVudCkge1xuICAgICAgICBsZXQgYWN0aW9uczogQWN0aW9uPFRyYW5zYWN0aW9uPltdID0gW107XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4uUkVETykge1xuICAgICAgICAgICAgYWN0aW9ucyA9IGV2ZW50LmFjdGlvbnMgPyBldmVudC5hY3Rpb25zLmZpbHRlcih4ID0+IHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkRFTEVURSkgOiBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5vcmlnaW4gPT09IFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4uVU5ETykge1xuICAgICAgICAgICAgYWN0aW9ucyA9IGV2ZW50LmFjdGlvbnMgPyBldmVudC5hY3Rpb25zLmZpbHRlcih4ID0+IHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERCkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5pc1Jvd1NlbGVjdGVkKGFjdGlvbi50cmFuc2FjdGlvbi5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmRlc2VsZWN0Um93KGFjdGlvbi50cmFuc2FjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4uUkVETyB8fCBldmVudC5vcmlnaW4gPT09IFRyYW5zYWN0aW9uRXZlbnRPcmlnaW4uVU5ETykge1xuICAgICAgICAgICAgZXZlbnQuYWN0aW9ucy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4LnRyYW5zYWN0aW9uLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5VUERBVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYW5zYWN0aW9ucy5nZXRBZ2dyZWdhdGVkVmFsdWUoeC50cmFuc2FjdGlvbi5pZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi51cGRhdGUoeC50cmFuc2FjdGlvbi5pZCwgdmFsdWUgPz8geC5yZWNvcmRSZWYpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeC50cmFuc2FjdGlvbi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuREVMRVRFIHx8IHgudHJhbnNhY3Rpb24udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFERCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldEFnZ3JlZ2F0ZWRWYWx1ZSh4LnRyYW5zYWN0aW9uLmlkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24uY3JlYXRlKHgudHJhbnNhY3Rpb24uaWQsIHZhbHVlID8/IHgucmVjb3JkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbi51cGRhdGUoeC50cmFuc2FjdGlvbi5pZCwgdmFsdWUgPz8geC5yZWNvcmRSZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uLm1hcmtBc1RvdWNoZWQoeC50cmFuc2FjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb24uY2xlYXIoeC50cmFuc2FjdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmNsZWFySGVhZGVyQ0JTdGF0ZSgpO1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIHRoaXMucGlwZVRyaWdnZXIrKztcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHdyaXRlVG9EYXRhKHJvd0luZGV4OiBudW1iZXIsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgbWVyZ2VPYmplY3RzKHRoaXMuZ3JpZEFQSS5nZXRfYWxsX2RhdGEoKVtyb3dJbmRleF0sIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Jlc3RvcmVWaXJ0U3RhdGUocm93KSB7XG4gICAgICAgIC8vIGNoZWNrIHZpcnR1YWxpemF0aW9uIHN0YXRlIG9mIGRhdGEgcmVjb3JkIGFkZGVkIGZyb20gY2FjaGVcbiAgICAgICAgLy8gaW4gY2FzZSBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQgLSB1cGRhdGUgaXQuXG4gICAgICAgIGNvbnN0IHJvd0Zvck9mID0gcm93LnZpcnREaXJSb3c7XG4gICAgICAgIGNvbnN0IGdyaWRTY3JMZWZ0ID0gcm93Rm9yT2YuZ2V0U2Nyb2xsKCkuc2Nyb2xsTGVmdDtcbiAgICAgICAgcm93Rm9yT2Yub25IU2Nyb2xsKGdyaWRTY3JMZWZ0KTtcbiAgICAgICAgcm93Rm9yT2YuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY2hhbmdlUm93RWRpdGluZ092ZXJsYXlTdGF0ZU9uU2Nyb2xsKHJvdzogUm93VHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMucm93RWRpdGFibGUgfHwgIXRoaXMucm93RWRpdGluZ092ZXJsYXkgfHwgdGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5jb2xsYXBzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJvdykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nT3ZlcmxheShmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheShyb3cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGRhdGEgYW5kL29yIGlzTG9hZGluZyBpbnB1dCBjaGFuZ2VzIHNvIHRoYXQgdGhlIG92ZXJsYXkgY2FuIGJlXG4gICAgICogaGlkZGVuL3Nob3duIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHNob3VsZE92ZXJsYXlMb2FkaW5nXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGV2YWx1YXRlTG9hZGluZ1N0YXRlKCkge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRPdmVybGF5TG9hZGluZykge1xuICAgICAgICAgICAgLy8gYSBuZXcgb3ZlcmxheSBzaG91bGQgYmUgc2hvd25cbiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlTZXR0aW5nczogT3ZlcmxheVNldHRpbmdzID0ge1xuICAgICAgICAgICAgICAgIG91dGxldDogdGhpcy5sb2FkaW5nT3V0bGV0LFxuICAgICAgICAgICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IG5ldyBDb250YWluZXJQb3NpdGlvblN0cmF0ZWd5KClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdPdmVybGF5Lm9wZW4ob3ZlcmxheVNldHRpbmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ092ZXJsYXkuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZXRzIGdyaWQgd2lkdGggaS5lLiB0aGlzLmNhbGNXaWR0aFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkV2lkdGgoKSB7XG4gICAgICAgIGxldCB3aWR0aDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgLyogd2lkdGggaW4gJSovXG4gICAgICAgICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3dpZHRoJyk7XG4gICAgICAgICAgICB3aWR0aCA9IGNvbXB1dGVkLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBwYXJzZUZsb2F0KGNvbXB1dGVkKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghd2lkdGggJiYgdGhpcy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKHRoaXMud2lkdGggPT09IG51bGwgfHwgIXdpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuZ2V0Q29sdW1uV2lkdGhTdW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkgJiYgdGhpcy53aWR0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5zY3JvbGxTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoTnVtYmVyLmlzRmluaXRlKHdpZHRoKSB8fCB3aWR0aCA9PT0gbnVsbCkgJiYgd2lkdGggIT09IHRoaXMuY2FsY1dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGNXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Rlcml2ZVBvc3NpYmxlV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBjb2x1bW5zIGRlZmF1bHRXaWR0aCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGVyaXZlUG9zc2libGVXaWR0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5XaWR0aCA9IHRoaXMud2lkdGggIT09IG51bGwgPyB0aGlzLmdldFBvc3NpYmxlQ29sdW1uV2lkdGgoKSA6IHRoaXMubWluQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMgJiYgcGFyc2VJbnQodGhpcy5fY29sdW1uV2lkdGgsIDEwKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbldpZHRoQ29tYmluZWQgPSBwYXJzZUludCh0aGlzLl9jb2x1bW5XaWR0aCwgMTApICogKGNvbHVtbi5jb2xFbmQgPyBjb2x1bW4uY29sRW5kIC0gY29sdW1uLmNvbFN0YXJ0IDogMSk7XG4gICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IGNvbHVtbldpZHRoQ29tYmluZWQgKyAncHgnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBELksuIE1hcmNoIDI5dGgsIDIwMjEgIzkxNDUgQ29uc2lkZXIgbWluL21heCB3aWR0aCB3aGVuIHNldHRpbmcgZGVmYXVsdFdpZHRoIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgY29sdW1uLmRlZmF1bHRXaWR0aCA9IHRoaXMuZ2V0RXh0cmVtdW1CYXNlZENvbFdpZHRoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgY29sdW1uLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVkV2lkdGhzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRFeHRyZW11bUJhc2VkQ29sV2lkdGgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgd2lkdGggPSB0aGlzLl9jb2x1bW5XaWR0aDtcbiAgICAgICAgaWYgKHdpZHRoICYmIHR5cGVvZiB3aWR0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IHdpZHRoLmluZGV4T2YoJyUnKSA9PT0gLTEgPyBjb2x1bW4ubWluV2lkdGhQeCA6IGNvbHVtbi5taW5XaWR0aFBlcmNlbnQ7XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gd2lkdGguaW5kZXhPZignJScpID09PSAtMSA/IGNvbHVtbi5tYXhXaWR0aFB4IDogY29sdW1uLm1heFdpZHRoUGVyY2VudDtcbiAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB3aWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaW5XaWR0aCA+IHBhcnNlRmxvYXQod2lkdGgpKSB7XG4gICAgICAgICAgICB3aWR0aCA9IFN0cmluZyhjb2x1bW4ubWluV2lkdGgpO1xuICAgICAgICB9IGVsc2UgaWYgKG1heFdpZHRoIDwgcGFyc2VGbG9hdCh3aWR0aCkpIHtcbiAgICAgICAgICAgIHdpZHRoID0gU3RyaW5nKGNvbHVtbi5tYXhXaWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBubyBweCBvciAlIGFyZSBkZWZpbmVkIGluIG1heFdpZHRoL21pbldpZHRoIGNvbnNpZGVyIGl0IHB4XG4gICAgICAgIGlmICh3aWR0aC5pbmRleE9mKCclJykgPT09IC0xICYmIHdpZHRoLmluZGV4T2YoJ3B4JykgPT09IC0xKSB7XG4gICAgICAgICAgICB3aWR0aCArPSAncHgnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVzZXROb3RpZnlDaGFuZ2VzKCkge1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0UmVwYWludCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9jZHJSZXF1ZXN0cyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyByZXNvbHZlT3V0bGV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlck91dGxldERpcmVjdGl2ZSA/IHRoaXMuX3VzZXJPdXRsZXREaXJlY3RpdmUgOiB0aGlzLl9vdXRsZXREaXJlY3RpdmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBjb2x1bW5zIGluIHRoZSBtYWluIGNvbHVtbkxpc3QgYW5kIF9jb2x1bW5zIGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbW92ZUNvbHVtbnMoZnJvbTogSWd4Q29sdW1uQ29tcG9uZW50LCB0bzogSWd4Q29sdW1uQ29tcG9uZW50LCBwb3M6IERyb3BQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBvcmRlcmVkTGlzdCA9IHRoaXMuX3Bpbm5lZENvbHVtbnMuY29uY2F0KHRoaXMuX3VucGlubmVkQ29sdW1ucyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBvcmRlcmVkTGlzdDtcbiAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoZnJvbSwgdG8sIHBvcywgbGlzdCk7XG4gICAgICAgIGNvbnN0IG5ld0xpc3QgPSB0aGlzLl9yZXNldENvbHVtbkxpc3QobGlzdCk7XG4gICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyhuZXdMaXN0KTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBpbnRlcm5hbCBjb2x1bW4ncyBjb2xsZWN0aW9uLlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQ29sdW1ucyhuZXdDb2x1bW5zOiBJZ3hDb2x1bW5Db21wb25lbnRbXSkge1xuICAgICAgICAvLyB1cGRhdGUgaW50ZXJuYWwgY29sbGVjdGlvbnMgdG8gcmV0YWluIG9yZGVyLlxuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gbmV3Q29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5waW5uZWQpO1xuICAgICAgICB0aGlzLl91bnBpbm5lZENvbHVtbnMgPSBuZXdDb2x1bW5zLmZpbHRlcigoYykgPT4gIWMucGlubmVkKTtcbiAgICAgICAgdGhpcy5fY29sdW1ucyA9IG5ld0NvbHVtbnM7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yZXNldENvbHVtbkxpc3QobGlzdD8pIHtcbiAgICAgICAgaWYgKCFsaXN0KSB7XG4gICAgICAgICAgICBsaXN0ID0gdGhpcy5fY29sdW1ucztcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3TGlzdCA9IFtdO1xuICAgICAgICBsaXN0LmZpbHRlcihjID0+IGMubGV2ZWwgPT09IDApLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICBuZXdMaXN0LnB1c2gocCk7XG4gICAgICAgICAgICBpZiAocC5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgIG5ld0xpc3QgPSBuZXdMaXN0LmNvbmNhdChwLmFsbENoaWxkcmVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXdMaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXJzIGNvbHVtbnMgaW5zaWRlIHRoZSBwYXNzZWQgY29sdW1uIGNvbGxlY3Rpb24uXG4gICAgICogV2hlbiByZW9yZGVyaW5nIGNvbHVtbiBncm91cCBjb2xsZWN0aW9uLCB0aGUgY29sbGVjdGlvbiBpcyBub3QgZmxhdHRlbmVkLlxuICAgICAqIEluIGFsbCBvdGhlciBjYXNlcywgdGhlIGNvbHVtbnMgY29sbGVjdGlvbiBpcyBmbGF0dGVuZWQsIHRoaXMgaXMgd2h5IGFkaXR0aW9uYWwgY2FsY3VsYXRpb25zIG9uIHRoZSBkcm9wSW5kZXggYXJlIGRvbmUuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9yZW9yZGVyQ29sdW1ucyhmcm9tOiBJZ3hDb2x1bW5Db21wb25lbnQsIHRvOiBJZ3hDb2x1bW5Db21wb25lbnQsIHBvc2l0aW9uOiBEcm9wUG9zaXRpb24sIGNvbHVtbkNvbGxlY3Rpb246IGFueVtdLFxuICAgICAgICBpbkdyb3VwID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gY29sdW1uQ29sbGVjdGlvbi5pbmRleE9mKGZyb20pO1xuICAgICAgICBjb25zdCBjaGlsZENvbHVtbnNDb3VudCA9IGluR3JvdXAgPyAxIDogZnJvbS5hbGxDaGlsZHJlbi5sZW5ndGggKyAxO1xuICAgICAgICBjb2x1bW5Db2xsZWN0aW9uLnNwbGljZShmcm9tSW5kZXgsIGNoaWxkQ29sdW1uc0NvdW50KTtcbiAgICAgICAgbGV0IGRyb3BJbmRleCA9IGNvbHVtbkNvbGxlY3Rpb24uaW5kZXhPZih0byk7XG4gICAgICAgIGlmIChwb3NpdGlvbiA9PT0gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCkge1xuICAgICAgICAgICAgZHJvcEluZGV4Kys7XG4gICAgICAgICAgICBpZiAoIWluR3JvdXAgJiYgdG8uY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBkcm9wSW5kZXggKz0gdG8uYWxsQ2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbHVtbkNvbGxlY3Rpb24uc3BsaWNlKGRyb3BJbmRleCwgMCwgZnJvbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVvcmRlciBjb2x1bW4gZ3JvdXAgY29sbGVjdGlvbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX21vdmVDaGlsZENvbHVtbnMocGFyZW50OiBJZ3hDb2x1bW5Db21wb25lbnQsIGZyb206IElneENvbHVtbkNvbXBvbmVudCwgdG86IElneENvbHVtbkNvbXBvbmVudCwgcG9zOiBEcm9wUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcGFyZW50LmNoaWxkcmVuLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5fcmVvcmRlckNvbHVtbnMoZnJvbSwgdG8sIHBvcywgYnVmZmVyLCB0cnVlKTtcbiAgICAgICAgcGFyZW50LmNoaWxkcmVuLnJlc2V0KGJ1ZmZlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2V0dXBDb2x1bW5zKCkge1xuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b2dlbmVyYXRlQ29sdW1ucygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1uTGlzdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLl9jb2x1bW5zLCAoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHRoaXMuY29sdW1uSW5pdC5lbWl0KGNvbCkpO1xuICAgICAgICB0aGlzLmNvbHVtbkxpc3REaWZmZXIuZGlmZih0aGlzLmNvbHVtbkxpc3QpO1xuXG4gICAgICAgIHRoaXMuY29sdW1uTGlzdC5jaGFuZ2VzXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChjaGFuZ2U6IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbHVtbnNDaGFuZ2VkKGNoYW5nZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uTGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1uTGlzdC50b0FycmF5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkZWxldGVSb3dGcm9tRGF0YShyb3dJRDogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIC8vICBpZiB0aGVyZSBpcyBhIHJvdyAoaW5kZXggIT09IDApIGRlbGV0ZSBpdFxuICAgICAgICAvLyAgaWYgdGhlcmUgaXMgYSByb3cgaW4gQUREIG9yIFVQREFURSBzdGF0ZSBjaGFuZ2UgaXQncyBzdGF0ZSB0byBERUxFVEVcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25zLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24gPSB7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucy5hZGQodHJhbnNhY3Rpb24sIHRoaXMuZGF0YVtpbmRleF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBTdGF0ZSA9IHRoaXMudHJhbnNhY3Rpb25zLmdldFN0YXRlKHJvd0lEKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zLmFkZCh7IGlkOiByb3dJRCwgdHlwZTogVHJhbnNhY3Rpb25UeXBlLkRFTEVURSwgbmV3VmFsdWU6IG51bGwgfSwgc3RhdGUgJiYgc3RhdGUucmVjb3JkUmVmKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gIXRoaXMuZGF0YSB8fCAodGhpcy5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZmF1bHRUYXJnZXRSZWNvcmROdW1iZXIpID9cbiAgICAgICAgICAgIDAgOiB0aGlzLmRlZmF1bHRUYXJnZXRCb2R5SGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUGlubmVkUm93c0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4R3JpZFJvd0NvbXBvbmVudD4pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMucm93TGlzdERpZmZlci5kaWZmKGNoYW5nZSk7XG4gICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNoYW5nZXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ29sdW1uc0NoYW5nZWQoY2hhbmdlOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50Pikge1xuICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5jb2x1bW5MaXN0RGlmZmVyLmRpZmYoY2hhbmdlKTtcblxuICAgICAgICBpZiAodGhpcy5hdXRvR2VuZXJhdGUgJiYgdGhpcy5fY29sdW1ucy5sZW5ndGggPT09IDAgJiYgdGhpcy5fYXV0b0dlbmVyYXRlZENvbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSW4gSXZ5IGlmIHRoZXJlIGFyZSBuZXN0ZWQgY29uZGl0aW9uYWwgdGVtcGxhdGVzIHRoZSBjb250ZW50IGNoaWxkcmVuIGFyZSByZS1ldmFsdWF0ZWRcbiAgICAgICAgICAgIC8vIGhlbmNlIGF1dG9nZW5lcmF0ZWQgY29sdW1ucyBhcmUgY2xlYXJlZCBhbmQgbmVlZCB0byBiZSByZXNldC5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sdW1ucyh0aGlzLl9hdXRvR2VuZXJhdGVkQ29scyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IHJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBwaW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBkaWZmLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZDogSXRlcmFibGVDaGFuZ2VSZWNvcmQ8SWd4Q29sdW1uQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLml0ZW0ucGlubmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bpbm5lZENvbHVtbnMucHVzaChyZWNvcmQuaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHBpbm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucy5wdXNoKHJlY29yZC5pdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pbml0Q29sdW1ucyh0aGlzLmNvbHVtbkxpc3QudG9BcnJheSgpLCAoY29sOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHRoaXMuY29sdW1uSW5pdC5lbWl0KGNvbCkpO1xuICAgICAgICAgICAgaWYgKHBpbm5pbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQaW5uaW5nKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQ6IEl0ZXJhYmxlQ2hhbmdlUmVjb3JkPElneENvbHVtbkNvbXBvbmVudCB8IElneENvbHVtbkdyb3VwQ29tcG9uZW50PikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ29sdW1uR3JvdXAgPSByZWNvcmQuaXRlbSBpbnN0YW5jZW9mIElneENvbHVtbkdyb3VwQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIGlmICghaXNDb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBHcm91cGluZ1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWRBUEkuY2xlYXJfZ3JvdXBieShyZWNvcmQuaXRlbS5maWVsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgRmlsdGVyaW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nU2VydmljZS5jbGVhcl9maWx0ZXIocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsb3NlIGZpbHRlciByb3dcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuZmlsdGVyaW5nU2VydmljZS5maWx0ZXJlZENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5maWx0ZXJpbmdTZXJ2aWNlLmZpbHRlcmVkQ29sdW1uLmZpZWxkID09PSByZWNvcmQuaXRlbS5maWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmdSb3cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIFNvcnRpbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmNsZWFyX3NvcnQocmVjb3JkLml0ZW0uZmllbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBjb2x1bW4gc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChbcmVjb3JkLml0ZW0uZmllbGRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuXG4gICAgICAgICAgICBpZiAoYWRkZWQgfHwgcmVtb3ZlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25Db2x1bW5zQWRkZWRPclJlbW92ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uQ29sdW1uc0FkZGVkT3JSZW1vdmVkKCkge1xuICAgICAgICB0aGlzLnN1bW1hcnlTZXJ2aWNlLmNsZWFyU3VtbWFyeUNhY2hlKCk7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gYG9uQ29sdW1uc0NoYW5nZWRgIGNhbiBiZSBleGVjdXRlZCBtaWR3YXkgYSBjdXJyZW50IGRldGVjdENoYW5nZSBjeWNsZSBhbmQgbWFya0ZvckNoZWNrIHdpbGwgYmUgaWdub3JlZCB0aGVuLlxuICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3YWl0IGZvciB0aGUgY3VycmVudCBjeWNsZSB0byBlbmQgc28gd2UgY2FuIHRyaWdnZXIgYSBuZXcgb25lIGFuZCBuZ0RvQ2hlY2sgdG8gZmlyZS5cbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcyh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjYWxjdWxhdGVHcmlkU2l6ZXMocmVjYWxjRmVhdHVyZVdpZHRoID0gdHJ1ZSkge1xuICAgICAgICAvKlxuICAgICAgICAgICAgVE9ETzogKFIuSy4pIFRoaXMgbGF5ZXJlZCBsYXNhZ25lIHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICAgICAgICBBU0FQLiBUaGUgcmVhc29uIEkgaGF2ZSB0byByZXNldCB0aGUgY2FjaGVzIHNvIG1hbnkgdGltZXMgaXMgYmVjYXVzZVxuICAgICAgICAgICAgYWZ0ZXIgdGVhY2ggYGRldGVjdENoYW5nZXNgIGNhbGwgdGhleSBhcmUgZmlsbGVkIHdpdGggaW52YWxpZFxuICAgICAgICAgICAgc3RhdGUuIE9mIGNvdXJzZSBhbGwgb2YgdGhpcyBoYXBwZW5zIG1pZHdheSB0aHJvdWdoIHRoZSBncmlkXG4gICAgICAgICAgICBzaXppbmcgcHJvY2VzcyB3aGljaCBvZiBjb3Vyc2UsIHVzZXMgdmFsdWVzIGZyb20gdGhlIGNhY2hlcywgdGh1cyByZXN1bHRpbmdcbiAgICAgICAgICAgIGluIGEgYnJva2VuIGxheW91dC5cbiAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIGNvbnN0IGhhc1Njcm9sbCA9IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKTtcbiAgICAgICAgY29uc3QgaGFzSFNjcm9sbCA9ICF0aGlzLmlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlbjtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgdGhpcy5yZXNldENhY2hlcyhyZWNhbGNGZWF0dXJlV2lkdGgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvd0VkaXRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25Sb3dFZGl0aW5nT3ZlcmxheSh0aGlzLmNydWRTZXJ2aWNlLnJvd0luRWRpdE1vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyaW5nU2VydmljZS5pc0ZpbHRlclJvd1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nUm93LnJlc2V0Q2hpcHNBcmVhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGluIGNhc2Ugc2Nyb2xsYmFyIGhhcyBhcHBlYXJlZCByZWNhbGMgdG8gc2l6ZSBjb3JyZWN0bHkuXG4gICAgICAgIGlmIChoYXNTY3JvbGwgIT09IHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVHcmlkV2lkdGgoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGluIGNhc2UgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaGFzIGFwcGVhcmVkIHJlY2FsYyB0byBzaXplIGNvcnJlY3RseS5cbiAgICAgICAgaWYgKGhhc0hTY3JvbGwgIT09IHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCgpKSB7XG4gICAgICAgICAgICB0aGlzLmlzSG9yaXpvbnRhbFNjcm9sbEhpZGRlbiA9ICF0aGlzLmhhc0hvcml6b250YWxTY3JvbGwoKTtcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZEhlaWdodCgpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnpvbmUuaXNTdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5V2lkdGhIb3N0QmluZGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlXaWR0aEhvc3RCaW5kaW5nKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc2V0Q2FjaGVzKHJlY2FsY0ZlYXR1cmVXaWR0aCk7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSB7XG4gICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplQ29sdW1uc05vdGlmeS5uZXh0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY0dyaWRIZWFkUm93KCkge1xuICAgICAgICBpZiAodGhpcy5tYXhMZXZlbEhlYWRlckRlcHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9iYXNlRm9udFNpemUgPSBwYXJzZUZsb2F0KGdldENvbXB1dGVkU3R5bGUodGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0ZpbHRlclJvdyA9IHRoaXMuX2FsbG93RmlsdGVyaW5nICYmIHRoaXMuX2ZpbHRlck1vZGUgPT09IEZpbHRlck1vZGUucXVpY2tGaWx0ZXI7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0gKHRoaXMubWF4TGV2ZWxIZWFkZXJEZXB0aCArIDEgKyAoaGFzRmlsdGVyUm93ID8gMSA6IDApKSAqIHRoaXMuZGVmYXVsdFJvd0hlaWdodCAvIHRoaXMuX2Jhc2VGb250U2l6ZTtcbiAgICAgICAgICAgIHRoaXMudGhlYWRSb3cubmF0aXZlRWxlbWVudC5zdHlsZS5taW5IZWlnaHQgPSBgJHttaW5TaXplfXJlbWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogU2V0cyBUQk9EWSBoZWlnaHQgaS5lLiB0aGlzLmNhbGNIZWlnaHRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FsY3VsYXRlR3JpZEhlaWdodCgpIHtcbiAgICAgICAgdGhpcy5jYWxjR3JpZEhlYWRSb3coKTtcblxuICAgICAgICB0aGlzLmNhbGNIZWlnaHQgPSB0aGlzLl9jYWxjdWxhdGVHcmlkQm9keUhlaWdodCgpO1xuICAgICAgICBpZiAodGhpcy5waW5uZWRSb3dIZWlnaHQgJiYgdGhpcy5jYWxjSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmNhbGNIZWlnaHQgLT0gdGhpcy5waW5uZWRSb3dIZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldEdyb3VwQXJlYUhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldENvbXB1dGVkSGVpZ2h0KGVsZW0pIHtcbiAgICAgICAgcmV0dXJuIGVsZW0ub2Zmc2V0SGVpZ2h0ID8gcGFyc2VGbG9hdCh0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpIDogMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRGb290ZXJIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VtbWFyeVJvd0hlaWdodCB8fCB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudGZvb3QubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VGhlYWRSb3dIZWlnaHQoKTogbnVtYmVyIHtcbiAgICAgICAgLy8gRC5QLjogQmVmb3JlIENTUyBsb2Fkcyx0aGVhZFJvdyBjb21wdXRlZCBoZWlnaHQgd2lsbCBiZSAnYXV0byctPk5hTiwgc28gdXNlIDAgZmFsbGJhY2tcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5nZXRDb21wdXRlZEhlaWdodCh0aGlzLnRoZWFkUm93Lm5hdGl2ZUVsZW1lbnQpIHx8IDA7XG4gICAgICAgIHJldHVybiAoIXRoaXMuYWxsb3dGaWx0ZXJpbmcgfHwgKHRoaXMuYWxsb3dGaWx0ZXJpbmcgJiYgdGhpcy5maWx0ZXJNb2RlICE9PSBGaWx0ZXJNb2RlLnF1aWNrRmlsdGVyKSkgP1xuICAgICAgICAgICAgaGVpZ2h0IC0gdGhpcy5nZXRGaWx0ZXJDZWxsSGVpZ2h0KCkgOlxuICAgICAgICAgICAgaGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VG9vbGJhckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgdG9vbGJhckhlaWdodCA9IDA7XG4gICAgICAgIGlmICh0aGlzLnRvb2xiYXIuZmlyc3QpIHtcbiAgICAgICAgICAgIHRvb2xiYXJIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMudG9vbGJhci5maXJzdC5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9vbGJhckhlaWdodDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFBhZ2luZ0Zvb3RlckhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBsZXQgcGFnaW5nSGVpZ2h0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMuZm9vdGVyKSB7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuZm9vdGVyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgcGFnaW5nSGVpZ2h0ID0gdGhpcy5mb290ZXIubmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZCA/XG4gICAgICAgICAgICAgICAgaGVpZ2h0IDogMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFnaW5nSGVpZ2h0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0RmlsdGVyQ2VsbEhlaWdodCgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBoZWFkZXJHcm91cE5hdGl2ZUVsID0gKHRoaXMuaGVhZGVyR3JvdXBzTGlzdC5sZW5ndGggIT09IDApID9cbiAgICAgICAgICAgIHRoaXMuaGVhZGVyR3JvdXBzTGlzdFswXS5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2VsbE5hdGl2ZUVsID0gKGhlYWRlckdyb3VwTmF0aXZlRWwpID9cbiAgICAgICAgICAgIGhlYWRlckdyb3VwTmF0aXZlRWwucXVlcnlTZWxlY3RvcignaWd4LWdyaWQtZmlsdGVyaW5nLWNlbGwnKSBhcyBIVE1MRWxlbWVudCA6IG51bGw7XG4gICAgICAgIHJldHVybiAoZmlsdGVyQ2VsbE5hdGl2ZUVsKSA/IGZpbHRlckNlbGxOYXRpdmVFbC5vZmZzZXRIZWlnaHQgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NhbGN1bGF0ZUdyaWRCb2R5SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5faGVpZ2h0KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3R1YWxUaGVhZFJvdyA9IHRoaXMuZ2V0VGhlYWRSb3dIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgZm9vdGVySGVpZ2h0ID0gdGhpcy5nZXRGb290ZXJIZWlnaHQoKTtcbiAgICAgICAgY29uc3QgdG9vbGJhckhlaWdodCA9IHRoaXMuZ2V0VG9vbGJhckhlaWdodCgpO1xuICAgICAgICBjb25zdCBwYWdpbmdIZWlnaHQgPSB0aGlzLmdldFBhZ2luZ0Zvb3RlckhlaWdodCgpO1xuICAgICAgICBjb25zdCBncm91cEFyZWFIZWlnaHQgPSB0aGlzLmdldEdyb3VwQXJlYUhlaWdodCgpO1xuICAgICAgICBjb25zdCBzY3JIZWlnaHQgPSB0aGlzLmdldENvbXB1dGVkSGVpZ2h0KHRoaXMuc2NyLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCByZW5kZXJlZEhlaWdodCA9IHRvb2xiYXJIZWlnaHQgKyBhY3R1YWxUaGVhZFJvdyArXG4gICAgICAgICAgICBmb290ZXJIZWlnaHQgKyBwYWdpbmdIZWlnaHQgKyBncm91cEFyZWFIZWlnaHQgK1xuICAgICAgICAgICAgc2NySGVpZ2h0O1xuXG4gICAgICAgIGxldCBncmlkSGVpZ2h0ID0gMDtcblxuICAgICAgICBpZiAodGhpcy5pc1BlcmNlbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0Jyk7XG4gICAgICAgICAgICBjb25zdCBhdXRvU2l6ZSA9IHRoaXMuX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChhdXRvU2l6ZSB8fCBjb21wdXRlZC5pbmRleE9mKCclJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZ2V0RGF0YUJhc2VkQm9keUhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBib2R5SGVpZ2h0ID4gMCA/IGJvZHlIZWlnaHQgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlRmxvYXQoY29tcHV0ZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZEhlaWdodCA9IHBhcnNlSW50KHRoaXMuX2hlaWdodCwgMTApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKGdyaWRIZWlnaHQgLSByZW5kZXJlZEhlaWdodCk7XG5cbiAgICAgICAgaWYgKE1hdGgucm91bmQoaGVpZ2h0KSA9PT0gMCB8fCBpc05hTihncmlkSGVpZ2h0KSkge1xuICAgICAgICAgICAgY29uc3QgYm9keUhlaWdodCA9IHRoaXMuZGVmYXVsdFRhcmdldEJvZHlIZWlnaHQ7XG4gICAgICAgICAgICByZXR1cm4gYm9keUhlaWdodCA+IDAgPyBib2R5SGVpZ2h0IDogbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCB8fCAodGhpcy5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgYXMgYW55KS5ob3N0O1xuICAgICAgICBjb25zdCBvcmlnSGVpZ2h0ID0gcGFyZW50RWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBwYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgcmV0dXJuIG9yaWdIZWlnaHQgIT09IGhlaWdodDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3Nob3VsZEF1dG9TaXplKHJlbmRlcmVkSGVpZ2h0KSB7XG4gICAgICAgIHRoaXMudGJvZHkubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQgfHwgKHRoaXMubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGFzIGFueSkuaG9zdDtcbiAgICAgICAgbGV0IHJlcyA9ICFwYXJlbnRFbGVtZW50IHx8XG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50LmNsaWVudEhlaWdodCA9PT0gMCB8fFxuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5jbGllbnRIZWlnaHQgPT09IHJlbmRlcmVkSGVpZ2h0O1xuICAgICAgICBpZiAocGFyZW50RWxlbWVudCAmJiAocmVzIHx8IHRoaXMuX2F1dG9TaXplKSkge1xuICAgICAgICAgICAgLy8gSWYgZ3JpZCBjYXVzZXMgdGhlIHBhcmVudCBjb250YWluZXIgdG8gZXh0ZW5kIChmb3IgZXhhbXBsZSB3aGVuIGNvbnRhaW5lciBpcyBmbGV4KVxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBhdXRvLXNpemUgc2luY2UgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250YWluZXIgd2lsbCBjb250aW51b3VzbHkgY2hhbmdlIGFzIHRoZSBncmlkIHJlbmRlcnMgZWxlbWVudHMuXG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzID0gdGhpcy5jaGVja0NvbnRhaW5lclNpemVDaGFuZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIGNhbGN1bGF0ZWQgd2lkdGggb2YgdGhlIHVucGlubmVkIGFyZWFcbiAgICAgKiBAcGFyYW0gdGFrZUhpZGRlbiBJZiB3ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhlIGhpZGRlbiBjb2x1bW5zIGluIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VW5waW5uZWRXaWR0aCh0YWtlSGlkZGVuID0gZmFsc2UpIHtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5pc1BlcmNlbnRXaWR0aCA/XG4gICAgICAgICAgICB0aGlzLmNhbGNXaWR0aCA6XG4gICAgICAgICAgICBwYXJzZUludCh0aGlzLndpZHRoLCAxMCkgfHwgcGFyc2VJbnQodGhpcy5ob3N0V2lkdGgsIDEwKSB8fCB0aGlzLmNhbGNXaWR0aDtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmVydGljYWxTY3JvbGwoKSAmJiAhdGhpcy5pc1BlcmNlbnRXaWR0aCkge1xuICAgICAgICAgICAgd2lkdGggLT0gdGhpcy5zY3JvbGxTaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1Bpbm5pbmdUb1N0YXJ0KSB7XG4gICAgICAgICAgICB3aWR0aCAtPSB0aGlzLmZlYXR1cmVDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aWR0aCAtIHRoaXMuZ2V0UGlubmVkV2lkdGgodGFrZUhpZGRlbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3VtbWFyaWVzKGZpZWxkTmFtZTogc3RyaW5nLCBoYXNTdW1tYXJ5OiBib29sZWFuLCBzdW1tYXJ5T3BlcmFuZD86IGFueSkge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWRBUEkuZ2V0X2NvbHVtbl9ieV9uYW1lKGZpZWxkTmFtZSk7XG4gICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIGNvbHVtbi5oYXNTdW1tYXJ5ID0gaGFzU3VtbWFyeTtcbiAgICAgICAgICAgIGlmIChzdW1tYXJ5T3BlcmFuZCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RTdW1tYXJpZXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeVNlcnZpY2UucmV0cmlnZ2VyUm9vdFBpcGUrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sdW1uLnN1bW1hcmllcyA9IHN1bW1hcnlPcGVyYW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfbXVsdGlwbGVTdW1tYXJpZXMoZXhwcmVzc2lvbnM6IElTdW1tYXJ5RXhwcmVzc2lvbltdLCBoYXNTdW1tYXJ5OiBib29sZWFuKSB7XG4gICAgICAgIGV4cHJlc3Npb25zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcmllcyhlbGVtZW50LmZpZWxkTmFtZSwgaGFzU3VtbWFyeSwgZWxlbWVudC5jdXN0b21TdW1tYXJ5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVNdWx0aXBsZVN1bW1hcmllcyhleHByZXNzaW9ucykge1xuICAgICAgICBleHByZXNzaW9ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBjb2x1bW4gJiYgY29sdW1uLmZpZWxkTmFtZSA/IGNvbHVtbi5maWVsZE5hbWUgOiBjb2x1bW47XG4gICAgICAgICAgICB0aGlzLl9zdW1tYXJpZXMoY29sdW1uTmFtZSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVEYXRhVHlwZXMocmVjKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVjID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gR3JpZENvbHVtbkRhdGFUeXBlLkJvb2xlYW47XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlYyA9PT0gJ29iamVjdCcgJiYgcmVjIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWMgPT09ICdzdHJpbmcnICYmICgvXFwuKGdpZnxqcGU/Z3x0aWZmP3xwbmd8d2VicHxibXApJC9pKS50ZXN0KHJlYykpIHtcbiAgICAgICAgICAgIHJldHVybiBHcmlkQ29sdW1uRGF0YVR5cGUuSW1hZ2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhdXRvZ2VuZXJhdGVDb2x1bW5zKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5ncmlkQVBJLmdldF9kYXRhKCk7XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZ2VuZXJhdGVEYXRhRmllbGRzKGRhdGEpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG5cbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWYgPSBjcmVhdGVDb21wb25lbnQoSWd4Q29sdW1uQ29tcG9uZW50LCB7IGVudmlyb25tZW50SW5qZWN0b3I6IHRoaXMuZW52SW5qZWN0b3IsIGVsZW1lbnRJbmplY3RvcjogdGhpcy5pbmplY3RvciB9KTtcbiAgICAgICAgICAgIHJlZi5pbnN0YW5jZS5maWVsZCA9IGZpZWxkO1xuICAgICAgICAgICAgcmVmLmluc3RhbmNlLmRhdGFUeXBlID0gdGhpcy5yZXNvbHZlRGF0YVR5cGVzKGRhdGFbMF1bZmllbGRdKTtcbiAgICAgICAgICAgIHJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICBjb2x1bW5zLnB1c2gocmVmLmluc3RhbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzID0gY29sdW1ucztcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoY29sdW1ucyk7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zaG91bGRHZW5lcmF0ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29sdW1uc0F1dG9nZW5lcmF0ZWQuZW1pdCh7IGNvbHVtbnM6IHRoaXMuX2F1dG9HZW5lcmF0ZWRDb2xzIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURhdGFGaWVsZHMoZGF0YTogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhkYXRhICYmIGRhdGEubGVuZ3RoICE9PSAwID8gZGF0YVswXSA6IFtdKVxuICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4gIXRoaXMuYXV0b0dlbmVyYXRlRXhjbHVkZS5pbmNsdWRlcyhrZXkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGluaXRDb2x1bW5zKGNvbGxlY3Rpb246IElneENvbHVtbkNvbXBvbmVudFtdLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uR3JvdXBzID0gY29sbGVjdGlvbi5zb21lKGNvbCA9PiBjb2wuY29sdW1uR3JvdXApO1xuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzKSB7XG4gICAgICAgICAgICAvLyBTZXQgb3ZlcmFsbCByb3cgbGF5b3V0IHNpemVcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5jb2x1bW5MYXlvdXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0U2l6ZSA9IGNvbC5jaGlsZHJlbiA/XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4ucmVkdWNlKChhY2MsIHZhbCkgPT4gTWF0aC5tYXgodmFsLnJvd1N0YXJ0ICsgdmFsLmdyaWRSb3dTcGFuIC0gMSwgYWNjKSwgMSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgMTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplID0gTWF0aC5tYXgobGF5b3V0U2l6ZSwgdGhpcy5fbXVsdGlSb3dMYXlvdXRSb3dTaXplKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNDb2x1bW5MYXlvdXRzICYmIHRoaXMuaGFzQ29sdW1uR3JvdXBzKSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gLSBtdWx0aS1yb3cgYW5kIGNvbHVtbiBncm91cHNcbiAgICAgICAgICAgIC8vIHJlbW92ZSBjb2x1bW4gZ3JvdXBzXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5MYXlvdXRDb2x1bW5zID0gY29sbGVjdGlvbi5maWx0ZXIoKGNvbCkgPT4gY29sLmNvbHVtbkxheW91dCB8fCBjb2wuY29sdW1uTGF5b3V0Q2hpbGQpO1xuICAgICAgICAgICAgY29sbGVjdGlvbiA9IGNvbHVtbkxheW91dENvbHVtbnM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWF4TGV2ZWxIZWFkZXJEZXB0aCA9IG51bGw7XG4gICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0V2lkdGggPSB0aGlzLmNvbHVtbldpZHRoU2V0QnlVc2VyID8gdGhpcy5fY29sdW1uV2lkdGggOiBjb2x1bW4uZGVmYXVsdFdpZHRoID8gY29sdW1uLmRlZmF1bHRXaWR0aCA6ICcnO1xuXG4gICAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgICAgICBjYihjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbHVtbnMoY29sbGVjdGlvbik7XG5cbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uTGF5b3V0cykge1xuICAgICAgICAgICAgY29sbGVjdGlvbi5mb3JFYWNoKChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbHVtbi5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVpbml0UGluU3RhdGVzKCkge1xuICAgICAgICB0aGlzLl9waW5uZWRDb2x1bW5zID0gdGhpcy5fY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5waW5uZWQpLnNvcnQoKGEsIGIpID0+IHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihhKSAtIHRoaXMuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZihiKSk7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IHRoaXMuaGFzQ29sdW1uR3JvdXBzID8gdGhpcy5fY29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZCkgOlxuICAgICAgICAgICAgdGhpcy5fY29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLnBpbm5lZClcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gdGhpcy5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YoYSkgLSB0aGlzLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZihiKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbVNlbGVjdGlvbihzb3VyY2U6IGFueVtdLCBmb3JtYXR0ZXJzID0gZmFsc2UsIGhlYWRlcnMgPSBmYWxzZSwgY29sdW1uRGF0YT86IGFueVtdKTogYW55W10ge1xuICAgICAgICBsZXQgY29sdW1uc0FycmF5OiBJZ3hDb2x1bW5Db21wb25lbnRbXTtcbiAgICAgICAgbGV0IHJlY29yZCA9IHt9O1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGxldCBrZXlzID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbGxlY3Rpb24gPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGtleXNBbmREYXRhID0gW107XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmFjdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2hpZXJhcmNoaWNhbCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuc2lvblJvd0luZGV4ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZXhwYW5zaW9uU3RhdGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dJbmRleCA9IHRoaXMuZ3JpZEFQSS5nZXRfcmVjX2luZGV4X2J5X2lkKGtleSwgdGhpcy5kYXRhVmlldyk7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMucHVzaChyb3dJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24uc2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5zaW9uUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb24uZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkS2V5ID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnRyYWN0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRLZXkgPiBOdW1iZXIocm93KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmFjdCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uQ29sbGVjdGlvbi5zZXQodXBkYXRlZEtleSAtIHN1YnRyYWN0LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YnRyYWN0ID0gMDtcbiAgICAgICAgICAgICAgICBpZiAoZXhwYW5zaW9uUm93SW5kZXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuc2lvblJvd0luZGV4ZXMuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUVsLnJvdyA+IE51bWJlcihyb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJhY3QrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUVsLnJvdyAtPSBzdWJ0cmFjdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBpc1JlbW90ZSA9IHRvdGFsSXRlbXMgJiYgdG90YWxJdGVtcyA+IHRoaXMuZGF0YVZpZXcubGVuZ3RoO1xuICAgICAgICBsZXQgc2VsZWN0aW9uTWFwO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnaGllcmFyY2hpY2FsJyAmJiBzZWxlY3Rpb25Db2xsZWN0aW9uLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAgPSBpc1JlbW90ZSA/IEFycmF5LmZyb20oc2VsZWN0aW9uQ29sbGVjdGlvbikgOlxuICAgICAgICAgICAgICAgIEFycmF5LmZyb20oc2VsZWN0aW9uQ29sbGVjdGlvbikuZmlsdGVyKCh0dXBsZSkgPT4gdHVwbGVbMF0gPCBzb3VyY2UubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbk1hcCA9IGlzUmVtb3RlID8gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKSA6XG4gICAgICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uKS5maWx0ZXIoKHR1cGxlKSA9PiB0dXBsZVswXSA8IHNvdXJjZS5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VsbFNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUuc2luZ2xlICYmIGFjdGl2ZUVsKSB7XG4gICAgICAgICAgICBzZWxlY3Rpb25NYXAucHVzaChbYWN0aXZlRWwucm93LCBuZXcgU2V0PG51bWJlcj4oKS5hZGQoYWN0aXZlRWwuY29sdW1uKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2VsbFNlbGVjdGlvbiA9PT0gR3JpZFNlbGVjdGlvbk1vZGUubm9uZSAmJiBhY3RpdmVFbCkge1xuICAgICAgICAgICAgc2VsZWN0aW9uTWFwLnB1c2goW2FjdGl2ZUVsLnJvdywgbmV3IFNldDxudW1iZXI+KCkuYWRkKGFjdGl2ZUVsLmNvbHVtbildKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICBzZWxlY3RlZERhdGEgPSBjb2x1bW5EYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgICAgICBmb3IgKGxldCBbcm93LCBzZXRdIG9mIHNlbGVjdGlvbk1hcCkge1xuICAgICAgICAgICAgcm93ID0gdGhpcy5wYWdpbmF0b3IgJiYgKHRoaXMucGFnaW5nTW9kZSA9PT0gR3JpZFBhZ2luZ01vZGUuTG9jYWwgJiYgc291cmNlID09PSB0aGlzLmZpbHRlcmVkU29ydGVkRGF0YSkgPyByb3cgKyAodGhpcy5wZXJQYWdlICogdGhpcy5wYWdlKSA6IHJvdztcbiAgICAgICAgICAgIHJvdyA9IGlzUmVtb3RlID8gcm93IC0gdGhpcy52aXJ0dWFsaXphdGlvblN0YXRlLnN0YXJ0SW5kZXggOiByb3c7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZVtyb3ddIHx8IHNvdXJjZVtyb3ddLmRldGFpbHNEYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBBcnJheS5mcm9tKHNldCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVhY2ggb2YgdGVtcCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbnNBcnJheSA9IHRoaXMuZ2V0U2VsZWN0YWJsZUNvbHVtbnNBdChlYWNoKTtcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJyYXkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMudHlwZSAhPT0gJ3Bpdm90JyAmJiBoZWFkZXJzID8gY29sLmhlYWRlciB8fCBjb2wuZmllbGQgOiBjb2wuZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dEYXRhID0gc291cmNlW3Jvd10uZ2hvc3RSZWNvcmQgPyBzb3VyY2Vbcm93XS5yZWNvcmRSZWYgOiBzb3VyY2Vbcm93XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy50eXBlID09PSAncGl2b3QnID8gcm93RGF0YS5hZ2dyZWdhdGlvblZhbHVlcy5nZXQoY29sLmZpZWxkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzb2x2ZU5lc3RlZFBhdGgocm93RGF0YSwgY29sLmZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcih2YWx1ZSwgcm93RGF0YSkgOiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNvcmRba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IHJlY29yZFtrZXldLnRvU3RyaW5nKCkuY29uY2F0KCdyZWNvcmRSb3ctJyArIHJvdyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBPYmplY3Qua2V5cyhjb2x1bW5EYXRhWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGM6IGFueSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93TnVtYmVyID0gK2Muc3BsaXQoJ3JlY29yZFJvdy0nKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnNwbGl0KCdyZWNvcmRSb3ctJylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRba2V5XSA9IGM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRPYmogPSBPYmplY3QuYXNzaWduKHNlbGVjdGVkRGF0YVtyb3dOdW1iZXJdLCByZWNvcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW3Jvd051bWJlcl0gPSBtZXJnZWRPYmo7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlY29yZCA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKHNlbGVjdGVkRGF0YSk7XG4gICAgICAgICAgICBrZXlzQW5kRGF0YS5wdXNoKGtleXMpO1xuICAgICAgICAgICAgcmV0dXJuIGtleXNBbmREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXRTZWxlY3RhYmxlQ29sdW1uc0F0KGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbkxheW91dHMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVMYXlvdXRDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+IGNvbC5jb2x1bW5MYXlvdXQpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgY29sTGF5b3V0ID0gdmlzaWJsZUxheW91dENvbHVtbnNbaW5kZXhdO1xuICAgICAgICAgICAgcmV0dXJuIGNvbExheW91dCA/IGNvbExheW91dC5jaGlsZHJlbi50b0FycmF5KCkgOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVDb2x1bW5zID0gdGhpcy52aXNpYmxlQ29sdW1uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sID0+ICFjb2wuY29sdW1uR3JvdXApXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEudmlzaWJsZUluZGV4IC0gYi52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgcmV0dXJuIFt2aXNpYmxlQ29sdW1uc1tpbmRleF1dO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGF1dG9TaXplQ29sdW1uc0luVmlldygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbnNUb0F1dG9zaXplKSByZXR1cm47XG4gICAgICAgIGNvbnN0IHZTdGF0ZSA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLnN0YXRlO1xuICAgICAgICBsZXQgY29sUmVzaXplZCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB1bnBpbm5lZEluVmlldyA9IHRoaXMuaGVhZGVyQ29udGFpbmVyLmlneEdyaWRGb3JPZi5zbGljZSh2U3RhdGUuc3RhcnRJbmRleCwgdlN0YXRlLnN0YXJ0SW5kZXggKyB2U3RhdGUuY2h1bmtTaXplKS5mbGF0TWFwKHggPT4geC5jb2x1bW5Hcm91cCA/IHguYWxsQ2hpbGRyZW4gOiB4KTtcbiAgICAgICAgY29uc3QgY29sdW1uc0luVmlldyA9IHRoaXMucGlubmVkQ29sdW1ucy5jb25jYXQodW5waW5uZWRJblZpZXcgYXMgSWd4Q29sdW1uQ29tcG9uZW50W10pO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zSW5WaWV3KSB7XG4gICAgICAgICAgICBpZiAoIWNvbC5hdXRvU2l6ZSAmJiBjb2wuaGVhZGVyQ2VsbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzQ29udGVudFdpZHRocyA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChjb2wuX2NlbGxzLmxlbmd0aCAhPT0gdGhpcy5yb3dMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0xpc3QuZm9yRWFjaCh4ID0+IHguY2RyLmRldGVjdENoYW5nZXMoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5fZGF0YVJvd0xpc3QubWFwKHggPT4geC5jZWxscy5maW5kKGMgPT4gYy5jb2x1bW4gPT09IGNvbCkpO1xuICAgICAgICAgICAgICAgIGNlbGxzLmZvckVhY2goKGNlbGwpID0+IGNlbGxzQ29udGVudFdpZHRocy5wdXNoKGNlbGw/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoIHx8IDApKTtcbiAgICAgICAgICAgICAgICBsZXQgbWF4Rm9yQ2VsbHMgPSBNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuaGVhZGVyQ2VsbExpc3QuZmluZCh4ID0+IHguY29sdW1uID09PSBjb2wpO1xuICAgICAgICAgICAgICAgIGNlbGxzQ29udGVudFdpZHRocy5wdXNoKGhlYWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXggPSBNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpO1xuICAgICAgICAgICAgICAgIC8vIGluIGNhc2VzIHdpdGggdGVtcGxhdGUgY29udGFpbnMgc29tZXRoaW5nLCBsaWtlIGEgd2ViY29tcG9uZW50LFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgcmVuZGVycyBmdWxseSBvbmx5IGFmdGVyIGl0IGlzIGFscmVhZHkgaW5qZWN0ZWQgaW4gdGhlIERPTSxcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW5pdGlhbGx5IHJlbmRlcnMgYXMgZW1wdHksIHNraXAgbWVhc3VyaW5nIGl0LlxuICAgICAgICAgICAgICAgIGxldCBlbXB0eUNlbGxXaXRoUGFkZGluZ09ubHkgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChjZWxscy5sZW5ndGggPiAwICYmICEhY29sLmJvZHlUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsU3R5bGUgPSB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoY2VsbHNbMF0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGVtcHR5Q2VsbFdpdGhQYWRkaW5nT25seSA9IHBhcnNlRmxvYXQoY2VsbFN0eWxlLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY2VsbFN0eWxlLnBhZGRpbmdSaWdodCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4Rm9yQ2VsbHMgPSBtYXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gMCB8fCAobWF4Rm9yQ2VsbHMgPD0gZW1wdHlDZWxsV2l0aFBhZGRpbmdPbmx5ICYmIHRoaXMuX2ZpcnN0QXV0b1Jlc2l6ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2VsbHMgbm90IGluIERPTSB5ZXQgb3IgY29udGVudCBub3QgZnVsbHkgaW5pdGlhbGl6ZWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgbWF4U2l6ZSA9IE1hdGguY2VpbChNYXRoLm1heCguLi5jZWxsc0NvbnRlbnRXaWR0aHMpKSArIDE7XG4gICAgICAgICAgICAgICAgaWYgKGNvbC5tYXhXaWR0aCAmJiBtYXhTaXplID4gY29sLm1heFdpZHRoUHgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IGNvbC5tYXhXaWR0aFB4O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4U2l6ZSA8IGNvbC5taW5XaWR0aFB4KSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFNpemUgPSBjb2wubWluV2lkdGhQeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sLmF1dG9TaXplID0gbWF4U2l6ZTtcbiAgICAgICAgICAgICAgICBjb2wucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgICAgICAgICBjb2xSZXNpemVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sUmVzaXplZCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlZFdpZHRocygpO1xuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4dHJhY3REYXRhRnJvbUNvbHVtbnNTZWxlY3Rpb24oc291cmNlOiBhbnlbXSwgZm9ybWF0dGVycyA9IGZhbHNlLCBoZWFkZXJzID0gZmFsc2UpOiBhbnlbXSB7XG4gICAgICAgIGxldCByZWNvcmQgPSB7fTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWREYXRhID0gW107XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuc2VsZWN0ZWRDb2x1bW5zKCk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGEgb2Ygc291cmNlKSB7XG4gICAgICAgICAgICBzZWxlY3RlZENvbHVtbnMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gaGVhZGVycyA/IGNvbC5oZWFkZXIgfHwgY29sLmZpZWxkIDogY29sLmZpZWxkO1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gZm9ybWF0dGVycyAmJiBjb2wuZm9ybWF0dGVyID8gY29sLmZvcm1hdHRlcihkYXRhW2NvbC5maWVsZF0sIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgIDogZGF0YVtjb2wuZmllbGRdO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YS5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWNvcmQgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaW5pdFBpbm5pbmcoKSB7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlR3JpZFdpZHRoKCk7XG4gICAgICAgIHRoaXMucmVzZXRDYWNoZXMoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDb2x1bW5QaW5uaW5nRm9yR3JvdXBzKCk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2Nyb2xsVG8ocm93OiBhbnkgfCBudW1iZXIsIGNvbHVtbjogYW55IHwgbnVtYmVyLCBpbkNvbGxlY3Rpb24gPSB0aGlzLl9maWx0ZXJlZFNvcnRlZFVucGlubmVkRGF0YSk6IHZvaWQge1xuICAgICAgICBsZXQgZGVsYXlTY3JvbGxpbmcgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5wYWdpbmF0b3IgJiYgdHlwZW9mIChyb3cpICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgY29uc3Qgcm93SW5kZXggPSBpbkNvbGxlY3Rpb24uaW5kZXhPZihyb3cpO1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iocm93SW5kZXggLyB0aGlzLnBlclBhZ2UpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlICE9PSBwYWdlKSB7XG4gICAgICAgICAgICAgICAgZGVsYXlTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsYXlTY3JvbGxpbmcpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlyZWN0aXZlKHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiAocm93KSA9PT0gJ251bWJlcicgPyByb3cgOiB0aGlzLnVucGlubmVkRGF0YVZpZXcuaW5kZXhPZihyb3cpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lcixcbiAgICAgICAgICAgICAgICB0eXBlb2YgKHJvdykgPT09ICdudW1iZXInID8gcm93IDogdGhpcy51bnBpbm5lZERhdGFWaWV3LmluZGV4T2Yocm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjcm9sbFRvSG9yaXpvbnRhbGx5KGNvbHVtbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxUb0hvcml6b250YWxseShjb2x1bW46IGFueSB8IG51bWJlcikge1xuICAgICAgICBsZXQgY29sdW1uSW5kZXggPSB0eXBlb2YgY29sdW1uID09PSAnbnVtYmVyJyA/IGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQnlOYW1lKGNvbHVtbikudmlzaWJsZUluZGV4O1xuICAgICAgICBjb25zdCBzY3JvbGxSb3cgPSB0aGlzLnJvd0xpc3QuZmluZChyID0+ICEhci52aXJ0RGlyUm93KTtcbiAgICAgICAgY29uc3QgdmlydERpciA9IHNjcm9sbFJvdyA/IHNjcm9sbFJvdy52aXJ0RGlyUm93IDogbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuaXNQaW5uaW5nVG9TdGFydCAmJiB0aGlzLnBpbm5lZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uSW5kZXggPj0gdGhpcy5waW5uZWRDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4IC09IHRoaXMucGlubmVkQ29sdW1ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXJlY3RpdmUodmlydERpciwgY29sdW1uSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzY3JvbGxEaXJlY3RpdmUoZGlyZWN0aXZlOiBJZ3hHcmlkRm9yT2ZEaXJlY3RpdmU8YW55LCBhbnlbXT4sIGdvYWw6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZS5zY3JvbGxUbyhnb2FsKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0Q29sdW1uV2lkdGhTdW0oKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNvbFN1bSA9IDA7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmhhc0NvbHVtbkxheW91dHMgP1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkgOiB0aGlzLnZpc2libGVDb2x1bW5zLmZpbHRlcih4ID0+ICF4LmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb2xTdW0gKz0gcGFyc2VJbnQoKGl0ZW0uY2FsY1dpZHRoIHx8IGl0ZW0uZGVmYXVsdFdpZHRoKSwgMTApIHx8IHRoaXMubWluQ29sdW1uV2lkdGg7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWNvbFN1bSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICBjb2xTdW0gKz0gdGhpcy5mZWF0dXJlQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIHJldHVybiBjb2xTdW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90aWZ5IGNoYW5nZXMsIHJlc2V0IGNhY2hlIGFuZCBwb3B1bGF0ZVZpc2libGVJbmRleGVzLlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2NvbHVtbnNSZW9yZGVyZWQoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIC8vIGFmdGVyIHJlb3JkZXJpbmcgaXMgZG9uZSByZXNldCBjYWNoZWQgY29sdW1uIGNvbGxlY3Rpb25zLlxuICAgICAgICB0aGlzLnJlc2V0Q29sdW1uQ29sbGVjdGlvbnMoKTtcbiAgICAgICAgY29sdW1uLnJlc2V0Q2FjaGVzKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkRGF0YVZpZXcoX2RhdGE6IGFueVtdKSB7XG4gICAgICAgIHRoaXMuX2RhdGFWaWV3ID0gdGhpcy5pc1Jvd1Bpbm5pbmdUb1RvcCA/XG4gICAgICAgICAgICBbLi4udGhpcy5waW5uZWREYXRhVmlldywgLi4udGhpcy51bnBpbm5lZERhdGFWaWV3XSA6XG4gICAgICAgICAgICBbLi4udGhpcy51bnBpbm5lZERhdGFWaWV3LCAuLi50aGlzLnBpbm5lZERhdGFWaWV3XTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hcHBseVdpZHRoSG9zdEJpbmRpbmcoKSB7XG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuX3dpZHRoO1xuICAgICAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjdXJyZW50V2lkdGggPSB0aGlzLmNhbGNXaWR0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZlcnRpY2FsU2Nyb2xsKCkpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50V2lkdGggKz0gdGhpcy5zY3JvbGxTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2lkdGggPSBjdXJyZW50V2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5yZXNldENhY2hlcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hvc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgdmVydGljYWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIub25TY3JvbGwoZXZlbnQpO1xuICAgICAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9ucyA9IHRydWU7XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUub25TdGFibGUucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuY2h1bmtMb2FkLmVtaXQodGhpcy52ZXJ0aWNhbFNjcm9sbENvbnRhaW5lci5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucm93RWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VSb3dFZGl0aW5nT3ZlcmxheVN0YXRlT25TY3JvbGwodGhpcy5jcnVkU2VydmljZS5yb3dJbkVkaXRNb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb25zID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5oaWRlT3ZlcmxheXMoKTtcbiAgICAgICAgdGhpcy5hY3Rpb25TdHJpcD8uaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25TdHJpcCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdHJpcC5jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzOiBJR3JpZFNjcm9sbEV2ZW50QXJncyA9IHtcbiAgICAgICAgICAgIGRpcmVjdGlvbjogJ3ZlcnRpY2FsJyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb246IHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuc2Nyb2xsUG9zaXRpb25cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5ncmlkU2Nyb2xsLmVtaXQoYXJncyk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhvcml6b250YWxTY3JvbGxIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBldmVudC50YXJnZXQuc2Nyb2xsTGVmdDtcbiAgICAgICAgdGhpcy5oZWFkZXJDb250YWluZXIub25IU2Nyb2xsKHNjcm9sbExlZnQpO1xuICAgICAgICB0aGlzLl9ob3Jpem9udGFsRm9yT2ZzLmZvckVhY2godmZvciA9PiB2Zm9yLm9uSFNjcm9sbChzY3JvbGxMZWZ0KSk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy56b25lLm9uU3RhYmxlLnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFZpcnREaXIuY2h1bmtMb2FkLmVtaXQodGhpcy5oZWFkZXJDb250YWluZXIuc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b1NpemVDb2x1bW5zSW5WaWV3KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uLmlzQ29sdW1uRnVsbHlWaXNpYmxlKHRoaXMubmF2aWdhdGlvbi5sYXN0Q29sdW1uSW5kZXgpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVPdmVybGF5cygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3M6IElHcmlkU2Nyb2xsRXZlbnRBcmdzID0geyBkaXJlY3Rpb246ICdob3Jpem9udGFsJywgZXZlbnQsIHNjcm9sbFBvc2l0aW9uOiB0aGlzLmhlYWRlckNvbnRhaW5lci5zY3JvbGxQb3NpdGlvbiB9O1xuICAgICAgICB0aGlzLmdyaWRTY3JvbGwuZW1pdChhcmdzKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHJlbmRlcmVkQWN0dWFsUm93SGVpZ2h0KCkge1xuICAgICAgICBsZXQgYm9yZGVyID0gMTtcbiAgICAgICAgaWYgKHRoaXMucm93TGlzdC50b0FycmF5KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm93U3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnJvd0xpc3QuZmlyc3QubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBib3JkZXIgPSByb3dTdHlsZXMuYm9yZGVyQm90dG9tV2lkdGggPyBNYXRoLmNlaWwocGFyc2VGbG9hdChyb3dTdHlsZXMuYm9yZGVyQm90dG9tV2lkdGgpKSA6IGJvcmRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yb3dIZWlnaHQgKyBib3JkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2socm93SW5kZXgsIHZpc2libGVDb2xJbmRleCA9IC0xLCBjYjogKGFyZ3M6IGFueSkgPT4gdm9pZCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3cgPSB0aGlzLnN1bW1hcmllc1Jvd0xpc3QuZmlsdGVyKHMgPT4gcy5pbmRleCAhPT0gMCkuY29uY2F0KHRoaXMucm93TGlzdC50b0FycmF5KCkpLmZpbmQociA9PiByLmluZGV4ID09PSByb3dJbmRleCk7XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS50b3RhbEl0ZW1Db3VudCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmVydGljYWxTY3JvbGxDb250YWluZXIuZGF0YUNoYW5nZWQucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJvdyA9IHRoaXMuc3VtbWFyaWVzUm93TGlzdC5maWx0ZXIocyA9PiBzLmluZGV4ICE9PSAwKS5jb25jYXQodGhpcy5yb3dMaXN0LnRvQXJyYXkoKSkuZmluZChyID0+IHIuaW5kZXggPT09IHJvd0luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2JBcmdzID0gdGhpcy5nZXROYXZpZ2F0aW9uQXJndW1lbnRzKHJvdywgdmlzaWJsZUNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgY2IoY2JBcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3SW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KHJvd0luZGV4KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3W2RhdGFWaWV3SW5kZXhdLmRldGFpbHNEYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uLnNldEFjdGl2ZU5vZGUoeyByb3c6IHJvd0luZGV4IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpO1xuICAgICAgICBjYihhcmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5hdmlnYXRpb25Bcmd1bWVudHMocm93LCB2aXNpYmxlQ29sSW5kZXgpIHtcbiAgICAgICAgbGV0IHRhcmdldFR5cGU6IEdyaWRLZXlkb3duVGFyZ2V0VHlwZTsgbGV0IHRhcmdldDtcbiAgICAgICAgc3dpdGNoIChyb3cubmF0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lneC1ncmlkLWdyb3VwYnktcm93JzpcbiAgICAgICAgICAgICAgICB0YXJnZXRUeXBlID0gJ2dyb3VwUm93JztcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3c7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdpZ3gtZ3JpZC1zdW1tYXJ5LXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdzdW1tYXJ5Q2VsbCc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdmlzaWJsZUNvbEluZGV4ICE9PSAtMSA/XG4gICAgICAgICAgICAgICAgICAgIHJvdy5zdW1tYXJ5Q2VsbHMuZmluZChjID0+IGMudmlzaWJsZUNvbHVtbkluZGV4ID09PSB2aXNpYmxlQ29sSW5kZXgpIDogcm93LnN1bW1hcnlDZWxscy5maXJzdDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lneC1jaGlsZC1ncmlkLXJvdyc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdoaWVyYXJjaGljYWxSb3cnO1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSA9ICdkYXRhQ2VsbCc7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdmlzaWJsZUNvbEluZGV4ICE9PSAtMSA/IHJvdy5jZWxscy5maW5kKGMgPT4gYy52aXNpYmxlQ29sdW1uSW5kZXggPT09IHZpc2libGVDb2xJbmRleCkgOiByb3cuY2VsbHMuZmlyc3Q7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VHlwZSwgdGFyZ2V0IH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROZXh0RGF0YVJvd0luZGV4KGN1cnJlbnRSb3dJbmRleCwgcHJldmlvdXMgPSBmYWxzZSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJlbnRSb3dJbmRleCk7XG4gICAgICAgIGlmIChjdXJyZW50Um93SW5kZXggPCAwIHx8IChjdXJyZW50Um93SW5kZXggPT09IDAgJiYgcHJldmlvdXMpIHx8IChyZXNvbHZlZEluZGV4ID49IHRoaXMuZGF0YVZpZXcubGVuZ3RoIC0gMSAmJiAhcHJldmlvdXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJvd0luZGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmQgbmV4dC9wcmV2IHJlY29yZCB0aGF0IGlzIGVkaXRhYmxlLlxuICAgICAgICBjb25zdCBuZXh0Um93SW5kZXggPSBwcmV2aW91cyA/IHRoaXMuZmluZFByZXZFZGl0YWJsZURhdGFSb3dJbmRleChjdXJyZW50Um93SW5kZXgpIDpcbiAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuZmluZEluZGV4KChyZWMsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgIGluZGV4ID4gcmVzb2x2ZWRJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpbmRleCkpO1xuICAgICAgICBjb25zdCBuZXh0RGF0YUluZGV4ID0gdGhpcy5nZXREYXRhSW5kZXgobmV4dFJvd0luZGV4KTtcbiAgICAgICAgcmV0dXJuIG5leHREYXRhSW5kZXggIT09IC0xID8gbmV4dERhdGFJbmRleCA6IGN1cnJlbnRSb3dJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlZGl0YWJsZSByb3cgaW5kZXggb3IgLTEgaWYgbm8gc3VjaCByb3cgaXMgZm91bmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3VycmVudEluZGV4IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBlZGl0YWJsZSByZWNvcmQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kUHJldkVkaXRhYmxlRGF0YVJvd0luZGV4KGN1cnJlbnRJbmRleCk6IG51bWJlciB7XG4gICAgICAgIGxldCBpID0gdGhpcy5kYXRhVmlldy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkSW5kZXggPSB0aGlzLl9nZXREYXRhVmlld0luZGV4KGN1cnJlbnRJbmRleCk7XG4gICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgIGlmIChpIDwgcmVzb2x2ZWRJbmRleCAmJiB0aGlzLmlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIHJlY29yZCBhdCB0aGUgc3BlY2lmaWVkIGRhdGEgdmlldyBpbmRleCBpcyBhIGFuIGVkaXRhYmxlIGRhdGEgcmVjb3JkLlxuICAgICAqIElmIHJlY29yZCBpcyBncm91cCByZWMsIHN1bW1hcnkgcmVjLCBjaGlsZCByZWMsIGdob3N0IHJlYy4gZXRjLiBpdCBpcyBub3QgZWRpdGFibGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YVZpZXdJbmRleCBUaGUgaW5kZXggb2YgdGhhdCByZWNvcmQgaW4gdGhlIGRhdGEgdmlldy5cbiAgICAgKlxuICAgICAqL1xuICAgIC8vIFRPRE86IENvbnNpZGVyIG1vdmluZyBpdCBpbnRvIENSVURcbiAgICBwcml2YXRlIGlzRWRpdGFibGVEYXRhUmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KSB7XG4gICAgICAgIGNvbnN0IHJlYyA9IHRoaXMuZGF0YVZpZXdbZGF0YVZpZXdJbmRleF07XG4gICAgICAgIHJldHVybiAhcmVjLmV4cHJlc3Npb24gJiYgIXJlYy5zdW1tYXJpZXMgJiYgIXJlYy5jaGlsZEdyaWRzRGF0YSAmJiAhcmVjLmRldGFpbHNEYXRhICYmXG4gICAgICAgICAgICAhdGhpcy5pc0dob3N0UmVjb3JkQXRJbmRleChkYXRhVmlld0luZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSByZWNvcmQgYXQgdGhlIHNwZWNpZmllZCBkYXRhIHZpZXcgaW5kZXggaXMgYSBnaG9zdC5cbiAgICAgKiBJZiByZWNvcmQgaXMgcGlubmVkIGJ1dCBpcyBub3QgaW4gcGlubmVkIGFyZWEgdGhlbiBpdCBpcyBhIGdob3N0IHJlY29yZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBkYXRhVmlld0luZGV4IFRoZSBpbmRleCBvZiB0aGF0IHJlY29yZCBpbiB0aGUgZGF0YSB2aWV3LlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNHaG9zdFJlY29yZEF0SW5kZXgoZGF0YVZpZXdJbmRleCkge1xuICAgICAgICBjb25zdCBpc1Bpbm5lZCA9IHRoaXMuaXNSZWNvcmRQaW5uZWQodGhpcy5kYXRhVmlld1tkYXRhVmlld0luZGV4XSk7XG4gICAgICAgIGNvbnN0IGlzSW5QaW5uZWRBcmVhID0gdGhpcy5pc1JlY29yZFBpbm5lZEJ5Vmlld0luZGV4KGRhdGFWaWV3SW5kZXgpO1xuICAgICAgICByZXR1cm4gaXNQaW5uZWQgJiYgIWlzSW5QaW5uZWRBcmVhO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNWYWxpZFBvc2l0aW9uKHJvd0luZGV4LCBjb2xJbmRleCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb3dzID0gdGhpcy5zdW1tYXJpZXNSb3dMaXN0LmZpbHRlcihzID0+IHMuaW5kZXggIT09IDApLmNvbmNhdCh0aGlzLnJvd0xpc3QudG9BcnJheSgpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcihjb2wgPT4gIWNvbC5jb2x1bW5Hcm91cCAmJiBjb2wudmlzaWJsZUluZGV4ID49IDAgJiYgIWNvbC5oaWRkZW4pLmxlbmd0aDtcbiAgICAgICAgaWYgKHJvd3MgPCAxIHx8IGNvbHMgPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvd0luZGV4ID4gLTEgJiYgcm93SW5kZXggPCB0aGlzLmRhdGFWaWV3Lmxlbmd0aCAmJlxuICAgICAgICAgICAgY29sSW5kZXggPiAtIDEgJiYgY29sSW5kZXggPD0gTWF0aC5tYXgoLi4udGhpcy52aXNpYmxlQ29sdW1ucy5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kKHRleHQ6IHN0cmluZywgaW5jcmVtZW50OiBudW1iZXIsIGNhc2VTZW5zaXRpdmU/OiBib29sZWFuLCBleGFjdE1hdGNoPzogYm9vbGVhbiwgc2Nyb2xsPzogYm9vbGVhbiwgZW5kRWRpdCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJvd0xpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZEVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FzZVNlbnNpdGl2ZVJlc29sdmVkID0gY2FzZVNlbnNpdGl2ZSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgY29uc3QgZXhhY3RNYXRjaFJlc29sdmVkID0gZXhhY3RNYXRjaCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbGV0IHJlYnVpbGRDYWNoZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0ICE9PSB0ZXh0IHx8XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlICE9PSBjYXNlU2Vuc2l0aXZlUmVzb2x2ZWQgfHxcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmV4YWN0TWF0Y2ggIT09IGV4YWN0TWF0Y2hSZXNvbHZlZCkge1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8gPSB7XG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogdGV4dCxcbiAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaEluZGV4OiAwLFxuICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGNhc2VTZW5zaXRpdmVSZXNvbHZlZCxcbiAgICAgICAgICAgICAgICBleGFjdE1hdGNoOiBleGFjdE1hdGNoUmVzb2x2ZWQsXG4gICAgICAgICAgICAgICAgbWF0Y2hJbmZvQ2FjaGU6IFtdLFxuICAgICAgICAgICAgICAgIG1hdGNoQ291bnQ6IDAsXG4gICAgICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJlYnVpbGRDYWNoZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ICs9IGluY3JlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWJ1aWxkQ2FjaGUpIHtcbiAgICAgICAgICAgIHRoaXMucm93TGlzdC5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93LmNlbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvdy5jZWxscy5mb3JFYWNoKChjOiBJZ3hHcmlkQ2VsbENvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgYy5oaWdobGlnaHRUZXh0KHRleHQsIGNhc2VTZW5zaXRpdmVSZXNvbHZlZCwgZXhhY3RNYXRjaFJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVidWlsZE1hdGNoQ2FjaGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID49IHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5hY3RpdmVNYXRjaEluZGV4ID0gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCAtIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoSW5mbyA9IHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlW3RoaXMuX2xhc3RTZWFyY2hJbmZvLmFjdGl2ZU1hdGNoSW5kZXhdO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8gPSB7IC4uLnRoaXMuX2xhc3RTZWFyY2hJbmZvIH07XG5cbiAgICAgICAgICAgIGlmIChzY3JvbGwgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhtYXRjaEluZm8ucm93LCBtYXRjaEluZm8uY29sdW1uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZXh0SGlnaGxpZ2h0U2VydmljZS5zZXRBY3RpdmVIaWdobGlnaHQodGhpcy5pZCwge1xuICAgICAgICAgICAgICAgIGNvbHVtbjogbWF0Y2hJbmZvLmNvbHVtbixcbiAgICAgICAgICAgICAgICByb3c6IG1hdGNoSW5mby5yb3csXG4gICAgICAgICAgICAgICAgaW5kZXg6IG1hdGNoSW5mby5pbmRleCxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogbWF0Y2hJbmZvLm1ldGFkYXRhLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGV4dEhpZ2hsaWdodFNlcnZpY2UuY2xlYXJBY3RpdmVIaWdobGlnaHQodGhpcy5pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hDb3VudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRNYXRjaENhY2hlKCkge1xuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5tYXRjaEluZm9DYWNoZSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGNhc2VTZW5zaXRpdmUgPSB0aGlzLl9sYXN0U2VhcmNoSW5mby5jYXNlU2Vuc2l0aXZlO1xuICAgICAgICBjb25zdCBleGFjdE1hdGNoID0gdGhpcy5fbGFzdFNlYXJjaEluZm8uZXhhY3RNYXRjaDtcbiAgICAgICAgY29uc3Qgc2VhcmNoVGV4dCA9IGNhc2VTZW5zaXRpdmUgPyB0aGlzLl9sYXN0U2VhcmNoSW5mby5zZWFyY2hUZXh0IDogdGhpcy5fbGFzdFNlYXJjaEluZm8uc2VhcmNoVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWx0ZXJlZFNvcnRlZERhdGE7XG4gICAgICAgIGNvbnN0IGNvbHVtbkl0ZW1zID0gdGhpcy52aXNpYmxlQ29sdW1ucy5maWx0ZXIoKGMpID0+ICFjLmNvbHVtbkdyb3VwKS5zb3J0KChjMSwgYzIpID0+IGMxLnZpc2libGVJbmRleCAtIGMyLnZpc2libGVJbmRleCk7XG5cbiAgICAgICAgZGF0YS5mb3JFYWNoKChkYXRhUm93LCByb3dJbmRleCkgPT4ge1xuICAgICAgICAgICAgY29sdW1uSXRlbXMuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBpcGVBcmdzID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoYy5maWVsZCkucGlwZUFyZ3M7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjLmZvcm1hdHRlciA/IGMuZm9ybWF0dGVyKHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpLCBkYXRhUm93KSA6XG4gICAgICAgICAgICAgICAgICAgIGMuZGF0YVR5cGUgPT09ICdudW1iZXInID8gZm9ybWF0TnVtYmVyKHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpLCB0aGlzLmxvY2FsZSwgcGlwZUFyZ3MuZGlnaXRzSW5mbykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgYy5kYXRhVHlwZSA9PT0gJ2RhdGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmb3JtYXREYXRlKHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpLCBwaXBlQXJncy5mb3JtYXQsIHRoaXMubG9jYWxlLCBwaXBlQXJncy50aW1lem9uZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc29sdmVOZXN0ZWRQYXRoKGRhdGFSb3csIGMuZmllbGQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsICYmIGMuc2VhcmNoYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoVmFsdWUgPSBjYXNlU2Vuc2l0aXZlID8gU3RyaW5nKHZhbHVlKSA6IFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFZhbHVlID09PSBzZWFyY2hUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWljOiBJTWF0Y2hJbmZvQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPihbWydwaW5uZWQnLCB0aGlzLmlzUmVjb3JkUGlubmVkQnlJbmRleChyb3dJbmRleCldXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUucHVzaChtaWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9jY3VycmVuY2VJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoSW5kZXggPSBzZWFyY2hWYWx1ZS5pbmRleE9mKHNlYXJjaFRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc2VhcmNoSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWljOiBJTWF0Y2hJbmZvQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogZGF0YVJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogb2NjdXJyZW5jZUluZGV4KyssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oW1sncGlubmVkJywgdGhpcy5pc1JlY29yZFBpbm5lZEJ5SW5kZXgocm93SW5kZXgpXV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWFyY2hJbmZvLm1hdGNoSW5mb0NhY2hlLnB1c2gobWljKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFZhbHVlID0gc2VhcmNoVmFsdWUuc3Vic3RyaW5nKHNlYXJjaEluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gc2VhcmNoVmFsdWUuaW5kZXhPZihzZWFyY2hUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9sYXN0U2VhcmNoSW5mby5tYXRjaENvdW50ID0gdGhpcy5fbGFzdFNlYXJjaEluZm8ubWF0Y2hJbmZvQ2FjaGUubGVuZ3RoO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB1cGRhdGVEZWZhdWx0Um93SGVpZ2h0KCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhUm93TGlzdC5sZW5ndGggPiAwICYmIHRoaXMuZGF0YVJvd0xpc3QuZmlyc3QuY2VsbHMgJiYgdGhpcy5kYXRhUm93TGlzdC5maXJzdC5jZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBwYXJzZUZsb2F0KHRoaXMuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRhdGFSb3dMaXN0LmZpcnN0LmNlbGxzLmZpcnN0Lm5hdGl2ZUVsZW1lbnQpPy5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKSk7XG4gICAgICAgICAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFJvd0hlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvdWxkUmVjYWxjUm93SGVpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IEFib3V0IHRvIE1vdmUgdG8gQ1JVRFxuICAgIHByaXZhdGUgY29uZmlndXJlUm93RWRpdGluZ092ZXJsYXkocm93SUQ6IGFueSwgdXNlT3V0ZXIgPSBmYWxzZSkge1xuICAgICAgICBsZXQgc2V0dGluZ3MgPSB0aGlzLnJvd0VkaXRTZXR0aW5ncztcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMub3ZlcmxheVNlcnZpY2UuZ2V0T3ZlcmxheUJ5SWQodGhpcy5yb3dFZGl0aW5nT3ZlcmxheS5vdmVybGF5SWQpO1xuICAgICAgICBpZiAob3ZlcmxheSkge1xuICAgICAgICAgICAgc2V0dGluZ3MgPSBvdmVybGF5LnNldHRpbmdzO1xuICAgICAgICB9XG4gICAgICAgIHNldHRpbmdzLm91dGxldCA9IHVzZU91dGVyID8gdGhpcy5wYXJlbnRSb3dPdXRsZXREaXJlY3RpdmUgOiB0aGlzLnJvd091dGxldERpcmVjdGl2ZTtcbiAgICAgICAgdGhpcy5yb3dFZGl0UG9zaXRpb25pbmdTdHJhdGVneS5zZXR0aW5ncy5jb250YWluZXIgPSB0aGlzLnRib2R5Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBpbm5lZCA9IHRoaXMuX3Bpbm5lZFJlY29yZElEcy5pbmRleE9mKHJvd0lEKSAhPT0gLTE7XG4gICAgICAgIGNvbnN0IHRhcmdldFJvdyA9ICFwaW5uZWQgP1xuICAgICAgICAgICAgdGhpcy5ncmlkQVBJLmdldF9yb3dfYnlfa2V5KHJvd0lEKSBhcyBJZ3hSb3dEaXJlY3RpdmVcbiAgICAgICAgICAgIDogdGhpcy5waW5uZWRSb3dzLmZpbmQoeCA9PiB4LmtleSA9PT0gcm93SUQpIGFzIElneFJvd0RpcmVjdGl2ZTtcbiAgICAgICAgaWYgKCF0YXJnZXRSb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXR0aW5ncy50YXJnZXQgPSB0YXJnZXRSb3cuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLnRvZ2dsZVJvd0VkaXRpbmdPdmVybGF5KHRydWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQ29sdW1uUGlubmluZ0Zvckdyb3VwcygpOiB2b2lkIHtcbiAgICAgICAgLy8gV2hlbiBhIGNvbHVtbiBpcyBhIGdyb3VwIG9yIGlzIGluc2lkZSBhIGdyb3VwLCBwaW4gYWxsIHJlbGF0ZWQuXG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHVtbnMgPSBbXTtcbiAgICAgICAgY29uc3QgdW5waW5uZWRDb2x1bW5zID0gW107XG5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgICAgICBpZiAoY29sLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIGNvbC5wYXJlbnQucGlubmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2wuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb2wuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5waW5uZWQgPSB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGV4Y2VlZCB1bnBpbm5lZCBhcmVhIG1pbiB3aWR0aCBhbmQgZ2V0IHBpbm5lZCBhbmQgdW5waW5uZWQgY29sIGNvbGxlY3Rpb25zLlxuICAgICAgICAvLyBXZSB0YWtlIGludG8gYWNjb3VudCB0b3AgbGV2ZWwgY29sdW1ucyAodG9wIGxldmVsIGdyb3VwcyBhbmQgbm9uIGdyb3VwcykuXG4gICAgICAgIC8vIElmIHRvcCBsZXZlbCBpcyB1bnBpbm5lZCB0aGUgcGlubmluZyBoYW5kbGVzIGFsbCBjaGlsZHJlbiB0byBiZSB1bnBpbm5lZCBhcyB3ZWxsLlxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5zKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLnBpbm5lZCAmJiAhY29sdW1uLnBhcmVudCkge1xuICAgICAgICAgICAgICAgIHBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4ucGlubmVkICYmIGNvbHVtbi5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnRvcExldmVsUGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLnB1c2goY29sdW1uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucGlubmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHVucGlubmVkQ29sdW1ucy5wdXNoKGNvbHVtbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1bnBpbm5lZENvbHVtbnMucHVzaChjb2x1bW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFzc2lnbiB0aGUgYXBwbGljYWJsZSBjb2xsZWN0aW9ucy5cbiAgICAgICAgdGhpcy5fcGlubmVkQ29sdW1ucyA9IHBpbm5lZENvbHVtbnM7XG4gICAgICAgIHRoaXMuX3VucGlubmVkQ29sdW1ucyA9IHVucGlubmVkQ29sdW1ucztcbiAgICB9XG59XG4iXX0=