@jax-data-science/sci-image-visualizer 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +49 -0
  2. package/esm2022/lib/contracts/display-types.mjs +28 -1
  3. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -1
  5. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  6. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +46 -4
  7. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  8. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +195 -0
  9. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +10 -2
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +1098 -0
  11. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +6 -3
  12. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +186 -10
  13. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +2 -2
  14. package/esm2022/lib/implementations/plotly/plotly.service.mjs +2 -3
  15. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +120 -2
  16. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +76 -1
  17. package/esm2022/lib/routing-visualizer.service.mjs +10 -1
  18. package/esm2022/lib/spatial/spatial-tiles.mjs +506 -0
  19. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +659 -19
  20. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +44 -3
  21. package/esm2022/lib/toolbar/toolbar.component.mjs +15 -3
  22. package/esm2022/lib/visualizer.component.mjs +221 -7
  23. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3238 -84
  24. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  25. package/lib/contracts/display-types.d.ts +104 -1
  26. package/lib/contracts/plot-type-contribution.contract.d.ts +27 -0
  27. package/lib/contracts/ports/spatial-data.port.d.ts +59 -1
  28. package/lib/contracts/spatial-dataset.contract.d.ts +167 -0
  29. package/lib/contracts/toolbar-tool.contract.d.ts +84 -5
  30. package/lib/contracts/visualizer.contract.d.ts +22 -1
  31. package/lib/implementations/napari-js/napari-navigator.d.ts +72 -0
  32. package/lib/implementations/napari-js/napari-region-overlay.d.ts +3 -0
  33. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +240 -0
  34. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +42 -2
  35. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +26 -2
  36. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -1
  37. package/lib/spatial/spatial-tiles.d.ts +222 -0
  38. package/lib/spatial-controls/spatial-controls.component.d.ts +234 -3
  39. package/lib/toolbar/brush/brush-tool.service.d.ts +21 -0
  40. package/lib/toolbar/toolbar.component.d.ts +11 -3
  41. package/lib/visualizer.component.d.ts +54 -2
  42. package/package.json +1 -1
@@ -1536,7 +1536,7 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
1536
1536
  this.brushTool.setMode(true, (options ?? {}));
1537
1537
  }
1538
1538
  setBrushOptions(options) {
1539
- this.brushTool.setSize(options?.size ?? 0);
1539
+ this.brushTool.setOptions((options ?? {}));
1540
1540
  }
1541
1541
  setVertexEraserMode(active) {
1542
1542
  if (active) {
@@ -2099,4 +2099,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2099
2099
  type: Inject,
2100
2100
  args: [VIZ_CONFIG]
2101
2101
  }] }] });
2102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUUsT0FBTyxFQUFtQixlQUFlLEVBQWdCLE1BQU0sc0NBQXNDLENBQUM7QUFDdEcsT0FBTyxFQUFFLGdCQUFnQixFQUFnQixNQUFNLHdDQUF3QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUN4RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUM5RixPQUFPLEVBQWtCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBd0IsTUFBTSx3REFBd0QsQ0FBQztBQUN2SCxPQUFPLEVBQUUsb0JBQW9CLEVBQXFCLE1BQU0sb0RBQW9ELENBQUM7QUFFN0csT0FBTyxFQUFFLGdCQUFnQixFQUFPLE1BQU0sOEJBQThCLENBQUM7QUFFckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7OztBQUVwQzs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLDRCQUE0QjtJQUNuQyxNQUFNLEdBQUcsR0FBUSxHQUFVLENBQUM7SUFDNUIsSUFBSSxHQUFHLENBQUMsMkJBQTJCO1FBQUUsT0FBTztJQUM1QyxNQUFNLElBQUksR0FBUSxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUM7UUFDeEUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPO1FBQ2IsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTztJQUNsQixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQVUsRUFBRSxFQUFFLENBQ2hDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0UsR0FBRyxDQUFDLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDNUIsR0FBRyxDQUFDLE1BQVcsRUFBRSxJQUFZO1lBQzNCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3hFLE9BQU8sQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1RixDQUFDO1lBQ0QsT0FBTyxPQUFPLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvRCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsR0FBRyxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQztBQUN6QyxDQUFDO0FBK0NEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sT0FBTyw4QkFBK0IsU0FBUSxtQkFBbUI7SUEwSXJFLFlBQ1UsSUFBZ0IsRUFDVSxLQUFxQixFQUMvQyxRQUF5QixFQUN6QixTQUEyQixFQUMzQixPQUF1QixFQUN2QixZQUFpQyxFQUNqQyxlQUF1QyxFQUNILGFBQW9DLEVBQ3hFLFVBQW1DLEVBQ25DLGFBQW1DLEVBQzNDLEtBQXNCLEVBQ3RCLFdBQXdCLEVBQ2hCLFdBQXFDLEVBQ3pCLE1BQWlCO1FBRXJDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFmbEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNVLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQy9DLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDSCxrQkFBYSxHQUFiLGFBQWEsQ0FBdUI7UUFDeEUsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBR25DLGdCQUFXLEdBQVgsV0FBVyxDQUEwQjtRQXRKL0MsK0VBQStFO1FBQ3RFLGlCQUFZLEdBQXVCLGNBQWMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBR2pGLFdBQU0sR0FBZ0MsSUFBSSxDQUFDO1FBQzNDLFlBQU8sR0FBMEIsSUFBSSxDQUFDO1FBQ3RDLGFBQVEsR0FBdUIsSUFBSSxDQUFDO1FBQ3BDLGVBQVUsR0FBMEIsSUFBSSxDQUFDO1FBQ2pEO21FQUMyRDtRQUNuRCxZQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNyQjs7O3VFQUcrRDtRQUN2RCxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQzNCOztpRUFFeUQ7UUFDakQsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQUNsQzswRkFDa0Y7UUFDakUsc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDL0Q7Ozt3RUFHZ0U7UUFDeEQsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQzNCLHNCQUFpQixHQUFlLEVBQUUsQ0FBQztRQUNuQyx3QkFBbUIsR0FBc0UsRUFBRSxDQUFDO1FBQzVGLHVCQUFrQixHQUFrQixJQUFJLENBQUM7UUFDakQ7O3FEQUU2QztRQUM1QiwyQkFBc0IsR0FBRyxJQUFJLENBQUM7UUFDdkMsbUJBQWMsR0FBa0MsSUFBSSxDQUFDO1FBRzdEOzJEQUNtRDtRQUMzQyxtQkFBYyxHQUEyQixJQUFJLENBQUM7UUFDdEQ7MERBQ2tEO1FBQzFDLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFHckI7O2tGQUUwRTtRQUNsRSxhQUFRLEdBQWlCLElBQUksQ0FBQztRQUN0QywrRUFBK0U7UUFDdkUscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGdCQUFXLEdBQXdCLElBQUksQ0FBQztRQUNoRDs7Ozs7O3dEQU1nRDtRQUN4QyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUN6Qix1RUFBdUU7UUFDL0QscUJBQWdCLEdBQWtCLElBQUksQ0FBQztRQUMvQzs7bUVBRTJEO1FBQ25ELGtCQUFhLEdBQW9CLEVBQUUsQ0FBQztRQUM1Qzs7dUVBRStEO1FBQ3ZELG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQy9COztpRUFFeUQ7UUFDakQsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUN2QjttREFDMkM7UUFDbkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUN6QjtvRkFDNEU7UUFDcEUsZ0JBQVcsR0FBMkIsRUFBRSxDQUFDO1FBQ2pEOzt1RUFFK0Q7UUFDdkQscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ2hDOzs7Z0RBR3dDO1FBQ2hDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUVqQzs7Ozt1RkFJK0U7UUFDOUQsdUJBQWtCLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUztRQUV2RDs7OzsrQ0FJdUM7UUFDdEIsK0JBQTBCLEdBQUcsR0FBRyxDQUFDO1FBRWxEOzttRkFFMkU7UUFDMUQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFDO1lBQzdDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3hDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUM3QixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDdkMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRO1NBQzlCLENBQUMsQ0FBQztRQU1IOzs7Z0RBR3dDO1FBQ3ZCLFVBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQztZQUN0QyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDekIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ2xFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3pDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUTtZQUM3QixjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDekMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUYsY0FBYyxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxLQUFLO1lBQ3ZFLGVBQWUsRUFBRSxDQUFDLENBQVMsRUFBRSxPQUFnQixFQUFFLEVBQUUsQ0FDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQztZQUNsRSxxQkFBcUIsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3pHLENBQUMsQ0FBQztRQWdDYyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3BELDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUN0RDt1RkFDK0U7UUFDOUQsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBMkQsQ0FBQztRQUMxRzs0REFDb0Q7UUFDbkMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO1FBQzlDLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLHFCQUFnQixHQUE0QixJQUFJLENBQUM7UUFDekQsMEVBQTBFO1FBQzFFLDhEQUE4RDtRQUM3QyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQztRQTFCckUsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkQsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2pDLFlBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztZQUNuRSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtZQUN4Qyx5RUFBeUU7WUFDekUsbURBQW1EO1lBQ25ELDBCQUEwQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hHLG1CQUFtQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1NBQ2pFLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFnQkQsZ0ZBQWdGO0lBRWhGOzs7Ozs7OztPQVFHO0lBQ0ssMEJBQTBCO1FBQ2hDLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPO1FBQzdCLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUscUVBQXFFO1FBQ3JFLDhFQUE4RTtRQUM5RSw0RUFBNEU7UUFDNUUsNkVBQTZFO1FBQzdFLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO1NBQ3ZCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7WUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pCLDBFQUEwRTtZQUMxRSwwRUFBMEU7WUFDMUUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFBQyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUFDLE9BQU87WUFBQyxDQUFDO1lBQ3hFLHVFQUF1RTtZQUN2RSx5RUFBeUU7WUFDekUsNEVBQTRFO1lBQzVFLDhEQUE4RDtZQUM5RCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELHlFQUF5RTtZQUN6RSwyRUFBMkU7WUFDM0UseUVBQXlFO1lBQ3pFLDJFQUEyRTtZQUMzRSxzRUFBc0U7WUFDdEUsOENBQThDO1lBQzlDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztpRkFFNkU7SUFDckUsY0FBYyxDQUFDLEdBQVcsRUFBRSxHQUFXO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRCxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQztnQkFDRixJQUFJLENBQUMsTUFBYyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFdBQVc7WUFDYixDQUFDO1lBQ0QsSUFBSSxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFjLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFdBQVc7WUFDYixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFFeEU7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQXFCLEVBQUUsTUFBYztRQUM5QyxNQUFNLFFBQVEsR0FBRyxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQ3JDLHdFQUF3RTtRQUN4RSwwRUFBMEU7UUFDMUUsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzFFLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsMkVBQTJFO1FBQzNFLDhFQUE4RTtRQUM5RSxzREFBc0Q7UUFDdEQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFFakYsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsaURBQWlEO1FBQzFFLENBQUM7UUFDRCwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSxxRUFBcUU7UUFDckUsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSx3Q0FBd0M7UUFDeEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsT0FBTyxFQUFFLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUN0RCxTQUFTLENBQUM7WUFDUixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1lBQy9FLENBQUM7WUFDRCxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFpQixHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2pGLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDdEUsQ0FBQztnQkFDRCwwRUFBMEU7WUFDNUUsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsdUVBQXVFO2dCQUN2RSxxRUFBcUU7Z0JBQ3JFLHVFQUF1RTtnQkFDdkUsdUVBQXVFO2dCQUN2RSx1RUFBdUU7Z0JBQ3ZFLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7a0ZBRzhFO0lBQ3RFLEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBcUIsRUFBRSxNQUFjO1FBQzVELE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLG9FQUFvRTtRQUNwRSx5RUFBeUU7UUFDekUsK0RBQStEO1FBQy9ELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUUsSUFBSSxHQUF1QixDQUFDO1FBQzVCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQW9CLENBQUM7WUFDOUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7Z0JBQy9DLHNFQUFzRTtnQkFDdEUsOERBQThEO1lBQ2hFLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxJQUFJLENBQUMsNENBQTRDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNyRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQztvQkFDSCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqRSxxRUFBcUU7b0JBQ3JFLGdFQUFnRTtvQkFDaEUsR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO2dCQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7b0JBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLDhCQUE4QjtRQUM5QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzNGLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBbUI7WUFDakMsS0FBSztZQUNMLE1BQU07WUFDTixRQUFRLEVBQUUsQ0FBQyxFQUFhLGtEQUFrRDtZQUMxRSxDQUFDLEVBQUUsQ0FBQyxFQUFvQixlQUFlO1lBQ3ZDLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUQsWUFBWSxFQUFFLEtBQUs7WUFDbkIsVUFBVSxFQUFFLENBQUM7WUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ25DLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUM7WUFDckIsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQztTQUN0QixDQUFDO1FBQ0YsT0FBTztZQUNMLFVBQVU7WUFDVixPQUFPLEVBQUUsRUFBRTtZQUNYLENBQUM7WUFDRCxRQUFRO1lBQ1IsTUFBTSxFQUFFLElBQUk7WUFDWixHQUFHO1NBQ0osQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBa0IsRUFBRSxLQUFhLEVBQUUsTUFBYztRQUMxRSxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0I7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUNsRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFCLElBQUksR0FBcUIsQ0FBQztRQUMxQixJQUFJLENBQUM7WUFDSCxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFVBQVUsQ0FBQyxDQUFDLDhDQUE4QztRQUNuRSxDQUFDO1FBQ0QsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSwrREFBK0Q7UUFDL0QsSUFBSSxHQUFHLENBQUMsWUFBWSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsYUFBYSxLQUFLLE1BQU07WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUNsRixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUM1QixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztRQUNsRixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLFVBQVUsQ0FBQztRQUM3QixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7NEVBRXdFO0lBQ2hFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUF1QixFQUFFLENBQVM7UUFDcEUsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO1lBQ2xELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUFFLE9BQU87WUFDckIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPO1lBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7O3FGQUVpRjtJQUN6RSxLQUFLLENBQUMsdUJBQXVCLENBQUMsSUFBMEI7UUFDOUQsTUFBTSxNQUFNLEdBQXNFLEVBQUUsQ0FBQztRQUNyRixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO2dCQUNsRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQUMsU0FBUztnQkFBQyxDQUFDO2dCQUNqRyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQUMsU0FBUztnQkFBQyxDQUFDO2dCQUM3RixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RSxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OytFQUkyRTtJQUNuRSxLQUFLLENBQUMsMkJBQTJCO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2hELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksaUJBQWlCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUs7Z0JBQUUsU0FBUyxDQUFDLHFDQUFxQztZQUMvRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxTQUFTO1lBQzVFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFBRSxTQUFTO2dCQUM5QixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7Z0JBQy9DLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBVSxrREFBa0Q7Z0JBQzdFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQixHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUMzQixHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxPQUFPLENBQWMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxrQkFBa0I7WUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pDLENBQUM7SUFFRDt5RkFDcUY7SUFDN0UsS0FBSyxDQUFDLGtCQUFrQjtRQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDakMsSUFBSSxDQUFDO1lBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBUyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O3FFQUVpRTtJQUN6RCxXQUFXLENBQUMsR0FBVztRQUM3QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7WUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFBQyxDQUFDO0lBQ2hILENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxDQUNGLE9BQWUsRUFDZixXQUFnQixFQUNoQixTQUFxQixFQUNyQixhQUFxQixFQUNyQixTQUFtQixFQUNuQixPQUFpQjtRQUVqQixNQUFNLE1BQU0sR0FBRyxXQUF3QixDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsdUVBQXVFO1FBQ3ZFLDBFQUEwRTtRQUMxRSw4Q0FBOEM7UUFDOUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDbEMsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxzRUFBc0U7UUFDdEUsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLHVFQUF1RTtnQkFDdkUsbUVBQW1FO2dCQUNuRSw4REFBOEQ7Z0JBQzlELCtEQUErRDtnQkFDL0QsaUVBQWlFO2dCQUNqRSw2Q0FBNkM7Z0JBQzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQVMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxFQUFFLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRCw2RUFBNkU7UUFDN0UsNEVBQTRFO1FBQzVFLHNFQUFzRTtRQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELGlFQUFpRTtRQUNqRSwyRUFBMkU7UUFDM0UsNEVBQTRFO1FBQzVFLG1FQUFtRTtRQUNuRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUM7UUFDakQsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSwyREFBMkQ7UUFDM0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsZ0ZBQWdGO1lBQ2hGLDBFQUEwRTtZQUMxRSw4QkFBOEI7WUFDOUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3ZGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTiwrRUFBK0U7WUFDL0UsZ0ZBQWdGO1lBQ2hGLDhFQUE4RTtZQUM5RSxnRkFBZ0Y7WUFDaEYsMkVBQTJFO1lBQzNFLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNsRCw2RUFBNkU7WUFDN0UsaUZBQWlGO1lBQ2pGLGlGQUFpRjtZQUNqRixpRkFBaUY7WUFDakYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QiwwRUFBMEU7Z0JBQzFFLCtFQUErRTtnQkFDL0UsNkVBQTZFO2dCQUM3RSx5RUFBeUU7Z0JBQ3pFLDhFQUE4RTtnQkFDOUUsMENBQTBDO2dCQUMxQyxNQUFNLFFBQVEsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7b0JBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO29CQUM1QixPQUFPLENBQUMsSUFBSSxDQUNWLG9FQUFvRTt3QkFDcEUsR0FBRyxPQUFPLElBQUksT0FBTyxZQUFZLENBQUMsQ0FBQyxRQUFRLGVBQWUsUUFBUSxtQkFBbUI7d0JBQ3JGLGlCQUFpQixJQUFJLENBQUMsMEJBQTBCLDJDQUEyQyxDQUM1RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hDLDRFQUE0RTtZQUM1RSwyRUFBMkU7WUFDM0UsNEVBQTRFO1lBQzVFLDRFQUE0RTtZQUM1RSwrREFBK0Q7WUFDL0QsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLHVFQUF1RTtZQUN2RSwwRUFBMEU7WUFDMUUsK0VBQStFO1lBQy9FLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSwyRUFBMkU7UUFDM0UsTUFBTSxVQUFVLEdBQUcsTUFBTTtZQUN2QixDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRiw0QkFBNEIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUksR0FBVyxDQUFDO1lBQ3pCLEVBQUUsRUFBRSxPQUFPO1lBQ1gsK0RBQStEO1lBQy9ELG9FQUFvRTtZQUNwRSxnRUFBZ0U7WUFDaEUsMkRBQTJEO1lBQzNELGdCQUFnQixFQUFFLElBQUk7WUFDdEIsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSxzRUFBc0U7WUFDdEUsd0RBQXdEO1lBQ3hELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLHFCQUFxQixFQUFFLEtBQUssRUFBRSx1Q0FBdUM7WUFDckUsd0VBQXdFO1lBQ3hFLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3BDLDJFQUEyRTtZQUMzRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQzVDLGlCQUFpQixFQUFFLGNBQWM7WUFDakMsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLG1CQUFtQixFQUFFLGlCQUFpQjtZQUN0QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLG1CQUFtQixFQUFFLElBQUksRUFBRSw2QkFBNkI7WUFDeEQsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsc0NBQXNDO1lBQ3JFLGlCQUFpQixFQUFFLFdBQVc7WUFDOUIseUVBQXlFO1lBQ3pFLDJFQUEyRTtZQUMzRSxxRUFBcUU7WUFDckUsYUFBYSxFQUFFLG1CQUFtQjtZQUNsQyx1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLG1FQUFtRTtZQUNuRSxvQkFBb0IsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRTtZQUMvRCwwRUFBMEU7WUFDMUUsMkVBQTJFO1lBQzNFLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUseUVBQXlFO1lBQ3pFLG1DQUFtQztZQUNuQyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGlCQUFpQixFQUFFLEVBQUU7WUFDckIsb0VBQW9FO1lBQ3BFLDZEQUE2RDtZQUM3RCxpQ0FBaUM7WUFDakMsRUFBRTtZQUNGLHFFQUFxRTtZQUNyRSxFQUFFO1lBQ0Ysd0VBQXdFO1lBQ3hFLHVFQUF1RTtZQUN2RSx3RUFBd0U7WUFDeEUsa0VBQWtFO1lBQ2xFLEVBQUU7WUFDRix5RUFBeUU7WUFDekUsOERBQThEO1lBQzlELEVBQUU7WUFDRiw4Q0FBOEM7WUFDOUMsa0RBQWtEO1lBQ2xELDJEQUEyRDtZQUMzRCwrQ0FBK0M7WUFDL0MsRUFBRTtZQUNGLDJFQUEyRTtZQUMzRSwwRUFBMEU7WUFDMUUsZ0VBQWdFO1lBQ2hFLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLHFFQUFxRTtZQUNyRSxlQUFlLEVBQUUsS0FBSztZQUN0QixhQUFhLEVBQUUsR0FBRztZQUNsQix1RUFBdUU7WUFDdkUsMEVBQTBFO1lBQzFFLDBFQUEwRTtZQUMxRSx5RUFBeUU7WUFDekUsbUVBQW1FO1lBQ25FLDJFQUEyRTtZQUMzRSw0RUFBNEU7WUFDNUUsMkVBQTJFO1lBQzNFLG9EQUFvRDtZQUNwRCxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7U0FDdEcsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLHlFQUF5RTtZQUN6RSwyRUFBMkU7WUFDM0UsK0RBQStEO1lBQy9ELDBEQUEwRDtZQUMxRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxFQUFXLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNiLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ2YsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsTUFBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO2dCQUN2QyxzRUFBc0U7Z0JBQ3RFLHVFQUF1RTtnQkFDdkUsK0RBQStEO2dCQUMvRCxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsTUFBYSxDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLDBFQUEwRTtnQkFDMUUsSUFBSSxNQUFNLEVBQUUsQ0FBQztvQkFDWCw2Q0FBNkM7Z0JBQy9DLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQy9CLHdFQUF3RTtvQkFDeEUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLElBQUksQ0FBQzt3QkFDSCxNQUFNLEdBQUcsR0FBSSxJQUFJLENBQUMsTUFBYyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDdkQsSUFBSSxHQUFHOzRCQUFHLElBQUksQ0FBQyxNQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDdEQsQ0FBQztvQkFBQyxNQUFNLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzVDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixxRUFBcUU7b0JBQ3JFLDBFQUEwRTtvQkFDMUUsTUFBTSxTQUFTLEdBQUksSUFBSSxDQUFDLE1BQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzdELElBQUksU0FBUzt3QkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO2dCQUNELHdFQUF3RTtnQkFDeEUsc0VBQXNFO2dCQUN0RSxJQUFJLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7b0JBQzlDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixDQUFDLENBQUMsQ0FBQztnQkFDSCxzRUFBc0U7Z0JBQ3RFLHVFQUF1RTtnQkFDdkUsd0RBQXdEO2dCQUN4RCx3RUFBd0U7Z0JBQ3hFLElBQUksQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3JGLHVFQUF1RTtnQkFDdkUseUVBQXlFO2dCQUN6RSx5RUFBeUU7Z0JBQ3pFLDZDQUE2QztnQkFDN0MsTUFBTSxHQUFHLEdBQUksSUFBSSxDQUFDLE1BQWMsQ0FBQyxTQUFTLENBQUM7Z0JBQzNDLEdBQUcsRUFBRSxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUNwRSxJQUFJLENBQUM7d0JBQ0YsSUFBSSxDQUFDLE1BQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JELENBQUM7b0JBQUMsTUFBTSxDQUFDO3dCQUNQLFdBQVc7b0JBQ2IsQ0FBQztvQkFDRCxJQUFJLENBQUM7d0JBQ0gsR0FBRyxFQUFFLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdEMsQ0FBQztvQkFBQyxNQUFNLENBQUM7d0JBQ1AsV0FBVztvQkFDYixDQUFDO2dCQUNILENBQUM7Z0JBQ0Qsd0VBQXdFO2dCQUN4RSx5RUFBeUU7Z0JBQ3pFLHNEQUFzRDtnQkFDdEQsSUFBSSxDQUFDLE1BQU07b0JBQUUsSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Z0JBQzlGLHlFQUF5RTtnQkFDekUsMEVBQTBFO2dCQUMxRSxJQUFJLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RSx1RUFBdUU7Z0JBQ3ZFLHVFQUF1RTtnQkFDdkUsSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLDRFQUE0RTtnQkFDNUUscUVBQXFFO2dCQUNyRSw2RUFBNkU7Z0JBQzdFLDBFQUEwRTtnQkFDMUUsNEVBQTRFO2dCQUM1RSwwRUFBMEU7Z0JBQzFFLDBDQUEwQztnQkFDMUMsSUFBSSxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxNQUFNO29CQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDM0MsNkRBQTZEO2dCQUM3RCx3RUFBd0U7Z0JBQ3hFLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSx3RUFBd0U7Z0JBQ3hFLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQzt3QkFDSCxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ25DLGlFQUFpRTt3QkFDakUsMERBQTBEO3dCQUMxRCwrREFBK0Q7d0JBQy9ELGlEQUFpRDt3QkFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN6QixDQUFDO29CQUFDLE1BQU0sQ0FBQzt3QkFDUCxlQUFlO29CQUNqQixDQUFDO2dCQUNILENBQUMsQ0FBQztnQkFDRixxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDN0IsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkIsVUFBVSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkIscUVBQXFFO2dCQUNyRSxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUsb0VBQW9FO2dCQUNwRSx1RUFBdUU7Z0JBQ3ZFLGdFQUFnRTtnQkFDaEUsdUVBQXVFO2dCQUN2RSxvREFBb0Q7Z0JBQ3BELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwRSxrRUFBa0U7Z0JBQ2xFLElBQUksQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsTUFBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDcEQsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU87b0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDZCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTyxDQUFDLElBQUksQ0FBQyxVQUFpQixDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxxQkFBcUIsQ0FBQyxFQUFzQixFQUFFLEtBQWlCO1FBQ3JFLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxjQUFjLEtBQUssV0FBVztZQUFFLE9BQU87UUFDekQsSUFBSSxFQUFFLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsWUFBWSxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsdUNBQXVDO1FBQzlGLE1BQU0sRUFBRSxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxFQUFFLENBQUM7WUFDVixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2YsNERBQTREO1FBQzVELFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssZUFBZSxDQUFDLENBQWlCLEVBQUUsT0FBZSxFQUFFLENBQVMsRUFBRSxPQUFnQjtRQUNyRiw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSwwQ0FBMEM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNuRixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUV0Qiw0RUFBNEU7UUFDNUUsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHVFQUF1RTtRQUN2RSxNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckQsTUFBTSxFQUFFLEdBQVEsSUFBSyxHQUFXLENBQUMsVUFBVSxDQUFDO1lBQzFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSztZQUNkLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTTtZQUNoQixRQUFRLEVBQUUsQ0FBQztZQUNYLFdBQVcsRUFBRSxDQUFDO1lBQ2QsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ25DLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDO1FBQ0YsZ0ZBQWdGO1FBQ2hGLGlGQUFpRjtRQUNqRiw0RUFBNEU7UUFDNUUsK0VBQStFO1FBQy9FLDZFQUE2RTtRQUM3RSwwRUFBMEU7UUFDMUUscUNBQXFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFJLEdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDakMsRUFBRSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxPQUFPLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUM7UUFDRixFQUFFLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUN0RCxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDcEcsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQ7Ozs7O29GQUtnRjtJQUNoRjs7Ozs2RUFJeUU7SUFDakUsa0JBQWtCO1FBQ3hCLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUk7WUFBRSxPQUFPLENBQUMsZ0NBQWdDO1FBQzVFLE1BQU0sR0FBRyxHQUNQLE9BQU8scUJBQXFCLEtBQUssVUFBVTtZQUN6QyxDQUFDLENBQUMscUJBQXFCO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDLEVBQXdCLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFzQixDQUFDO1FBQ3JGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLGtGQUFrRjtRQUNsRixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLEdBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFDZixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRCxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQztZQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDO1lBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLG9CQUFvQjtRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsb0JBQW9CO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFvQjtRQUN4QyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxVQUFVO2dCQUNiLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssZ0JBQWdCO2dCQUNuQixPQUFPLGdCQUFnQixDQUFDO1lBQzFCLEtBQUssY0FBYztnQkFDakIsT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGFBQWEsQ0FBQztZQUN2QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxhQUFhO2dCQUNoQixPQUFPLGFBQWEsQ0FBQztZQUN2QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxNQUFNLENBQUM7WUFDaEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sUUFBUSxDQUFDO1lBQ2xCO2dCQUNFLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLHFEQUFxRDtJQUN2RCxDQUFDO0lBQ0QsS0FBSztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ0QsUUFBUSxDQUFDLGNBQXlCO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUNoQiwwRUFBMEU7UUFDMUUsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSx3QkFBd0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asc0JBQXNCO1lBQ3hCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFDRixxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQixVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFDRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELFNBQVM7UUFDUCxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsTUFBTTtRQUNKLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFDRCxXQUFXLENBQUMsSUFBb0I7UUFDOUIseUVBQXlFO1FBQ3pFLHlFQUF5RTtRQUN6RSxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxZQUFZLENBQUMsVUFBbUI7UUFDOUIsMkRBQTJEO0lBQzdELENBQUM7SUFFRDs7c0ZBRWtGO0lBQ2xGLG1CQUFtQixDQUFDLE9BQWdCO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7UUFDaEMsTUFBTSxLQUFLLEdBQTZCLElBQUksQ0FBQyxNQUFjLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQztRQUNoRixJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3pELENBQUM7SUFFRDtzRkFDa0Y7SUFDbEYsd0JBQXdCLENBQUMsT0FBZ0I7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztRQUNoQyxNQUFNLE1BQU0sR0FBUyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQU0sQ0FBQztRQUNqRCxJQUFJLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLElBQUk7b0JBQUUsT0FBTztnQkFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2YsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTt3QkFBRSxPQUFPO29CQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDOUUsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztvQkFDckQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHO3dCQUFFLE9BQU87b0JBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQVMsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNMLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU87WUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSx1RUFBdUU7WUFDdkUsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztpQkFDcEMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUN6RjtpQkFDQSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDWixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTztnQkFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQ25ELE9BQU8sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDOUQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBUyxDQUFDLENBQUM7Z0JBQ2hELEtBQUssSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtZQUN2RSxDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLGtDQUFrQztRQUM5RCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRSxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxZQUFxQjtRQUNuQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDbkcsQ0FBQztJQUNELGVBQWU7UUFDYixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gscUJBQXFCO1FBQ25CLE1BQU0sTUFBTSxHQUFtQyxJQUFJLENBQUMsTUFBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDbkYsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCO1FBQ3BCLE1BQU0sRUFBRSxHQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzlELENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtRQUNYLDZFQUE2RTtRQUM3RSx5RUFBeUU7UUFDekUsNkVBQTZFO1FBQzdFLHdFQUF3RTtRQUN4RSx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLHFCQUFxQjtRQUNyQixNQUFNLE1BQU0sR0FBbUMsSUFBSSxDQUFDLE1BQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQ25GLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixJQUFJLElBQUk7Z0JBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxXQUFXLENBQUMsU0FBbUI7UUFDN0IscUNBQXFDO0lBQ3ZDLENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLDZCQUE2QjtJQUMvQixDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLDZCQUE2QjtJQUMvQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDtzRkFDa0Y7SUFDbEYsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7OzZEQUV5RDtJQUN6RCxLQUFLLENBQUMsdUJBQXVCLENBQUMsVUFBc0IsRUFBRSxPQUFlO1FBQ25FLG9FQUFvRTtJQUN0RSxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLDhCQUE4QixDQUFDLEVBQVUsRUFBRSxFQUFVLEVBQUUsTUFBYyxFQUFFLE9BQWUsRUFDdkQsT0FBZTtRQUM1QyxvRUFBb0U7SUFDdEUsQ0FBQztJQUVEOzRCQUN3QjtJQUNoQixrQkFBa0I7UUFDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVEO21EQUMrQztJQUN2QyxnQkFBZ0I7UUFDdEIsTUFBTSxFQUFFLEdBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSxtRUFBbUU7WUFDbkUsTUFBTSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDL0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQzlELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdkQsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLElBQUksQ0FBQyxDQUFDLHdCQUF3QjtRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVEO2tEQUM4QztJQUN0QyxhQUFhO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzVELElBQUksQ0FBQyxRQUFRLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JDLElBQUksSUFBSTtnQkFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JELElBQUksQ0FBQyxnQkFBZ0IsR0FBRztZQUN0QixtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDckQsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDakYsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWUsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDckYsa0JBQWtCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFlLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMzRixPQUFPLEVBQUUsS0FBSztZQUNkLDhFQUE4RTtZQUM5RSwwRUFBMEU7WUFDMUUsaUZBQWlGO1lBQ2pGLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQ2hELFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDO1NBQzVELENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQsdUZBQXVGO0lBQy9FLGVBQWUsQ0FBQyxNQUE2QixFQUFFLEtBQW9CO1FBQ3pFLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNoQixNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixzQkFBc0I7UUFDcEIsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0MsQ0FBQztJQUNELGdGQUFnRjtJQUNoRixvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsU0FBNkI7UUFDaEUseUJBQXlCO0lBQzNCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsNkVBQTZFO0lBQzdFLG1EQUFtRDtJQUVuRCx3RUFBd0U7SUFDeEUsNkVBQTZFO0lBQzdFLCtFQUErRTtJQUMvRSxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQWE7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsT0FBTztRQUNULENBQUM7UUFDRCwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFnQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELGNBQWMsQ0FBQyxPQUFZO1FBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQXNCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsWUFBWSxDQUFDLE1BQWUsRUFBRSxPQUFhO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLE9BQU87UUFDVCxDQUFDO1FBQ0QsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBaUIsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFDRCxlQUFlLENBQUMsT0FBWTtRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBRSxPQUF3QixFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsTUFBZTtRQUNqQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtZQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxxQkFBcUIsQ0FBQyxNQUFjO1FBQ2xDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxnQkFBZ0IsQ0FBQyxNQUFlO1FBQzlCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsNEJBQTRCO1lBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNEOytFQUMyRTtJQUMzRSxpQkFBaUI7UUFDZixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLGdEQUFnRDtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLENBQUMsNkNBQTZDO1FBQ3pFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsV0FBVyxDQUFDLEVBQVU7UUFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELGVBQWUsQ0FBQyxNQUFlO1FBQzdCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsK0JBQStCO1lBQ3ZFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELGVBQWUsS0FBVyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxjQUFjLEtBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckQ7O3FGQUVpRjtJQUN6RSxjQUFjO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDL0MsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDN0Qsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ2pELG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRO1lBQ3hDLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUNyRCxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBc0M7WUFDekUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlO1lBQ3ZDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtTQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDL0MsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDN0Qsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtZQUM3RCxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDckQsc0JBQXNCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQXNDO1lBQ3pFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1NBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLG1CQUFtQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7O2dEQUk0QztJQUNwQyxlQUFlO1FBQ3JCLE1BQU0sQ0FBQyxHQUFRLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQztRQUN6QixNQUFNLEVBQUUsR0FBNEIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztRQUMvQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLEVBQUUsWUFBWTtZQUFFLE9BQU87UUFDbkUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEYsSUFBSSxDQUFDO2dCQUNILEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUNELHdFQUF3RTtRQUN4RSxvREFBb0Q7UUFDcEQsMkVBQTJFO1FBQzNFLHFDQUFxQztRQUNyQywwRUFBMEU7UUFDMUUsZ0NBQWdDO1FBQ2hDLHlFQUF5RTtRQUN6RSxrQkFBa0I7UUFDbEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFtQyxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxhQUFtQyxDQUFDO1FBQzVELElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBQzdCLGtFQUFrRTtZQUNsRSx5RUFBeUU7WUFDekUsbUVBQW1FO1lBQ25FLHlEQUF5RDtZQUN6RCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDOUIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBQzdCLEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFrQixFQUFFLENBQUM7Z0JBQ2pFLElBQUksS0FBSyxLQUFLLE9BQU87b0JBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ3RELENBQUM7WUFDRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBa0IsRUFBRSxDQUFDO2dCQUNsRSxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsT0FBTztvQkFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDMUQsQ0FBQztZQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUM3QixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDOUIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEgseUNBQXlDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNoRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEVBQUUsR0FBRyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztRQUMzQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN2QyxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRztZQUN0RyxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUc7WUFDcEYsUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDcEgsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUNwRSxtQkFBbUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLGFBQWEsQ0FBYyxlQUFlLENBQUMsQ0FBQztRQUMzRixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLG9EQUFvRDtRQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDNUIsQ0FBQztJQUVEO2lGQUM2RTtJQUNyRSxXQUFXO1FBQ2pCLE9BQU87WUFDTCxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU87WUFDOUIsV0FBVyxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUM1RSxjQUFjLEVBQUUsQ0FBQyxNQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVEO3FDQUNpQztJQUN6QixjQUFjLENBQUMsV0FBcUI7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTztRQUNuRCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU87UUFDN0IsTUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssZ0JBQWdCO1FBQ3RCLElBQUksSUFBSSxDQUFDLGNBQWM7WUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQWEsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBa0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7UUFDckUsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLFFBQVEsQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFdEIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGdCQUFnQjtRQUN4QyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsa0JBQWtCO1FBQ2xFLHFFQUFxRTtRQUNyRSxNQUFNLE1BQU0sR0FBaUIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFlLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNsQixDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSxxRUFBcUU7UUFDckUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7UUFDckMsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sRUFBRSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtRQUM3RCxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ3BCLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQztZQUNSLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQUUsS0FBSyxFQUFFLGlDQUFpQztZQUNyRCxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDYixPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDZCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVTtRQUNsQyxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDaEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ25DLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQUUsT0FBTztRQUM3QixDQUFDO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsMEVBQTBFO1FBQ3BGLENBQUM7UUFFRCw2RUFBNkU7UUFDN0UsMkVBQTJFO1FBQzNFLDhFQUE4RTtRQUM5RSw0RUFBNEU7UUFDNUUsc0VBQXNFO1FBQ3RFLElBQUksR0FBRyxHQUFvQyxJQUFJLENBQUM7UUFDaEQsSUFBSSxDQUFDO1lBQ0gsR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asc0JBQXNCO1FBQ3hCLENBQUM7UUFDRCxJQUFJLEdBQUcsR0FBcUIsSUFBSSxDQUFDO1FBQ2pDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUM7Z0JBQ0gsR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsR0FBRyxHQUFHLElBQUksQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdEMsZ0RBQWdEO1lBQ2hELElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFVBQVU7WUFDWixDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDO29CQUNILEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLFVBQVU7Z0JBQ1osQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUs7Z0JBQUUsT0FBTyxDQUFDLDhDQUE4QztZQUM5RSxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDdEIsR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsR0FBRztnQkFBRSxPQUFPO1lBQ2pCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sQ0FBQyxpQkFBaUI7UUFDMUUsMkVBQTJFO1FBQzNFLDZEQUE2RDtRQUM3RCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDeEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLDZFQUE2RTtRQUM3RSx1RUFBdUU7UUFDdkUsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQztZQUFDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFBQyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQVU7UUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkcsTUFBTSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEMsSUFBSSxHQUFHLEdBQW9DLElBQUksQ0FBQztRQUNoRCxJQUFJLENBQUM7WUFBQyxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDOUUsSUFBSSxHQUFHLEdBQXFCLElBQUksQ0FBQztRQUNqQyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDL0QsSUFBSSxDQUFDO2dCQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUFDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUFDLENBQUM7UUFDbEcsQ0FBQztRQUNELElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQUMsR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUFDLElBQUksQ0FBQztvQkFBQyxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUFDLENBQUM7Z0JBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztnQkFBRSxPQUFPO1lBQy9CLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0MsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQzNDLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTztZQUNqQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBRWpCLDRFQUE0RTtRQUM1RSxpRUFBaUU7UUFDakUsK0VBQStFO1FBQy9FLCtEQUErRDtRQUMvRCxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ25CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUM3QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtZQUM1RSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNqQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQ3JCLDhFQUE4RTtRQUM5RSw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLDhDQUE4QztRQUM5QyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFDeEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLDZFQUE2RTtRQUM3RSxJQUFJLENBQUM7WUFBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVEOzt3REFFb0Q7SUFDcEQsWUFBWSxDQUFDLFlBQW9CLEVBQUUsS0FBYTtRQUM5QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELCtFQUErRTtJQUN2RSxlQUFlLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVEsSUFBSSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGFBQWEsQ0FBQyxZQUFvQixFQUFFLElBQVk7UUFDOUMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBQzFCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDdEMsd0VBQXdFO1FBQ3hFLE1BQU0sT0FBTyxHQUNYLE9BQU8sQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakYsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxvQkFBb0IsSUFBSSxDQUFDLE9BQU8sTUFBTSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3ZGLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUMvQixJQUFJLENBQUMsSUFBSTtpQkFDTixHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQ3ZELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FDekIsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkIsSUFBSSxJQUFJO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsS0FBSyxDQUFDLGVBQWU7UUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNyRCxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxnREFBZ0Q7UUFDeEUsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPO1FBQ2pCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDeEIsTUFBTSxJQUFJLEdBQW9CLEVBQUUsQ0FBQztRQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDcEMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLENBQUMsSUFBSSxDQUNQLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ1YsSUFBSSxDQUFDO3dCQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN6RCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDckMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUM7b0JBQ2hCLENBQUM7b0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzt3QkFDYiwrREFBK0Q7d0JBQy9ELE9BQU8sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUMvRSxDQUFDO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQ0wsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLG1FQUFtRTtZQUNuRSxPQUFPLENBQUMsSUFBSSxDQUFDLHNFQUFzRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsSUFBSSxJQUFJO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCwrREFBK0Q7SUFDdkQsU0FBUyxDQUFDLENBQW9CO1FBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsOENBQThDO0lBRTlDLHdFQUF3RTtJQUN4RSxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QiwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVU7Z0JBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O2dCQUN2RixZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUE0RCxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OEdBdDVEVSw4QkFBOEIsNENBNEkvQixnQkFBZ0IsbUxBTUosY0FBYyw0TUFNMUIsVUFBVTtrSEF4SlQsOEJBQThCLGNBRGpCLE1BQU07OzJGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFNdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFNakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkZWZlciwgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgT1NEX1pPT01fUEVSX1NDUk9MTCB9IGZyb20gJy4vb3NkLXpvb20nO1xuXG5cbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBWaXpDb25maWcsIFZJWl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUExPVF9UWVBFX0RFU0NSSVBUT1JTLCBQbG90VHlwZURlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzLCBWaWV3ZXJGZWF0dXJlLCBjYXBhYmlsaXRpZXNPZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE9zZFNjYWxlQmFyIH0gZnJvbSAnLi9vc2Qtc2NhbGUtYmFyJztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9vc2QtY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGxvdE1vZGVSZWN0LCBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlUmVjdFRvVmlld3BvcnQsIHZpZXdwb3J0UmVjdFRvSW1hZ2UgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUaWxlVXJsLCBmZXRjaFRpbGVCaXRtYXAgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IFNsaWNlQ2FjaGUgfSBmcm9tICcuL3NsaWNlLWNhY2hlJztcbmltcG9ydCB7IERpc3BsYXlQaXBlbGluZSB9IGZyb20gJy4vZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgeyBIaXN0b2dyYW1TYW1wbGVyIH0gZnJvbSAnLi9oaXN0b2dyYW0tc2FtcGxlcic7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsIFZlcnRleEVyYXNlclRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlLCBab29tVG9Cb3hUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG4vKipcbiAqIFF1aWV0IE9wZW5TZWFkcmFnb24ncyBcIltWaWV3cG9ydC4qXSBpcyBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZVwiIGFkdmlzb3JpZXMuXG4gKiBBIG11bHRpY2hhbm5lbCBpbWFnZSBpcyBjb21wb3NpdGVkIGZyb20gb25lIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwg4oCUIGEgbGVnaXRpbWF0ZVxuICogbXVsdGktaW1hZ2Ugd29ybGQg4oCUIGFuZCBPU0QgbG9ncyB0aGF0IGFkdmlzb3J5IChhdCBlcnJvciBsZXZlbCkgZnJvbSBpdHMgb3duXG4gKiBuYXZpZ2F0b3Ivb3ZlcnZpZXcgcmVuZGVyaW5nIG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSwgZmxvb2RpbmcgdGhlIGNvbnNvbGUuIE91clxuICogb3duIGltYWdlPC0+dmlld3BvcnQgY29udmVyc2lvbnMgYWxyZWFkeSByb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAoc2VlXG4gKiBvc2QtY29vcmRzKSwgc28gdGhlIHJlbWFpbmluZyBhZHZpc29yaWVzIGFyZSBPU0QtaW50ZXJuYWwgYW5kIG9ubHkgYWZmZWN0IHRoZVxuICogbWluaW1hcCdzIGJveCBhY2N1cmFjeSAoY29zbWV0aWMpLiBUaGlzIHdyYXBzIE9TRCdzIGxvZ2dlciBpbiBhIFByb3h5IHRoYXQgZHJvcHNcbiAqIG9ubHkgdGhhdCBvbmUgbWVzc2FnZSBzdHJpbmcgYW5kIGZvcndhcmRzIGV2ZXJ5IG90aGVyIGxvZyB1bnRvdWNoZWQuIElkZW1wb3RlbnQuXG4gKi9cbmZ1bmN0aW9uIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTogdm9pZCB7XG4gIGNvbnN0IG9zZDogYW55ID0gT1NEIGFzIGFueTtcbiAgaWYgKG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQpIHJldHVybjtcbiAgY29uc3QgYmFzZTogYW55ID0gKG9zZC5jb25zb2xlICYmIHR5cGVvZiBvc2QuY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IG9zZC5jb25zb2xlXG4gICAgOiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnID8gY29uc29sZSA6IG51bGwpO1xuICBpZiAoIWJhc2UpIHJldHVybjtcbiAgY29uc3QgaXNBZHZpc29yeSA9IChhOiB1bmtub3duKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ25vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlJykgIT09IC0xO1xuICBvc2QuY29uc29sZSA9IG5ldyBQcm94eShiYXNlLCB7XG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSB0YXJnZXRbcHJvcF07XG4gICAgICBpZiAoKHByb3AgPT09ICdlcnJvcicgfHwgcHJvcCA9PT0gJ3dhcm4nKSAmJiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7IGlmIChpc0Fkdmlzb3J5KGFyZ3NbMF0pKSByZXR1cm47IG9yaWcuYXBwbHkodGFyZ2V0LCBhcmdzKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJyA/IG9yaWcuYmluZCh0YXJnZXQpIDogb3JpZztcbiAgICB9LFxuICB9KTtcbiAgb3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCA9IHRydWU7XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7IHJlczogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxuXG4vKiogVGlsZS1zb3VyY2UgZGVzY3JpcHRvciByZXR1cm5lZCBieSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBiaXREZXB0aD86IG51bWJlcjsgbWluQWxsb3dlZD86IG51bWJlcjsgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0gKDAgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KS4gKi9cbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYGxvYWQoKWAgaGFuZHMgdG8gYHBsb3QoKWAuICovXG5pbnRlcmZhY2UgT3NkTG9hZGVkIHtcbiAgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsO1xuICBpbmZvQjY0OiBzdHJpbmc7XG4gIHo6IG51bWJlcjtcbiAgLyoqIE1pcnJvcnMgdGhlIGxvYWRlZCBpbWFnZSdzIGZpbGVuYW1lIOKAlCB0aGUgZGlhZ3JhbSdzIHJlbmRlciBwaXBlbGluZVxuICAgKiAgZ3VhcmRzIG9uIGBsb2FkZWQuZmlsZW5hbWUgPT09IHBoYXNlSW5mby5maWxlTmFtZWAgYmVmb3JlIGNhbGxpbmcgcGxvdCgpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogU2ltcGxlIChub24tdGlsZWQpIGltYWdlOiBgcGxvdCgpYCBvcGVucyB7QGxpbmsgdXJsfSBkaXJlY3RseSB2aWEgT1NEJ3NcbiAgICogIHNpbmdsZS1pbWFnZSBzb3VyY2Ug4oCUIG5vIHRpbGUgcHlyYW1pZCwgbm8gc2VydmVyLiBTZXQgd2hlbiB0aGUgaW1hZ2VcbiAgICogIGNhcnJpZXMgYHRpbGVkID09PSBmYWxzZWAgKHNlZSB7QGxpbmsgSUltYWdlSW5mby50aWxlZH0pLiAqL1xuICBzaW1wbGU/OiBib29sZWFuO1xuICAvKiogVGhlIGRpcmVjdGx5LWxvYWRhYmxlIGltYWdlIFVSTCAoYGJsb2I6YC9gZGF0YTpgL2BodHRwYCkgZm9yIHNpbXBsZSBtb2RlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiB2aXN1YWxpemF0aW9uIGJhY2tlbmQuXG4gKlxuICogUmVuZGVycyB0aGUgKmltYWdlKiBwbG90IHR5cGUgYXMgYSBuYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyLCBiYWNrZWQgYnlcbiAqIHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cyAoYEdFVCAvdGlsZXMvaW5mb2AgKyBgR0VUIC90aWxlYCwgd2hpY2ggcmV1c2VcbiAqIHRoZSBCaW8tRm9ybWF0cyBST0kgcmVuZGVyZXIpLiBQbG90bHkga2VlcHMgdGhlIHNjaWVudGlmaWMvZGF0YSBwbG90IHR5cGVzXG4gKiAoc2NhbGFyIGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkg4oCUXG4gKiBoZW5jZSB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBvbmx5IGBJbWFnZURpc3BsYXlgLlxuICpcbiAqIFdpcmVkOiBsb2FkIOKGkiBkZXNjcmlwdG9yLCBwbG90IOKGkiBtb3VudCB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSxcbiAqIHpvb20vcGFuIOKGkiB2aWV3cG9ydCBBUEkuIE5PVCB3aXJlZCB5ZXQgKGZvbGxvdy11cHMpOiByZWdpb24gb3ZlcmxheXMgKyB0b29sc1xuICogKGEgcG9zaXRpb25lZCBjYW52YXMvU1ZHIG92ZXJsYXkgb3IgQW5ub3RvcmlvdXMpLCBwaXhlbCByZWFkYmFjaywgYW5kIHRoZVxuICogcGVyLXRpbGUgTFVUL2NvbnRyYXN0IHBhcmFtcy4gTm90IHJlZ2lzdGVyZWQgaW4gREkgcHJvdmlkZXJzIOKAlCBgUGxvdGx5U2VydmljZWBcbiAqIGlzIHN0aWxsIHRoZSBvbmx5IGFjdGl2ZSBiYWNrZW5kOyB0aGlzIHByb3ZlcyB0aGUgY29udHJhY3Qgc3VwcG9ydHMgYSBzZWNvbmRcbiAqIGltcGxlbWVudGF0aW9uIGFnYWluc3QgcmVhbCBlbmRwb2ludHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgLyoqIE9TRCdzIHN0cmVuZ3RoIGlzIGRpc3BsYXlpbmcgYSBsYXJnZSB6b29tYWJsZSBpbWFnZSDigJQgbm90aGluZyBlbHNlIGhlcmUuICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1ZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5XSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcbiAgcHJpdmF0ZSB2aWV3ZXI6IE9wZW5TZWFkcmFnb24uVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogT3NkU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICAvKiogQmFzZTY0IFJhd0ZpbGVJbmZvICsgY3VycmVudCB6LXNsaWNlLCBrZXB0IHNvIHNldFpJbmRleCBjYW4gcmVidWlsZCB0aGVcbiAgICogIHRpbGUgc291cmNlIGFuZCBzd2FwIHNsaWNlcyBsaXZlIChzdGFjayBuYXZpZ2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbmZvQjY0ID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFogPSAwO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY3VycmVudCBpbWFnZSBpcyBcInNpbXBsZVwiICh0aWxlZDpmYWxzZSDigJQgc2VsZi1jb250YWluZWRcbiAgICogIHBlci1zbGljZSBVUkxzLCBubyB0aWxlIHNlcnZlcjsgZS5nLiBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWRcbiAgICogIGNsaWVudC1zaWRlIGludG8gYSBzdGFjaykuIHNldFpJbmRleCBzd2FwcyB0aGUgc2luZ2xlLWltYWdlIHNvdXJjZSBmb3JcbiAgICogIHRoZSBuZXcgc2xpY2UncyBVUkwgaW5zdGVhZCBvZiB1cGRhdGluZyBhIHRpbGVkIHotcGFyYW0uICovXG4gIHByaXZhdGUgc2ltcGxlTW9kZSA9IGZhbHNlO1xuICAvKiogdXJsc1tdIGZvciB0aGUgY3VycmVudCBzaW1wbGUtbW9kZSBpbWFnZSwgc28gc2V0WkluZGV4IGNhbiBsb29rIHVwIHRoZVxuICAgKiAgc2xpY2UgYmVpbmcgc2NydWJiZWQgdG8gKHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLnVybEZvcn0pLlxuICAgKiAgVW51c2VkIChhbmQgbGVmdCBzdGFsZSwgaGFybWxlc3NseSkgaW4gdGlsZWQgbW9kZS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogcHJldmlldyBibG9iIFVSTCDihpIgZnVsbC1yZXMgdXBzY2FsZWQgYmxvYiBVUkwgKHNlZSB0b0Z1bGxSZXNVcmwpLCBzb1xuICAgKiAgcmUtdmlzaXRpbmcgYSBzaW1wbGUtbW9kZSBzbGljZSBkb2Vzbid0IHJlLXVwc2NhbGUuIFJldm9rZWQgb24gZmlsZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlRnVsbFJlc1VybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbENvdW50PjEpOiB0aGUgc3RhY2snc1xuICAgKiAgcGVyLXNsaWNlIHBlci1jaGFubmVsIHBsYW5lIFVSTHMsIHRoZSBjdXJyZW50IHNsaWNlJ3MgZGVjb2RlZCBwbGFuZXMsIGFuZFxuICAgKiAgdGhlIGxhc3QgY29tcG9zaXRlIGJsb2IgVVJMLiBDb21wb3NpdGVkIGNsaWVudC1zaWRlIHZpYSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXRcbiAgICogIChubyB0aWxlIHNlcnZlcik7IGtlcHQgT0ZGIHRoZSB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoLiAqL1xuICBwcml2YXRlIHNpbXBsZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxVcmxzOiBzdHJpbmdbXVtdID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDb21wb3NpdGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2tpcCB0aGUgZnVsbC1yZXMgdXBzY2FsZSBhYm92ZSB0aGlzIGxvbmdlc3Qtc2lkZSBkaW1lbnNpb24g4oCUIGEgZm9sZGVyXG4gICAqICBzdGFjayBpcyBwZXItZmlsZSBwcmV2aWV3cyAod2VsbCB1bmRlciB0aGlzKTsgdGhpcyBvbmx5IGd1YXJkcyBhZ2FpbnN0IGFuXG4gICAqICBhY2NpZGVudGFsIGVub3Jtb3VzIGNhbnZhcyBhbGxvY2F0aW9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNJTVBMRV9VUFNDQUxFX01BWF9ESU0gPSA4MTkyO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBPc2RDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLyoqIFRoZSB2aXNpYmxlIHJlY3Qgb24gZXZlcnkgcmVkcmF3LCBjb2FsZXNjZWQgdG8gb25lIGVtaXNzaW9uIHBlciBhbmltYXRpb25cbiAgICogIGZyYW1lLiBGZWVkcyB7QGxpbmsgUGxvdE1vZGVWaWV3cG9ydC5mcmFtZSR9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZyYW1lJCA9IG5ldyBTdWJqZWN0PFBsb3RNb2RlUmVjdD4oKTtcbiAgcHJpdmF0ZSBmcmFtZVJhZjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxvdE1vZGVWaWV3cG9ydDogUGxvdE1vZGVWaWV3cG9ydCB8IG51bGwgPSBudWxsO1xuICAvLyBSZWdpb24gc3RhdGUgKHJlZ2lvbnMsIHNlbGVjdGlvbiwgdGhlIHVwZGF0ZSBldmVudCkgbGl2ZXMgaW4gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZTsgdGhlIElSZWdpb25TdG9yZSBtZXRob2RzIGJlbG93IGRlbGVnYXRlIHRvIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVByb2ZpbGUkID0gbmV3IFN1YmplY3Q8SW50ZW5zaXR5UHJvZmlsZVtdPigpO1xuICAvLyBJbWFnZSBtZXRhZGF0YSBhbmQgY2xhc3NpZmljYXRpb24gY29sb3VycyBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLlxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgY29sb3JtYXAvcmV2ZXJzZSBzbyBPU0QgcmVjb2xvcnMgaW5cbiAgICogbG9jay1zdGVwIHdpdGggUGxvdGx5LiBJZGVtcG90ZW50IGFuZCBzZWxmLWhlYWxpbmc6IHRoaXMgc2VydmljZSBpcyBhIHJvb3RcbiAgICogc2luZ2xldG9uLCBidXQgYHVuc3Vic2NyaWJlKClgIChjYWxsZWQgb24gVmlzdWFsaXplckNvbXBvbmVudCBkZXN0cm95KVxuICAgKiB0ZWFycyB0aGUgc3Vic2NyaXB0aW9uIGRvd24g4oCUIGFuZCB0aGUgY29uc3RydWN0b3IgbmV2ZXIgcnVucyBhZ2Fpbi4gU29cbiAgICogYHBsb3QoKWAgY2FsbHMgdGhpcyB0byByZS1lc3RhYmxpc2ggaXQgYWZ0ZXIgYSBjb21wb25lbnQgdGVhcmRvd24vcmVjcmVhdGVcbiAgICogKGUuZy4gc3dpdGNoaW5nIGltYWdlcyksIG90aGVyd2lzZSBjb2xvcm1hcCBjaGFuZ2VzIHdvdWxkIGJlIHNpbGVudGx5XG4gICAqIGRyb3BwZWQgb24gZXZlcnkgaW1hZ2UgYWZ0ZXIgdGhlIGZpcnN0IHN3aXRjaC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29sb3JtYXBTdWIpIHJldHVybjtcbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlXG4gICAgLy8gb2YgdHJ1dGggZm9yIGJvdGggYmFja2VuZHMuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjaGFuZ2VzLCBzbyBPU0QgcmVjb2xvcnMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgKyBwZXItY2hhbm5lbCB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSArIGludmVydCBhbGwgbGl2ZSBpblxuICAgIC8vIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBhbnkgb2YgdGhlbSBjaGFuZ2VzLCBzbyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB1cGRhdGVzIHRoZVxuICAgIC8vIGltYWdlIGxpdmUgYW5kIE9TRCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjbSwgcmV2LCBjaGFubmVscywgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jb2xvckx1dCA9IGJ1aWxkQ29sb3JtYXBMdXQoY20/LmRhdGE/LnZhbHVlLCAhIXJldik7XG4gICAgICB0aGlzLmNoYW5uZWxTdGF0ZXMgPSBjaGFubmVscztcbiAgICAgIHRoaXMuaW52ZXJ0QmcgPSAhIWludmVydDtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsOiByZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkXG4gICAgICAvLyBwbGFuZXMgd2l0aCB0aGUgbmV3IGNoYW5uZWwgc3RhdGVzICsgcmUtb3BlbiAobm8gdGlsZS1pbnZhbGlkYXRlIHBhdGgpLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7IHZvaWQgdGhpcy5yZWNvbXBvc2l0ZUFuZE9wZW4oKTsgcmV0dXJuOyB9XG4gICAgICAvLyBNdWx0aWNoYW5uZWw6IGVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIFRpbGVkSW1hZ2Ug4oCUIHZpc2liaWxpdHkgaXMgdGhlXG4gICAgICAvLyBpbWFnZSdzIG9wYWNpdHkgKHdpbmRvdy9nYW1tYS9jb2xvdXIgYXJlIGFwcGxpZWQgYnkgcmVjb2xvckNoYW5uZWxUaWxlXG4gICAgICAvLyBvbiB0aGUgaW52YWxpZGF0ZSBiZWxvdykuIFJlLWFwcGx5aW5nIHRoZSBjdXJyZW50IHNsaWNlJ3MgcmV2ZWFsIHBpY2tzIHVwXG4gICAgICAvLyB0aGUgbmV3IHBlci1jaGFubmVsIHZpc2liaWxpdHkgKGNhY2hlZCBzbGljZXMgc3RheSBoaWRkZW4pLlxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5yZXZlYWxDaGFubmVsU2xpY2UodGhpcy5jdXJyZW50Wik7XG4gICAgICB9XG4gICAgICAvLyByZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKSByZXN0b3JlcyBlYWNoIHRpbGUgdG8gaXRzIG9yaWdpbmFsIGRhdGEgYmVmb3JlXG4gICAgICAvLyByZS1ydW5uaW5nIHJlY29sb3JUaWxlLCBzbyBhIGNoYW5nZSBhbHdheXMgbWFwcyBhZnJlc2ggKG5vIGNvbXBvdW5kaW5nKS5cbiAgICAgIC8vIFJHQiBub3cgcmVjb2xvcnMgdG9vIChwZXItY2hhbm5lbCB3aW5kb3cvdmlzaWJpbGl0eSksIHNvIGRvbid0IGdhdGUgb25cbiAgICAgIC8vIGdyYXlzY2FsZS4gQ29hbGVzY2VkOiBQcmltZU5HJ3Mgc2xpZGVyIGZpcmVzIChvbkNoYW5nZSkgY29udGludW91c2x5LCBzb1xuICAgICAgLy8gYSBzaW5nbGUgZHJhZyB3b3VsZCBvdGhlcndpc2UgcXVldWUgZG96ZW5zIG9mIG92ZXJsYXBwaW5nIHJlc3RvcmUgK1xuICAgICAgLy8gcmUtcHJvY2VzcyByb3VuZHMgb3ZlciBldmVyeSBjaGFubmVsIGltYWdlLlxuICAgICAgdGhpcy5zY2hlZHVsZUludmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZWVkIHRoZSBJbnRlbnNpdHkgY2hhbm5lbCB3aXRoIGEgbWVhc3VyZWQgYXV0by13aW5kb3cgd2hpbGUgaXQncyBzdGlsbFxuICAgKiAgYXQgZnVsbCByYW5nZSAobmV2ZXIgY2xvYmJlciB0aGUgdXNlcidzIG1hbnVhbCB3aW5kb3cpOyBpZiB0aGUgdXNlclxuICAgKiAgYWxyZWFkeSB3aW5kb3dlZCwganVzdCByZS1pbnZhbGlkYXRlIHNvIHBhaW50ZWQgdGlsZXMgcGljayB0aGUgTFVUIHVwLiAqL1xuICBwcml2YXRlIHNlZWRHcmF5V2luZG93KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNoMCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICBpZiAoY2gwICYmIGNoMC5taW4gPT09IDAgJiYgY2gwLm1heCA9PT0gMjU1KSB7XG4gICAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZSgwLCB7IG1pbiwgbWF4IH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5jb2xvckx1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSB0aWxlLXNvdXJjZSBkZXNjcmlwdG9yIGZvciB0aGUgc2VsZWN0ZWQgZmlsZS4gVGhlIGBpbmZvYCBwYXJhbSBpc1xuICAgKiB0aGUgYmFzZTY0IFJhd0ZpbGVJbmZvIHRoZSByZXN0IG9mIHRoZSBBUEkgdXNlczsgdGhlIEdFVCBnb2VzIHRocm91Z2ggdGhlXG4gICAqIGF1dGggaW50ZXJjZXB0b3IgKEJlYXJlcikuIFdlIGFsc28gZ3JhYiBhIHRva2VuIGhlcmUgZm9yIE9TRCdzIG93biB0aWxlXG4gICAqIGZldGNoZXMgKGl0cyBsb2FkZXIgYnlwYXNzZXMgSHR0cENsaWVudCkuXG4gICAqL1xuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICAvLyBBIGRpZmZlcmVudCBpbWFnZSB3YXMgc2VsZWN0ZWQg4oCUIHN0b3AgdGhlIHByZXZpb3VzIHN0YWNrJ3MgYmFja2dyb3VuZFxuICAgIC8vIGxvYWRpbmcgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBmaW5pc2ggYmVoaW5kIHRoZSBuZXcgaW1hZ2UuXG4gICAgaWYgKGZpbGVuYW1lICYmIHRoaXMuY3VycmVudEZpbGVOYW1lICYmIGZpbGVuYW1lICE9PSB0aGlzLmN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgICAgdGhpcy5yZXZva2VTaW1wbGVGdWxsUmVzVXJscygpO1xuICAgIH1cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGZpbGVuYW1lKTtcbiAgICAvLyBTaW1wbGUgKGluLW1lbW9yeSAvIG5vbi10aWxlZCkgaW1hZ2U6IHNraXAgdGhlIHRpbGUgc2VydmVyIGVudGlyZWx5IOKAlCBub1xuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCwgbm8gL3RpbGVzL2luZm8gcG9sbC4gYHVybHNbekluZGV4XWAgaXMgYSBjb21wbGV0ZSBpbWFnZVxuICAgIC8vIE9TRCBvcGVucyB2aWEgaXRzIHNpbmdsZS1pbWFnZSBzb3VyY2UgKHNlZSBwbG90KCkpLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGltYWdlSW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRTaW1wbGUoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlcy5nZXRBdXRoSGVhZGVycygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9OyAvLyBmYWxsIGJhY2sgdG8gY29va2llIGF1dGggKGFqYXhXaXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICAgIC8vIFBvbGwgL3RpbGVzL2luZm86IHRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2UgZmlsZSBpcyBzdGlsbFxuICAgIC8vIGJlaW5nIGNhY2hlZCAoR0NTLT5QVkMpIOKAlCBpdCBraWNrcyB0aGUgZG93bmxvYWQgb2ZmIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGVhY2ggcmVxdWVzdCBpcyBzaG9ydCAobm8gbG9uZy1oZWxkIGNvbm5lY3Rpb24gdG8gdHJpcCBpbmdyZXNzL3Byb3h5IG9yXG4gICAgLy8gY2xpZW50IHRpbWVvdXRzKSwgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgaXQncyByZWFkeS4gVGhlXG4gICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSBzaG93cyBwcm9ncmVzcyBkdXJpbmcgdGhlIHdhaXQuIFdlIGdpdmUgdXAgYWZ0ZXJcbiAgICAvLyB0aWxlc0luZm9UaW1lb3V0TXMgc28gdGhlIHJlbmRlciBwaXBlbGluZSBuZXZlciBoYW5ncyAodGhlIHJvdXRlciB0aGVuXG4gICAgLy8gZmFsbHMgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UpLlxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfXRpbGVzL2luZm8/aW5mbz0ke2luZm9CNjR9YDtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLnRpbGVzSW5mb1RpbWVvdXRNcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGlsZXMvaW5mbyBub3QgcmVhZHkgYmVmb3JlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmcnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PFRpbGVEZXNjcmlwdG9yPih1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKHRpbWVvdXQoNDUwMDApKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDAgJiYgcmVzcC5ib2R5KSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gcmVzcC5ib2R5O1xuICAgICAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IHJlc3AuYm9keSwgaW5mb0I2NCwgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gMjAyIEFjY2VwdGVkIChvciBlbXB0eSBib2R5KSDihpIgc3RpbGwgY2FjaGluZzsgZmFsbCB0aHJvdWdoIGFuZCByZS1wb2xsLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFRvbGVyYXRlIHRyYW5zaWVudCBmYWlsdXJlcyBXSElMRSB0aGUgZmlsZSBpcyBiZWluZyBwcmVwYXJlZDogYSBzbG93XG4gICAgICAgIC8vIG1ldGFkYXRhIHJlYWQgb24gYSBtdWx0aS1HQiBmaWxlIChJRkQgd2FsayksIGEgNXh4IG1pZC1waXBlbGluZSwgYVxuICAgICAgICAvLyBwcm94eSBoaWNjdXAuIEEgc2luZ2xlIGJhZCBwb2xsIG11c3QgTk9UIGRyb3AgdXMgdG8gUGxvdGx5IOKAlCBhIGxhcmdlXG4gICAgICAgIC8vIGltYWdlIGFsd2F5cyBwYXNzZXMgdGhyb3VnaCB0aGlzIGJ1c3kgd2luZG93LCBzbyBiYWlsaW5nIGhlcmUgaXMgd2h5XG4gICAgICAgIC8vIGl0IFwiYWx3YXlzIGVuZHMgdXAgb24gUGxvdGx5XCIuIEtlZXAgcG9sbGluZyB1bnRpbCByZWFkeSBvciBkZWFkbGluZS5cbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTUwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgYHBsb3QoKWAgcGF5bG9hZCBmb3IgYSBzaW1wbGUgKHRpbGVkOmZhbHNlKSBpbWFnZTogYSBzaW5nbGUtbGV2ZWxcbiAgICogIGRlc2NyaXB0b3Igc2l6ZWQgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAsIHBsdXMgdGhlIGRpcmVjdGx5LWxvYWRhYmxlIFVSTCDigJRcbiAgICogIHJlc29sdmVkIGFuZCBmZXRjaGVkIHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlfSAoc2hhcmVkIHdpdGhcbiAgICogIG5hcGFyaS1qczsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIHJhdyBgZmV0Y2goKWAvYDxpbWc+YCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZShpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgY29uc3QgbWV0YSA9IGltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICAvLyBTRVJWRVJMRVNTIE1VTFRJQ0hBTk5FTDogY29tcG9zaXRlIHRoZSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lc1xuICAgIC8vIGNsaWVudC1zaWRlIChubyB0aWxlIHNlcnZlciksIGRyaXZlbiBieSB0aGUgY2hhbm5lbCBwYW5lLiBLZXB0IE9GRiB0aGVcbiAgICAvLyB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoIChzZWUgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKS5cbiAgICBjb25zdCBjaFVybHMgPSBpbWFnZUluZm8uY2hhbm5lbFVybHM7XG4gICAgdGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwgPSAhIWNoVXJscz8ubGVuZ3RoICYmIChtZXRhPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGxldCB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBjaFVybHMgYXMgc3RyaW5nW11bXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXMoY2hVcmxzIVt6XSA/PyBjaFVybHMhWzBdKTtcbiAgICAgICAgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgLy8gTkI6IGhpc3RvZ3JhbXMgYXJlIGJpbm5lZCBpbiBwbG90KCksIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgY2xlYXJzIHRoZVxuICAgICAgICAvLyBzYW1wbGVyIOKAlCBjb21wdXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHdpcGVkIGJ5IHRoYXQgY2xlYXIuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gW107XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJhd1VybCA9IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGltYWdlSW5mbywgeik7XG4gICAgICBpZiAocmF3VXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKTtcbiAgICAgICAgICAvLyBVcHNjYWxlIHRoZSAoZG93bnNjYWxlZCkgcHJldmlldyB0byBmdWxsIHJlc29sdXRpb24gc28gT1NEJ3Mgd29ybGRcbiAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSDigJQgc2VlIHRvRnVsbFJlc1VybC5cbiAgICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGxvYWRhYmxlIFVSTCAoZW1wdHkgdXJsc1tdIG9yIHRoZSBmZXRjaCBmYWlsZWQpOiBzaWduYWwgXCJjb3VsZG4ndFxuICAgIC8vIGxvYWRcIiB3aXRoIGEgbnVsbCBkZXNjcmlwdG9yIOKAlCBzYW1lIGFzIHRoZSB0aWxlZCBwYXRoIHdoZW4gdGhlcmUncyBub1xuICAgIC8vIHNlbGVjdGVkLWZpbGUgaW5mbyDigJQgc28gcGxvdCgpIHJldHVybnMgZmFsc2UgKGl0cyBgaWYgKCFkKWAgZ3VhcmQpIGFuZFxuICAgIC8vIHRoZSByb3V0ZXIgY2FuIGZhbGwgYmFjaywgaW5zdGVhZCBvZiBtb3VudGluZyBhbiA8aW1nPiB3aXRoIGFuIHVuZGVmaW5lZFxuICAgIC8vIHNyYyB0aGF0IHRocm93cyBhdCBydW50aW1lLlxuICAgIGlmICghdXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGhhcyBubyBsb2FkYWJsZSBVUkw7IHNraXBwaW5nIE9TRCByZW5kZXInLCBmaWxlbmFtZSk7XG4gICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgeiwgZmlsZW5hbWUgfTtcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpbGVTaXplOiAwLCAgICAgICAgICAgIC8vIHVudXNlZDogc2ltcGxlIG1vZGUgbmV2ZXIgY2FsbHMgYnVpbGRUaWxlU291cmNlXG4gICAgICB6OiAxLCAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZnJhbWVcbiAgICAgIGNoYW5uZWxzOiBtZXRhPy5yZ2JDaGFubmVscyA/PyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlID8gMSA6IDMpLFxuICAgICAgbXVsdGljaGFubmVsOiBmYWxzZSxcbiAgICAgIHJlYWxMZXZlbHM6IDEsXG4gICAgICBsZXZlbHM6IFt7IHJlczogMCwgd2lkdGgsIGhlaWdodCB9XSxcbiAgICAgIG1wcFg6IG1ldGE/Lm1wcFggPz8gMCxcbiAgICAgIG1wcFk6IG1ldGE/Lm1wcFkgPz8gMCxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgaW5mb0I2NDogJycsXG4gICAgICB6LFxuICAgICAgZmlsZW5hbWUsXG4gICAgICBzaW1wbGU6IHRydWUsXG4gICAgICB1cmwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0QncyBge3R5cGU6J2ltYWdlJ31gIHNvdXJjZSBzaXplcyBpdHMgY29vcmRpbmF0ZSB3b3JsZCB0byB0aGUgaW1hZ2Unc1xuICAgKiBOQVRVUkFMIHBpeGVscy4gQSBmb2xkZXItc3RhY2sgc2xpY2UgaXMgYSBzZXJ2ZXIgYC9wcmV2aWV3YCB3aG9zZSBwaXhlbCBzaXplXG4gICAqIG5lZWRuJ3QgbWF0Y2ggdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSDigJQgaXQgbWF5IGJlIGRvd25zY2FsZWQgKGxhcmdlXG4gICAqIGltYWdlcykgT1IgbGFyZ2VyIHRoYW4gdGhlIGRpbWVuc2lvbnMgYC9tZXRhZGF0YWAgcmVwb3J0cy4gRWl0aGVyIHdheSBPU0Qnc1xuICAgKiB3b3JsZCB3b3VsZCBkaWZmZXIgZnJvbSB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2UgKFF1UGF0aCBnZW9qc29uLFxuICAgKiBpbiBsZXZlbC0wIHBpeGVscyk6IGEgc21hbGxlciBwcmV2aWV3IHJlbmRlcnMgUk9JcyBvdmVyc2l6ZWQsIGEgbGFyZ2VyIG9uZVxuICAgKiByZW5kZXJzIHRoZW0gdW5kZXJzaXplZC9vZmZzZXQuIFJlc2FtcGxlIHRoZSBwcmV2aWV3IHRvIEVYQUNUTFkgdGhlXG4gICAqIGZ1bGwtcmVzb2x1dGlvbiBkaW1lbnNpb25zIChibHVycnkgYnV0IHBvc2l0aW9uYWxseSBleGFjdCDigJQgc2NhbGluZyB1cCBvclxuICAgKiBkb3duIGFzIG5lZWRlZCkgc28gT1NEJ3Mgd29ybGQgbWF0Y2hlcyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWxlIHN0aWxsXG4gICAqIHVzaW5nIE9TRCdzIHJlbGlhYmxlIHNpbmdsZS1pbWFnZSByZW5kZXJlci4gQ2FjaGVkIHBlciBwcmV2aWV3IFVSTCAocmV2b2tlZFxuICAgKiBvbiBmaWxlIGNoYW5nZSk7IGEgbm8tb3Agd2hlbiB0aGUgcHJldmlldyBpcyBhbHJlYWR5IGV4YWN0bHkgZnVsbC1yZXMgKHNtYWxsXG4gICAqIGltYWdlcywgaW4tbWVtb3J5IHBpcGVsaW5lIGJsb2JzKSwgd2hlbiB0aGUgZGltcyBhcmUgdW5rbm93biwgb3Igd2hlblxuICAgKiB0aGV5J3JlIGltcGxhdXNpYmx5IGxhcmdlIChndWFyZHMgYWdhaW5zdCBhbiBlbm9ybW91cyBjYW52YXMpLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0b0Z1bGxSZXNVcmwocHJldmlld1VybDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpID4gdGhpcy5TSU1QTEVfVVBTQ0FMRV9NQVhfRElNKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmdldChwcmV2aWV3VXJsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcHJldmlld1VybDsgLy8gY291bGRuJ3QgZGVjb2RlIOKAlCBsZXQgT1NEIHRyeSB0aGUgVVJMIGFzLWlzXG4gICAgfVxuICAgIC8vIEFscmVhZHkgdGhlIGV4YWN0IGZ1bGwtcmVzIHdvcmxkIOKAlCBubyByZXNhbXBsZSBuZWVkZWQuIChBIHByZXZpZXcgdGhhdCBpc1xuICAgIC8vIGxhcmdlciBPUiBzbWFsbGVyIHRoYW4gZnVsbC1yZXMgbXVzdCBzdGlsbCBiZSByZXNpemVkIHNvIE9TRCdzIHdvcmxkID09XG4gICAgLy8gdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlOyBvbmx5IGFuIGV4YWN0IG1hdGNoIGlzIHNraXBwYWJsZS4pXG4gICAgaWYgKGltZy5uYXR1cmFsV2lkdGggPT09IHdpZHRoICYmIGltZy5uYXR1cmFsSGVpZ2h0ID09PSBoZWlnaHQpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsgLy8gc2NhbGUgcHJldmlldyAodXAgb3IgZG93bikgdG8gZnVsbC1yZXNcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXNvbHZlKSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGZ1bGxSZXNVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuc2V0KHByZXZpZXdVcmwsIGZ1bGxSZXNVcmwpO1xuICAgIHJldHVybiBmdWxsUmVzVXJsO1xuICB9XG5cbiAgLyoqIFNhbXBsZSBhIFNJTVBMRS1tb2RlIHNsaWNlJ3Mgb3duIGRlY29kZWQgcGl4ZWxzIGludG8gdGhlIGhpc3RvZ3JhbSDigJQgdGhlXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgc2FtcGxlcnMgKG5vIHRpbGUgc2VydmVyKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICAgKiAgYSBkZWNvZGUgZmFpbHVyZSBqdXN0IGxlYXZlcyB0aGUgcGFuZSBlbXB0eSByYXRoZXIgdGhhbiB0aHJvd2luZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzYW1wbGVTaW1wbGVIaXN0b2dyYW0odXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwodXJsKTtcbiAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICBpZiAoIXcgfHwgIWgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlSGlzdG9ncmFtKHosIGRhdGEsIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIGhpc3RvZ3JhbSBzYW1wbGUgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggKyBkZWNvZGUgYSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lcyAoc2luZ2xlLWJhbmQgZ3JheXNjYWxlKSBpbnRvXG4gICAqICBwaXhlbCBidWZmZXJzLCBmb3IgdGhlIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGNvbXBvc2l0b3IuIEF1dGgtc2FmZTogZ29lc1xuICAgKiAgdGhyb3VnaCBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGJsb2I6L2RhdGE6IGFzLWlzOyBodHRwIHZpYSBIdHRwQ2xpZW50KS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyh1cmxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXJscyA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwodSk7XG4gICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGlmICghdyB8fCAhaCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgIGlmICghY3R4KSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gY2hhbm5lbCBwbGFuZSBkZWNvZGUgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IHBsYW5lcztcbiAgfVxuXG4gIC8qKiBDb21wb3NpdGUgdGhlIGNhY2hlZCBwZXItY2hhbm5lbCBwbGFuZXMgaW50byBPTkUgUkdCQSBpbWFnZSB1c2luZyB0aGVcbiAgICogIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgKGNvbG91ci93aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSkg4oCUIHRoZSBjbGllbnQtc2lkZSxcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBwZXItY2hhbm5lbCAnbGlnaHRlcicgY29tcG9zaXRvclxuICAgKiAgKHNhbWUgZGlzcGxheS5jaGFubmVsUmdiTHV0IG1hdGggYXMgcmVjb2xvckNoYW5uZWxUaWxlLCBhcHBsaWVkIHBlci1wbGFuZSkuXG4gICAqICBSZXR1cm5zIGEgYmxvYjogVVJMIG9mIHRoZSBjb21wb3NpdGUgUE5HLCByZXZva2luZyB0aGUgcHJldmlvdXMgb25lLiAqL1xuICBwcml2YXRlIGFzeW5jIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcztcbiAgICBpZiAoIXBsYW5lcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdyA9IHBsYW5lc1swXS53aWR0aCwgaCA9IHBsYW5lc1swXS5oZWlnaHQ7XG4gICAgaWYgKCF3IHx8ICFoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IHBsYW5lcy5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbY107XG4gICAgICBpZiAoc3QgJiYgc3QudmlzaWJsZSA9PT0gZmFsc2UpIGNvbnRpbnVlOyAvLyBoaWRkZW4gY2hhbm5lbCBjb250cmlidXRlcyBub3RoaW5nXG4gICAgICBjb25zdCBwbGFuZSA9IHBsYW5lc1tjXTtcbiAgICAgIGlmIChwbGFuZS53aWR0aCAhPT0gdyB8fCBwbGFuZS5oZWlnaHQgIT09IGggfHwgIXBsYW5lLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgciwgZywgYiB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgICAgY29uc3QgcGQgPSBwbGFuZS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKHBkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGx1bSA9IHBkW2ldOyAvLyBzaW5nbGUtYmFuZCBwbGFuZSAoUj1HPUIpXG4gICAgICAgIG91dFtpXSArPSByW2x1bV07ICAgICAgICAgIC8vIFVpbnQ4Q2xhbXBlZEFycmF5IGNsYW1wcyDihpIgYWRkaXRpdmUgKCdsaWdodGVyJylcbiAgICAgICAgb3V0W2kgKyAxXSArPSBnW2x1bV07XG4gICAgICAgIG91dFtpICsgMl0gKz0gYltsdW1dO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkgb3V0W2ldID0gMjU1OyAvLyBvcGFxdWVcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3OyBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEob3V0LCB3LCBoKSwgMCwgMCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzKSA9PiBjYW52YXMudG9CbG9iKHJlcywgJ2ltYWdlL3BuZycpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTtcbiAgICB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsO1xuICB9XG5cbiAgLyoqIFJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWQgcGxhbmVzIChuZXcgY2hhbm5lbCBzdGF0ZXMpXG4gICAqICBhbmQgcmUtb3BlbiDigJQgdGhlIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBpbnZhbGlkYXRlLW9uLWNoYW5uZWwtY2hhbmdlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29tcG9zaXRlQW5kT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgIGlmICghdXJsIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIHRyeSB7IHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpOyB9IGNhdGNoIHsgLyogdmlld2VyIGdvbmUgKi8gfVxuICB9XG5cbiAgLyoqIExvYWQgYSBVUkwgaW50byBhbiBIVE1MSW1hZ2VFbGVtZW50IChyZXNvbHZlcyBvbmNlIGRlY29kZWQpLiBVc2VzXG4gICAqICBkb2N1bWVudC5jcmVhdGVFbGVtZW50IHJhdGhlciB0aGFuIGBuZXcgSW1hZ2UoKWAgYmVjYXVzZSB0aGlzIGZpbGUnc1xuICAgKiAgYEltYWdlYCBpbXBvcnQgaXMgaW1hZ2UtanMncyBkZWNvZGVyLCBub3QgdGhlIERPTSBlbGVtZW50LiAqL1xuICBwcml2YXRlIGxvYWRJbWFnZUVsKHVybDogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKGUpID0+IHJlamVjdChlKTtcbiAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdSBvZiB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnZhbHVlcygpKSBVUkwucmV2b2tlT2JqZWN0VVJMKHUpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7IHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gbnVsbDsgfVxuICB9XG5cbiAgLyoqIE1vdW50IHRoZSB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSBwb2ludGluZyBhdCBgR0VUIC90aWxlYC4gKi9cbiAgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgX3NjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIF9wbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGltYWdlTG9hZGVkIGFzIE9zZExvYWRlZDtcbiAgICBjb25zdCBkID0gbG9hZGVkPy5kZXNjcmlwdG9yO1xuICAgIGlmICghZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgLy8gUmUtZXN0YWJsaXNoIHRoZSBjb2xvcm1hcCBzdWJzY3JpcHRpb24gaWYgYSBwcmlvciBjb21wb25lbnQgdGVhcmRvd25cbiAgICAvLyAodW5zdWJzY3JpYmUoKSkgdG9yZSBpdCBkb3duIOKAlCB0aGlzIHNlcnZpY2UgaXMgYSByb290IHNpbmdsZXRvbiwgc28gdGhlXG4gICAgLy8gY29uc3RydWN0b3Igd29uJ3QgcnVuIGFnYWluIHRvIHJlY3JlYXRlIGl0LlxuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgICAvLyBPU0QgdGlsZXMgbmF0aXZlbHksIHNvIHRoZSBpbi1wbGFjZSAobGFyZ2UpIHBhc3MgaXMgbm9ybWFsbHkgYSBuby1vcFxuICAgIC8vIG9uY2UgbW91bnRlZCDigJQgdGhlIHRpbGUgcHlyYW1pZCBJUyB0aGUgZnVsbCByZXNvbHV0aW9uIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyB3aGljaCBJbWFnZUluZm8gdGllciByZXF1ZXN0ZWQgaXQuIFNpbXBsZSBtb2RlIGhhcyBubyBweXJhbWlkIHRvIGZhbGxcbiAgICAvLyBiYWNrIG9uOiBpdCBkaXNwbGF5cyBsaXRlcmFsbHkgd2hhdGV2ZXIgVVJMIHdhcyBsYXN0IG9wZW5lZCwgc29cbiAgICAvLyB3aXRob3V0IHRoaXMgc3dhcCB0aGUgc21hbGwgdGllcidzIDEyOHB4IHBsYWNlaG9sZGVyIHdvdWxkIHN0YXkgb25cbiAgICAvLyBzY3JlZW4gZm9yZXZlciAocGl4ZWxhdGVkLCBuZXZlciBcInNoYXJwZW5pbmdcIiBsaWtlIHRoZSB0aWxlZCBwYXRoKS5cbiAgICBpZiAoaW5QbGFjZSAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgaWYgKGxvYWRlZC5zaW1wbGUgJiYgbG9hZGVkLnVybCkge1xuICAgICAgICAvLyBBbHNvIHJlZnJlc2ggc2ltcGxlVXJscyB0byBUSElTIHBoYXNlJ3MgKGxhcmdlLXRpZXIpIHVybHNbXSDigJQgaXQgd2FzXG4gICAgICAgIC8vIHNldCBmcm9tIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggdXJscyBvbiB0aGUgaW5pdGlhbCBtb3VudCBiZWxvdyxcbiAgICAgICAgLy8gd2hpY2ggbmV2ZXIgcnVucyBhZ2FpbiBmb3IgdGhlIGluLXBsYWNlIHBhc3MuIFdpdGhvdXQgdGhpcyxcbiAgICAgICAgLy8gc2V0WkluZGV4J3MgbGF0ZXIgc2xpZGVyIHNjcnVicyB3b3VsZCBrZWVwIHJlYWRpbmcgdGhlIHNtYWxsXG4gICAgICAgIC8vIHRpZXIncyBsb3ctcmVzIFVSTHMgZm9yZXZlciwgZXZlbiB0aG91Z2ggdGhlIGluaXRpYWwgc2xpY2Ugd2FzXG4gICAgICAgIC8vIGNvcnJlY3RseSBzd2FwcGVkIHRvIGZ1bGwgcmVzb2x1dGlvbiBoZXJlLlxuICAgICAgICB0aGlzLnNpbXBsZVVybHMgPSBpbWFnZUluZm8/LnVybHMgPz8gdGhpcy5zaW1wbGVVcmxzO1xuICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50RmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRvciA9IGQ7XG4gICAgdGhpcy5pbmZvQjY0ID0gbG9hZGVkLmluZm9CNjQ7XG4gICAgdGhpcy5jdXJyZW50WiA9IGxvYWRlZC56O1xuICAgIHRoaXMuc2ltcGxlTW9kZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICB0aGlzLnNpbXBsZVVybHMgPSBsb2FkZWQuc2ltcGxlID8gKGltYWdlSW5mbz8udXJscyA/PyBbXSkgOiBbXTtcbiAgICAvLyBUaGUgZGVzY3JpcHRvcidzIHBoeXNpY2FsIHBpeGVsIHNpemUgKHNlcnZlciBCaW8tRm9ybWF0cyBgL3RpbGVzL2luZm9gKSBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIHB1c2ggaXQgaW50byB0aGUgc2hhcmVkIG1ldGEgc28gdGhlIFJlZ2lvbiBFZGl0b3IgcmVwb3J0c1xuICAgIC8vIGFyZWFzIGluIMK1bcKyL21twrIsIG1hdGNoaW5nIHRoZSBzY2FsZSBiYXIgYnVpbHQgZnJvbSBgZC5tcHBYYCBiZWxvdy5cbiAgICB0aGlzLnN0b3JlLnNldFBoeXNpY2FsUGl4ZWxTaXplKGQubXBwWCwgZC5tcHBZKTtcbiAgICAvLyBVc2UgdGhlIFNBTUUgZ3JheXNjYWxlIGZsYWcgdGhlIGNvbG9ybWFwIGRyb3Bkb3duIC8gUGxvdGx5IHVzZVxuICAgIC8vIChpbWFnZUluZm8uaXNHcmF5c2NhbGUg4oaQIHJnYkNoYW5uZWxzID09PSAxKS4gVGhlIGRlc2NyaXB0b3IncyBgY2hhbm5lbHNgXG4gICAgLy8gKGNoYW5uZWxDb3VudCkgZGl2ZXJnZXMgZnJvbSByZ2JDaGFubmVscyBmb3Igc3RhY2tzLCB3aGljaCBsZWZ0IGdyYXlzY2FsZVxuICAgIC8vIHN0YWNrcyB1bi1yZWNvbG9yZWQgZXZlbiB0aG91Z2ggdGhlIGNvbG9ybWFwIHNlbGVjdG9yIHdhcyBzaG93bi5cbiAgICB0aGlzLmlzR3JheXNjYWxlSW1hZ2UgPSAhIWltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gU2ltcGxlIChub24tdGlsZWQsIGluLW1lbW9yeSkgaW1hZ2U6IG5vIHB5cmFtaWQsIG5vIHBlci1jaGFubmVsIHRpbGVzLCBhbmRcbiAgICAvLyBubyBzZXJ2ZXItc2lkZSBpbnRlbnNpdHkgc2FtcGxpbmcg4oCUIE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2Rlc1xuICAgIC8vIHVybHNbel0gZGlyZWN0bHkuIFNraXAgdGhlIHdob2xlIHRpbGVkLXNldHVwIHBhdGggYmVsb3cuXG4gICAgY29uc3Qgc2ltcGxlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIGlmIChzaW1wbGUpIHtcbiAgICAgIHRoaXMucmVhbExldmVscyA9IDE7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIGhpc3RvZ3JhbSDigJQgQUZURVIgZGVzdHJveVZpZXdlciAoaXRzIGxhc3QgYWN0IGlzIHNhbXBsZXIuY2xlYXIoKSkuXG4gICAgICAvLyBNdWx0aWNoYW5uZWwgYmlucyBlYWNoIGNhY2hlZCBjaGFubmVsIHBsYW5lOyBzaW5nbGUtYmFuZCAvIFJHQiBiaW5zIHRoZVxuICAgICAgLy8gZGVjb2RlZCBmcmFtZSdzIG93biBwaXhlbHMuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKGxvYWRlZC56LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbShsb2FkZWQudXJsLCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGluZGV4ZWQvTFVULWJlYXJpbmcgc3RhY2tzKSBjb21wb3NpdGUgY2xpZW50LXNpZGVcbiAgICAgIC8vIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMuIFRydXN0IHRoZSBzZXJ2ZXIncyBleHBsaWNpdCBgbXVsdGljaGFubmVsYCBmbGFnIOKAlCB0aGVcbiAgICAgIC8vIG9sZCBgY2hhbm5lbHM+MSAmJiBncmF5c2NhbGVgIGhldXJpc3RpYyBhbHNvIG1hdGNoZWQgUkdCIHBob3RvcyBCaW8tRm9ybWF0c1xuICAgICAgLy8gcmVhZHMgYXMgc2VwYXJhdGVkIHBsYW5lcyAoY2hhbm5lbHM+MSwgcmdiQ2hhbm5lbHM9PTEpLCBzcGxpdHRpbmcgdGhlbSBpbnRvIE5cbiAgICAgIC8vIHBlci1jaGFubmVsIFRpbGVkSW1hZ2VzIHRoYXQgZmxvb2RlZCB0aGUgdGlsZSBlbmRwb2ludCBhbmQgaHVuZyBvbiBsb2FkLlxuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gZC5yZWFsTGV2ZWxzID8/IGQubGV2ZWxzLmxlbmd0aDtcbiAgICAgIC8vIFRpbGVzIHRvIGNvdmVyIHRoZSB3aG9sZSBpbWFnZSBhdCB0aGUgY29hcnNlc3QgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbCAodGhlXG4gICAgICAvLyBzbWFsbGVzdCBsZXZlbCB0aGF0IGhhcyByZWFsLCBwZXItY2hhbm5lbC1mZXRjaGFibGUgdGlsZXMg4oCUIHN5bnRoZXRpYyBvdmVydmlld1xuICAgICAgLy8gbGV2ZWxzIGFyZSBzZXJ2ZXItY29tcG9zaXRlZCBvbmx5KS4gQSBweXJhbWlkYWwgaW1hZ2UncyBjb2Fyc2VzdCByZWFsIGxldmVsIGlzXG4gICAgICAvLyB0aW55IChmZXcgdGlsZXMpOyBhIGZsYXQvbm8tcHlyYW1pZCBpbWFnZSdzIGlzIHRoZSBmdWxsLXJlcyBncmlkIChtYW55IHRpbGVzKS5cbiAgICAgIGNvbnN0IGNvYXJzZSA9IGQubGV2ZWxzW3RoaXMucmVhbExldmVscyAtIDFdID8/IGQubGV2ZWxzW2QubGV2ZWxzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgY29hcnNlVyA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2Uud2lkdGggLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VIID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS5oZWlnaHQgLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VUaWxlcyA9IGNvYXJzZVcgKiBjb2Fyc2VIO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9ICEhZC5tdWx0aWNoYW5uZWw7XG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICAvLyBQZXItY2hhbm5lbCByZW5kZXJpbmcgY2FuIG9ubHkgdXNlIHRoZSBSRUFMIGxldmVscywgc28gT1NEIHJlcXVlc3RzIHRoZVxuICAgICAgICAvLyBjb2Fyc2VzdCByZWFsIGxldmVsJ3Mgd2hvbGUgdGlsZSBncmlkIMOXIE4gY2hhbm5lbHMgYXQgZml0LiBXaGVuIHRoYXQncyBsYXJnZVxuICAgICAgICAvLyAoYSB3aG9sZS1zbGlkZSksIGl0J3MgdG9vIG1hbnkgKG9mdGVuIHNsb3csIHB5cmFtaWQtbGVzcykgZnVsbC1yZXMgcmVhZHMg4oCUXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlIHNlcnZlci1jb21wb3NpdGVkIHNvdXJjZSAod2hpY2gga2VlcHMgdGhlIGZhc3RcbiAgICAgICAgLy8gc3ludGhldGljIG92ZXJ2aWV3cykuIEEgc21hbGwgc2luZ2xlLUZPViB6LXN0YWNrIHN0YXlzIHBlci1jaGFubmVsLiBTaXplIGluXG4gICAgICAgIC8vIEJZVEVTIGlzbid0IHRoZSBzaWduYWwg4oCUIHRpbGUgY291bnQgaXMuXG4gICAgICAgIGNvbnN0IGZpdFRpbGVzID0gY29hcnNlVGlsZXMgKiBNYXRoLm1heCgxLCBkLmNoYW5uZWxzID8/IDEpO1xuICAgICAgICBpZiAoZml0VGlsZXMgPiB0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTKSB7XG4gICAgICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbT1NEXSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIHRvbyBsYXJnZSBmb3IgcGVyLWNoYW5uZWwgcmVuZGVyaW5nOiAnICtcbiAgICAgICAgICAgIGAke2NvYXJzZVd9eCR7Y29hcnNlSH0gdGlsZXMgeCAke2QuY2hhbm5lbHN9IGNoYW5uZWxzID0gJHtmaXRUaWxlc30gYXQgdGhlIGNvYXJzZXN0IGAgK1xuICAgICAgICAgICAgYHJlYWwgbGV2ZWwgKD4gJHt0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTfSk7IHJlbmRlcmluZyBzZXJ2ZXItY29tcG9zaXRlZCBmb3Igc3BlZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgLy8gQXV0by1yYW5nZSBncmF5c2NhbGUgdGlsZXMgdG8gdGhlIGltYWdlJ3MgYWN0dWFsIGludGVuc2l0eSBzcGFuIChsaWtlIHRoZVxuICAgICAgLy8gaGVhdG1hcCksIHNhbXBsaW5nIHRoZSBjb2Fyc2VzdCB0aWxlIGxldmVsIHNvIHRoZSB3aW5kb3cgbWF0Y2hlcyB0aGUgcmF3XG4gICAgICAvLyB0aWxlIHZhbHVlcy4gRmlyZS1hbmQtZm9yZ2V0OiBpdCByZS1pbnZhbGlkYXRlcyBvbmNlIHRoZSB3aW5kb3cgaXMga25vd247XG4gICAgICAvLyB0aWxlcyBwYWludCB1bndpbmRvd2VkIHVudGlsIHRoZW4uIChNdWx0aWNoYW5uZWwgd2luZG93cyBhcmUgcGVyLWNoYW5uZWwsXG4gICAgICAvLyBkZWZhdWx0aW5nIHRvIGZ1bGwgcmFuZ2U7IHRoZSB1c2VyIGF1dG8vZWRpdHMgZWFjaCBjaGFubmVsLilcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTaXplIHRoZSBzbGljZSBjYWNoZSBmb3IgdGhpcyBpbWFnZTogTFJVIGNhcCB0byBob2xkIHRoZSB3aG9sZSBzdGFja1xuICAgICAgLy8gKGNhcHBlZCkgYW5kIHNraXAgYmFja2dyb3VuZCBwcmVsb2FkaW5nIGZvciBzdGFja3MgdG9vIGxhcmdlIHRvIHByZWxvYWRcbiAgICAgIC8vICh3b3VsZCBmbG9vZCBmdWxsLXJlcyByZWFkcykuIE5vcm1hbCBzdGFja3Mga2VlcCB0aGUgZmxpY2tlci1mcmVlIHByZS1jYWNoZS5cbiAgICAgIHRoaXMuY2FjaGUuY29uZmlndXJlKGQueiA/PyAxLCBjb2Fyc2VUaWxlcyk7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIG1vZGU6IE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2RlcyB0aGUgVVJMIChibG9iOi9kYXRhOi9odHRwKVxuICAgIC8vIGRpcmVjdGx5IOKAlCBubyBweXJhbWlkLCBubyBzZXJ2ZXIuIFRpbGVkIG1vZGU6IHRoZSBjdXN0b20gc2VydmVyLWJhY2tlZCB0aWxlXG4gICAgLy8gc291cmNlIChtdWx0aWNoYW5uZWwgb3BlbnMgb24gY2hhbm5lbCAwOyB0aGUgb3BlbiBoYW5kbGVyIHRoZW4gc3dhcHMgaW4gdGhpc1xuICAgIC8vIHNsaWNlJ3MgcGVyLWNoYW5uZWwgZ3JvdXAgYW5kIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBwcmUtZmlsbHMgdGhlIHJlc3QpLlxuICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBzaW1wbGVcbiAgICAgID8geyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfVxuICAgICAgOiB0aGlzLmJ1aWxkVGlsZVNvdXJjZShkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnosIHRoaXMuaXNNdWx0aUNoYW5uZWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICBzaWxlbmNlT3NkTXVsdGlJbWFnZUFkdmlzb3J5KCk7XG4gICAgdGhpcy52aWV3ZXIgPSAoT1NEIGFzIGFueSkoe1xuICAgICAgaWQ6IHBsb3REaXYsXG4gICAgICAvLyBTaW1wbGUtbW9kZSB6LXNjcnViIGNhbGxzIHZpZXdlci5vcGVuKCkgYWdhaW4gcGVyIHNsaWNlIChzZWVcbiAgICAgIC8vIHNldFpJbmRleCkg4oCUIHdpdGhvdXQgdGhpcyBpdCByZXNldHMgdG8gdGhlIGhvbWUgem9vbS9wYW4gb24gZXZlcnlcbiAgICAgIC8vIHNsaWNlIGNoYW5nZS4gVGlsZWQgbW9kZSBuZXZlciByZS1vcGVucyAoaXQgdG9nZ2xlcyBwcmUtYWRkZWRcbiAgICAgIC8vIFRpbGVkSW1hZ2VzJyBvcGFjaXR5IGluc3RlYWQpLCBzbyB0aGlzIGlzIGEgbm8tb3AgdGhlcmUuXG4gICAgICBwcmVzZXJ2ZVZpZXdwb3J0OiB0cnVlLFxuICAgICAgLy8gVXNlIHRoZSAyRCBjYW52YXMgZHJhd2VyLCBub3QgV2ViR0w6IGNyZWF0aW5nL2Rlc3Ryb3lpbmcgYSB2aWV3ZXIgb25cbiAgICAgIC8vIGVhY2ggZW5naW5lIHRvZ2dsZSAvIGltYWdlIGxvYWQgY2h1cm5zIFdlYkdMIGNvbnRleHRzIChicm93c2VycyBjYXBcbiAgICAgIC8vIGhvdyBtYW55IGV4aXN0IGF0IG9uY2UpLCB3aGljaCBzdXJmYWNlcyBhcyBcIldlYkdMIGNvbnRleHQgd2FzIGxvc3RcIlxuICAgICAgLy8gYW5kIGJsYW5rIHRpbGVzLiBUaGUgY2FudmFzIGRyYXdlciBoYXMgbm8gc3VjaCBsaW1pdC5cbiAgICAgIGRyYXdlcjogJ2NhbnZhcycsXG4gICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6IGZhbHNlLCAvLyBhdm9pZHMgbmVlZGluZyB0aGUgaWNvbi1pbWFnZSBhc3NldHNcbiAgICAgIC8vIE92ZXJ2aWV3IHRodW1ibmFpbCB3aXRoIHRoZSBjdXJyZW50LXZpZXdwb3J0IHJlY3RhbmdsZSwgYm90dG9tLXJpZ2h0LlxuICAgICAgc2hvd05hdmlnYXRvcjogdGhpcy5uYXZpZ2F0b3JWaXNpYmxlLFxuICAgICAgLy8gTmVhcmVzdC1uZWlnaGJvdXIgd2hlbiBvZmYg4oaSIGNyaXNwIHBpeGVscyBvbiB6b29tLWluIChwaXhlbCBpbnNwZWN0aW9uKS5cbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogdGhpcy5zbW9vdGhpbmdFbmFibGVkLFxuICAgICAgbmF2aWdhdG9yUG9zaXRpb246ICdCT1RUT01fUklHSFQnLFxuICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAwLjE2LFxuICAgICAgbmF2aWdhdG9yQXV0b0ZhZGU6IGZhbHNlLFxuICAgICAgbmF2aWdhdG9yQmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gICAgICBsb2FkVGlsZXNXaXRoQWpheDogdHJ1ZSxcbiAgICAgIGFqYXhXaXRoQ3JlZGVudGlhbHM6IHRydWUsIC8vIGNvb2tpZSBhdXRoIChvYXV0aDItcHJveHkpXG4gICAgICBhamF4SGVhZGVyczogdGhpcy5hdXRoSGVhZGVycywgLy8gYmVhcmVyIGF1dGggKEF1dGgwKSwgd2hlbiBhdmFpbGFibGVcbiAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiAnQW5vbnltb3VzJyxcbiAgICAgIC8vIEdlbnRsZXIgem9vbTogdGhlIGRlZmF1bHQgKDEuMikgZmVlbHMgZmFzdCBhbmQgYmlnIGp1bXBzIGNyb3NzIHNldmVyYWxcbiAgICAgIC8vIHB5cmFtaWQgbGV2ZWxzIGF0IG9uY2UsIGZpcmluZyBhIGJ1cnN0IG9mIHRpbGUgcmVxdWVzdHMuIFNoYXJlZCB3aXRoIHRoZVxuICAgICAgLy8gcmVnaW9uIG92ZXJsYXksIHdoaWNoIHRha2VzIHRoZSB3aGVlbCBvdmVyIHdoaWxlIGEgdG9vbCBpcyBhY3RpdmUuXG4gICAgICB6b29tUGVyU2Nyb2xsOiBPU0RfWk9PTV9QRVJfU0NST0xMLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIE9TRCdzIHN0b2NrIHZhbHVlLCByZXN0b3JlZC4gRE8gTk9UIFJBSVNFIElUOiB0aGUgbmFtZSByZWFkcyBsaWtlXG4gICAgICAvLyBcIm1pbmltdW0gc2hhcnBuZXNzXCIgYnV0IGl0IGlzIHRoZSBvcHBvc2l0ZS4gRnJvbSBPU0QncyBvd25cbiAgICAgIC8vIFRpbGVkSW1hZ2UuX2dldExldmVsc0ludGVydmFsOlxuICAgICAgLy9cbiAgICAgIC8vICAgaGlnaGVzdExldmVsID0gZmxvb3IoIGxvZzIoIGN1cnJlbnRaZXJvUmF0aW8gLyBtaW5QaXhlbFJhdGlvICkgKVxuICAgICAgLy9cbiAgICAgIC8vIG1pblBpeGVsUmF0aW8gaXMgYSBmbG9vciBvbiBob3cgc21hbGwgYSB0aWxlIHBpeGVsIG1heSBzaHJpbmssIGFuZCBpdFxuICAgICAgLy8gRElWSURFUyBpbnRvIHRoZSByYXRpbyAtIHNvIHJhaXNpbmcgaXQgbG93ZXJzIHRoZSBjaG9zZW4gbGV2ZWwsIGkuZS5cbiAgICAgIC8vIHBpY2tzIGEgQ09BUlNFUiBpbWFnZS4gT1NEJ3Mgb3duIGNvbW1lbnQgb24gdGhlIGRlZmF1bHQgc2F5cyBhcyBtdWNoOlxuICAgICAgLy8gXCJjbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cIi5cbiAgICAgIC8vXG4gICAgICAvLyBNZWFzdXJlZCBvbiBhIGZsYXQgMjIzMDR4MjQ1MjggaW1hZ2UgKGxldmVscyA2OTcvMTM5NC8yNzg4LzU1NzYvMTExNTIvXG4gICAgICAvLyAyMjMwNCksIHByZWRpY3RlZCBsZXZlbCBtYXRjaGluZyBhY3R1YWwgaW4gYWxsIG5pbmUgdHJpYWxzOlxuICAgICAgLy9cbiAgICAgIC8vICAgICAgICAgICAgem9vbSAyICAgICAgICB6b29tIDggICAgICAgIH4xOjFcbiAgICAgIC8vICAgMS4wICAgICAgMS4zNHggdXAgICAgICAxLjM0eCB1cCAgICAgIDEuODZ4IHVwXG4gICAgICAvLyAgIDAuNSAgICAgIDAuNjd4IChub25lKSAgMC42N3ggKG5vbmUpICAwLjkzeCAtPiBmdWxsIHJlc1xuICAgICAgLy8gICAwLjI1ICAgICAwLjMzeCAgICAgICAgIDAuMzN4ICAgICAgICAgMC45M3hcbiAgICAgIC8vXG4gICAgICAvLyAwLjUgaXMgd2hhdCBnaXZlcyBcIm5ldmVyIHVwc2NhbGVkIGJlbG93IG5hdGl2ZSwgZnVsbCByZXNvbHV0aW9uIGF0IDE6MVwiLlxuICAgICAgLy8gMC4yNSBpcyBub3QgYmV0dGVyIC0gaXQganVtcHMgdHdvIHJ1bmdzIGZpbmVyIGFuZCBmZXRjaGVzIH40eCB0aGUgdGlsZXNcbiAgICAgIC8vIGZvciBubyB2aXNpYmxlIGdhaW4sIGFuZCB0aWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgaW5ncmVzcy5cbiAgICAgIG1pblBpeGVsUmF0aW86IDAuNSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBFdmVyeSByZWRyYXcgKHBhbi96b29tIGFuaW1hdGlvbiBmcmFtZXMsIHJlc2l6ZSkg4oCUIGZvciBhIGNvbnRyaWJ1dGVkXG4gICAgICAgIC8vIHBsb3QgbW9kZSdzIG92ZXJsYXksIHdoaWNoIGhhcyB0byBtb3ZlIHdpdGggdGhlIGltYWdlLCBub3QgYWZ0ZXIgaXQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd1cGRhdGUtdmlld3BvcnQnLCAoKSA9PiB0aGlzLnNjaGVkdWxlRnJhbWUoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIGlmICh0aGlzLmZyYW1lUmFmICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lUmFmKTtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgIGlmIChyZWN0KSB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHJlY3QpO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IHZpZXdwb3J0J3MgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlLCBjbGFtcGVkIHRvIHRoZSBpbWFnZSwgb3JcbiAgICogIG51bGwgd2hlbiB0aGVyZSBpcyBubyBsYWlkLW91dCB2aWV3cG9ydC4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlSW1hZ2VSZWN0KCk6IFBsb3RNb2RlUmVjdCB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsOyAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogQ29hbGVzY2UgcmVkcmF3cyBpbnRvIG9uZSB7QGxpbmsgZnJhbWUkfSBlbWlzc2lvbiBwZXIgYW5pbWF0aW9uIGZyYW1lLlxuICAgKiAgU2tpcHBlZCBlbnRpcmVseSB3aGlsZSBub3RoaW5nIGxpc3RlbnMuICovXG4gIHByaXZhdGUgc2NoZWR1bGVGcmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmFtZVJhZiAhPT0gbnVsbCB8fCAhdGhpcy5mcmFtZSQub2JzZXJ2ZWQpIHJldHVybjtcbiAgICB0aGlzLmZyYW1lUmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgICAgaWYgKHJlY3QpIHRoaXMuZnJhbWUkLm5leHQocmVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlIGRyYXdzIG92ZXIuIE9uZSBzdGFibGUgb2JqZWN0IHBlclxuICAgKiBzZXJ2aWNlOiBldmVyeSBtZXRob2QgcmVhZHMgdGhlIENVUlJFTlQgdmlld2VyLCBzbyBpdCBzdGF5cyB2YWxpZCBhY3Jvc3MgYVxuICAgKiB2aWV3ZXIgcmVidWlsZCBhbmQgcmVwb3J0cyBgaXNSZWFkeSgpID09PSBmYWxzZWAgd2hpbGUgbm9uZSBpcyBtb3VudGVkXG4gICAqIChjb252ZXJzaW9ucyB0aGVuIHJldHVybiBOYU4gcmF0aGVyIHRoYW4gdGhyb3dpbmcpLlxuICAgKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHtcbiAgICBpZiAodGhpcy5wbG90TW9kZVZpZXdwb3J0KSByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICAgIGNvbnN0IG5hbiA9IHsgeDogTmFOLCB5OiBOYU4gfTtcbiAgICBjb25zdCByZWFkeSA9ICgpID0+ICEhdGhpcy5jb29yZFRyYW5zZm9ybT8uaXNSZWFkeSgpO1xuICAgIHRoaXMucGxvdE1vZGVWaWV3cG9ydCA9IHtcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZGF0YVRvQ2xpZW50OiAoeCwgeSkgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhVG9DbGllbnQoeCwgeSkgOiBuYW4pLFxuICAgICAgY2xpZW50VG9EYXRhOiAoY3gsIGN5KSA9PiAocmVhZHkoKSA/IHRoaXMuY29vcmRUcmFuc2Zvcm0hLmNsaWVudFRvRGF0YShjeCwgY3kpIDogbmFuKSxcbiAgICAgIGRhdGFMZW5ndGhUb1NjcmVlbjogKGxlbikgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhTGVuZ3RoVG9TY3JlZW4obGVuKSA6IE5hTiksXG4gICAgICBpc1JlYWR5OiByZWFkeSxcbiAgICAgIC8vIEJvdGggc3RhcnQgd2l0aCB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3Qgd2hlbiB0aGUgdmlld3BvcnQgaXMgcmVhZHk6IGEgbW9kZVxuICAgICAgLy8gYWN0aXZhdGVzIGFmdGVyIHRoZSBiYXNlIHJlbmRlciBoYXMgZ29uZSBpZGxlLCBzbyB3aXRob3V0IGl0IGFuIG92ZXJsYXlcbiAgICAgIC8vIGZvbGxvd2luZyBgZnJhbWUkLnN1YnNjcmliZShyZWRyYXcpYCB3b3VsZCBzdGF5IGJsYW5rIHVudGlsIHRoZSBuZXh0IHBhbi96b29tLlxuICAgICAgZnJhbWUkOiB0aGlzLndpdGhDdXJyZW50UmVjdCh0aGlzLmZyYW1lJCwgcmVhZHkpLFxuICAgICAgc2V0dGxlZCQ6IHRoaXMud2l0aEN1cnJlbnRSZWN0KHRoaXMudmlld3BvcnRDaGFuZ2UkLCByZWFkeSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICB9XG5cbiAgLyoqIGBzb3VyY2VgLCBwcmVjZWRlZCBieSB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3QgZm9yIGVhY2ggc3Vic2NyaWJlciAod2hlbiByZWFkeSkuICovXG4gIHByaXZhdGUgd2l0aEN1cnJlbnRSZWN0KHNvdXJjZTogU3ViamVjdDxQbG90TW9kZVJlY3Q+LCByZWFkeTogKCkgPT4gYm9vbGVhbik6IE9ic2VydmFibGU8UGxvdE1vZGVSZWN0PiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWFkeSgpID8gdGhpcy52aXNpYmxlSW1hZ2VSZWN0KCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHJlY3QgPyBzb3VyY2UucGlwZShzdGFydFdpdGgocmVjdCkpIDogc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgcGFpbnRzIGluc3RlYWQgb2YgcGFubmluZy5cbiAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTtcbiAgICAvLyBUaGUgYnJ1c2ggd29ya3MgaW4gdGhlIHJlbmRlcmVkLXZpZXdwb3J0IGNvb3JkaW5hdGUgZnJhbWUg4oCUIHJlYWQgaXQgYmFja1xuICAgIC8vIGxhemlseSBvbiBmaXJzdCB1c2UsIGxpa2UgdGhlIHdhbmQuIEl0IHNoYXJlcyB0aGUgd2FuZCdzIGhvc3QuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0U2l6ZSgob3B0aW9ucyBhcyBCcnVzaE9wdGlvbnMpPy5zaXplID8/IDApO1xuICB9XG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRvb2wgdGFrZXMgdGhlIHBvaW50ZXJcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgdGhpcy5lcmFzZXJUb29sLmJpbmRIb3N0KHRoaXMuZXJhc2VySG9zdCk7XG4gICAgfVxuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRNb2RlKGFjdGl2ZSk7XG4gIH1cbiAgc2V0VmVydGV4RXJhc2VyUmFkaXVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5lcmFzZXJUb29sLnNldFJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIHNldFpvb21Ub0JveE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIHRoZSBib3ggZHJhZyBtdXN0IG5vdCBwYW5cbiAgICAgIHRoaXMuem9vbVRvQm94VG9vbC5iaW5kSG9zdCh0aGlzLnpvb21Cb3hIb3N0KCkpO1xuICAgIH1cbiAgICB0aGlzLnpvb21Ub0JveFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICAgIGlmICghYWN0aXZlKSB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKHRydWUpO1xuICB9XG4gIC8qKiBCb3gtcHJvbXB0ZWQgU0FNOiBzZWdtZW50IHRoZSBkcmF3biByZWN0YW5nbGVzLiBUaGUgU0FNIHRvb2wgcmV1c2VzIHRoZVxuICAgKiAgd2FuZCBob3N0ICh2aWV3cG9ydCByZWFkYmFjayArIGNvb3JkaW5hdGUgdHJhbnNmb3JtICsgcmVnaW9uIHN0b3JlKS4gKi9cbiAgc2VnbWVudFJlY3RhbmdsZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gc2VnbWVudCBhZ2FpbnN0IHRoZSBjdXJyZW50IHZpZXdwb3J0IHJlYWRiYWNrXG4gICAgdGhpcy5zYW1Ub29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHJldHVybiB0aGlzLnNhbVRvb2wuc2VnbWVudEJveGVzKCk7XG4gIH1cbiAgc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICghdGhpcy5jZWxsU2VnbWVudGVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDApO1xuICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsOyAvLyBjcm9wIGFnYWluc3QgdGhlIGN1cnJlbnQgdmlld3BvcnQgcmVhZGJhY2tcbiAgICB0aGlzLmNlbGxTZWdtZW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5jZWxsU2VnbWVudFRvb2wuc2VnbWVudEJveGVzKHRoaXMuY2VsbFNlZ21lbnRlcik7XG4gIH1cbiAgc2V0U2FtTW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2FtVG9vbC5zZXRNb2RlbChpZCk7XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZWwoaWQpO1xuICB9XG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTsgLy8gY2xpY2tzIGFkZCBwb2ludHMsIGRvbid0IHBhblxuICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICB0aGlzLnNhbVBvaW50VG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICB9XG4gICAgdGhpcy5zYW1Qb2ludFRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIGNvbW1pdFNhbVBvaW50cygpOiB2b2lkIHsgdGhpcy5zYW1Qb2ludFRvb2wuY29tbWl0KCk7IH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNsZWFyKCk7IH1cblxuICAvKiogQnVpbGQgdGhlIHdhbmQvZXJhc2VyIGhvc3Qgb2JqZWN0cyBib3VuZCB0byB0aGlzIGJhY2tlbmQuIEJvdGggdG9vbHMgcnVuXG4gICAqICBvdmVyIE9TRCB2aWEgdGhlIHNoYXJlZCBjb29yZGluYXRlIHRyYW5zZm9ybSArIGEgdmlld3BvcnQgcGl4ZWwgcmVhZGJhY2ssXG4gICAqICBhbmQgcmVhZC93cml0ZSByZWdpb25zIGRpcmVjdGx5IG9uIHRoZSBzaGFyZWQgUmVnaW9uU3RvcmUgKG5ldXRyYWwgbW9kZWwpLiAqL1xuICBwcml2YXRlIGJ1aWxkVG9vbEhvc3RzKCk6IHZvaWQge1xuICAgIHRoaXMud2FuZEhvc3QgPSB7XG4gICAgICBnZXRSZWdpb25zOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSxcbiAgICAgIHNldFJlZ2lvbnM6IChyZWdpb25zKSA9PiB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMocmVnaW9ucyksXG4gICAgICBnZXRDYWNoZWRJbWFnZURhdGE6ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpLFxuICAgICAgZ2V0QWN0aXZlRnJhbWVJbmRleDogKCkgPT4gdGhpcy5jdXJyZW50WixcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldEZpbGVOYW1lOiAoKSA9PiB0aGlzLmN1cnJlbnRGaWxlTmFtZSxcbiAgICAgIGdldFNoYXBlQ29sb3I6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0U2hhcGVDb2xvcigpLFxuICAgIH07XG4gICAgdGhpcy5lcmFzZXJIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgaW52YWxpZGF0ZVdhbmRSZWdpb246ICgpID0+IHRoaXMud2FuZFRvb2wuY2xlYXJBY3RpdmVSZWdpb24oKSxcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZ2V0Q29vcmRpbmF0ZVRyYW5zZm9ybTogKCkgPT4gdGhpcy5jb29yZFRyYW5zZm9ybSBhcyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSxcbiAgICAgIGdldENhY2hlZEltYWdlUmF0aW86ICgpID0+IHRoaXMucmVhZGJhY2tWaWV3cG9ydCgpPy5yYXRpb3NbMF0gPz8gMSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFRoZSBlbGVtZW50IHRoZSBvbi1jYW52YXMgdG9vbCBvdmVybGF5cyBhdHRhY2ggdG8gKE9TRCBpcyBtb3VudGVkIGhlcmUpLiAqL1xuICBwcml2YXRlIGdldE92ZXJsYXlDb250YWluZXIoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5wbG90RGl2ID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbG90RGl2KSA6IG51bGw7XG4gIH1cblxuICAvKiogU2l6ZSB0aGUgbmF2aWdhdG9yIGZyb20gdGhlIENVUlJFTlQgY29udGFpbmVyIChuYXZpZ2F0b3JTaXplUmF0aW8gb2YgdGhlXG4gICAqICB2aWV3ZXIgZWxlbWVudCkgYW5kIGtlZXAgaXQgcGlubmVkIHRvIHRoZSBjb3JuZXIuIE9TRCBjb21wdXRlcyB0aGUgc2l6ZVxuICAgKiAgb25jZSBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBiZWZvcmUgdGhlIGhvc3QgZmxleCBsYXlvdXQgc2V0dGxlcyDigJRcbiAgICogIGFuZCBuZXZlciBjb3JyZWN0cyBpdCwgbGVhdmluZyBhIHN0YWxlLXNpemUgZWxlbWVudCB3aG9zZSB2aXNpYmxlIG1pbmltYXBcbiAgICogIGZsb2F0cyBhYm92ZSB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lci4gKi9cbiAgcHJpdmF0ZSByZXNpemVOYXZpZ2F0b3IoKTogdm9pZCB7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgY29uc3QgbmF2ID0gdj8ubmF2aWdhdG9yO1xuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9IHY/LmVsZW1lbnQ7XG4gICAgaWYgKCFuYXY/LmVsZW1lbnQgfHwgIWVsPy5jbGllbnRXaWR0aCB8fCAhZWw/LmNsaWVudEhlaWdodCkgcmV0dXJuO1xuICAgIGNvbnN0IHcgPSBNYXRoLnJvdW5kKGVsLmNsaWVudFdpZHRoICogMC4xNik7XG4gICAgY29uc3QgaCA9IE1hdGgucm91bmQoZWwuY2xpZW50SGVpZ2h0ICogMC4xNik7XG4gICAgaWYgKG5hdi5lbGVtZW50LnN0eWxlLndpZHRoICE9PSBgJHt3fXB4YCB8fCBuYXYuZWxlbWVudC5zdHlsZS5oZWlnaHQgIT09IGAke2h9cHhgKSB7XG4gICAgICB0cnkge1xuICAgICAgICBuYXYuc2V0V2lkdGgodyk7XG4gICAgICAgIG5hdi5zZXRIZWlnaHQoaCk7XG4gICAgICB9IGNhdGNoIHsgLyogbmF2aWdhdG9yIHRvcm4gZG93biAqLyB9XG4gICAgfVxuICAgIC8vIE5vcm1hbGl6ZSBPU0QncyBjb250cm9sLWNvcm5lciBzdGFjayBzbyB0aGUgbWluaW1hcCBzaXRzIGZsdXNoIGluIHRoZVxuICAgIC8vIGNvcm5lciwgaW5zZXQgMTJweCB0byBsaW5lIHVwIHdpdGggdGhlIHNjYWxlIGJhcjpcbiAgICAvLyAgLSB0aGUgaW5saW5lLWJsb2NrIHdyYXBwZXIgY2FycmllcyBsaW5lLWJveCBzdHJ1dHMgYW5kIGNhbiByZXRhaW4gc3RhbGVcbiAgICAvLyAgICBzaXppbmcg4oaSIG1ha2UgaXQgYSB0aWdodCBibG9jaztcbiAgICAvLyAgLSBhbnl0aGluZyBlbHNlIE9TRCBsZWZ0IGluIHRoZSBjb3JuZXIgd291bGQgc3RhY2sgYmVsb3cgdGhlIG5hdmlnYXRvclxuICAgIC8vICAgIGFuZCBmbG9hdCBpdCB1cCDihpIgaGlkZSBpdDtcbiAgICAvLyAgLSBpbnNldCB0aGUgY29ybmVyIGl0c2VsZiAoYm90dG9tL3JpZ2h0IDEycHgpLCBrZWVwaW5nIHRoZSBlbGVtZW50IGluXG4gICAgLy8gICAgbm9ybWFsIGZsb3cuXG4gICAgY29uc3Qgd3JhcHBlciA9IG5hdi5lbGVtZW50LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGNvcm5lciA9IHdyYXBwZXI/LnBhcmVudEVsZW1lbnQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICh3cmFwcGVyICYmIGNvcm5lcikge1xuICAgICAgd3JhcHBlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHdyYXBwZXIuc3R5bGUubGluZUhlaWdodCA9ICcwJztcbiAgICAgIHdyYXBwZXIuc3R5bGUuZm9udFNpemUgPSAnMCc7XG4gICAgICAvLyBUaGUgd3JhcHBlciBrZWVwcyB0aGUgbmF2aWdhdG9yJ3Mgc3RhbGUgcHJlLXNldHRsZSBoZWlnaHQgYXMgYW5cbiAgICAgIC8vIGV4cGxpY2l0IHNpemUgKHRoZSBuYXYgd2FzIDAuMTZ4IHRoZSBVTlNFVFRMRUQgY29udGFpbmVyIGF0IGNyZWF0aW9uKSxcbiAgICAgIC8vIGxlYXZpbmcgYW4gZW1wdHkgYmFuZCB1bmRlciB0aGUgcmVzaXplZCBtaW5pbWFwIOKAlCBtZWFzdXJlZCBsaXZlOlxuICAgICAgLy8gbmF2SD04NyBpbnNpZGUgd3JhcEg9MTY3LiBGb3JjZSBpdCB0byBodWcgaXRzIGNvbnRlbnQuXG4gICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHdyYXBwZXIuc3R5bGUud2lkdGggPSAnYXV0byc7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20oY29ybmVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gd3JhcHBlcikgY2hpbGQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbSh3cmFwcGVyLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdKSB7XG4gICAgICAgIGlmIChjaGlsZCAhPT0gbmF2LmVsZW1lbnQpIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBjb3JuZXIuc3R5bGUuYm90dG9tID0gJzEycHgnO1xuICAgICAgY29ybmVyLnN0eWxlLnJpZ2h0ID0gJzEycHgnO1xuICAgIH1cbiAgICBPYmplY3QuYXNzaWduKG5hdi5lbGVtZW50LnN0eWxlLCB7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB0b3A6ICcnLCBsZWZ0OiAnJywgYm90dG9tOiAnJywgcmlnaHQ6ICcnLCBtYXJnaW46ICcwJyB9KTtcbiAgICAvLyBUT0RPKGRlYnVnKTogcmVtb3ZlIGFmdGVyIHZlcmlmaWNhdGlvblxuICAgIGNvbnN0IG5lciA9IG5hdi5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHdyID0gd3JhcHBlcj8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgY3IgPSBjb3JuZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBlciA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnNvbGUud2FybihgW3ZpejpuYXZdIG5hdkJvdHRvbT0ke01hdGgucm91bmQobmVyLmJvdHRvbSl9IHdyYXBCb3R0b209JHtNYXRoLnJvdW5kKHdyPy5ib3R0b20gPz8gLTEpfSBgICtcbiAgICAgIGBjb3JuZXJCb3R0b209JHtNYXRoLnJvdW5kKGNyPy5ib3R0b20gPz8gLTEpfSBwbG90Qm90dG9tPSR7TWF0aC5yb3VuZChwZXIuYm90dG9tKX0gYCArXG4gICAgICBgbmF2SD0ke01hdGgucm91bmQobmVyLmhlaWdodCl9IHdyYXBIPSR7TWF0aC5yb3VuZCh3cj8uaGVpZ2h0ID8/IC0xKX0gY29ybmVySD0ke01hdGgucm91bmQoY3I/LmhlaWdodCA/PyAtMSl9YCk7XG4gIH1cblxuICAvKiogRm9yY2UgdGhlIGRvY2tlZCB0b29sYmFyIHRvIHJlcGFpbnQgYWZ0ZXIgYW4gT1NEIHpvb20uIENocm9tZSBsZWF2ZXMgaXRcbiAgICogIGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgKHRoZSBjYW52YXMncyBjb21wb3NpdGluZyBjaHVybiBzdHJhbmRzIHRoZSB0b29sYmFyJ3NcbiAgICogIHJhc3RlcikuIEEgc3luY2hyb25vdXMgZGlzcGxheSB0b2dnbGUgcmUtcmFzdGVycyBpdCB3aXRoIG5vIHZpc2libGUgZ29uZS1mcmFtZVxuICAgKiAgYW5kIG5vIGxheW91dCBzaGlmdC4gTG9jYXRlZCB2aWEgdGhlIERPTSBzaW5jZSB0aGlzIHNlcnZpY2UgZG9lc24ndCBvd24gdGhlXG4gICAqICB0b29sYmFyOyBhIG5vLW9wIHdoZW4gdGhlcmUncyBubyB0b29sYmFyIChlLmcuIGVtYmVkZGVkIHdpdGhvdXQgb25lKS4gKi9cbiAgcHJpdmF0ZSBudWRnZVRvb2xiYXJSZXBhaW50KCk6IHZvaWQge1xuICAgIGNvbnN0IHBsb3RFbCA9IHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICAgIGNvbnN0IGRvY2sgPSBwbG90RWw/LmNsb3Nlc3QoJ3Zpc3VhbGl6YXRpb24nKT8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJy50b29sYmFyLWRvY2snKTtcbiAgICBpZiAoIWRvY2spIHJldHVybjtcbiAgICBjb25zdCBwcmV2ID0gZG9jay5zdHlsZS5kaXNwbGF5O1xuICAgIGRvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB2b2lkIGRvY2sub2Zmc2V0SGVpZ2h0OyAvLyByZWZsb3cgc28gdGhlIHRvZ2dsZSByZS1yYXN0ZXJzIG9uIHRoZSBuZXh0IHBhaW50XG4gICAgZG9jay5zdHlsZS5kaXNwbGF5ID0gcHJldjtcbiAgfVxuXG4gIC8qKiBIb3N0IGZvciB0aGUgKHNoYXJlZCkgem9vbS10by1ib3ggdG9vbDogY29udmVydCBvdmVybGF5IHBpeGVscyB0byBpbWFnZVxuICAgKiAgY29vcmRzIHZpYSB0aGUgdmlld3BvcnQsIGFuZCBmaXQgdGhlIHZpZXdwb3J0IHRvIHRoZSBjaG9zZW4gcmVjdGFuZ2xlLiAqL1xuICBwcml2YXRlIHpvb21Cb3hIb3N0KCk6IFpvb21Ub0JveFRvb2xIb3N0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0UGxvdERpdjogKCkgPT4gdGhpcy5wbG90RGl2LFxuICAgICAgcGl4ZWxUb0RhdGE6IChweDogbnVtYmVyLCBweTogbnVtYmVyKSA9PiBlbGVtZW50VG9JbWFnZSh0aGlzLnZpZXdlciwgcHgsIHB5KSxcbiAgICAgIGFwcGx5Wm9vbVRvQm94OiAoY29vcmRzOiBudW1iZXJbXSkgPT4gdGhpcy5hcHBseVpvb21Ub0JveChjb29yZHMpLFxuICAgIH07XG4gIH1cblxuICAvKiogRml0IHRoZSBPU0Qgdmlld3BvcnQgdG8gYW4gaW1hZ2Utc3BhY2UgcmVjdGFuZ2xlIChjb29yZHMgb3JkZXJlZFxuICAgKiAgW3hNaW4sIHhNYXgsIHlNYXgsIHlNaW5dKS4gKi9cbiAgcHJpdmF0ZSBhcHBseVpvb21Ub0JveChjb29yZGluYXRlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudmlld2VyIHx8IGNvb3JkaW5hdGVzLmxlbmd0aCA8IDQpIHJldHVybjtcbiAgICBjb25zdCBbYSwgYiwgYywgZF0gPSBjb29yZGluYXRlcztcbiAgICBjb25zdCB4ID0gTWF0aC5taW4oYSwgYik7XG4gICAgY29uc3QgdyA9IE1hdGguYWJzKGIgLSBhKTtcbiAgICBjb25zdCB5ID0gTWF0aC5taW4oYywgZCk7XG4gICAgY29uc3QgaCA9IE1hdGguYWJzKGMgLSBkKTtcbiAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSBpbWFnZVJlY3RUb1ZpZXdwb3J0KHRoaXMudmlld2VyLCB4LCB5LCB3LCBoKTtcbiAgICB0aGlzLnZpZXdlci52aWV3cG9ydC5maXRCb3VuZHMocmVjdCwgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYmFjayB0aGUgKmN1cnJlbnRseSByZW5kZXJlZCogT1NEIGNhbnZhcyBhcyB0aGUgd2FuZCdzIHBpeGVsIG1hdHJpeC5cbiAgICogVGhlIG1hdHJpeCBjb3ZlcnMgb25seSB0aGUgdmlzaWJsZSB2aWV3cG9ydCBhdCBzY3JlZW4gcmVzb2x1dGlvbiwgc28gd2hlblxuICAgKiB0aGUgdXNlciBpcyB6b29tZWQgaW50byBhIHN1Yi1yZWdpb24gdGhlIHdhbmQgc2FtcGxlcyB0aGF0IHJlZ2lvbidzIGRldGFpbFxuICAgKiAocmF0aGVyIHRoYW4gdGhlIHdob2xlIGltYWdlIGF0IHByZXZpZXcgcmVzb2x1dGlvbikuIGBvcmlnaW5YL29yaWdpbllgIGFuZFxuICAgKiBgcmF0aW9zYCBtYXAgaW1hZ2UgY29vcmRzIDwtPiByZWFkYmFjay1waXhlbCBjb29yZHMgZm9yIHRoZSB3YW5kJ3NcbiAgICogZGF0YS9yYXRpby9vcmlnaW4gbW9kZWwuIENhY2hlZCB1bnRpbCB0aGUgdmlld3BvcnQgY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgcmVhZGJhY2tWaWV3cG9ydCgpOiBDYWNoZWRJbWFnZURhdGEgfCBudWxsIHtcbiAgICBpZiAodGhpcy52aWV3cG9ydFBpeGVscykgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXIgYXMgYW55O1xuICAgIGNvbnN0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQgPSB2aWV3ZXI/LmRyYXdlcj8uY2FudmFzO1xuICAgIGNvbnN0IHZwID0gdmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0IHx8ICF2cCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aDsgLy8gZGV2aWNlIHBpeGVsc1xuICAgIGNvbnN0IGggPSBjYW52YXMuaGVpZ2h0O1xuICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7IC8vIFJHQkEsIHJvdy1tYWpvclxuICAgIC8vIEJ1aWxkIHRoZSBbeV1beF0gPSBbcixnLGJdIG1hdHJpeCB0aGUgd2FuZCBleHBlY3RzIGZvciBSR0IgZnJhbWVzLlxuICAgIGNvbnN0IG1hdHJpeDogbnVtYmVyW11bXVtdID0gbmV3IEFycmF5KGgpO1xuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICBjb25zdCByb3c6IG51bWJlcltdW10gPSBuZXcgQXJyYXkodyk7XG4gICAgICBjb25zdCBiYXNlID0geSAqIHcgKiA0O1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgY29uc3QgbyA9IGJhc2UgKyB4ICogNDtcbiAgICAgICAgcm93W3hdID0gW2RhdGFbb10sIGRhdGFbbyArIDFdLCBkYXRhW28gKyAyXV07XG4gICAgICB9XG4gICAgICBtYXRyaXhbeV0gPSByb3c7XG4gICAgfVxuXG4gICAgLy8gSW1hZ2UtY29vcmQgc3BhbiB0aGUgcmVhZGJhY2sgY292ZXJzIChDU1MgcHggaW4sIGltYWdlIGNvb3JkcyBvdXQpLiBSb3V0ZVxuICAgIC8vIHRocm91Z2ggd29ybGQgaXRlbSAwIChvc2QtY29vcmRzKSBzbyBpdCBzdGF5cyBhY2N1cmF0ZSDigJQgYW5kIHF1aWV0IOKAlCB3aGVuXG4gICAgLy8gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWwgbXVsdGljaGFubmVsIGxheWVycykuXG4gICAgY29uc3QgZWxXID0gY2FudmFzLmNsaWVudFdpZHRoIHx8IHc7XG4gICAgY29uc3QgZWxIID0gY2FudmFzLmNsaWVudEhlaWdodCB8fCBoO1xuICAgIGNvbnN0IHRsID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIDAsIDApO1xuICAgIGNvbnN0IGJyID0gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIGVsVywgZWxIKTtcbiAgICBjb25zdCByYXRpb1ggPSAoYnIueCAtIHRsLngpIC8gdzsgLy8gaW1hZ2UgcHggcGVyIHJlYWRiYWNrIHB4XG4gICAgY29uc3QgcmF0aW9ZID0gKGJyLnkgLSB0bC55KSAvIGg7XG5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0ge1xuICAgICAgZnJhbWVzOiBbbWF0cml4XSxcbiAgICAgIHdpZHRoOiB3LFxuICAgICAgaGVpZ2h0OiBoLFxuICAgICAgcmF0aW9zOiBbcmF0aW9YLCByYXRpb1ldLFxuICAgICAgaXNHcmF5c2NhbGU6IGZhbHNlLCAvLyBjYW52YXMgcmVhZGJhY2sgaXMgYWx3YXlzIFJHQkFcbiAgICAgIG9yaWdpblg6IHRsLngsXG4gICAgICBvcmlnaW5ZOiB0bC55LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudmlld3BvcnRQaXhlbHM7XG4gIH1cblxuICAvKipcbiAgICogUmVjb2xvciBhIGdyYXlzY2FsZSB0aWxlIHRocm91Z2ggdGhlIGFjdGl2ZSBjb2xvcm1hcCBMVVQsIHVzaW5nIE9TRCdzXG4gICAqIHRpbGUtaW52YWxpZGF0ZWQgcGl4ZWwgcGlwZWxpbmUgKE9TRCA1Ky82KS4gTWFwcyBlYWNoIHBpeGVsJ3MgZ3JheXNjYWxlXG4gICAqIHZhbHVlIChyPT1nPT1iKSB0byB0aGUgTFVUJ3MgUkdCLiBOby1vcCBmb3IgUkdCIGltYWdlcyBvciB1bnRpbCB0aGUgTFVUIGlzXG4gICAqIGJ1aWx0LiBIYW5kbGVyIGlzIGFzeW5jIOKAlCBPU0QgYXdhaXRzIGl0IChyYWlzZUV2ZW50QXdhaXRpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yVGlsZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVjb2xvckNoYW5uZWxUaWxlKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLmRpc3BsYXlUb2tlbjtcbiAgICBjb25zdCBncmF5ID0gdGhpcy5pc0dyYXlzY2FsZUltYWdlO1xuICAgIGlmIChncmF5KSB7XG4gICAgICBpZiAoIXRoaXMuY29sb3JMdXQpIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmRpc3BsYXkucmdiTmVlZHNSZWNvbG9yKCkpIHtcbiAgICAgIHJldHVybjsgLy8gUkdCIGF0IGRlZmF1bHQgKGFsbCB2aXNpYmxlLCBmdWxsIHdpbmRvdywgzrM9MSwgbm8gaW52ZXJ0KSDihpIgcGFzc3Rocm91Z2hcbiAgICB9XG5cbiAgICAvLyBSZWFkIHRoZSB0aWxlJ3MgcGl4ZWxzLiBQcmVmZXIgdGhlIHJlbmRlcmluZyBjb250ZXh0LCBidXQgc29tZSB0aWxlIGNhY2hlc1xuICAgIC8vIChhamF4IFBORyBibG9icykgY29udmVydCB0byBhbiAqZW1wdHkqIGNvbnRleHQyZCDigJQgcmVjb2xvcmluZyB0aGF0IHdvdWxkXG4gICAgLy8gYmxhbmsgdGhlIHRpbGUgKHdoaXRlIGNhbnZhcykuIFNvIGlmIHRoZSBjb250ZXh0IGhhcyBubyBvcGFxdWUgcGl4ZWxzLCBkcmF3XG4gICAgLy8gdGhlIHRpbGUncyBvd24gYml0bWFwL2ltYWdlIGFuZCByZWNvbG9yIHRoYXQgaW5zdGVhZC4gV2UgbmV2ZXIgd3JpdGUgYmFja1xuICAgIC8vIHVubGVzcyB3ZSBhY3R1YWxseSByZWNvbG9yZWQgc29tZXRoaW5nLCBzbyBhIHRpbGUgaXMgbmV2ZXIgYmxhbmtlZC5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY3R4ID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnY29udGV4dDJkJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvKiB0cnkgYml0bWFwIGJlbG93ICovXG4gICAgfVxuICAgIGxldCBpbWc6IEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAgIGlmIChjdHggJiYgY3R4LmNhbnZhcyAmJiBjdHguY2FudmFzLndpZHRoICYmIGN0eC5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGN0eC5jYW52YXMud2lkdGgsIGN0eC5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBpbWcgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWltZyB8fCAhdGhpcy5oYXNPcGFxdWUoaW1nLmRhdGEpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHRpbGUncyBkZWNvZGVkIGltYWdlL2JpdG1hcC5cbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vbmUgKi9cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiBub25lICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHJldHVybjsgLy8gY2FuJ3QgZ2V0IHBpeGVscyDigJQgbGVhdmUgdGhlIHRpbGUgdW50b3VjaGVkXG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gc3JjLndpZHRoO1xuICAgICAgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltZy5kYXRhKSB8fCAhY3R4KSByZXR1cm47IC8vIG5vdGhpbmcgb3BhcXVlXG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kIGhhcyBhbHJlYWR5IHJlc3RvcmVkIHRoaXMgdGlsZSDigJQgd3JpdGluZyBub3cgd291bGRcbiAgICAvLyBoYW5kIE9TRCBhIHN1cGVyc2VkZWQgY2FudmFzIGFuZCBkZXN0cm95IHRoZSBjYWNoZSByZWNvcmQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBUaGUgdGlsZSdzIGNhY2hlIGNhbiBzdGlsbCBiZSBldmljdGVkIGJldHdlZW4gdGhlIGF3YWl0cyBhYm92ZSBhbmQgaGVyZSAoYVxuICAgIC8vIHNsaWNlIGNoYW5nZSksIG1ha2luZyBzZXREYXRhIHRocm93IGEgRE9NRXhjZXB0aW9uIG9uIGEgZGVhZCBjYW52YXMuXG4gICAgLy8gU3dhbGxvdyBpdCDigJQgdGhlIHRpbGUgaXMgZ29uZSwgc28gdGhlcmUncyBub3RoaW5nIHRvIHJlY29sb3IuXG4gICAgdHJ5IHsgYXdhaXQgZXZlbnQuc2V0RGF0YShjdHgsICdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIHRpbGUgZXZpY3RlZCAqLyB9XG4gIH1cblxuICAvKipcbiAgICogVGludCBhIHNpbmdsZSBjaGFubmVsJ3MgdGlsZSBpbiBwbGFjZS4gRWFjaCBjaGFubmVsIGlzIGl0cyBvd24gT3BlblNlYWRyYWdvblxuICAgKiBUaWxlZEltYWdlIChhIHNpbmdsZS1iYW5kIGdyYXlzY2FsZSB0aWxlKTsgT1NEIGNvbXBvc2l0ZXMgdGhlIE4gaW1hZ2VzXG4gICAqIGFkZGl0aXZlbHkgKCdsaWdodGVyJykgaW4gaXRzIGRyYXdlciDigJQgc28gdGhpcyBqdXN0IG1hcHMgdGhlIHRpbGUncyBpbnRlbnNpdHlcbiAgICogdGhyb3VnaCB0aGUgY2hhbm5lbCdzIHdpbmRvdy9nYW1tYSBhbmQgaXRzIHBzZXVkby1jb2xvdXIuIFN5bmNocm9ub3VzIChub1xuICAgKiBjcm9zcy10aWxlIGZldGNoKSDihpIgbm8gcmFjZSwgbm8gc2VhbXMuIENoYW5uZWwgaXMgcGFyc2VkIGZyb20gdGhlIHRpbGUgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbG9yQ2hhbm5lbFRpbGUoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5kaXNwbGF5VG9rZW47XG4gICAgY29uc3QgdGlsZSA9IGV2ZW50Py50aWxlO1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gKHRpbGUgJiYgKHR5cGVvZiB0aWxlLmdldFVybCA9PT0gJ2Z1bmN0aW9uJyA/IHRpbGUuZ2V0VXJsKCkgOiB0aWxlLnVybCkpIHx8ICcnO1xuICAgIGNvbnN0IG0gPSAvWz8mXWNoYW5uZWw9KFxcZCspLy5leGVjKHVybCk7XG4gICAgY29uc3QgY2ggPSBtID8gcGFyc2VJbnQobVsxXSwgMTApIDogMDtcbiAgICBjb25zdCBzdCA9IHRoaXMuY2hhbm5lbFN0YXRlc1tjaF07XG5cbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkgeyBjdHggPSBhd2FpdCBldmVudC5nZXREYXRhKCdjb250ZXh0MmQnKTsgfSBjYXRjaCB7IC8qIGZhbGxiYWNrIGJlbG93ICovIH1cbiAgICBsZXQgaW1nOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3R4ICYmIGN0eC5jYW52YXMgJiYgY3R4LmNhbnZhcy53aWR0aCAmJiBjdHguY2FudmFzLmhlaWdodCkge1xuICAgICAgdHJ5IHsgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7IH0gY2F0Y2ggeyBpbWcgPSBudWxsOyB9XG4gICAgfVxuICAgIGlmICghaW1nIHx8ICF0aGlzLmhhc09wYXF1ZShpbWcuZGF0YSkpIHtcbiAgICAgIGxldCBzcmM6IGFueSA9IG51bGw7XG4gICAgICB0cnkgeyBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZUJpdG1hcCcpOyB9IGNhdGNoIHsgLyogbm9uZSAqLyB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSB7IHRyeSB7IHNyYyA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2ltYWdlJyk7IH0gY2F0Y2ggeyAvKiBub25lICovIH0gfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgcmV0dXJuO1xuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHNyYy53aWR0aDsgYy5oZWlnaHQgPSBzcmMuaGVpZ2h0O1xuICAgICAgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2Uoc3JjLCAwLCAwKTtcbiAgICAgIGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYy53aWR0aCwgYy5oZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuXG4gICAgLy8gUHJlY29tcHV0ZSBsdW0oMC4uMjU1KSDihpIgdGludGVkIFJHQiBvbmNlLCB0aGVuIG1hcCBlYWNoIHBpeGVsIGJ5IGxvb2t1cCDigJRcbiAgICAvLyB0aGUgY2hhbm5lbCB0aWxlIGlzIHNpbmdsZS1iYW5kLCBzbyB0aGlzIHR1cm5zIH4yNjJrIHBlci1waXhlbFxuICAgIC8vIGNoYW5uZWxJbnRlbnNpdHkoKSAod2l0aCBNYXRoLnBvdyBmb3IgZ2FtbWEpIGNhbGxzIGludG8gMjU2IOKAlCB0aGUgZGlmZmVyZW5jZVxuICAgIC8vIGJldHdlZW4gYSBzbmFwcHkgYW5kIGEgc2x1Z2dpc2ggc2xpZGVyIG9uIGEgNC1jaGFubmVsIHN0YWNrLlxuICAgIGNvbnN0IHsgcjogckwsIGc6IGdMLCBiOiBiTCB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgIGNvbnN0IGQgPSBpbWcuZGF0YTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkgKz0gNCkge1xuICAgICAgaWYgKGRbaSArIDNdID09PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHIgPSBkW2ldLCBnID0gZFtpICsgMV0sIGIgPSBkW2kgKyAyXTtcbiAgICAgIGNvbnN0IGx1bSA9IHIgPj0gZyA/IChyID49IGIgPyByIDogYikgOiBnID49IGIgPyBnIDogYjsgLy8gc2luZ2xlLWJhbmQg4oaSIG1heFxuICAgICAgZFtpXSA9IHJMW2x1bV07XG4gICAgICBkW2kgKyAxXSA9IGdMW2x1bV07XG4gICAgICBkW2kgKyAyXSA9IGJMW2x1bV07XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XG4gICAgLy8gQSBuZXdlciBkaXNwbGF5IHJvdW5kICh0aGUgbmV4dCB0aWNrIG9mIGEgc2xpZGVyIGRyYWcpIGhhcyBhbHJlYWR5IHJlc3RvcmVkXG4gICAgLy8gdGhpcyB0aWxlLiBXcml0aW5nIGEgc3VwZXJzZWRlZCBjb250ZXh0IGJhY2sgbWFrZXMgT1NEJ3MgY29udmVyc2lvbiB0aHJvd1xuICAgIC8vIERPTUV4Y2VwdGlvbiwgd2hpY2ggZGVzdHJveXMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZSDigJQgZG9cbiAgICAvLyBub3RoaW5nIGFuZCBsZXQgdGhlIG5ld2VyIHJvdW5kIHJlcGFpbnQgaXQuXG4gICAgaWYgKHRva2VuICE9PSB0aGlzLmRpc3BsYXlUb2tlbikgcmV0dXJuO1xuICAgIGN0eC5wdXRJbWFnZURhdGEoaW1nLCAwLCAwKTtcbiAgICAvLyBTZWUgcmVjb2xvclRpbGU6IHRoZSB0aWxlIGNhY2hlIGNhbiBzdGlsbCBkaWUgYmV0d2VlbiB0aGUgYXdhaXRzIGFuZCBoZXJlLlxuICAgIHRyeSB7IGF3YWl0IGV2ZW50LnNldERhdGEoY3R4LCAnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiB0aWxlIGV2aWN0ZWQgKi8gfVxuICB9XG5cbiAgLyoqIFBlci1jaGFubmVsIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUsIGZyb20gdGhlIGN1cnJlbnRcbiAgICogIHNsaWNlJ3Mgc2FtcGxlZCB0aWxlcyAoZ3JheXNjYWxlIOKGkiBjaGFubmVsIDA7IFJHQiDihpIgUi9HL0IpLiBOdWxsIHVudGlsIHRoZVxuICAgKiAgYXN5bmMgc2FtcGxpbmcgcmVzb2x2ZXMgb3IgaWYgaXQgd2FzIHNraXBwZWQuICovXG4gIGdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXg6IG51bWJlciwgX2JpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLmdldCh0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgpO1xuICB9XG5cbiAgLyoqIE5hdGl2ZSBiaXQgZGVwdGggb2YgYSBjaGFubmVsIGZyb20gdGhlIHRpbGUgZGVzY3JpcHRvciAoOCB3aGVuIHVua25vd24pLiAqL1xuICBwcml2YXRlIGNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcj8uY2hhbm5lbEluZm8/LltjaGFubmVsSW5kZXhdPy5iaXREZXB0aCA/PyA4O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGhpc3RvZ3JhbSBmb3IgdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUuIEZvciA+OC1iaXQgaW1hZ2VzIGl0XG4gICAqIGZldGNoZXMgdGhlICoqbmF0aXZlKiogZGlzdHJpYnV0aW9uIGZyb20gdGhlIHNlcnZlciBgL2hpc3RvZ3JhbWAgZW5kcG9pbnRcbiAgICogKHRoZSA4LWJpdCBjYW52YXMgdGlsZXMgY2FuJ3QgY2FycnkgMTYtYml0IHZhbHVlcykgYW5kIGNhY2hlcyBpdCBwZXJcbiAgICogc2xpY2UrY2hhbm5lbDsgZm9yIDgtYml0L1JHQiBpdCByZXR1cm5zIHRoZSBleGlzdGluZyBjbGllbnQtc2FtcGxlZCA4LWJpdFxuICAgKiBoaXN0b2dyYW0uIFJlYWQtb25seSDigJQgaXQgbmV2ZXIgdG91Y2hlcyB0aGUgdGlsZS9kaXNwbGF5IHBpcGVsaW5lLlxuICAgKi9cbiAgZ2V0SGlzdG9ncmFtJChjaGFubmVsSW5kZXg6IG51bWJlciwgYmluczogbnVtYmVyKTogT2JzZXJ2YWJsZTxJSGlzdG9ncmFtIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLmNoYW5uZWxCaXREZXB0aChjaGFubmVsSW5kZXgpIDw9IDggfHwgIXRoaXMuaW5mb0I2NCkge1xuICAgICAgcmV0dXJuIG9mKHRoaXMuZ2V0SGlzdG9ncmFtKGNoYW5uZWxJbmRleCwgYmlucykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zYW1wbGVyLm5hdGl2ZSQodGhpcy5pbmZvQjY0LCB0aGlzLmN1cnJlbnRaLCBjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgdW5kZXJseWluZyBpbWFnZSBkYXRhIGFzIGEgZGF0YS1wcmVzZXJ2aW5nIG11bHRpLWJhbmQgVElGRiBhdFxuICAgKiBuYXRpdmUgYml0IGRlcHRoIHZpYSBgR0VUIC9leHBvcnQvdGlmZmAgKHRoZSBzZXJ2ZXIgcmVhZHMgdGhlIHJhdyAxNi1iaXRcbiAgICogcGxhbmVzIOKAlCB0aGUgY2xpZW50IG5ldmVyIHNlZXMgdGhlbSkuIFNlbmRzIG9ubHkgdGhlIHZpc2libGUgY2hhbm5lbHM7IHRoZVxuICAgKiBleGlzdGluZyA4LWJpdCBjb21wb3NpdGUgUE5HIGV4cG9ydCBpcyB1bmFmZmVjdGVkLlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RGF0YSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaW5mb0I2NCkgcmV0dXJuO1xuICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmNoYW5uZWxTdGF0ZXMuZmlsdGVyKChjKSA9PiBjLnZpc2libGUpLm1hcCgoYykgPT4gYy5pbmRleCk7XG4gICAgY29uc3QgYWxsID0gdGhpcy5jaGFubmVsU3RhdGVzLmxlbmd0aDtcbiAgICAvLyBPbWl0IGBjaGFubmVsc2Agd2hlbiBldmVyeSBjaGFubmVsIGlzIHZpc2libGUgKHNlcnZlciBkZWZhdWx0ID0gYWxsKS5cbiAgICBjb25zdCBjaFBhcmFtID1cbiAgICAgIHZpc2libGUubGVuZ3RoICYmIHZpc2libGUubGVuZ3RoIDwgYWxsID8gYCZjaGFubmVscz0ke3Zpc2libGUuam9pbignLCcpfWAgOiAnJztcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX1leHBvcnQvdGlmZj9pbmZvPSR7dGhpcy5pbmZvQjY0fSZ6PSR7dGhpcy5jdXJyZW50Wn0ke2NoUGFyYW19YDtcbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAuZ2V0KHVybCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnLCByZXNwb25zZVR5cGU6ICdibG9iJyB9KVxuICAgICAgICAgIC5waXBlKHRpbWVvdXQoNjAwMDAwKSksIC8vIGxhcmdlIGV4cG9ydHMgc3RyZWFtIHNsb3dseTsgZ2VuZXJvdXMgZGVhZGxpbmVcbiAgICAgICk7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIDE2LWJpdCBleHBvcnQ6IGZpbGUgc3RpbGwgY2FjaGluZyDigJQgdHJ5IGFnYWluIHNob3J0bHkuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJsb2IgPSByZXNwLmJvZHk7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19XzE2Yml0Lm9tZS50aWZgKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignW09TRF0gMTYtYml0IFRJRkYgZXhwb3J0IGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCB0aGUgY3VycmVudCBzbGljZSBhcyBhIHB1YmxpY2F0aW9uLXJlYWR5IFBORyBjb21wb3NpdGVkIHdpdGggdGhlXG4gICAqIGFjdGl2ZSBkaXNwbGF5IHNldHRpbmdzICh3aW5kb3cgLyBnYW1tYSAvIGNvbG9ybWFwIG9yIHBlci1jaGFubmVsIHBzZXVkby1cbiAgICogY29sb3VycyAvIGludmVydCkuIFBpY2tzIHRoZSBsYXJnZXN0IHB5cmFtaWQgbGV2ZWwgdW5kZXIgYSBwaXhlbCBjYXAgKHRoZVxuICAgKiBjb2Fyc2VyIG92ZXJ2aWV3IGZvciBodWdlIHdob2xlLXNsaWRlcyksIGZldGNoZXMgdGhhdCBsZXZlbCdzIHRpbGUgZ3JpZCxcbiAgICogc3RpdGNoZXMgaXQgaW50byBvbmUgY2FudmFzLCBydW5zIHRoZSBzaGFyZWQgZGlzcGxheSBwaXBlbGluZSwgYW5kIHNhdmVzIGl0LlxuICAgKi9cbiAgYXN5bmMgZXhwb3J0Q29tcG9zaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlc2MgPSB0aGlzLmRlc2NyaXB0b3I7XG4gICAgY29uc3QgbGV2ZWxzID0gZGVzYz8ubGV2ZWxzID8/IFtdO1xuICAgIGlmICghZGVzYyB8fCAhdGhpcy5pbmZvQjY0IHx8ICFsZXZlbHMubGVuZ3RoKSByZXR1cm47XG4gICAgY29uc3QgQ0FQID0gMzJfMDAwXzAwMDsgLy8gfjMyIE1QIOKAlCBib3VuZHMgbWVtb3J5IGZvciB3aG9sZS1zbGlkZSBpbWFnZXNcbiAgICBsZXQgcmVzID0gbGV2ZWxzLmxlbmd0aCAtIDE7IC8vIGNvYXJzZXN0IGZhbGxiYWNrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZXZlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChsZXZlbHNbaV0ud2lkdGggKiBsZXZlbHNbaV0uaGVpZ2h0IDw9IENBUCkgeyByZXMgPSBpOyBicmVhazsgfVxuICAgIH1cbiAgICBjb25zdCBsdyA9IGxldmVsc1tyZXNdLndpZHRoO1xuICAgIGNvbnN0IGxoID0gbGV2ZWxzW3Jlc10uaGVpZ2h0O1xuICAgIGNvbnN0IHQgPSBkZXNjLnRpbGVTaXplO1xuICAgIGNvbnN0IGNvbHMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobHcgLyB0KSk7XG4gICAgY29uc3Qgcm93cyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbChsaCAvIHQpKTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBsdztcbiAgICBjYW52YXMuaGVpZ2h0ID0gbGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICBjb25zdCB6ID0gdGhpcy5jdXJyZW50WjtcbiAgICBjb25zdCBqb2JzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgY29sczsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdXJsID0gYnVpbGRUaWxlVXJsKHRoaXMuYXBpLCB0aGlzLmluZm9CNjQsIHsgcmVzLCBjb2wsIHJvdywgeiwgdGlsZVNpemU6IHQgfSk7XG4gICAgICAgIGpvYnMucHVzaChcbiAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgYm1wID0gYXdhaXQgZmV0Y2hUaWxlQml0bWFwKHRoaXMuaHR0cCwgdXJsLCAzMDAwMCk7XG4gICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYm1wLCBjb2wgKiB0LCByb3cgKiB0KTtcbiAgICAgICAgICAgICAgYm1wLmNsb3NlPy4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAvLyBTa2lwIGEgZmFpbGVkIHRpbGUg4oCUIHRoZSBleHBvcnRlZCBjb21wb3NpdGUgaGFzIGEgZ2FwIHRoZXJlLlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgdGlsZSBmZXRjaCBmYWlsZWQsIHNraXBwaW5nJywgdXJsLCBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGpvYnMpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWFnZURhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGx3LCBsaCk7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5LmFwcGx5VG9SZ2JhKGltYWdlRGF0YS5kYXRhKSkgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gS2VlcCB0aGUgdW4tcmVjb2xvcmVkIGNvbXBvc2l0ZSBpZiByZWFkYmFjayBmYWlscyDigJQgYnV0IHNheSB3aHkuXG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXo6ZXhwb3J0XSBjb21wb3NpdGUgcmVjb2xvciByZWFkYmFjayBmYWlsZWQg4oCUIGV4cG9ydGluZyByYXcgdGlsZXMnLCBlcnIpO1xuICAgIH1cbiAgICBjb25zdCBzdGVtID0gKHRoaXMuY3VycmVudEZpbGVOYW1lIHx8ICdpbWFnZScpLnJlcGxhY2UoL1xcLlteLl0rJC8sICcnKTtcbiAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICBpZiAoYmxvYikgc2F2ZUFzKGJsb2IsIGAke3N0ZW19X2NvbXBvc2l0ZS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICAvKiogVHJ1ZSBpZiBhbnkgcGl4ZWwgaW4gdGhlIFJHQkEgYnVmZmVyIGlzIG5vbi10cmFuc3BhcmVudC4gKi9cbiAgcHJpdmF0ZSBoYXNPcGFxdWUoZDogVWludDhDbGFtcGVkQXJyYXkpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkW2ldICE9PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8g4pSA4pSAIElEaXNwbGF5T3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gSW5oZXJpdGVkIGZyb20gQmFzZVN0b3JlVmlzdWFsaXplciDigJQgcHVyZSBkZWxlZ2F0aW9ucyB0byB0aGUgc2hhcmVkXG4gIC8vIFZpc3VhbGl6ZXJTdG9yZSwgc28gT1NEIGFuZCBQbG90bHkgc3RheSBpbiBsb2NrLXN0ZXAuIE9TRCBhcHBsaWVzIHRoZVxuICAvLyBjb2xvcm1hcCB0byBncmF5c2NhbGUgdGlsZXMgdmlhIHRoZSBMVVQgcmVhY3RpdmVseSAoc2VlIHRoZSBjb25zdHJ1Y3RvcidzXG4gIC8vIGNvbG9ybWFwIHN1YnNjcmlwdGlvbiksIG5vdCBpbiBzZXRDb2xvcm1hcC5cblxuICAvLyDilIDilIAgSVZpc3VhbGl6ZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHVuc3Vic2NyaWJlKCk6IHZvaWQge1xuICAgIHRoaXMuY29sb3JtYXBTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IG51bGw7XG4gICAgLy8gRHJvcCBhIHF1ZXVlZCBpbnZhbGlkYXRpb24gc28gaXQgY2FuJ3QgZmlyZSBhZ2FpbnN0IGEgdG9ybi1kb3duIHZpZXdlci5cbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGNhbmNlbEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmludmFsaWRhdGVIYW5kbGUpO1xuICAgICAgZWxzZSBjbGVhclRpbWVvdXQodGhpcy5pbnZhbGlkYXRlSGFuZGxlIGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4pO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gIH1cbn1cbiJdfQ==
2102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlD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QUFDO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsc0VBQXNFO0lBQ3RFLHdFQUF3RTtJQUN4RSw0RUFBNEU7SUFDNUUsOENBQThDO0lBRTlDLHdFQUF3RTtJQUN4RSxXQUFXO1FBQ1QsSUFBSSxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QiwwRUFBMEU7UUFDMUUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkMsSUFBSSxPQUFPLG9CQUFvQixLQUFLLFVBQVU7Z0JBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7O2dCQUN2RixZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUE0RCxDQUFDLENBQUM7WUFDckYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7OEdBdDVEVSw4QkFBOEIsNENBNEkvQixnQkFBZ0IsbUxBTUosY0FBYyw0TUFNMUIsVUFBVTtrSEF4SlQsOEJBQThCLGNBRGpCLE1BQU07OzJGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkE2STdCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFNdkIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjOzswQkFNakMsTUFBTTsyQkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkZWZlciwgZmlyc3RWYWx1ZUZyb20sIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzdGFydFdpdGgsIHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCAqIGFzIE9wZW5TZWFkcmFnb24gZnJvbSAnb3BlbnNlYWRyYWdvbic7XG5pbXBvcnQgeyBPU0QgfSBmcm9tICcuL29zZC1saWInO1xuaW1wb3J0IHsgT1NEX1pPT01fUEVSX1NDUk9MTCB9IGZyb20gJy4vb3NkLXpvb20nO1xuXG5cbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3Zpc3VhbGl6ZXItc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBSZWdpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgVGlsZUFjY2Vzc1BvcnQsIFRJTEVfQUNDRVNTX1BPUlQgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcG9ydHMvdGlsZS1hY2Nlc3MucG9ydCc7XG5pbXBvcnQgeyBWaXpDb25maWcsIFZJWl9DT05GSUcgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90VHlwZSwgUExPVF9UWVBFX0RFU0NSSVBUT1JTLCBQbG90VHlwZURlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IElWaXN1YWxpemVyLCBQaXhlbERhdGEsIEludGVuc2l0eVByb2ZpbGUsIElJc29zdXJmYWNlQ29udHJvbHMsIElJbnRlbnNpdHlDb250cm9scywgSVN1cmZhY2UzZENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzLCBWaWV3ZXJGZWF0dXJlLCBjYXBhYmlsaXRpZXNPZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jYXBhYmlsaXRpZXMuY29udHJhY3QnO1xuaW1wb3J0IHsgT3NkUmVnaW9uT3ZlcmxheSB9IGZyb20gJy4vb3NkLXJlZ2lvbi1vdmVybGF5JztcbmltcG9ydCB7IE9zZFNjYWxlQmFyIH0gZnJvbSAnLi9vc2Qtc2NhbGUtYmFyJztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5LCBSZWdpb25Ub29sTW9kZSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9yZWdpb24tb3ZlcmxheS5jb250cmFjdCc7XG5pbXBvcnQgeyBJQ29vcmRpbmF0ZVRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb29yZGluYXRlLXRyYW5zZm9ybS5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi9vc2QtY29vcmRpbmF0ZS10cmFuc2Zvcm0nO1xuaW1wb3J0IHsgUGxvdE1vZGVSZWN0LCBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHsgZWxlbWVudFRvSW1hZ2UsIGltYWdlUmVjdFRvVmlld3BvcnQsIHZpZXdwb3J0UmVjdFRvSW1hZ2UgfSBmcm9tICcuL29zZC1jb29yZHMnO1xuaW1wb3J0IHsgYnVpbGRUaWxlVXJsLCBmZXRjaFRpbGVCaXRtYXAgfSBmcm9tICcuL3RpbGUtY2xpZW50JztcbmltcG9ydCB7IFNsaWNlQ2FjaGUgfSBmcm9tICcuL3NsaWNlLWNhY2hlJztcbmltcG9ydCB7IERpc3BsYXlQaXBlbGluZSB9IGZyb20gJy4vZGlzcGxheS1waXBlbGluZSc7XG5pbXBvcnQgeyBIaXN0b2dyYW1TYW1wbGVyIH0gZnJvbSAnLi9oaXN0b2dyYW0tc2FtcGxlcic7XG5pbXBvcnQgeyBCYXNlU3RvcmVWaXN1YWxpemVyIH0gZnJvbSAnLi4vYmFzZS1zdG9yZS12aXN1YWxpemVyJztcbmltcG9ydCB7IFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZSB9IGZyb20gJy4uL3NpbXBsZS1zbGljZS1hY2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZWRJbWFnZURhdGEsIFdhbmRUb29sU2VydmljZSwgV2FuZFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IEJydXNoVG9vbFNlcnZpY2UsIEJydXNoT3B0aW9ucyB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvYnJ1c2gvYnJ1c2gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBTYW1Qb2ludFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXBvaW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsU2VnbWVudFRvb2xTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9zZWdtZW50YXRpb24vY2VsbC1zZWdtZW50LXRvb2wuc2VydmljZSc7XG5pbXBvcnQgeyBJQ2VsbFNlZ21lbnRlciwgQ0VMTF9TRUdNRU5URVIgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2VsbC1zZWdtZW50ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgVmVydGV4RXJhc2VyVG9vbFNlcnZpY2UsIFZlcnRleEVyYXNlclRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci92ZXJ0ZXgtZXJhc2VyL3ZlcnRleC1lcmFzZXItdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFpvb21Ub0JveFRvb2xTZXJ2aWNlLCBab29tVG9Cb3hUb29sSG9zdCB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvem9vbS10by1ib3gvem9vbS10by1ib3gtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci93YW5kL3dhbmQuc2VydmljZSc7XG5pbXBvcnQgeyBidWlsZENvbG9ybWFwTHV0LCBSZ2IgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY29sb3JtYXAtbHV0JztcbmltcG9ydCB7IElDaGFubmVsU3RhdGUsIElIaXN0b2dyYW0gfSBmcm9tICcuLi8uLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGUtc2F2ZXInO1xuXG4vKipcbiAqIFF1aWV0IE9wZW5TZWFkcmFnb24ncyBcIltWaWV3cG9ydC4qXSBpcyBub3QgYWNjdXJhdGUgd2l0aCBtdWx0aS1pbWFnZVwiIGFkdmlzb3JpZXMuXG4gKiBBIG11bHRpY2hhbm5lbCBpbWFnZSBpcyBjb21wb3NpdGVkIGZyb20gb25lIFRpbGVkSW1hZ2UgcGVyIGNoYW5uZWwg4oCUIGEgbGVnaXRpbWF0ZVxuICogbXVsdGktaW1hZ2Ugd29ybGQg4oCUIGFuZCBPU0QgbG9ncyB0aGF0IGFkdmlzb3J5IChhdCBlcnJvciBsZXZlbCkgZnJvbSBpdHMgb3duXG4gKiBuYXZpZ2F0b3Ivb3ZlcnZpZXcgcmVuZGVyaW5nIG9uIGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSwgZmxvb2RpbmcgdGhlIGNvbnNvbGUuIE91clxuICogb3duIGltYWdlPC0+dmlld3BvcnQgY29udmVyc2lvbnMgYWxyZWFkeSByb3V0ZSB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAoc2VlXG4gKiBvc2QtY29vcmRzKSwgc28gdGhlIHJlbWFpbmluZyBhZHZpc29yaWVzIGFyZSBPU0QtaW50ZXJuYWwgYW5kIG9ubHkgYWZmZWN0IHRoZVxuICogbWluaW1hcCdzIGJveCBhY2N1cmFjeSAoY29zbWV0aWMpLiBUaGlzIHdyYXBzIE9TRCdzIGxvZ2dlciBpbiBhIFByb3h5IHRoYXQgZHJvcHNcbiAqIG9ubHkgdGhhdCBvbmUgbWVzc2FnZSBzdHJpbmcgYW5kIGZvcndhcmRzIGV2ZXJ5IG90aGVyIGxvZyB1bnRvdWNoZWQuIElkZW1wb3RlbnQuXG4gKi9cbmZ1bmN0aW9uIHNpbGVuY2VPc2RNdWx0aUltYWdlQWR2aXNvcnkoKTogdm9pZCB7XG4gIGNvbnN0IG9zZDogYW55ID0gT1NEIGFzIGFueTtcbiAgaWYgKG9zZC5fX211bHRpSW1hZ2VGaWx0ZXJJbnN0YWxsZWQpIHJldHVybjtcbiAgY29uc3QgYmFzZTogYW55ID0gKG9zZC5jb25zb2xlICYmIHR5cGVvZiBvc2QuY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICA/IG9zZC5jb25zb2xlXG4gICAgOiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnID8gY29uc29sZSA6IG51bGwpO1xuICBpZiAoIWJhc2UpIHJldHVybjtcbiAgY29uc3QgaXNBZHZpc29yeSA9IChhOiB1bmtub3duKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyAmJiBhLmluZGV4T2YoJ25vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlJykgIT09IC0xO1xuICBvc2QuY29uc29sZSA9IG5ldyBQcm94eShiYXNlLCB7XG4gICAgZ2V0KHRhcmdldDogYW55LCBwcm9wOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSB0YXJnZXRbcHJvcF07XG4gICAgICBpZiAoKHByb3AgPT09ICdlcnJvcicgfHwgcHJvcCA9PT0gJ3dhcm4nKSAmJiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IGFueVtdKSA9PiB7IGlmIChpc0Fkdmlzb3J5KGFyZ3NbMF0pKSByZXR1cm47IG9yaWcuYXBwbHkodGFyZ2V0LCBhcmdzKTsgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2Ygb3JpZyA9PT0gJ2Z1bmN0aW9uJyA/IG9yaWcuYmluZCh0YXJnZXQpIDogb3JpZztcbiAgICB9LFxuICB9KTtcbiAgb3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCA9IHRydWU7XG59XG5cbi8qKiBPbmUgcHlyYW1pZCBsZXZlbCBmcm9tIGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVMZXZlbCB7IHJlczogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlcjsgfVxuXG4vKiogVGlsZS1zb3VyY2UgZGVzY3JpcHRvciByZXR1cm5lZCBieSBgR0VUIC90aWxlcy9pbmZvYC4gKi9cbmludGVyZmFjZSBUaWxlRGVzY3JpcHRvciB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICB0aWxlU2l6ZTogbnVtYmVyO1xuICB6OiBudW1iZXI7XG4gIGNoYW5uZWxzOiBudW1iZXI7XG4gIC8qKiBUcnVlIG9ubHkgZm9yIGdlbnVpbmUgbXVsdGktY2hhbm5lbCBjb21wb3NpdGVzIChpbmRleGVkL0xVVC1iZWFyaW5nXG4gICAqICBmbHVvcmVzY2VuY2Ugc3RhY2tzKSB0aGUgY2xpZW50IHNob3VsZCBzcGxpdCBpbnRvIHBlci1jaGFubmVsIGxheWVycy4gVGhlXG4gICAqICBzZXJ2ZXIgc2V0cyBpdDsgYW4gUkdCIHBob3RvIHJlYWQgYXMgc2VwYXJhdGVkIHBsYW5lcyBoYXMgY2hhbm5lbHM+MSBidXRcbiAgICogIG11bHRpY2hhbm5lbD1mYWxzZSwgc28gaXQgc3RheXMgYSBzaW5nbGUgY29tcG9zaXRlIHRpbGUgc291cmNlLiAqL1xuICBtdWx0aWNoYW5uZWw/OiBib29sZWFuO1xuICAvKiogUmVhbCBCaW8tRm9ybWF0cyByZXNvbHV0aW9uIGxldmVscyBhdCB0aGUgZnJvbnQgb2YgYGxldmVsc2A7IHRoZSByZW1haW5pbmdcbiAgICogIGxldmVscyBhcmUgc3ludGhldGljIGNvbXBvc2l0ZWQgb3ZlcnZpZXdzIChubyBwZXItY2hhbm5lbCB0aWxlcykuICovXG4gIHJlYWxMZXZlbHM/OiBudW1iZXI7XG4gIC8qKiBQZXItY2hhbm5lbCBtZXRhZGF0YSAobmFtZS9jb2xvci9iaXREZXB0aC9taW4tbWF4QWxsb3dlZCkgZm9yIG5hdGl2ZSAxNi1iaXRcbiAgICogIHdpbmRvd2luZyArIGhpc3RvZ3JhbTsgbnVsbCBmb3IgcGxhaW4gOC1iaXQvUkdCIHNvdXJjZXMuICovXG4gIGNoYW5uZWxJbmZvPzogQXJyYXk8e1xuICAgIG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nOyBiaXREZXB0aD86IG51bWJlcjsgbWluQWxsb3dlZD86IG51bWJlcjsgbWF4QWxsb3dlZD86IG51bWJlcjtcbiAgfT4gfCBudWxsO1xuICBsZXZlbHM6IFRpbGVMZXZlbFtdO1xuICAvKiogUGh5c2ljYWwgcGl4ZWwgc2l6ZSBpbiDCtW0gKDAgd2hlbiB0aGUgZm9ybWF0IGRvZXNuJ3QgcmVwb3J0IGl0KS4gKi9cbiAgbXBwWD86IG51bWJlcjtcbiAgbXBwWT86IG51bWJlcjtcbn1cblxuLyoqIFdoYXQgYGxvYWQoKWAgaGFuZHMgdG8gYHBsb3QoKWAuICovXG5pbnRlcmZhY2UgT3NkTG9hZGVkIHtcbiAgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgfCBudWxsO1xuICBpbmZvQjY0OiBzdHJpbmc7XG4gIHo6IG51bWJlcjtcbiAgLyoqIE1pcnJvcnMgdGhlIGxvYWRlZCBpbWFnZSdzIGZpbGVuYW1lIOKAlCB0aGUgZGlhZ3JhbSdzIHJlbmRlciBwaXBlbGluZVxuICAgKiAgZ3VhcmRzIG9uIGBsb2FkZWQuZmlsZW5hbWUgPT09IHBoYXNlSW5mby5maWxlTmFtZWAgYmVmb3JlIGNhbGxpbmcgcGxvdCgpLiAqL1xuICBmaWxlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogU2ltcGxlIChub24tdGlsZWQpIGltYWdlOiBgcGxvdCgpYCBvcGVucyB7QGxpbmsgdXJsfSBkaXJlY3RseSB2aWEgT1NEJ3NcbiAgICogIHNpbmdsZS1pbWFnZSBzb3VyY2Ug4oCUIG5vIHRpbGUgcHlyYW1pZCwgbm8gc2VydmVyLiBTZXQgd2hlbiB0aGUgaW1hZ2VcbiAgICogIGNhcnJpZXMgYHRpbGVkID09PSBmYWxzZWAgKHNlZSB7QGxpbmsgSUltYWdlSW5mby50aWxlZH0pLiAqL1xuICBzaW1wbGU/OiBib29sZWFuO1xuICAvKiogVGhlIGRpcmVjdGx5LWxvYWRhYmxlIGltYWdlIFVSTCAoYGJsb2I6YC9gZGF0YTpgL2BodHRwYCkgZm9yIHNpbXBsZSBtb2RlLiAqL1xuICB1cmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlblNlYWRyYWdvbiB2aXN1YWxpemF0aW9uIGJhY2tlbmQuXG4gKlxuICogUmVuZGVycyB0aGUgKmltYWdlKiBwbG90IHR5cGUgYXMgYSBuYXRpdmVseS10aWxlZCwgem9vbWFibGUgcmFzdGVyLCBiYWNrZWQgYnlcbiAqIHRoZSBqaXQtc2VydmljZSB0aWxlIGVuZHBvaW50cyAoYEdFVCAvdGlsZXMvaW5mb2AgKyBgR0VUIC90aWxlYCwgd2hpY2ggcmV1c2VcbiAqIHRoZSBCaW8tRm9ybWF0cyBST0kgcmVuZGVyZXIpLiBQbG90bHkga2VlcHMgdGhlIHNjaWVudGlmaWMvZGF0YSBwbG90IHR5cGVzXG4gKiAoc2NhbGFyIGhlYXRtYXAsIHN1cmZhY2UsIGNvbnRvdXIsIHNjYXR0ZXIsIGxpbmUsIHNjYXR0ZXIzZCwgaXNvc3VyZmFjZSkg4oCUXG4gKiBoZW5jZSB0aGlzIGJhY2tlbmQgYWR2ZXJ0aXNlcyBvbmx5IGBJbWFnZURpc3BsYXlgLlxuICpcbiAqIFdpcmVkOiBsb2FkIOKGkiBkZXNjcmlwdG9yLCBwbG90IOKGkiBtb3VudCB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSxcbiAqIHpvb20vcGFuIOKGkiB2aWV3cG9ydCBBUEkuIE5PVCB3aXJlZCB5ZXQgKGZvbGxvdy11cHMpOiByZWdpb24gb3ZlcmxheXMgKyB0b29sc1xuICogKGEgcG9zaXRpb25lZCBjYW52YXMvU1ZHIG92ZXJsYXkgb3IgQW5ub3RvcmlvdXMpLCBwaXhlbCByZWFkYmFjaywgYW5kIHRoZVxuICogcGVyLXRpbGUgTFVUL2NvbnRyYXN0IHBhcmFtcy4gTm90IHJlZ2lzdGVyZWQgaW4gREkgcHJvdmlkZXJzIOKAlCBgUGxvdGx5U2VydmljZWBcbiAqIGlzIHN0aWxsIHRoZSBvbmx5IGFjdGl2ZSBiYWNrZW5kOyB0aGlzIHByb3ZlcyB0aGUgY29udHJhY3Qgc3VwcG9ydHMgYSBzZWNvbmRcbiAqIGltcGxlbWVudGF0aW9uIGFnYWluc3QgcmVhbCBlbmRwb2ludHMuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZVN0b3JlVmlzdWFsaXplciBpbXBsZW1lbnRzIElWaXN1YWxpemVyIHtcbiAgLyoqIE9TRCdzIHN0cmVuZ3RoIGlzIGRpc3BsYXlpbmcgYSBsYXJnZSB6b29tYWJsZSBpbWFnZSDigJQgbm90aGluZyBlbHNlIGhlcmUuICovXG4gIHJlYWRvbmx5IGNhcGFiaWxpdGllczogVmlld2VyQ2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzT2YoW1ZpZXdlckZlYXR1cmUuSW1hZ2VEaXNwbGF5XSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGk6IHN0cmluZztcbiAgcHJpdmF0ZSB2aWV3ZXI6IE9wZW5TZWFkcmFnb24uVmlld2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb3ZlcmxheTogSVJlZ2lvbk92ZXJsYXkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzY2FsZUJhcjogT3NkU2NhbGVCYXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGwgPSBudWxsO1xuICAvKiogQmFzZTY0IFJhd0ZpbGVJbmZvICsgY3VycmVudCB6LXNsaWNlLCBrZXB0IHNvIHNldFpJbmRleCBjYW4gcmVidWlsZCB0aGVcbiAgICogIHRpbGUgc291cmNlIGFuZCBzd2FwIHNsaWNlcyBsaXZlIChzdGFjayBuYXZpZ2F0aW9uKS4gKi9cbiAgcHJpdmF0ZSBpbmZvQjY0ID0gJyc7XG4gIHByaXZhdGUgY3VycmVudFogPSAwO1xuICAvKiogVHJ1ZSB3aGlsZSB0aGUgY3VycmVudCBpbWFnZSBpcyBcInNpbXBsZVwiICh0aWxlZDpmYWxzZSDigJQgc2VsZi1jb250YWluZWRcbiAgICogIHBlci1zbGljZSBVUkxzLCBubyB0aWxlIHNlcnZlcjsgZS5nLiBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWRcbiAgICogIGNsaWVudC1zaWRlIGludG8gYSBzdGFjaykuIHNldFpJbmRleCBzd2FwcyB0aGUgc2luZ2xlLWltYWdlIHNvdXJjZSBmb3JcbiAgICogIHRoZSBuZXcgc2xpY2UncyBVUkwgaW5zdGVhZCBvZiB1cGRhdGluZyBhIHRpbGVkIHotcGFyYW0uICovXG4gIHByaXZhdGUgc2ltcGxlTW9kZSA9IGZhbHNlO1xuICAvKiogdXJsc1tdIGZvciB0aGUgY3VycmVudCBzaW1wbGUtbW9kZSBpbWFnZSwgc28gc2V0WkluZGV4IGNhbiBsb29rIHVwIHRoZVxuICAgKiAgc2xpY2UgYmVpbmcgc2NydWJiZWQgdG8gKHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLnVybEZvcn0pLlxuICAgKiAgVW51c2VkIChhbmQgbGVmdCBzdGFsZSwgaGFybWxlc3NseSkgaW4gdGlsZWQgbW9kZS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogcHJldmlldyBibG9iIFVSTCDihpIgZnVsbC1yZXMgdXBzY2FsZWQgYmxvYiBVUkwgKHNlZSB0b0Z1bGxSZXNVcmwpLCBzb1xuICAgKiAgcmUtdmlzaXRpbmcgYSBzaW1wbGUtbW9kZSBzbGljZSBkb2Vzbid0IHJlLXVwc2NhbGUuIFJldm9rZWQgb24gZmlsZSBjaGFuZ2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2ltcGxlRnVsbFJlc1VybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogU0VSVkVSTEVTUyBtdWx0aWNoYW5uZWwgKHRpbGVkOmZhbHNlICsgY2hhbm5lbENvdW50PjEpOiB0aGUgc3RhY2snc1xuICAgKiAgcGVyLXNsaWNlIHBlci1jaGFubmVsIHBsYW5lIFVSTHMsIHRoZSBjdXJyZW50IHNsaWNlJ3MgZGVjb2RlZCBwbGFuZXMsIGFuZFxuICAgKiAgdGhlIGxhc3QgY29tcG9zaXRlIGJsb2IgVVJMLiBDb21wb3NpdGVkIGNsaWVudC1zaWRlIHZpYSBkaXNwbGF5LmNoYW5uZWxSZ2JMdXRcbiAgICogIChubyB0aWxlIHNlcnZlcik7IGtlcHQgT0ZGIHRoZSB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoLiAqL1xuICBwcml2YXRlIHNpbXBsZU11bHRpY2hhbm5lbCA9IGZhbHNlO1xuICBwcml2YXRlIHNpbXBsZUNoYW5uZWxVcmxzOiBzdHJpbmdbXVtdID0gW107XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDb21wb3NpdGVVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogU2tpcCB0aGUgZnVsbC1yZXMgdXBzY2FsZSBhYm92ZSB0aGlzIGxvbmdlc3Qtc2lkZSBkaW1lbnNpb24g4oCUIGEgZm9sZGVyXG4gICAqICBzdGFjayBpcyBwZXItZmlsZSBwcmV2aWV3cyAod2VsbCB1bmRlciB0aGlzKTsgdGhpcyBvbmx5IGd1YXJkcyBhZ2FpbnN0IGFuXG4gICAqICBhY2NpZGVudGFsIGVub3Jtb3VzIGNhbnZhcyBhbGxvY2F0aW9uLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IFNJTVBMRV9VUFNDQUxFX01BWF9ESU0gPSA4MTkyO1xuICBwcml2YXRlIGNvb3JkVHJhbnNmb3JtOiBPc2RDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLyoqIFRoZSB2aXNpYmxlIHJlY3Qgb24gZXZlcnkgcmVkcmF3LCBjb2FsZXNjZWQgdG8gb25lIGVtaXNzaW9uIHBlciBhbmltYXRpb25cbiAgICogIGZyYW1lLiBGZWVkcyB7QGxpbmsgUGxvdE1vZGVWaWV3cG9ydC5mcmFtZSR9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZyYW1lJCA9IG5ldyBTdWJqZWN0PFBsb3RNb2RlUmVjdD4oKTtcbiAgcHJpdmF0ZSBmcmFtZVJhZjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxvdE1vZGVWaWV3cG9ydDogUGxvdE1vZGVWaWV3cG9ydCB8IG51bGwgPSBudWxsO1xuICAvLyBSZWdpb24gc3RhdGUgKHJlZ2lvbnMsIHNlbGVjdGlvbiwgdGhlIHVwZGF0ZSBldmVudCkgbGl2ZXMgaW4gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZTsgdGhlIElSZWdpb25TdG9yZSBtZXRob2RzIGJlbG93IGRlbGVnYXRlIHRvIGl0LlxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVByb2ZpbGUkID0gbmV3IFN1YmplY3Q8SW50ZW5zaXR5UHJvZmlsZVtdPigpO1xuICAvLyBJbWFnZSBtZXRhZGF0YSBhbmQgY2xhc3NpZmljYXRpb24gY29sb3VycyBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLlxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUgY29sb3JtYXAvcmV2ZXJzZSBzbyBPU0QgcmVjb2xvcnMgaW5cbiAgICogbG9jay1zdGVwIHdpdGggUGxvdGx5LiBJZGVtcG90ZW50IGFuZCBzZWxmLWhlYWxpbmc6IHRoaXMgc2VydmljZSBpcyBhIHJvb3RcbiAgICogc2luZ2xldG9uLCBidXQgYHVuc3Vic2NyaWJlKClgIChjYWxsZWQgb24gVmlzdWFsaXplckNvbXBvbmVudCBkZXN0cm95KVxuICAgKiB0ZWFycyB0aGUgc3Vic2NyaXB0aW9uIGRvd24g4oCUIGFuZCB0aGUgY29uc3RydWN0b3IgbmV2ZXIgcnVucyBhZ2Fpbi4gU29cbiAgICogYHBsb3QoKWAgY2FsbHMgdGhpcyB0byByZS1lc3RhYmxpc2ggaXQgYWZ0ZXIgYSBjb21wb25lbnQgdGVhcmRvd24vcmVjcmVhdGVcbiAgICogKGUuZy4gc3dpdGNoaW5nIGltYWdlcyksIG90aGVyd2lzZSBjb2xvcm1hcCBjaGFuZ2VzIHdvdWxkIGJlIHNpbGVudGx5XG4gICAqIGRyb3BwZWQgb24gZXZlcnkgaW1hZ2UgYWZ0ZXIgdGhlIGZpcnN0IHN3aXRjaC5cbiAgICovXG4gIHByaXZhdGUgZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29sb3JtYXBTdWIpIHJldHVybjtcbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlIGxpdmUgaW4gdGhlIHNoYXJlZCBWaXN1YWxpemVyU3RvcmUg4oCUIHRoZSBzaW5nbGUgc291cmNlXG4gICAgLy8gb2YgdHJ1dGggZm9yIGJvdGggYmFja2VuZHMuIFJlYnVpbGQgdGhlIExVVCBhbmQgcmUtcnVuIHRoZSBwaXhlbCBwaXBlbGluZVxuICAgIC8vIHdoZW5ldmVyIGVpdGhlciBjaGFuZ2VzLCBzbyBPU0QgcmVjb2xvcnMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIC8vIENvbG9ybWFwL3JldmVyc2UgKyBwZXItY2hhbm5lbCB3aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSArIGludmVydCBhbGwgbGl2ZSBpblxuICAgIC8vIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBhbnkgb2YgdGhlbSBjaGFuZ2VzLCBzbyB0aGUgQ2hhbm5lbHMgJiBIaXN0b2dyYW0gcGFuZSB1cGRhdGVzIHRoZVxuICAgIC8vIGltYWdlIGxpdmUgYW5kIE9TRCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCBQbG90bHkuXG4gICAgdGhpcy5jb2xvcm1hcFN1YiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5zdG9yZS5nZXRDb2xvcm1hcCgpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgdGhpcy5zdG9yZS5nZXRJbnZlcnQoKSxcbiAgICBdKS5zdWJzY3JpYmUoKFtjbSwgcmV2LCBjaGFubmVscywgaW52ZXJ0XSkgPT4ge1xuICAgICAgdGhpcy5jb2xvckx1dCA9IGJ1aWxkQ29sb3JtYXBMdXQoY20/LmRhdGE/LnZhbHVlLCAhIXJldik7XG4gICAgICB0aGlzLmNoYW5uZWxTdGF0ZXMgPSBjaGFubmVscztcbiAgICAgIHRoaXMuaW52ZXJ0QmcgPSAhIWludmVydDtcbiAgICAgIC8vIFNlcnZlcmxlc3MgbXVsdGljaGFubmVsOiByZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkXG4gICAgICAvLyBwbGFuZXMgd2l0aCB0aGUgbmV3IGNoYW5uZWwgc3RhdGVzICsgcmUtb3BlbiAobm8gdGlsZS1pbnZhbGlkYXRlIHBhdGgpLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7IHZvaWQgdGhpcy5yZWNvbXBvc2l0ZUFuZE9wZW4oKTsgcmV0dXJuOyB9XG4gICAgICAvLyBNdWx0aWNoYW5uZWw6IGVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIFRpbGVkSW1hZ2Ug4oCUIHZpc2liaWxpdHkgaXMgdGhlXG4gICAgICAvLyBpbWFnZSdzIG9wYWNpdHkgKHdpbmRvdy9nYW1tYS9jb2xvdXIgYXJlIGFwcGxpZWQgYnkgcmVjb2xvckNoYW5uZWxUaWxlXG4gICAgICAvLyBvbiB0aGUgaW52YWxpZGF0ZSBiZWxvdykuIFJlLWFwcGx5aW5nIHRoZSBjdXJyZW50IHNsaWNlJ3MgcmV2ZWFsIHBpY2tzIHVwXG4gICAgICAvLyB0aGUgbmV3IHBlci1jaGFubmVsIHZpc2liaWxpdHkgKGNhY2hlZCBzbGljZXMgc3RheSBoaWRkZW4pLlxuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5jYWNoZS5yZXZlYWxDaGFubmVsU2xpY2UodGhpcy5jdXJyZW50Wik7XG4gICAgICB9XG4gICAgICAvLyByZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKSByZXN0b3JlcyBlYWNoIHRpbGUgdG8gaXRzIG9yaWdpbmFsIGRhdGEgYmVmb3JlXG4gICAgICAvLyByZS1ydW5uaW5nIHJlY29sb3JUaWxlLCBzbyBhIGNoYW5nZSBhbHdheXMgbWFwcyBhZnJlc2ggKG5vIGNvbXBvdW5kaW5nKS5cbiAgICAgIC8vIFJHQiBub3cgcmVjb2xvcnMgdG9vIChwZXItY2hhbm5lbCB3aW5kb3cvdmlzaWJpbGl0eSksIHNvIGRvbid0IGdhdGUgb25cbiAgICAgIC8vIGdyYXlzY2FsZS4gQ29hbGVzY2VkOiBQcmltZU5HJ3Mgc2xpZGVyIGZpcmVzIChvbkNoYW5nZSkgY29udGludW91c2x5LCBzb1xuICAgICAgLy8gYSBzaW5nbGUgZHJhZyB3b3VsZCBvdGhlcndpc2UgcXVldWUgZG96ZW5zIG9mIG92ZXJsYXBwaW5nIHJlc3RvcmUgK1xuICAgICAgLy8gcmUtcHJvY2VzcyByb3VuZHMgb3ZlciBldmVyeSBjaGFubmVsIGltYWdlLlxuICAgICAgdGhpcy5zY2hlZHVsZUludmFsaWRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZWVkIHRoZSBJbnRlbnNpdHkgY2hhbm5lbCB3aXRoIGEgbWVhc3VyZWQgYXV0by13aW5kb3cgd2hpbGUgaXQncyBzdGlsbFxuICAgKiAgYXQgZnVsbCByYW5nZSAobmV2ZXIgY2xvYmJlciB0aGUgdXNlcidzIG1hbnVhbCB3aW5kb3cpOyBpZiB0aGUgdXNlclxuICAgKiAgYWxyZWFkeSB3aW5kb3dlZCwganVzdCByZS1pbnZhbGlkYXRlIHNvIHBhaW50ZWQgdGlsZXMgcGljayB0aGUgTFVUIHVwLiAqL1xuICBwcml2YXRlIHNlZWRHcmF5V2luZG93KG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGNoMCA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKVswXTtcbiAgICBpZiAoY2gwICYmIGNoMC5taW4gPT09IDAgJiYgY2gwLm1heCA9PT0gMjU1KSB7XG4gICAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZSgwLCB7IG1pbiwgbWF4IH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy52aWV3ZXIgJiYgdGhpcy5jb2xvckx1dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHRoaXMudmlld2VyIGFzIGFueSkud29ybGQucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIElEYXRhUmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSB0aWxlLXNvdXJjZSBkZXNjcmlwdG9yIGZvciB0aGUgc2VsZWN0ZWQgZmlsZS4gVGhlIGBpbmZvYCBwYXJhbSBpc1xuICAgKiB0aGUgYmFzZTY0IFJhd0ZpbGVJbmZvIHRoZSByZXN0IG9mIHRoZSBBUEkgdXNlczsgdGhlIEdFVCBnb2VzIHRocm91Z2ggdGhlXG4gICAqIGF1dGggaW50ZXJjZXB0b3IgKEJlYXJlcikuIFdlIGFsc28gZ3JhYiBhIHRva2VuIGhlcmUgZm9yIE9TRCdzIG93biB0aWxlXG4gICAqIGZldGNoZXMgKGl0cyBsb2FkZXIgYnlwYXNzZXMgSHR0cENsaWVudCkuXG4gICAqL1xuICBhc3luYyBsb2FkKGltYWdlSW5mbzogSUltYWdlSW5mbywgekluZGV4OiBudW1iZXIpOiBQcm9taXNlPE9zZExvYWRlZD4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICAvLyBBIGRpZmZlcmVudCBpbWFnZSB3YXMgc2VsZWN0ZWQg4oCUIHN0b3AgdGhlIHByZXZpb3VzIHN0YWNrJ3MgYmFja2dyb3VuZFxuICAgIC8vIGxvYWRpbmcgaW1tZWRpYXRlbHkgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBmaW5pc2ggYmVoaW5kIHRoZSBuZXcgaW1hZ2UuXG4gICAgaWYgKGZpbGVuYW1lICYmIHRoaXMuY3VycmVudEZpbGVOYW1lICYmIGZpbGVuYW1lICE9PSB0aGlzLmN1cnJlbnRGaWxlTmFtZSkge1xuICAgICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgICAgdGhpcy5yZXZva2VTaW1wbGVGdWxsUmVzVXJscygpO1xuICAgIH1cbiAgICB0aGlzLnNpbXBsZVN0YWNrLm5vdGVBY3RpdmVGaWxlKGZpbGVuYW1lKTtcbiAgICAvLyBTaW1wbGUgKGluLW1lbW9yeSAvIG5vbi10aWxlZCkgaW1hZ2U6IHNraXAgdGhlIHRpbGUgc2VydmVyIGVudGlyZWx5IOKAlCBub1xuICAgIC8vIGdldFNlbGVjdGVkSW5mb0I2NCwgbm8gL3RpbGVzL2luZm8gcG9sbC4gYHVybHNbekluZGV4XWAgaXMgYSBjb21wbGV0ZSBpbWFnZVxuICAgIC8vIE9TRCBvcGVucyB2aWEgaXRzIHNpbmdsZS1pbWFnZSBzb3VyY2UgKHNlZSBwbG90KCkpLlxuICAgIGlmICh0aGlzLnNpbXBsZVN0YWNrLmlzU2ltcGxlKGltYWdlSW5mbykpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRTaW1wbGUoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCBpbmZvQjY0ID0gdGhpcy50aWxlcy5nZXRTZWxlY3RlZEluZm9CNjQoKTtcbiAgICBpZiAoIWluZm9CNjQpIHJldHVybiB7IGRlc2NyaXB0b3I6IG51bGwsIGluZm9CNjQ6ICcnLCB6OiB6SW5kZXggfHwgMCwgZmlsZW5hbWUgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1dGhIZWFkZXJzID0gYXdhaXQgdGhpcy50aWxlcy5nZXRBdXRoSGVhZGVycygpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IHt9OyAvLyBmYWxsIGJhY2sgdG8gY29va2llIGF1dGggKGFqYXhXaXRoQ3JlZGVudGlhbHMpXG4gICAgfVxuICAgIC8vIFBvbGwgL3RpbGVzL2luZm86IHRoZSBiYWNrZW5kIHJldHVybnMgMjAyIHdoaWxlIHRoZSBzb3VyY2UgZmlsZSBpcyBzdGlsbFxuICAgIC8vIGJlaW5nIGNhY2hlZCAoR0NTLT5QVkMpIOKAlCBpdCBraWNrcyB0aGUgZG93bmxvYWQgb2ZmIGluIHRoZSBiYWNrZ3JvdW5kLCBzb1xuICAgIC8vIGVhY2ggcmVxdWVzdCBpcyBzaG9ydCAobm8gbG9uZy1oZWxkIGNvbm5lY3Rpb24gdG8gdHJpcCBpbmdyZXNzL3Byb3h5IG9yXG4gICAgLy8gY2xpZW50IHRpbWVvdXRzKSwgYW5kIDIwMCB3aXRoIHRoZSBkZXNjcmlwdG9yIG9uY2UgaXQncyByZWFkeS4gVGhlXG4gICAgLy8gY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSBzaG93cyBwcm9ncmVzcyBkdXJpbmcgdGhlIHdhaXQuIFdlIGdpdmUgdXAgYWZ0ZXJcbiAgICAvLyB0aWxlc0luZm9UaW1lb3V0TXMgc28gdGhlIHJlbmRlciBwaXBlbGluZSBuZXZlciBoYW5ncyAodGhlIHJvdXRlciB0aGVuXG4gICAgLy8gZmFsbHMgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UpLlxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpfXRpbGVzL2luZm8/aW5mbz0ke2luZm9CNjR9YDtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLnRpbGVzSW5mb1RpbWVvdXRNcztcbiAgICBmb3IgKDs7KSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGlsZXMvaW5mbyBub3QgcmVhZHkgYmVmb3JlIGRlYWRsaW5lIOKAlCBmaWxlIHN0aWxsIGNhY2hpbmcnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PFRpbGVEZXNjcmlwdG9yPih1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKHRpbWVvdXQoNDUwMDApKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDAgJiYgcmVzcC5ib2R5KSB7XG4gICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gcmVzcC5ib2R5O1xuICAgICAgICAgIHJldHVybiB7IGRlc2NyaXB0b3I6IHJlc3AuYm9keSwgaW5mb0I2NCwgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gMjAyIEFjY2VwdGVkIChvciBlbXB0eSBib2R5KSDihpIgc3RpbGwgY2FjaGluZzsgZmFsbCB0aHJvdWdoIGFuZCByZS1wb2xsLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIC8vIFRvbGVyYXRlIHRyYW5zaWVudCBmYWlsdXJlcyBXSElMRSB0aGUgZmlsZSBpcyBiZWluZyBwcmVwYXJlZDogYSBzbG93XG4gICAgICAgIC8vIG1ldGFkYXRhIHJlYWQgb24gYSBtdWx0aS1HQiBmaWxlIChJRkQgd2FsayksIGEgNXh4IG1pZC1waXBlbGluZSwgYVxuICAgICAgICAvLyBwcm94eSBoaWNjdXAuIEEgc2luZ2xlIGJhZCBwb2xsIG11c3QgTk9UIGRyb3AgdXMgdG8gUGxvdGx5IOKAlCBhIGxhcmdlXG4gICAgICAgIC8vIGltYWdlIGFsd2F5cyBwYXNzZXMgdGhyb3VnaCB0aGlzIGJ1c3kgd2luZG93LCBzbyBiYWlsaW5nIGhlcmUgaXMgd2h5XG4gICAgICAgIC8vIGl0IFwiYWx3YXlzIGVuZHMgdXAgb24gUGxvdGx5XCIuIEtlZXAgcG9sbGluZyB1bnRpbCByZWFkeSBvciBkZWFkbGluZS5cbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSB0aWxlcy9pbmZvIHBvbGwgcmV0cnknLCBlcnIpO1xuICAgICAgfVxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgMTUwMCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCB0aGUgYHBsb3QoKWAgcGF5bG9hZCBmb3IgYSBzaW1wbGUgKHRpbGVkOmZhbHNlKSBpbWFnZTogYSBzaW5nbGUtbGV2ZWxcbiAgICogIGRlc2NyaXB0b3Igc2l6ZWQgZnJvbSBgdHJ1ZUltYWdlU2l6ZWAsIHBsdXMgdGhlIGRpcmVjdGx5LWxvYWRhYmxlIFVSTCDigJRcbiAgICogIHJlc29sdmVkIGFuZCBmZXRjaGVkIHZpYSB7QGxpbmsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlfSAoc2hhcmVkIHdpdGhcbiAgICogIG5hcGFyaS1qczsgc2VlIGl0cyBkb2NzIGZvciB3aHkgdGhpcyBjYW4ndCBiZSBhIHJhdyBgZmV0Y2goKWAvYDxpbWc+YCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZShpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpbWFnZUluZm8udHJ1ZUltYWdlU2l6ZSA/PyBbMCwgMF07XG4gICAgY29uc3QgbWV0YSA9IGltYWdlSW5mby5pbWFnZU1ldGE/LlswXTtcbiAgICAvLyBTRVJWRVJMRVNTIE1VTFRJQ0hBTk5FTDogY29tcG9zaXRlIHRoZSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lc1xuICAgIC8vIGNsaWVudC1zaWRlIChubyB0aWxlIHNlcnZlciksIGRyaXZlbiBieSB0aGUgY2hhbm5lbCBwYW5lLiBLZXB0IE9GRiB0aGVcbiAgICAvLyB0aWxlZCBpc011bHRpQ2hhbm5lbCBwYXRoIChzZWUgY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKS5cbiAgICBjb25zdCBjaFVybHMgPSBpbWFnZUluZm8uY2hhbm5lbFVybHM7XG4gICAgdGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwgPSAhIWNoVXJscz8ubGVuZ3RoICYmIChtZXRhPy5jaGFubmVsQ291bnQgPz8gMSkgPiAxO1xuICAgIGxldCB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFVybHMgPSBjaFVybHMgYXMgc3RyaW5nW11bXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFNpbXBsZUNoYW5uZWxQbGFuZXMoY2hVcmxzIVt6XSA/PyBjaFVybHMhWzBdKTtcbiAgICAgICAgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICAgICAgLy8gTkI6IGhpc3RvZ3JhbXMgYXJlIGJpbm5lZCBpbiBwbG90KCksIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgY2xlYXJzIHRoZVxuICAgICAgICAvLyBzYW1wbGVyIOKAlCBjb21wdXRpbmcgdGhlbSBoZXJlIHdvdWxkIGJlIHdpcGVkIGJ5IHRoYXQgY2xlYXIuXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUgbXVsdGljaGFubmVsIGNvbXBvc2l0ZSBmYWlsZWQnLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gW107XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBbXTtcbiAgICAgIGNvbnN0IHJhd1VybCA9IHRoaXMuc2ltcGxlU3RhY2sudXJsRm9yKGltYWdlSW5mbywgeik7XG4gICAgICBpZiAocmF3VXJsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwocmF3VXJsKTtcbiAgICAgICAgICAvLyBVcHNjYWxlIHRoZSAoZG93bnNjYWxlZCkgcHJldmlldyB0byBmdWxsIHJlc29sdXRpb24gc28gT1NEJ3Mgd29ybGRcbiAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBmdWxsLXJlcyBST0kgY29vcmRpbmF0ZSBzcGFjZSDigJQgc2VlIHRvRnVsbFJlc1VybC5cbiAgICAgICAgICB1cmwgPSBhd2FpdCB0aGlzLnRvRnVsbFJlc1VybChwcmV2aWV3VXJsLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBmZXRjaCBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE5vIGxvYWRhYmxlIFVSTCAoZW1wdHkgdXJsc1tdIG9yIHRoZSBmZXRjaCBmYWlsZWQpOiBzaWduYWwgXCJjb3VsZG4ndFxuICAgIC8vIGxvYWRcIiB3aXRoIGEgbnVsbCBkZXNjcmlwdG9yIOKAlCBzYW1lIGFzIHRoZSB0aWxlZCBwYXRoIHdoZW4gdGhlcmUncyBub1xuICAgIC8vIHNlbGVjdGVkLWZpbGUgaW5mbyDigJQgc28gcGxvdCgpIHJldHVybnMgZmFsc2UgKGl0cyBgaWYgKCFkKWAgZ3VhcmQpIGFuZFxuICAgIC8vIHRoZSByb3V0ZXIgY2FuIGZhbGwgYmFjaywgaW5zdGVhZCBvZiBtb3VudGluZyBhbiA8aW1nPiB3aXRoIGFuIHVuZGVmaW5lZFxuICAgIC8vIHNyYyB0aGF0IHRocm93cyBhdCBydW50aW1lLlxuICAgIGlmICghdXJsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIHNsaWNlIGhhcyBubyBsb2FkYWJsZSBVUkw7IHNraXBwaW5nIE9TRCByZW5kZXInLCBmaWxlbmFtZSk7XG4gICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgeiwgZmlsZW5hbWUgfTtcbiAgICB9XG4gICAgY29uc3QgZGVzY3JpcHRvcjogVGlsZURlc2NyaXB0b3IgPSB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpbGVTaXplOiAwLCAgICAgICAgICAgIC8vIHVudXNlZDogc2ltcGxlIG1vZGUgbmV2ZXIgY2FsbHMgYnVpbGRUaWxlU291cmNlXG4gICAgICB6OiAxLCAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZnJhbWVcbiAgICAgIGNoYW5uZWxzOiBtZXRhPy5yZ2JDaGFubmVscyA/PyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlID8gMSA6IDMpLFxuICAgICAgbXVsdGljaGFubmVsOiBmYWxzZSxcbiAgICAgIHJlYWxMZXZlbHM6IDEsXG4gICAgICBsZXZlbHM6IFt7IHJlczogMCwgd2lkdGgsIGhlaWdodCB9XSxcbiAgICAgIG1wcFg6IG1ldGE/Lm1wcFggPz8gMCxcbiAgICAgIG1wcFk6IG1ldGE/Lm1wcFkgPz8gMCxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgaW5mb0I2NDogJycsXG4gICAgICB6LFxuICAgICAgZmlsZW5hbWUsXG4gICAgICBzaW1wbGU6IHRydWUsXG4gICAgICB1cmwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0QncyBge3R5cGU6J2ltYWdlJ31gIHNvdXJjZSBzaXplcyBpdHMgY29vcmRpbmF0ZSB3b3JsZCB0byB0aGUgaW1hZ2Unc1xuICAgKiBOQVRVUkFMIHBpeGVscy4gQSBmb2xkZXItc3RhY2sgc2xpY2UgaXMgYSBzZXJ2ZXIgYC9wcmV2aWV3YCB3aG9zZSBwaXhlbCBzaXplXG4gICAqIG5lZWRuJ3QgbWF0Y2ggdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSDigJQgaXQgbWF5IGJlIGRvd25zY2FsZWQgKGxhcmdlXG4gICAqIGltYWdlcykgT1IgbGFyZ2VyIHRoYW4gdGhlIGRpbWVuc2lvbnMgYC9tZXRhZGF0YWAgcmVwb3J0cy4gRWl0aGVyIHdheSBPU0Qnc1xuICAgKiB3b3JsZCB3b3VsZCBkaWZmZXIgZnJvbSB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2UgKFF1UGF0aCBnZW9qc29uLFxuICAgKiBpbiBsZXZlbC0wIHBpeGVscyk6IGEgc21hbGxlciBwcmV2aWV3IHJlbmRlcnMgUk9JcyBvdmVyc2l6ZWQsIGEgbGFyZ2VyIG9uZVxuICAgKiByZW5kZXJzIHRoZW0gdW5kZXJzaXplZC9vZmZzZXQuIFJlc2FtcGxlIHRoZSBwcmV2aWV3IHRvIEVYQUNUTFkgdGhlXG4gICAqIGZ1bGwtcmVzb2x1dGlvbiBkaW1lbnNpb25zIChibHVycnkgYnV0IHBvc2l0aW9uYWxseSBleGFjdCDigJQgc2NhbGluZyB1cCBvclxuICAgKiBkb3duIGFzIG5lZWRlZCkgc28gT1NEJ3Mgd29ybGQgbWF0Y2hlcyB0aGUgUk9JIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWxlIHN0aWxsXG4gICAqIHVzaW5nIE9TRCdzIHJlbGlhYmxlIHNpbmdsZS1pbWFnZSByZW5kZXJlci4gQ2FjaGVkIHBlciBwcmV2aWV3IFVSTCAocmV2b2tlZFxuICAgKiBvbiBmaWxlIGNoYW5nZSk7IGEgbm8tb3Agd2hlbiB0aGUgcHJldmlldyBpcyBhbHJlYWR5IGV4YWN0bHkgZnVsbC1yZXMgKHNtYWxsXG4gICAqIGltYWdlcywgaW4tbWVtb3J5IHBpcGVsaW5lIGJsb2JzKSwgd2hlbiB0aGUgZGltcyBhcmUgdW5rbm93biwgb3Igd2hlblxuICAgKiB0aGV5J3JlIGltcGxhdXNpYmx5IGxhcmdlIChndWFyZHMgYWdhaW5zdCBhbiBlbm9ybW91cyBjYW52YXMpLiAoaml0LXVpIzkzKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0b0Z1bGxSZXNVcmwocHJldmlld1VybDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0IHx8IE1hdGgubWF4KHdpZHRoLCBoZWlnaHQpID4gdGhpcy5TSU1QTEVfVVBTQ0FMRV9NQVhfRElNKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmdldChwcmV2aWV3VXJsKTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgIGxldCBpbWc6IEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgdHJ5IHtcbiAgICAgIGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gcHJldmlld1VybDsgLy8gY291bGRuJ3QgZGVjb2RlIOKAlCBsZXQgT1NEIHRyeSB0aGUgVVJMIGFzLWlzXG4gICAgfVxuICAgIC8vIEFscmVhZHkgdGhlIGV4YWN0IGZ1bGwtcmVzIHdvcmxkIOKAlCBubyByZXNhbXBsZSBuZWVkZWQuIChBIHByZXZpZXcgdGhhdCBpc1xuICAgIC8vIGxhcmdlciBPUiBzbWFsbGVyIHRoYW4gZnVsbC1yZXMgbXVzdCBzdGlsbCBiZSByZXNpemVkIHNvIE9TRCdzIHdvcmxkID09XG4gICAgLy8gdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlOyBvbmx5IGFuIGV4YWN0IG1hdGNoIGlzIHNraXBwYWJsZS4pXG4gICAgaWYgKGltZy5uYXR1cmFsV2lkdGggPT09IHdpZHRoICYmIGltZy5uYXR1cmFsSGVpZ2h0ID09PSBoZWlnaHQpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsgLy8gc2NhbGUgcHJldmlldyAodXAgb3IgZG93bikgdG8gZnVsbC1yZXNcbiAgICBjb25zdCBibG9iID0gYXdhaXQgbmV3IFByb21pc2U8QmxvYiB8IG51bGw+KChyZXNvbHZlKSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiBwcmV2aWV3VXJsO1xuICAgIGNvbnN0IGZ1bGxSZXNVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuc2V0KHByZXZpZXdVcmwsIGZ1bGxSZXNVcmwpO1xuICAgIHJldHVybiBmdWxsUmVzVXJsO1xuICB9XG5cbiAgLyoqIFNhbXBsZSBhIFNJTVBMRS1tb2RlIHNsaWNlJ3Mgb3duIGRlY29kZWQgcGl4ZWxzIGludG8gdGhlIGhpc3RvZ3JhbSDigJQgdGhlXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgc2FtcGxlcnMgKG5vIHRpbGUgc2VydmVyKS4gRmlyZS1hbmQtZm9yZ2V0O1xuICAgKiAgYSBkZWNvZGUgZmFpbHVyZSBqdXN0IGxlYXZlcyB0aGUgcGFuZSBlbXB0eSByYXRoZXIgdGhhbiB0aHJvd2luZy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBzYW1wbGVTaW1wbGVIaXN0b2dyYW0odXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsIHo6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwodXJsKTtcbiAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICBpZiAoIXcgfHwgIWgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSB3OyBjLmhlaWdodCA9IGg7XG4gICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgY29uc3QgZGF0YSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YTtcbiAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlSGlzdG9ncmFtKHosIGRhdGEsIHRoaXMuaXNHcmF5c2NhbGVJbWFnZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIHNpbXBsZS1tb2RlIGhpc3RvZ3JhbSBzYW1wbGUgZmFpbGVkJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogRmV0Y2ggKyBkZWNvZGUgYSBzbGljZSdzIHBlci1jaGFubmVsIHBsYW5lcyAoc2luZ2xlLWJhbmQgZ3JheXNjYWxlKSBpbnRvXG4gICAqICBwaXhlbCBidWZmZXJzLCBmb3IgdGhlIFNFUlZFUkxFU1MgbXVsdGljaGFubmVsIGNvbXBvc2l0b3IuIEF1dGgtc2FmZTogZ29lc1xuICAgKiAgdGhyb3VnaCBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UgKGJsb2I6L2RhdGE6IGFzLWlzOyBodHRwIHZpYSBIdHRwQ2xpZW50KS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2ltcGxlQ2hhbm5lbFBsYW5lcyh1cmxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYW5lczogQXJyYXk8eyBkYXRhOiBVaW50OENsYW1wZWRBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdXJscyA/PyBbXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJldmlld1VybCA9IGF3YWl0IHRoaXMuc2ltcGxlU3RhY2suZmV0Y2hBc0Jsb2JVcmwodSk7XG4gICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlRWwocHJldmlld1VybCk7XG4gICAgICAgIGNvbnN0IHcgPSBpbWcubmF0dXJhbFdpZHRoLCBoID0gaW1nLm5hdHVyYWxIZWlnaHQ7XG4gICAgICAgIGlmICghdyB8fCAhaCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgICBjb25zdCBjdHggPSBjLmdldENvbnRleHQoJzJkJywgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSk7XG4gICAgICAgIGlmICghY3R4KSB7IHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pOyBjb250aW51ZTsgfVxuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhLCB3aWR0aDogdywgaGVpZ2h0OiBoIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gY2hhbm5lbCBwbGFuZSBkZWNvZGUgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcyA9IHBsYW5lcztcbiAgfVxuXG4gIC8qKiBDb21wb3NpdGUgdGhlIGNhY2hlZCBwZXItY2hhbm5lbCBwbGFuZXMgaW50byBPTkUgUkdCQSBpbWFnZSB1c2luZyB0aGVcbiAgICogIGN1cnJlbnQgY2hhbm5lbCBzdGF0ZXMgKGNvbG91ci93aW5kb3cvZ2FtbWEvdmlzaWJpbGl0eSkg4oCUIHRoZSBjbGllbnQtc2lkZSxcbiAgICogIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBwZXItY2hhbm5lbCAnbGlnaHRlcicgY29tcG9zaXRvclxuICAgKiAgKHNhbWUgZGlzcGxheS5jaGFubmVsUmdiTHV0IG1hdGggYXMgcmVjb2xvckNoYW5uZWxUaWxlLCBhcHBsaWVkIHBlci1wbGFuZSkuXG4gICAqICBSZXR1cm5zIGEgYmxvYjogVVJMIG9mIHRoZSBjb21wb3NpdGUgUE5HLCByZXZva2luZyB0aGUgcHJldmlvdXMgb25lLiAqL1xuICBwcml2YXRlIGFzeW5jIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBsYW5lcyA9IHRoaXMuc2ltcGxlQ2hhbm5lbFBsYW5lcztcbiAgICBpZiAoIXBsYW5lcy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdyA9IHBsYW5lc1swXS53aWR0aCwgaCA9IHBsYW5lc1swXS5oZWlnaHQ7XG4gICAgaWYgKCF3IHx8ICFoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YXRlcyA9IHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKTtcbiAgICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KTtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IHBsYW5lcy5sZW5ndGg7IGMrKykge1xuICAgICAgY29uc3Qgc3QgPSBzdGF0ZXNbY107XG4gICAgICBpZiAoc3QgJiYgc3QudmlzaWJsZSA9PT0gZmFsc2UpIGNvbnRpbnVlOyAvLyBoaWRkZW4gY2hhbm5lbCBjb250cmlidXRlcyBub3RoaW5nXG4gICAgICBjb25zdCBwbGFuZSA9IHBsYW5lc1tjXTtcbiAgICAgIGlmIChwbGFuZS53aWR0aCAhPT0gdyB8fCBwbGFuZS5oZWlnaHQgIT09IGggfHwgIXBsYW5lLmRhdGEubGVuZ3RoKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHsgciwgZywgYiB9ID0gdGhpcy5kaXNwbGF5LmNoYW5uZWxSZ2JMdXQoc3QpO1xuICAgICAgY29uc3QgcGQgPSBwbGFuZS5kYXRhO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgaWYgKHBkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGx1bSA9IHBkW2ldOyAvLyBzaW5nbGUtYmFuZCBwbGFuZSAoUj1HPUIpXG4gICAgICAgIG91dFtpXSArPSByW2x1bV07ICAgICAgICAgIC8vIFVpbnQ4Q2xhbXBlZEFycmF5IGNsYW1wcyDihpIgYWRkaXRpdmUgKCdsaWdodGVyJylcbiAgICAgICAgb3V0W2kgKyAxXSArPSBnW2x1bV07XG4gICAgICAgIG91dFtpICsgMl0gKz0gYltsdW1dO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IG91dC5sZW5ndGg7IGkgKz0gNCkgb3V0W2ldID0gMjU1OyAvLyBvcGFxdWVcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3OyBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKG5ldyBJbWFnZURhdGEob3V0LCB3LCBoKSwgMCwgMCk7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzKSA9PiBjYW52YXMudG9CbG9iKHJlcywgJ2ltYWdlL3BuZycpKTtcbiAgICBpZiAoIWJsb2IpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKTtcbiAgICB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgcmV0dXJuIHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsO1xuICB9XG5cbiAgLyoqIFJlLWNvbXBvc2l0ZSB0aGUgY3VycmVudCBzbGljZSBmcm9tIGl0cyBjYWNoZWQgcGxhbmVzIChuZXcgY2hhbm5lbCBzdGF0ZXMpXG4gICAqICBhbmQgcmUtb3BlbiDigJQgdGhlIHNlcnZlcmxlc3MgYW5hbG9nIG9mIHRoZSB0aWxlZCBpbnZhbGlkYXRlLW9uLWNoYW5uZWwtY2hhbmdlLiAqL1xuICBwcml2YXRlIGFzeW5jIHJlY29tcG9zaXRlQW5kT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCgpO1xuICAgIGlmICghdXJsIHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgIHRyeSB7IHRoaXMudmlld2VyLm9wZW4oeyB0eXBlOiAnaW1hZ2UnLCB1cmwgfSBhcyBhbnkpOyB9IGNhdGNoIHsgLyogdmlld2VyIGdvbmUgKi8gfVxuICB9XG5cbiAgLyoqIExvYWQgYSBVUkwgaW50byBhbiBIVE1MSW1hZ2VFbGVtZW50IChyZXNvbHZlcyBvbmNlIGRlY29kZWQpLiBVc2VzXG4gICAqICBkb2N1bWVudC5jcmVhdGVFbGVtZW50IHJhdGhlciB0aGFuIGBuZXcgSW1hZ2UoKWAgYmVjYXVzZSB0aGlzIGZpbGUnc1xuICAgKiAgYEltYWdlYCBpbXBvcnQgaXMgaW1hZ2UtanMncyBkZWNvZGVyLCBub3QgdGhlIERPTSBlbGVtZW50LiAqL1xuICBwcml2YXRlIGxvYWRJbWFnZUVsKHVybDogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKGUpID0+IHJlamVjdChlKTtcbiAgICAgIGltZy5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJldm9rZVNpbXBsZUZ1bGxSZXNVcmxzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgdSBvZiB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnZhbHVlcygpKSBVUkwucmV2b2tlT2JqZWN0VVJMKHUpO1xuICAgIHRoaXMuc2ltcGxlRnVsbFJlc1VybHMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpIHsgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7IHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsID0gbnVsbDsgfVxuICB9XG5cbiAgLyoqIE1vdW50IHRoZSB2aWV3ZXIgd2l0aCBhIGN1c3RvbSB0aWxlIHNvdXJjZSBwb2ludGluZyBhdCBgR0VUIC90aWxlYC4gKi9cbiAgcGxvdChcbiAgICBwbG90RGl2OiBzdHJpbmcsXG4gICAgaW1hZ2VMb2FkZWQ6IGFueSxcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgX3NjcmVlbkhlaWdodDogbnVtYmVyLFxuICAgIF9wbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGltYWdlTG9hZGVkIGFzIE9zZExvYWRlZDtcbiAgICBjb25zdCBkID0gbG9hZGVkPy5kZXNjcmlwdG9yO1xuICAgIGlmICghZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gICAgLy8gUmUtZXN0YWJsaXNoIHRoZSBjb2xvcm1hcCBzdWJzY3JpcHRpb24gaWYgYSBwcmlvciBjb21wb25lbnQgdGVhcmRvd25cbiAgICAvLyAodW5zdWJzY3JpYmUoKSkgdG9yZSBpdCBkb3duIOKAlCB0aGlzIHNlcnZpY2UgaXMgYSByb290IHNpbmdsZXRvbiwgc28gdGhlXG4gICAgLy8gY29uc3RydWN0b3Igd29uJ3QgcnVuIGFnYWluIHRvIHJlY3JlYXRlIGl0LlxuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgICAvLyBPU0QgdGlsZXMgbmF0aXZlbHksIHNvIHRoZSBpbi1wbGFjZSAobGFyZ2UpIHBhc3MgaXMgbm9ybWFsbHkgYSBuby1vcFxuICAgIC8vIG9uY2UgbW91bnRlZCDigJQgdGhlIHRpbGUgcHlyYW1pZCBJUyB0aGUgZnVsbCByZXNvbHV0aW9uIHJlZ2FyZGxlc3Mgb2ZcbiAgICAvLyB3aGljaCBJbWFnZUluZm8gdGllciByZXF1ZXN0ZWQgaXQuIFNpbXBsZSBtb2RlIGhhcyBubyBweXJhbWlkIHRvIGZhbGxcbiAgICAvLyBiYWNrIG9uOiBpdCBkaXNwbGF5cyBsaXRlcmFsbHkgd2hhdGV2ZXIgVVJMIHdhcyBsYXN0IG9wZW5lZCwgc29cbiAgICAvLyB3aXRob3V0IHRoaXMgc3dhcCB0aGUgc21hbGwgdGllcidzIDEyOHB4IHBsYWNlaG9sZGVyIHdvdWxkIHN0YXkgb25cbiAgICAvLyBzY3JlZW4gZm9yZXZlciAocGl4ZWxhdGVkLCBuZXZlciBcInNoYXJwZW5pbmdcIiBsaWtlIHRoZSB0aWxlZCBwYXRoKS5cbiAgICBpZiAoaW5QbGFjZSAmJiB0aGlzLnZpZXdlcikge1xuICAgICAgaWYgKGxvYWRlZC5zaW1wbGUgJiYgbG9hZGVkLnVybCkge1xuICAgICAgICAvLyBBbHNvIHJlZnJlc2ggc2ltcGxlVXJscyB0byBUSElTIHBoYXNlJ3MgKGxhcmdlLXRpZXIpIHVybHNbXSDigJQgaXQgd2FzXG4gICAgICAgIC8vIHNldCBmcm9tIHRoZSBzbWFsbCB0aWVyJ3MgMTI4cHggdXJscyBvbiB0aGUgaW5pdGlhbCBtb3VudCBiZWxvdyxcbiAgICAgICAgLy8gd2hpY2ggbmV2ZXIgcnVucyBhZ2FpbiBmb3IgdGhlIGluLXBsYWNlIHBhc3MuIFdpdGhvdXQgdGhpcyxcbiAgICAgICAgLy8gc2V0WkluZGV4J3MgbGF0ZXIgc2xpZGVyIHNjcnVicyB3b3VsZCBrZWVwIHJlYWRpbmcgdGhlIHNtYWxsXG4gICAgICAgIC8vIHRpZXIncyBsb3ctcmVzIFVSTHMgZm9yZXZlciwgZXZlbiB0aG91Z2ggdGhlIGluaXRpYWwgc2xpY2Ugd2FzXG4gICAgICAgIC8vIGNvcnJlY3RseSBzd2FwcGVkIHRvIGZ1bGwgcmVzb2x1dGlvbiBoZXJlLlxuICAgICAgICB0aGlzLnNpbXBsZVVybHMgPSBpbWFnZUluZm8/LnVybHMgPz8gdGhpcy5zaW1wbGVVcmxzO1xuICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH0gYXMgYW55KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMucGxvdERpdiA9IHBsb3REaXY7XG4gICAgdGhpcy5jdXJyZW50RmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMuZGVzY3JpcHRvciA9IGQ7XG4gICAgdGhpcy5pbmZvQjY0ID0gbG9hZGVkLmluZm9CNjQ7XG4gICAgdGhpcy5jdXJyZW50WiA9IGxvYWRlZC56O1xuICAgIHRoaXMuc2ltcGxlTW9kZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICB0aGlzLnNpbXBsZVVybHMgPSBsb2FkZWQuc2ltcGxlID8gKGltYWdlSW5mbz8udXJscyA/PyBbXSkgOiBbXTtcbiAgICAvLyBUaGUgZGVzY3JpcHRvcidzIHBoeXNpY2FsIHBpeGVsIHNpemUgKHNlcnZlciBCaW8tRm9ybWF0cyBgL3RpbGVzL2luZm9gKSBpc1xuICAgIC8vIGF1dGhvcml0YXRpdmUg4oCUIHB1c2ggaXQgaW50byB0aGUgc2hhcmVkIG1ldGEgc28gdGhlIFJlZ2lvbiBFZGl0b3IgcmVwb3J0c1xuICAgIC8vIGFyZWFzIGluIMK1bcKyL21twrIsIG1hdGNoaW5nIHRoZSBzY2FsZSBiYXIgYnVpbHQgZnJvbSBgZC5tcHBYYCBiZWxvdy5cbiAgICB0aGlzLnN0b3JlLnNldFBoeXNpY2FsUGl4ZWxTaXplKGQubXBwWCwgZC5tcHBZKTtcbiAgICAvLyBVc2UgdGhlIFNBTUUgZ3JheXNjYWxlIGZsYWcgdGhlIGNvbG9ybWFwIGRyb3Bkb3duIC8gUGxvdGx5IHVzZVxuICAgIC8vIChpbWFnZUluZm8uaXNHcmF5c2NhbGUg4oaQIHJnYkNoYW5uZWxzID09PSAxKS4gVGhlIGRlc2NyaXB0b3IncyBgY2hhbm5lbHNgXG4gICAgLy8gKGNoYW5uZWxDb3VudCkgZGl2ZXJnZXMgZnJvbSByZ2JDaGFubmVscyBmb3Igc3RhY2tzLCB3aGljaCBsZWZ0IGdyYXlzY2FsZVxuICAgIC8vIHN0YWNrcyB1bi1yZWNvbG9yZWQgZXZlbiB0aG91Z2ggdGhlIGNvbG9ybWFwIHNlbGVjdG9yIHdhcyBzaG93bi5cbiAgICB0aGlzLmlzR3JheXNjYWxlSW1hZ2UgPSAhIWltYWdlSW5mbz8uaXNHcmF5c2NhbGU7XG4gICAgLy8gU2ltcGxlIChub24tdGlsZWQsIGluLW1lbW9yeSkgaW1hZ2U6IG5vIHB5cmFtaWQsIG5vIHBlci1jaGFubmVsIHRpbGVzLCBhbmRcbiAgICAvLyBubyBzZXJ2ZXItc2lkZSBpbnRlbnNpdHkgc2FtcGxpbmcg4oCUIE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2Rlc1xuICAgIC8vIHVybHNbel0gZGlyZWN0bHkuIFNraXAgdGhlIHdob2xlIHRpbGVkLXNldHVwIHBhdGggYmVsb3cuXG4gICAgY29uc3Qgc2ltcGxlID0gISFsb2FkZWQuc2ltcGxlO1xuICAgIGlmIChzaW1wbGUpIHtcbiAgICAgIHRoaXMucmVhbExldmVscyA9IDE7XG4gICAgICB0aGlzLmlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIGhpc3RvZ3JhbSDigJQgQUZURVIgZGVzdHJveVZpZXdlciAoaXRzIGxhc3QgYWN0IGlzIHNhbXBsZXIuY2xlYXIoKSkuXG4gICAgICAvLyBNdWx0aWNoYW5uZWwgYmlucyBlYWNoIGNhY2hlZCBjaGFubmVsIHBsYW5lOyBzaW5nbGUtYmFuZCAvIFJHQiBiaW5zIHRoZVxuICAgICAgLy8gZGVjb2RlZCBmcmFtZSdzIG93biBwaXhlbHMuXG4gICAgICBpZiAodGhpcy5zaW1wbGVNdWx0aWNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVTaW1wbGVNdWx0aWNoYW5uZWxIaXN0b2dyYW1zKGxvYWRlZC56LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbShsb2FkZWQudXJsLCBsb2FkZWQueik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE11bHRpY2hhbm5lbCBmbHVvcmVzY2VuY2UgKGluZGV4ZWQvTFVULWJlYXJpbmcgc3RhY2tzKSBjb21wb3NpdGUgY2xpZW50LXNpZGVcbiAgICAgIC8vIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMuIFRydXN0IHRoZSBzZXJ2ZXIncyBleHBsaWNpdCBgbXVsdGljaGFubmVsYCBmbGFnIOKAlCB0aGVcbiAgICAgIC8vIG9sZCBgY2hhbm5lbHM+MSAmJiBncmF5c2NhbGVgIGhldXJpc3RpYyBhbHNvIG1hdGNoZWQgUkdCIHBob3RvcyBCaW8tRm9ybWF0c1xuICAgICAgLy8gcmVhZHMgYXMgc2VwYXJhdGVkIHBsYW5lcyAoY2hhbm5lbHM+MSwgcmdiQ2hhbm5lbHM9PTEpLCBzcGxpdHRpbmcgdGhlbSBpbnRvIE5cbiAgICAgIC8vIHBlci1jaGFubmVsIFRpbGVkSW1hZ2VzIHRoYXQgZmxvb2RlZCB0aGUgdGlsZSBlbmRwb2ludCBhbmQgaHVuZyBvbiBsb2FkLlxuICAgICAgdGhpcy5yZWFsTGV2ZWxzID0gZC5yZWFsTGV2ZWxzID8/IGQubGV2ZWxzLmxlbmd0aDtcbiAgICAgIC8vIFRpbGVzIHRvIGNvdmVyIHRoZSB3aG9sZSBpbWFnZSBhdCB0aGUgY29hcnNlc3QgUkVBTCBCaW8tRm9ybWF0cyBsZXZlbCAodGhlXG4gICAgICAvLyBzbWFsbGVzdCBsZXZlbCB0aGF0IGhhcyByZWFsLCBwZXItY2hhbm5lbC1mZXRjaGFibGUgdGlsZXMg4oCUIHN5bnRoZXRpYyBvdmVydmlld1xuICAgICAgLy8gbGV2ZWxzIGFyZSBzZXJ2ZXItY29tcG9zaXRlZCBvbmx5KS4gQSBweXJhbWlkYWwgaW1hZ2UncyBjb2Fyc2VzdCByZWFsIGxldmVsIGlzXG4gICAgICAvLyB0aW55IChmZXcgdGlsZXMpOyBhIGZsYXQvbm8tcHlyYW1pZCBpbWFnZSdzIGlzIHRoZSBmdWxsLXJlcyBncmlkIChtYW55IHRpbGVzKS5cbiAgICAgIGNvbnN0IGNvYXJzZSA9IGQubGV2ZWxzW3RoaXMucmVhbExldmVscyAtIDFdID8/IGQubGV2ZWxzW2QubGV2ZWxzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgY29hcnNlVyA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2Uud2lkdGggLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VIID0gY29hcnNlID8gTWF0aC5jZWlsKGNvYXJzZS5oZWlnaHQgLyBkLnRpbGVTaXplKSA6IDE7XG4gICAgICBjb25zdCBjb2Fyc2VUaWxlcyA9IGNvYXJzZVcgKiBjb2Fyc2VIO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9ICEhZC5tdWx0aWNoYW5uZWw7XG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICAvLyBQZXItY2hhbm5lbCByZW5kZXJpbmcgY2FuIG9ubHkgdXNlIHRoZSBSRUFMIGxldmVscywgc28gT1NEIHJlcXVlc3RzIHRoZVxuICAgICAgICAvLyBjb2Fyc2VzdCByZWFsIGxldmVsJ3Mgd2hvbGUgdGlsZSBncmlkIMOXIE4gY2hhbm5lbHMgYXQgZml0LiBXaGVuIHRoYXQncyBsYXJnZVxuICAgICAgICAvLyAoYSB3aG9sZS1zbGlkZSksIGl0J3MgdG9vIG1hbnkgKG9mdGVuIHNsb3csIHB5cmFtaWQtbGVzcykgZnVsbC1yZXMgcmVhZHMg4oCUXG4gICAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgc2luZ2xlIHNlcnZlci1jb21wb3NpdGVkIHNvdXJjZSAod2hpY2gga2VlcHMgdGhlIGZhc3RcbiAgICAgICAgLy8gc3ludGhldGljIG92ZXJ2aWV3cykuIEEgc21hbGwgc2luZ2xlLUZPViB6LXN0YWNrIHN0YXlzIHBlci1jaGFubmVsLiBTaXplIGluXG4gICAgICAgIC8vIEJZVEVTIGlzbid0IHRoZSBzaWduYWwg4oCUIHRpbGUgY291bnQgaXMuXG4gICAgICAgIGNvbnN0IGZpdFRpbGVzID0gY29hcnNlVGlsZXMgKiBNYXRoLm1heCgxLCBkLmNoYW5uZWxzID8/IDEpO1xuICAgICAgICBpZiAoZml0VGlsZXMgPiB0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTKSB7XG4gICAgICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdbT1NEXSBtdWx0aWNoYW5uZWwgY29tcG9zaXRlIHRvbyBsYXJnZSBmb3IgcGVyLWNoYW5uZWwgcmVuZGVyaW5nOiAnICtcbiAgICAgICAgICAgIGAke2NvYXJzZVd9eCR7Y29hcnNlSH0gdGlsZXMgeCAke2QuY2hhbm5lbHN9IGNoYW5uZWxzID0gJHtmaXRUaWxlc30gYXQgdGhlIGNvYXJzZXN0IGAgK1xuICAgICAgICAgICAgYHJlYWwgbGV2ZWwgKD4gJHt0aGlzLk1BWF9NVUxUSUNIQU5ORUxfRklUX1RJTEVTfSk7IHJlbmRlcmluZyBzZXJ2ZXItY29tcG9zaXRlZCBmb3Igc3BlZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNhY2hlLmNsZWFyQ2hhbm5lbEdyb3VwcygpO1xuICAgICAgLy8gQXV0by1yYW5nZSBncmF5c2NhbGUgdGlsZXMgdG8gdGhlIGltYWdlJ3MgYWN0dWFsIGludGVuc2l0eSBzcGFuIChsaWtlIHRoZVxuICAgICAgLy8gaGVhdG1hcCksIHNhbXBsaW5nIHRoZSBjb2Fyc2VzdCB0aWxlIGxldmVsIHNvIHRoZSB3aW5kb3cgbWF0Y2hlcyB0aGUgcmF3XG4gICAgICAvLyB0aWxlIHZhbHVlcy4gRmlyZS1hbmQtZm9yZ2V0OiBpdCByZS1pbnZhbGlkYXRlcyBvbmNlIHRoZSB3aW5kb3cgaXMga25vd247XG4gICAgICAvLyB0aWxlcyBwYWludCB1bndpbmRvd2VkIHVudGlsIHRoZW4uIChNdWx0aWNoYW5uZWwgd2luZG93cyBhcmUgcGVyLWNoYW5uZWwsXG4gICAgICAvLyBkZWZhdWx0aW5nIHRvIGZ1bGwgcmFuZ2U7IHRoZSB1c2VyIGF1dG8vZWRpdHMgZWFjaCBjaGFubmVsLilcbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlTXVsdGlDaGFubmVsSGlzdG9ncmFtcyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyhkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgICAgdGhpcy5kZXN0cm95Vmlld2VyKCk7XG4gICAgICAvLyBTaXplIHRoZSBzbGljZSBjYWNoZSBmb3IgdGhpcyBpbWFnZTogTFJVIGNhcCB0byBob2xkIHRoZSB3aG9sZSBzdGFja1xuICAgICAgLy8gKGNhcHBlZCkgYW5kIHNraXAgYmFja2dyb3VuZCBwcmVsb2FkaW5nIGZvciBzdGFja3MgdG9vIGxhcmdlIHRvIHByZWxvYWRcbiAgICAgIC8vICh3b3VsZCBmbG9vZCBmdWxsLXJlcyByZWFkcykuIE5vcm1hbCBzdGFja3Mga2VlcCB0aGUgZmxpY2tlci1mcmVlIHByZS1jYWNoZS5cbiAgICAgIHRoaXMuY2FjaGUuY29uZmlndXJlKGQueiA/PyAxLCBjb2Fyc2VUaWxlcyk7XG4gICAgfVxuXG4gICAgLy8gU2ltcGxlIG1vZGU6IE9TRCdzIHNpbmdsZS1pbWFnZSBzb3VyY2UgZGVjb2RlcyB0aGUgVVJMIChibG9iOi9kYXRhOi9odHRwKVxuICAgIC8vIGRpcmVjdGx5IOKAlCBubyBweXJhbWlkLCBubyBzZXJ2ZXIuIFRpbGVkIG1vZGU6IHRoZSBjdXN0b20gc2VydmVyLWJhY2tlZCB0aWxlXG4gICAgLy8gc291cmNlIChtdWx0aWNoYW5uZWwgb3BlbnMgb24gY2hhbm5lbCAwOyB0aGUgb3BlbiBoYW5kbGVyIHRoZW4gc3dhcHMgaW4gdGhpc1xuICAgIC8vIHNsaWNlJ3MgcGVyLWNoYW5uZWwgZ3JvdXAgYW5kIHRoZSBiYWNrZ3JvdW5kIGxvYWRlciBwcmUtZmlsbHMgdGhlIHJlc3QpLlxuICAgIGNvbnN0IHRpbGVTb3VyY2UgPSBzaW1wbGVcbiAgICAgID8geyB0eXBlOiAnaW1hZ2UnLCB1cmw6IGxvYWRlZC51cmwgfVxuICAgICAgOiB0aGlzLmJ1aWxkVGlsZVNvdXJjZShkLCBsb2FkZWQuaW5mb0I2NCwgbG9hZGVkLnosIHRoaXMuaXNNdWx0aUNoYW5uZWwgPyAwIDogdW5kZWZpbmVkKTtcbiAgICBzaWxlbmNlT3NkTXVsdGlJbWFnZUFkdmlzb3J5KCk7XG4gICAgdGhpcy52aWV3ZXIgPSAoT1NEIGFzIGFueSkoe1xuICAgICAgaWQ6IHBsb3REaXYsXG4gICAgICAvLyBTaW1wbGUtbW9kZSB6LXNjcnViIGNhbGxzIHZpZXdlci5vcGVuKCkgYWdhaW4gcGVyIHNsaWNlIChzZWVcbiAgICAgIC8vIHNldFpJbmRleCkg4oCUIHdpdGhvdXQgdGhpcyBpdCByZXNldHMgdG8gdGhlIGhvbWUgem9vbS9wYW4gb24gZXZlcnlcbiAgICAgIC8vIHNsaWNlIGNoYW5nZS4gVGlsZWQgbW9kZSBuZXZlciByZS1vcGVucyAoaXQgdG9nZ2xlcyBwcmUtYWRkZWRcbiAgICAgIC8vIFRpbGVkSW1hZ2VzJyBvcGFjaXR5IGluc3RlYWQpLCBzbyB0aGlzIGlzIGEgbm8tb3AgdGhlcmUuXG4gICAgICBwcmVzZXJ2ZVZpZXdwb3J0OiB0cnVlLFxuICAgICAgLy8gVXNlIHRoZSAyRCBjYW52YXMgZHJhd2VyLCBub3QgV2ViR0w6IGNyZWF0aW5nL2Rlc3Ryb3lpbmcgYSB2aWV3ZXIgb25cbiAgICAgIC8vIGVhY2ggZW5naW5lIHRvZ2dsZSAvIGltYWdlIGxvYWQgY2h1cm5zIFdlYkdMIGNvbnRleHRzIChicm93c2VycyBjYXBcbiAgICAgIC8vIGhvdyBtYW55IGV4aXN0IGF0IG9uY2UpLCB3aGljaCBzdXJmYWNlcyBhcyBcIldlYkdMIGNvbnRleHQgd2FzIGxvc3RcIlxuICAgICAgLy8gYW5kIGJsYW5rIHRpbGVzLiBUaGUgY2FudmFzIGRyYXdlciBoYXMgbm8gc3VjaCBsaW1pdC5cbiAgICAgIGRyYXdlcjogJ2NhbnZhcycsXG4gICAgICBzaG93TmF2aWdhdGlvbkNvbnRyb2w6IGZhbHNlLCAvLyBhdm9pZHMgbmVlZGluZyB0aGUgaWNvbi1pbWFnZSBhc3NldHNcbiAgICAgIC8vIE92ZXJ2aWV3IHRodW1ibmFpbCB3aXRoIHRoZSBjdXJyZW50LXZpZXdwb3J0IHJlY3RhbmdsZSwgYm90dG9tLXJpZ2h0LlxuICAgICAgc2hvd05hdmlnYXRvcjogdGhpcy5uYXZpZ2F0b3JWaXNpYmxlLFxuICAgICAgLy8gTmVhcmVzdC1uZWlnaGJvdXIgd2hlbiBvZmYg4oaSIGNyaXNwIHBpeGVscyBvbiB6b29tLWluIChwaXhlbCBpbnNwZWN0aW9uKS5cbiAgICAgIGltYWdlU21vb3RoaW5nRW5hYmxlZDogdGhpcy5zbW9vdGhpbmdFbmFibGVkLFxuICAgICAgbmF2aWdhdG9yUG9zaXRpb246ICdCT1RUT01fUklHSFQnLFxuICAgICAgbmF2aWdhdG9yU2l6ZVJhdGlvOiAwLjE2LFxuICAgICAgbmF2aWdhdG9yQXV0b0ZhZGU6IGZhbHNlLFxuICAgICAgbmF2aWdhdG9yQmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gICAgICBsb2FkVGlsZXNXaXRoQWpheDogdHJ1ZSxcbiAgICAgIGFqYXhXaXRoQ3JlZGVudGlhbHM6IHRydWUsIC8vIGNvb2tpZSBhdXRoIChvYXV0aDItcHJveHkpXG4gICAgICBhamF4SGVhZGVyczogdGhpcy5hdXRoSGVhZGVycywgLy8gYmVhcmVyIGF1dGggKEF1dGgwKSwgd2hlbiBhdmFpbGFibGVcbiAgICAgIGNyb3NzT3JpZ2luUG9saWN5OiAnQW5vbnltb3VzJyxcbiAgICAgIC8vIEdlbnRsZXIgem9vbTogdGhlIGRlZmF1bHQgKDEuMikgZmVlbHMgZmFzdCBhbmQgYmlnIGp1bXBzIGNyb3NzIHNldmVyYWxcbiAgICAgIC8vIHB5cmFtaWQgbGV2ZWxzIGF0IG9uY2UsIGZpcmluZyBhIGJ1cnN0IG9mIHRpbGUgcmVxdWVzdHMuIFNoYXJlZCB3aXRoIHRoZVxuICAgICAgLy8gcmVnaW9uIG92ZXJsYXksIHdoaWNoIHRha2VzIHRoZSB3aGVlbCBvdmVyIHdoaWxlIGEgdG9vbCBpcyBhY3RpdmUuXG4gICAgICB6b29tUGVyU2Nyb2xsOiBPU0RfWk9PTV9QRVJfU0NST0xMLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIE9TRCdzIHN0b2NrIHZhbHVlLCByZXN0b3JlZC4gRE8gTk9UIFJBSVNFIElUOiB0aGUgbmFtZSByZWFkcyBsaWtlXG4gICAgICAvLyBcIm1pbmltdW0gc2hhcnBuZXNzXCIgYnV0IGl0IGlzIHRoZSBvcHBvc2l0ZS4gRnJvbSBPU0QncyBvd25cbiAgICAgIC8vIFRpbGVkSW1hZ2UuX2dldExldmVsc0ludGVydmFsOlxuICAgICAgLy9cbiAgICAgIC8vICAgaGlnaGVzdExldmVsID0gZmxvb3IoIGxvZzIoIGN1cnJlbnRaZXJvUmF0aW8gLyBtaW5QaXhlbFJhdGlvICkgKVxuICAgICAgLy9cbiAgICAgIC8vIG1pblBpeGVsUmF0aW8gaXMgYSBmbG9vciBvbiBob3cgc21hbGwgYSB0aWxlIHBpeGVsIG1heSBzaHJpbmssIGFuZCBpdFxuICAgICAgLy8gRElWSURFUyBpbnRvIHRoZSByYXRpbyAtIHNvIHJhaXNpbmcgaXQgbG93ZXJzIHRoZSBjaG9zZW4gbGV2ZWwsIGkuZS5cbiAgICAgIC8vIHBpY2tzIGEgQ09BUlNFUiBpbWFnZS4gT1NEJ3Mgb3duIGNvbW1lbnQgb24gdGhlIGRlZmF1bHQgc2F5cyBhcyBtdWNoOlxuICAgICAgLy8gXCJjbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cIi5cbiAgICAgIC8vXG4gICAgICAvLyBNZWFzdXJlZCBvbiBhIGZsYXQgMjIzMDR4MjQ1MjggaW1hZ2UgKGxldmVscyA2OTcvMTM5NC8yNzg4LzU1NzYvMTExNTIvXG4gICAgICAvLyAyMjMwNCksIHByZWRpY3RlZCBsZXZlbCBtYXRjaGluZyBhY3R1YWwgaW4gYWxsIG5pbmUgdHJpYWxzOlxuICAgICAgLy9cbiAgICAgIC8vICAgICAgICAgICAgem9vbSAyICAgICAgICB6b29tIDggICAgICAgIH4xOjFcbiAgICAgIC8vICAgMS4wICAgICAgMS4zNHggdXAgICAgICAxLjM0eCB1cCAgICAgIDEuODZ4IHVwXG4gICAgICAvLyAgIDAuNSAgICAgIDAuNjd4IChub25lKSAgMC42N3ggKG5vbmUpICAwLjkzeCAtPiBmdWxsIHJlc1xuICAgICAgLy8gICAwLjI1ICAgICAwLjMzeCAgICAgICAgIDAuMzN4ICAgICAgICAgMC45M3hcbiAgICAgIC8vXG4gICAgICAvLyAwLjUgaXMgd2hhdCBnaXZlcyBcIm5ldmVyIHVwc2NhbGVkIGJlbG93IG5hdGl2ZSwgZnVsbCByZXNvbHV0aW9uIGF0IDE6MVwiLlxuICAgICAgLy8gMC4yNSBpcyBub3QgYmV0dGVyIC0gaXQganVtcHMgdHdvIHJ1bmdzIGZpbmVyIGFuZCBmZXRjaGVzIH40eCB0aGUgdGlsZXNcbiAgICAgIC8vIGZvciBubyB2aXNpYmxlIGdhaW4sIGFuZCB0aWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgaW5ncmVzcy5cbiAgICAgIG1pblBpeGVsUmF0aW86IDAuNSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBFdmVyeSByZWRyYXcgKHBhbi96b29tIGFuaW1hdGlvbiBmcmFtZXMsIHJlc2l6ZSkg4oCUIGZvciBhIGNvbnRyaWJ1dGVkXG4gICAgICAgIC8vIHBsb3QgbW9kZSdzIG92ZXJsYXksIHdoaWNoIGhhcyB0byBtb3ZlIHdpdGggdGhlIGltYWdlLCBub3QgYWZ0ZXIgaXQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd1cGRhdGUtdmlld3BvcnQnLCAoKSA9PiB0aGlzLnNjaGVkdWxlRnJhbWUoKSk7XG4gICAgICAgIC8vIENocm9tZSBjb21wb3NpdG9yIGJ1ZzogYWZ0ZXIgYW4gT1NEIHpvb20gdGhlIGRvY2tlZCB0b29sYmFyIChhIHNpYmxpbmcgb2ZcbiAgICAgICAgLy8gI3Bsb3QgaW4gdGhlIDx2aXN1YWxpemVyPiBob3N0KSBpcyBsZWZ0IGxhaWQtb3V0LWJ1dC11bnBhaW50ZWQgYW5kXG4gICAgICAgIC8vIHZhbmlzaGVzIOKAlCBjb25maXJtZWQgdmlhIERldlRvb2xzIChET00gaW50YWN0LCByZWdpb24gc2ltcGx5IG5vdCBwYWludGVkKS5cbiAgICAgICAgLy8gQ1NTICh6LWluZGV4IC8gaXNvbGF0aW9uIC8gY29udGFpbikgYW5kIERPTS1yZXBhcmVudGluZyBkb24ndCBmaXggaXQ7IGFcbiAgICAgICAgLy8gcmVwYWludCByZWxpYWJseSBkb2VzLiBOdWRnZSBpdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSAoc28gaXQgbmV2ZXIgdmlzaWJseVxuICAgICAgICAvLyBkcm9wcykgYW5kIG9uIHNldHRsZS4gVGhlIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgd2l0aCBub1xuICAgICAgICAvLyB2aXNpYmxlIGdvbmUtZnJhbWUgYW5kIG5vIGxheW91dCBzaGlmdC5cbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbicsICgpID0+IHRoaXMubnVkZ2VUb29sYmFyUmVwYWludCgpKTtcbiAgICAgICAgdGhpcy52aWV3ZXIhLmFkZEhhbmRsZXIoJ2FuaW1hdGlvbi1maW5pc2gnLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLmNhY2hlLnNjaGVkdWxlUHJlZmV0Y2goKTtcbiAgICAgICAgLy8gRm9yY2UgZml0LXRvLXZpZXcgYXMgdGhlIHNwbGl0L2ZsZXggbGF5b3V0IHNldHRsZXMuIEEgdGFsbFxuICAgICAgICAvLyBub24tcHlyYW1pZGFsIGltYWdlIGNhbiBvdGhlcndpc2Ugb3BlbiB6b29tZWQtaW4gKGltYWdlIHdpZHRoIGZpbGxpbmdcbiAgICAgICAgLy8gdGhlIHZpZXdlciksIG1ha2luZyBPU0QgZGVtYW5kIHNsb3cgZnVsbC1yZXMgcmVzPTAgdGlsZXMgZm9yIHRoZVxuICAgICAgICAvLyBjZW50cmUgaW5zdGVhZCBvZiB0aGUgZmFzdCBjb2Fyc2Ugb3ZlcnZpZXcg4oaSIHdoaXRlIGNhbnZhcy4gZ29Ib21lXG4gICAgICAgIC8vIGZpdHMgdGhlIHdob2xlIGltYWdlIHNvIE9TRCBzZWxlY3RzIHRoZSBjb2Fyc2Ugc3ludGhldGljIGxldmVsLiBSZXRyeVxuICAgICAgICAvLyBhY3Jvc3MgYSBmZXcgZnJhbWVzIGJlY2F1c2UgdGhlIGNvbnRhaW5lciBtYXkgbm90IGhhdmUgaXRzIGZpbmFsIHNpemVcbiAgICAgICAgLy8gb24gdGhlIGZpcnN0IGZyYW1lIGFmdGVyICdvcGVuJy5cbiAgICAgICAgY29uc3QgcmVmaXQgPSAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUodHJ1ZSk7XG4gICAgICAgICAgICAvLyBUaGUgbmF2aWdhdG9yIHdhcyBzaXplZCBpbiB0aGUgVmlld2VyIGNvbnN0cnVjdG9yIOKAlCBCRUZPUkUgdGhlXG4gICAgICAgICAgICAvLyBsYXlvdXQgc2V0dGxlZCDigJQgc28gaXRzIGVsZW1lbnQgY2FuIGNhcnJ5IGEgc3RhbGUgKGV2ZW5cbiAgICAgICAgICAgIC8vIHdyb25nLWFzcGVjdCkgc2l6ZSB0aGF0IGZsb2F0cyB0aGUgdmlzaWJsZSBtaW5pbWFwIGFib3ZlIHRoZVxuICAgICAgICAgICAgLy8gY29ybmVyLiBSZS1zaXplIGl0IGZyb20gdGhlIHNldHRsZWQgY29udGFpbmVyLlxuICAgICAgICAgICAgdGhpcy5yZXNpemVOYXZpZ2F0b3IoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8qIHRvcm4gZG93biAqL1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHJlZml0KTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgMTUwKTtcbiAgICAgICAgc2V0VGltZW91dChyZWZpdCwgNDAwKTtcbiAgICAgICAgLy8gVGhlIHRpbWVkIHJldHJpZXMgYWJvdmUgbWlzcyB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGFpbmVyIGlzIFNUSUxMXG4gICAgICAgIC8vIHplcm8tc2l6ZSBhdCA0MDBtcyDigJQgd2hpY2ggaGFwcGVucyB3aGVuIHRoZSByZW5kZXIgc3RhcnRzIHdoaWxlIHRoZVxuICAgICAgICAvLyBmaWxlIHZpZXdlciBpcyBtaWQtc3dpdGNoIGZyb20gdGhlIGZvbGRlciB2aWV3IHRvIHRoZSBkaWFncmFtIChlLmcuXG4gICAgICAgIC8vIFwiTG9hZCBhcyBTdGFja1wiIGZyb20gYSBmb2xkZXIsIHdpdGggbm8gaW1hZ2Ugb3BlbiBmaXJzdCkuIEJlY2F1c2VcbiAgICAgICAgLy8gcHJlc2VydmVWaWV3cG9ydCBzdXBwcmVzc2VzIE9TRCdzIG93biBvcGVuLXRpbWUgZml0LCB0aGUgaW1hZ2Ugd291bGRcbiAgICAgICAgLy8gdGhlbiBiZSBsZWZ0IHVuLWZpdHRlZCBhdCB0aGUgdG9wLWxlZnQgKFwiYSB0aWxlXCIpLiBBIG9uZS1zaG90XG4gICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIGZpdHMgdGhlIGluc3RhbnQgdGhlIGNvbnRhaW5lciBmaXJzdCBoYXMgYSByZWFsIHNpemUsXG4gICAgICAgIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgcmVuZGVyIGJlZ2FuIChqaXQtdWkjMTA2KS5cbiAgICAgICAgdGhpcy5maXRXaGVuQ29udGFpbmVyU2l6ZWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGxvdERpdiksIHJlZml0KTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbmF2aWdhdG9yIHNpemVkIHRvIHRoZSBjb250YWluZXIgYXMgdGhlIHBhbmVsIHJlc2l6ZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZU5hdmlnYXRvcigpKTtcbiAgICAgICAgZG9uZSh0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3ZXIhLmFkZE9uY2VIYW5kbGVyKCdvcGVuLWZhaWxlZCcsIChlOiBhbnkpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBvcGVuLWZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgIGRvbmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSBjb25zb2xlLndhcm4oJ1tPU0RdIHZpZXdlciBvcGVuIHRpbWVkIG91dCcpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0sIDgwMDApO1xuICAgICAgdGhpcy52aWV3ZXIhLm9wZW4odGlsZVNvdXJjZSBhcyBhbnkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdC10by1ob21lIG9uY2UgYGVsYCBmaXJzdCBoYXMgYSBub24temVybyBzaXplLiBJZiBpdCdzIGFscmVhZHkgc2l6ZWQgd2VcbiAgICogcmVseSBvbiB0aGUgdGltZWQgcmVmaXRzIHRoZSBjYWxsZXIgc2NoZWR1bGVkOyBvdGhlcndpc2UgYSBvbmUtc2hvdFxuICAgKiBSZXNpemVPYnNlcnZlciBydW5zIGByZWZpdGAgdGhlIG1vbWVudCB0aGUgY29udGFpbmVyIGlzIGxhaWQgb3V0ICh0aGVuXG4gICAqIGRpc2Nvbm5lY3RzKSwgc28gdGhlIGluaXRpYWwgZml0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSByZW5kZXIncyBzdGFydCB0aW1lXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBkaWFncmFtIGNvbnRhaW5lcidzIGxheW91dC4gTm8tb3Agd2l0aG91dCBhIGNvbnRhaW5lciBvclxuICAgKiBSZXNpemVPYnNlcnZlciAodGhlIHRpbWVkIHJlZml0cyByZW1haW4gdGhlIGZhbGxiYWNrKS4gT25lLXNob3QgKyBvbmx5XG4gICAqIGF0dGFjaGVkIG9uIGEgZnJlc2ggbW91bnQsIHNvIHNsaWNlLXNjcnViIHJlLW9wZW5zIGtlZXAgdGhlIHVzZXIncyB6b29tLlxuICAgKi9cbiAgcHJpdmF0ZSBmaXRXaGVuQ29udGFpbmVyU2l6ZWQoZWw6IEhUTUxFbGVtZW50IHwgbnVsbCwgcmVmaXQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAoIWVsIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHJldHVybjsgLy8gYWxyZWFkeSBzaXplZCDigJQgdGltZWQgcmVmaXRzIHN1ZmZpY2VcbiAgICBjb25zdCBybyA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICBpZiAoZWwuY2xpZW50V2lkdGggPiAwICYmIGVsLmNsaWVudEhlaWdodCA+IDApIHtcbiAgICAgICAgcm8uZGlzY29ubmVjdCgpO1xuICAgICAgICByZWZpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJvLm9ic2VydmUoZWwpO1xuICAgIC8vIFNhZmV0eSBuZXQ6IHN0b3Agb2JzZXJ2aW5nIGV2ZW4gaWYgaXQgbmV2ZXIgZ2FpbnMgYSBzaXplLlxuICAgIHNldFRpbWVvdXQoKCkgPT4gcm8uZGlzY29ubmVjdCgpLCA1MDAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXN0b20gdGlsZSBzb3VyY2UgYnVpbHQgZnJvbSB0aGUgZGVzY3JpcHRvci4gT1NEIG51bWJlcnMgbGV2ZWxzXG4gICAqIGNvYXJzZXN0LWZpcnN0OyB0aGUgYmFja2VuZCBudW1iZXJzIHJlc29sdXRpb25zIGZ1bGwtcmVzLWZpcnN0LCBzb1xuICAgKiBgcmVzID0gKGxldmVscy0xKSAtIG9zZExldmVsYC4gT3ZlcnJpZGluZyBnZXRMZXZlbFNjYWxlL2dldE51bVRpbGVzIGxldHMgdXNcbiAgICogaG9ub3VyIEJpby1Gb3JtYXRzJyBhY3R1YWwgcGVyLWxldmVsIGRpbWVuc2lvbnMgKG5vdCBhc3N1bWUgcG93ZXItb2YtdHdvKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRUaWxlU291cmNlKGQ6IFRpbGVEZXNjcmlwdG9yLCBpbmZvQjY0OiBzdHJpbmcsIHo6IG51bWJlciwgY2hhbm5lbD86IG51bWJlcik6IGFueSB7XG4gICAgLy8gTXVsdGljaGFubmVsIGltYWdlcyBjb21wb3NpdGUgZnJvbSBwZXItY2hhbm5lbCB0aWxlcywgd2hpY2ggb25seSBleGlzdCBhdFxuICAgIC8vIHJlYWwgQmlvLUZvcm1hdHMgcmVzb2x1dGlvbnMg4oCUIHNvIGRyaXZlIE9TRCBvZmYgdGhlIHJlYWwgbGV2ZWxzIGFsb25lIGFuZFxuICAgIC8vIHNraXAgdGhlIHN5bnRoZXRpYyAoc2VydmVyLWNvbXBvc2l0ZWQpIG92ZXJ2aWV3cy4gRXZlcnkgZGlzcGxheWVkIHRpbGUgaXNcbiAgICAvLyB0aGVuIHBlci1jaGFubmVsLWZldGNoYWJsZSBhdCBhbnkgem9vbS5cbiAgICBjb25zdCBsZXZlbHMgPSB0aGlzLmlzTXVsdGlDaGFubmVsID8gZC5sZXZlbHMuc2xpY2UoMCwgdGhpcy5yZWFsTGV2ZWxzKSA6IGQubGV2ZWxzO1xuICAgIGNvbnN0IG4gPSBsZXZlbHMubGVuZ3RoO1xuICAgIGNvbnN0IHQgPSBkLnRpbGVTaXplO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmFwaTtcblxuICAgIC8vIE9TRCBsZXZlbCBpICgwID0gY29hcnNlc3QpIDwtPiBiYWNrZW5kIHJlc29sdXRpb24gKG4tMS1pKSAocmVzIDAgPSBmdWxsKS5cbiAgICAvLyBUaGUgYmFja2VuZCBweXJhbWlkIGlzIE5PVCBuZWNlc3NhcmlseSBwb3dlci1vZi10d28sIHNvIHdlIGRyaXZlIE9TRCBvZmZcbiAgICAvLyB0aGUgYmFja2VuZCdzIHJlYWwgcGVyLWxldmVsIGRpbWVuc2lvbnMuIFdlIG92ZXJyaWRlIE9OTFkgZ2V0TGV2ZWxTY2FsZTpcbiAgICAvLyBPU0QgZGVyaXZlcyBnZXROdW1UaWxlcywgZ2V0VGlsZUJvdW5kcyBBTkQgaXRzIHBlci16b29tIGxldmVsIHNlbGVjdGlvblxuICAgIC8vIGZyb20gZ2V0TGV2ZWxTY2FsZSwgc28gdGhleSBhbGwgc3RheSBjb25zaXN0ZW50IOKAlCByZXF1ZXN0aW5nIGV4YWN0bHkgdGhlXG4gICAgLy8gdGlsZXMgZWFjaCByZXNvbHV0aW9uIGFjdHVhbGx5IGhhcyAobm8gb3V0LW9mLXJhbmdlIDQwMHMsIG5vIGZsb29kKS5cbiAgICBjb25zdCByZXNGb3JMZXZlbCA9IChsZXZlbDogbnVtYmVyKSA9PiBuIC0gMSAtIGxldmVsO1xuICAgIGNvbnN0IHRzOiBhbnkgPSBuZXcgKE9TRCBhcyBhbnkpLlRpbGVTb3VyY2Uoe1xuICAgICAgd2lkdGg6IGQud2lkdGgsXG4gICAgICBoZWlnaHQ6IGQuaGVpZ2h0LFxuICAgICAgdGlsZVNpemU6IHQsXG4gICAgICB0aWxlT3ZlcmxhcDogMCxcbiAgICAgIG1pbkxldmVsOiAwLFxuICAgICAgbWF4TGV2ZWw6IG4gLSAxLFxuICAgIH0pO1xuICAgIHRzLmdldExldmVsU2NhbGUgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICByZXR1cm4gbHZsID8gbHZsLndpZHRoIC8gZC53aWR0aCA6IDE7XG4gICAgfTtcbiAgICAvLyBEcml2ZSB0aGUgdGlsZSBDT1VOVCBvZmYgZWFjaCBsZXZlbCdzIG93biAoaW5kZXBlbmRlbnRseS1yb3VuZGVkKSBkaW1lbnNpb25zLFxuICAgIC8vIG5vdCBPU0QncyBkZWZhdWx0IGBjZWlsKHNjYWxlICogZnVsbERpbWVuc2lvbiAvIHRpbGVTaXplKWAuIFN5bnRoZXRpYyBBTkQgcmVhbFxuICAgIC8vIEJpby1Gb3JtYXRzIGxldmVscyBhcmVuJ3QgZXhhY3QgcHJvcG9ydGlvbmFsIHNjYWxlcyBvZiB0aGUgZnVsbCBpbWFnZSwgc29cbiAgICAvLyBgc2NhbGUgKiBmdWxsSGVpZ2h0YCBjYW4gcm91bmQgdXAgdG8gb25lIG1vcmUgcm93IChvciBjb2x1bW4pIHRoYW4gdGhlIGxldmVsXG4gICAgLy8gYWN0dWFsbHkgaGFzIOKAlCBPU0QgdGhlbiByZXF1ZXN0cyBhbiBvdXQtb2YtcmFuZ2UgdGlsZSB0aGF0IHRoZSBzZXJ2ZXIgNDAwc1xuICAgIC8vIChcIlRpbGUgKGNvbCxyb3cpIG91dCBvZiByYW5nZVwiKS4gVXNpbmcgdGhlIGxldmVsJ3MgcmVhbCB3L2ggbWF0Y2hlcyB0aGVcbiAgICAvLyBzZXJ2ZXIncyBvd24gYm91bmRzIGNoZWNrIGV4YWN0bHkuXG4gICAgY29uc3QgUG9pbnQgPSAoT1NEIGFzIGFueSkuUG9pbnQ7XG4gICAgdHMuZ2V0TnVtVGlsZXMgPSAobGV2ZWw6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgbHZsID0gbGV2ZWxzW3Jlc0ZvckxldmVsKGxldmVsKV07XG4gICAgICBpZiAoIWx2bCkgcmV0dXJuIG5ldyBQb2ludCgwLCAwKTtcbiAgICAgIHJldHVybiBuZXcgUG9pbnQoTWF0aC5jZWlsKGx2bC53aWR0aCAvIHQpLCBNYXRoLmNlaWwobHZsLmhlaWdodCAvIHQpKTtcbiAgICB9O1xuICAgIHRzLmdldFRpbGVVcmwgPSAobGV2ZWw6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgICBidWlsZFRpbGVVcmwoYmFzZSwgaW5mb0I2NCwgeyByZXM6IHJlc0ZvckxldmVsKGxldmVsKSwgY29sOiB4LCByb3c6IHksIHosIHRpbGVTaXplOiB0LCBjaGFubmVsIH0pO1xuICAgIHJldHVybiB0cztcbiAgfVxuXG4gIC8qKiBSZS1hcHBseSB0aGUgZGlzcGxheSBwaXBlbGluZSAod2luZG93L2dhbW1hL2NvbG91ci9pbnZlcnQpIGFmdGVyIGEgc3RhdGUgY2hhbmdlLlxuICAgKiAgTXVsdGljaGFubmVsIGludmFsaWRhdGVzIE9OTFkgdGhlIHZpc2libGUgc2xpY2UncyBjaGFubmVsIGltYWdlcyDigJQgaW52YWxpZGF0aW5nXG4gICAqICB0aGUgd2hvbGUgd29ybGQgd291bGQgcmUtcHJvY2VzcyBldmVyeSBoaWRkZW4vcHJlbG9hZGVkIHNsaWNlJ3MgdGlsZXMgKGh1bmRyZWRzKSxcbiAgICogIGZsb29kaW5nIE9TRCB3aXRoIFwiW0NhY2hlUmVjb3JkXSDigKYgSW52YWxpZFN0YXRlRXJyb3JcIiBhbmQgd2FzdGluZyB3b3JrIG9uIHRpbGVzXG4gICAqICB0aGF0IGFyZW4ndCBvbiBzY3JlZW4uIFRoZSBvdGhlciBjYWNoZWQgc2xpY2VzIGFyZSBtYXJrZWQgc3RhbGUgYW5kIHJlLXRpbnRlZFxuICAgKiAgbGF6aWx5IHdoZW4gcmV2ZWFsZWQuIENvbXBvc2l0ZS9ncmF5c2NhbGUgaW52YWxpZGF0ZSB0aGUgd29ybGQgYXMgYmVmb3JlLiAqL1xuICAvKiogQ29sbGFwc2UgYSBidXJzdCBvZiBkaXNwbGF5LXN0YXRlIGNoYW5nZXMgaW50byBPTkUgaW52YWxpZGF0aW9uIG9uIHRoZSBuZXh0XG4gICAqICBmcmFtZS4gRHJhZ2dpbmcgYSB3aW5kb3cgc2xpZGVyIGVtaXRzIHBlciBwaXhlbCBvZiB0cmF2ZWwsIGFuZCBlYWNoIHJvdW5kXG4gICAqICByZXN0b3JlcyBhbmQgcmUtcHJvY2Vzc2VzIGV2ZXJ5IHRpbGUgb2YgZXZlcnkgY2hhbm5lbCDigJQgc28gdGhlIGJ1cnN0IGlzIGJvdGhcbiAgICogIHdhc3RlZCB3b3JrIGFuZCB0aGUgcmFjZSB0aGF0IGJyZWFrcyBjYWNoZSByZWNvcmRzIChzZWUge0BsaW5rIGRpc3BsYXlUb2tlbn0pLlxuICAgKiAgVGhlIHN0b3JlIHdyaXRlIHN0YXlzIGxpdmUsIHNvIHRoZSBwYW5lIGl0c2VsZiByZW1haW5zIHJlc3BvbnNpdmUuICovXG4gIHByaXZhdGUgc2NoZWR1bGVJbnZhbGlkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludmFsaWRhdGVIYW5kbGUgIT09IG51bGwpIHJldHVybjsgLy8gYWxyZWFkeSBxdWV1ZWQgZm9yIHRoaXMgZnJhbWVcbiAgICBjb25zdCByYWYgPVxuICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICA6IChjYjogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IHNldFRpbWVvdXQoKCkgPT4gY2IoMCksIDE2KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLmludmFsaWRhdGVIYW5kbGUgPSByYWYoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gbnVsbDtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZURpc3BsYXkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW52YWxpZGF0ZURpc3BsYXkoKTogdm9pZCB7XG4gICAgLy8gU3VwZXJzZWRlIGFueSBpbi1mbGlnaHQgcmVjb2xvciByb3VuZCBiZWZvcmUgcmVzdGFydGluZyBvbmUgKHNlZSBkaXNwbGF5VG9rZW4pLlxuICAgIHRoaXMuZGlzcGxheVRva2VuKys7XG4gICAgY29uc3QgdjogYW55ID0gdGhpcy52aWV3ZXI7XG4gICAgaWYgKCF2KSByZXR1cm47XG4gICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgIHRoaXMuY2FjaGUuaW52YWxpZGF0ZUNoYW5uZWxEaXNwbGF5KHRoaXMuY3VycmVudFopO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkgeyB2LndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICAgIHRyeSB7IHYubmF2aWdhdG9yPy53b3JsZD8ucmVxdWVzdEludmFsaWRhdGUodHJ1ZSk7IH0gY2F0Y2ggeyAvKiBuby1vcCAqLyB9XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lWaWV3ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZS5jYW5jZWxCYWNrZ3JvdW5kTG9hZCgpO1xuICAgIGlmICh0aGlzLmZyYW1lUmFmICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lUmFmKTtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgIH1cbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgIGlmIChyZWN0KSB0aGlzLnZpZXdwb3J0Q2hhbmdlJC5uZXh0KHJlY3QpO1xuICB9XG5cbiAgLyoqIFRoZSBjdXJyZW50IHZpZXdwb3J0J3MgaW1hZ2UtcGl4ZWwgcmVjdGFuZ2xlLCBjbGFtcGVkIHRvIHRoZSBpbWFnZSwgb3JcbiAgICogIG51bGwgd2hlbiB0aGVyZSBpcyBubyBsYWlkLW91dCB2aWV3cG9ydC4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlSW1hZ2VSZWN0KCk6IFBsb3RNb2RlUmVjdCB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHJldHVybiB7IHgsIHksIHdpZHRoLCBoZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsOyAvKiB2aWV3cG9ydCBub3QgcmVhZHkgKi9cbiAgICB9XG4gIH1cblxuICAvKiogQ29hbGVzY2UgcmVkcmF3cyBpbnRvIG9uZSB7QGxpbmsgZnJhbWUkfSBlbWlzc2lvbiBwZXIgYW5pbWF0aW9uIGZyYW1lLlxuICAgKiAgU2tpcHBlZCBlbnRpcmVseSB3aGlsZSBub3RoaW5nIGxpc3RlbnMuICovXG4gIHByaXZhdGUgc2NoZWR1bGVGcmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmFtZVJhZiAhPT0gbnVsbCB8fCAhdGhpcy5mcmFtZSQub2JzZXJ2ZWQpIHJldHVybjtcbiAgICB0aGlzLmZyYW1lUmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuZnJhbWVSYWYgPSBudWxsO1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMudmlzaWJsZUltYWdlUmVjdCgpO1xuICAgICAgaWYgKHJlY3QpIHRoaXMuZnJhbWUkLm5leHQocmVjdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlIGRyYXdzIG92ZXIuIE9uZSBzdGFibGUgb2JqZWN0IHBlclxuICAgKiBzZXJ2aWNlOiBldmVyeSBtZXRob2QgcmVhZHMgdGhlIENVUlJFTlQgdmlld2VyLCBzbyBpdCBzdGF5cyB2YWxpZCBhY3Jvc3MgYVxuICAgKiB2aWV3ZXIgcmVidWlsZCBhbmQgcmVwb3J0cyBgaXNSZWFkeSgpID09PSBmYWxzZWAgd2hpbGUgbm9uZSBpcyBtb3VudGVkXG4gICAqIChjb252ZXJzaW9ucyB0aGVuIHJldHVybiBOYU4gcmF0aGVyIHRoYW4gdGhyb3dpbmcpLlxuICAgKi9cbiAgZ2V0UGxvdE1vZGVWaWV3cG9ydCgpOiBQbG90TW9kZVZpZXdwb3J0IHtcbiAgICBpZiAodGhpcy5wbG90TW9kZVZpZXdwb3J0KSByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICAgIGNvbnN0IG5hbiA9IHsgeDogTmFOLCB5OiBOYU4gfTtcbiAgICBjb25zdCByZWFkeSA9ICgpID0+ICEhdGhpcy5jb29yZFRyYW5zZm9ybT8uaXNSZWFkeSgpO1xuICAgIHRoaXMucGxvdE1vZGVWaWV3cG9ydCA9IHtcbiAgICAgIGdldE92ZXJsYXlDb250YWluZXI6ICgpID0+IHRoaXMuZ2V0T3ZlcmxheUNvbnRhaW5lcigpLFxuICAgICAgZGF0YVRvQ2xpZW50OiAoeCwgeSkgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhVG9DbGllbnQoeCwgeSkgOiBuYW4pLFxuICAgICAgY2xpZW50VG9EYXRhOiAoY3gsIGN5KSA9PiAocmVhZHkoKSA/IHRoaXMuY29vcmRUcmFuc2Zvcm0hLmNsaWVudFRvRGF0YShjeCwgY3kpIDogbmFuKSxcbiAgICAgIGRhdGFMZW5ndGhUb1NjcmVlbjogKGxlbikgPT4gKHJlYWR5KCkgPyB0aGlzLmNvb3JkVHJhbnNmb3JtIS5kYXRhTGVuZ3RoVG9TY3JlZW4obGVuKSA6IE5hTiksXG4gICAgICBpc1JlYWR5OiByZWFkeSxcbiAgICAgIC8vIEJvdGggc3RhcnQgd2l0aCB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3Qgd2hlbiB0aGUgdmlld3BvcnQgaXMgcmVhZHk6IGEgbW9kZVxuICAgICAgLy8gYWN0aXZhdGVzIGFmdGVyIHRoZSBiYXNlIHJlbmRlciBoYXMgZ29uZSBpZGxlLCBzbyB3aXRob3V0IGl0IGFuIG92ZXJsYXlcbiAgICAgIC8vIGZvbGxvd2luZyBgZnJhbWUkLnN1YnNjcmliZShyZWRyYXcpYCB3b3VsZCBzdGF5IGJsYW5rIHVudGlsIHRoZSBuZXh0IHBhbi96b29tLlxuICAgICAgZnJhbWUkOiB0aGlzLndpdGhDdXJyZW50UmVjdCh0aGlzLmZyYW1lJCwgcmVhZHkpLFxuICAgICAgc2V0dGxlZCQ6IHRoaXMud2l0aEN1cnJlbnRSZWN0KHRoaXMudmlld3BvcnRDaGFuZ2UkLCByZWFkeSksXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5wbG90TW9kZVZpZXdwb3J0O1xuICB9XG5cbiAgLyoqIGBzb3VyY2VgLCBwcmVjZWRlZCBieSB0aGUgY3VycmVudCB2aXNpYmxlIHJlY3QgZm9yIGVhY2ggc3Vic2NyaWJlciAod2hlbiByZWFkeSkuICovXG4gIHByaXZhdGUgd2l0aEN1cnJlbnRSZWN0KHNvdXJjZTogU3ViamVjdDxQbG90TW9kZVJlY3Q+LCByZWFkeTogKCkgPT4gYm9vbGVhbik6IE9ic2VydmFibGU8UGxvdE1vZGVSZWN0PiB7XG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSByZWFkeSgpID8gdGhpcy52aXNpYmxlSW1hZ2VSZWN0KCkgOiBudWxsO1xuICAgICAgcmV0dXJuIHJlY3QgPyBzb3VyY2UucGlwZShzdGFydFdpdGgocmVjdCkpIDogc291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgV2FuZE9wdGlvbnMpO1xuICB9XG4gIHNldFdhbmRPcHRpb25zKG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMud2FuZFRvb2wuc2V0T3B0aW9ucyhvcHRpb25zIGFzIFdhbmRPcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy53YW5kVG9vbC5jbGVhckFjdGl2ZVJlZ2lvbigpO1xuICB9XG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRha2UgdGhlIHBvaW50ZXIgZnJvbSBPU0Qgc28gdGhlIGRyYWcgcGFpbnRzIGluc3RlYWQgb2YgcGFubmluZy5cbiAgICB0aGlzLnZpZXdlcj8uc2V0TW91c2VOYXZFbmFibGVkKGZhbHNlKTtcbiAgICAvLyBUaGUgYnJ1c2ggd29ya3MgaW4gdGhlIHJlbmRlcmVkLXZpZXdwb3J0IGNvb3JkaW5hdGUgZnJhbWUg4oCUIHJlYWQgaXQgYmFja1xuICAgIC8vIGxhemlseSBvbiBmaXJzdCB1c2UsIGxpa2UgdGhlIHdhbmQuIEl0IHNoYXJlcyB0aGUgd2FuZCdzIGhvc3QuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgdGhpcy5icnVzaFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRCcnVzaE9wdGlvbnMob3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgdGhpcy5icnVzaFRvb2wuc2V0T3B0aW9ucygob3B0aW9ucyA/PyB7fSkgYXMgQnJ1c2hPcHRpb25zKTtcbiAgfVxuICBzZXRWZXJ0ZXhFcmFzZXJNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyB0b29sIHRha2VzIHRoZSBwb2ludGVyXG4gICAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICAgIHRoaXMuZXJhc2VyVG9vbC5iaW5kSG9zdCh0aGlzLmVyYXNlckhvc3QpO1xuICAgIH1cbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZXJhc2VyVG9vbC5zZXRSYWRpdXMocmFkaXVzKTtcbiAgfVxuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpOyAvLyB0aGUgYm94IGRyYWcgbXVzdCBub3QgcGFuXG4gICAgICB0aGlzLnpvb21Ub0JveFRvb2wuYmluZEhvc3QodGhpcy56b29tQm94SG9zdCgpKTtcbiAgICB9XG4gICAgdGhpcy56b29tVG9Cb3hUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgICBpZiAoIWFjdGl2ZSkgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZCh0cnVlKTtcbiAgfVxuICAvKiogQm94LXByb21wdGVkIFNBTTogc2VnbWVudCB0aGUgZHJhd24gcmVjdGFuZ2xlcy4gVGhlIFNBTSB0b29sIHJldXNlcyB0aGVcbiAgICogIHdhbmQgaG9zdCAodmlld3BvcnQgcmVhZGJhY2sgKyBjb29yZGluYXRlIHRyYW5zZm9ybSArIHJlZ2lvbiBzdG9yZSkuICovXG4gIHNlZ21lbnRSZWN0YW5nbGVzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHNlZ21lbnQgYWdhaW5zdCB0aGUgY3VycmVudCB2aWV3cG9ydCByZWFkYmFja1xuICAgIHRoaXMuc2FtVG9vbC5iaW5kSG9zdCh0aGlzLndhbmRIb3N0KTtcbiAgICByZXR1cm4gdGhpcy5zYW1Ub29sLnNlZ21lbnRCb3hlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuY2VsbFNlZ21lbnRlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDsgLy8gY3JvcCBhZ2FpbnN0IHRoZSBjdXJyZW50IHZpZXdwb3J0IHJlYWRiYWNrXG4gICAgdGhpcy5jZWxsU2VnbWVudFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgcmV0dXJuIHRoaXMuY2VsbFNlZ21lbnRUb29sLnNlZ21lbnRCb3hlcyh0aGlzLmNlbGxTZWdtZW50ZXIpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNhbVRvb2wuc2V0TW9kZWwoaWQpO1xuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGVsKGlkKTtcbiAgfVxuICBzZXRTYW1Qb2ludE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy52aWV3ZXI/LnNldE1vdXNlTmF2RW5hYmxlZChmYWxzZSk7IC8vIGNsaWNrcyBhZGQgcG9pbnRzLCBkb24ndCBwYW5cbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgdGhpcy5zYW1Qb2ludFRvb2wuYmluZEhvc3QodGhpcy53YW5kSG9zdCk7XG4gICAgfVxuICAgIHRoaXMuc2FtUG9pbnRUb29sLnNldE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7IHRoaXMuc2FtUG9pbnRUb29sLmNvbW1pdCgpOyB9XG4gIGNsZWFyU2FtUG9pbnRzKCk6IHZvaWQgeyB0aGlzLnNhbVBvaW50VG9vbC5jbGVhcigpOyB9XG5cbiAgLyoqIEJ1aWxkIHRoZSB3YW5kL2VyYXNlciBob3N0IG9iamVjdHMgYm91bmQgdG8gdGhpcyBiYWNrZW5kLiBCb3RoIHRvb2xzIHJ1blxuICAgKiAgb3ZlciBPU0QgdmlhIHRoZSBzaGFyZWQgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrLFxuICAgKiAgYW5kIHJlYWQvd3JpdGUgcmVnaW9ucyBkaXJlY3RseSBvbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlIChuZXV0cmFsIG1vZGVsKS4gKi9cbiAgcHJpdmF0ZSBidWlsZFRvb2xIb3N0cygpOiB2b2lkIHtcbiAgICB0aGlzLndhbmRIb3N0ID0ge1xuICAgICAgZ2V0UmVnaW9uczogKCkgPT4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCksXG4gICAgICBzZXRSZWdpb25zOiAocmVnaW9ucykgPT4gdGhpcy5yZWdpb25TdG9yZS5zZXRSZWdpb25zKHJlZ2lvbnMpLFxuICAgICAgZ2V0Q2FjaGVkSW1hZ2VEYXRhOiAoKSA9PiB0aGlzLnJlYWRiYWNrVmlld3BvcnQoKSxcbiAgICAgIGdldEFjdGl2ZUZyYW1lSW5kZXg6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRGaWxlTmFtZTogKCkgPT4gdGhpcy5jdXJyZW50RmlsZU5hbWUsXG4gICAgICBnZXRTaGFwZUNvbG9yOiAoKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmdldFNoYXBlQ29sb3IoKSxcbiAgICB9O1xuICAgIHRoaXMuZXJhc2VySG9zdCA9IHtcbiAgICAgIGdldFJlZ2lvbnM6ICgpID0+IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpLFxuICAgICAgc2V0UmVnaW9uczogKHJlZ2lvbnMpID0+IHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zKSxcbiAgICAgIGludmFsaWRhdGVXYW5kUmVnaW9uOiAoKSA9PiB0aGlzLndhbmRUb29sLmNsZWFyQWN0aXZlUmVnaW9uKCksXG4gICAgICBnZXRPdmVybGF5Q29udGFpbmVyOiAoKSA9PiB0aGlzLmdldE92ZXJsYXlDb250YWluZXIoKSxcbiAgICAgIGdldENvb3JkaW5hdGVUcmFuc2Zvcm06ICgpID0+IHRoaXMuY29vcmRUcmFuc2Zvcm0gYXMgSUNvb3JkaW5hdGVUcmFuc2Zvcm0sXG4gICAgICBnZXRDYWNoZWRJbWFnZVJhdGlvOiAoKSA9PiB0aGlzLnJlYWRiYWNrVmlld3BvcnQoKT8ucmF0aW9zWzBdID8/IDEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBUaGUgZWxlbWVudCB0aGUgb24tY2FudmFzIHRvb2wgb3ZlcmxheXMgYXR0YWNoIHRvIChPU0QgaXMgbW91bnRlZCBoZXJlKS4gKi9cbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucGxvdERpdiA/IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxvdERpdikgOiBudWxsO1xuICB9XG5cbiAgLyoqIFNpemUgdGhlIG5hdmlnYXRvciBmcm9tIHRoZSBDVVJSRU5UIGNvbnRhaW5lciAobmF2aWdhdG9yU2l6ZVJhdGlvIG9mIHRoZVxuICAgKiAgdmlld2VyIGVsZW1lbnQpIGFuZCBrZWVwIGl0IHBpbm5lZCB0byB0aGUgY29ybmVyLiBPU0QgY29tcHV0ZXMgdGhlIHNpemVcbiAgICogIG9uY2UgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgYmVmb3JlIHRoZSBob3N0IGZsZXggbGF5b3V0IHNldHRsZXMg4oCUXG4gICAqICBhbmQgbmV2ZXIgY29ycmVjdHMgaXQsIGxlYXZpbmcgYSBzdGFsZS1zaXplIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSBtaW5pbWFwXG4gICAqICBmbG9hdHMgYWJvdmUgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIuICovXG4gIHByaXZhdGUgcmVzaXplTmF2aWdhdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGNvbnN0IG5hdiA9IHY/Lm5hdmlnYXRvcjtcbiAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQgPSB2Py5lbGVtZW50O1xuICAgIGlmICghbmF2Py5lbGVtZW50IHx8ICFlbD8uY2xpZW50V2lkdGggfHwgIWVsPy5jbGllbnRIZWlnaHQpIHJldHVybjtcbiAgICBjb25zdCB3ID0gTWF0aC5yb3VuZChlbC5jbGllbnRXaWR0aCAqIDAuMTYpO1xuICAgIGNvbnN0IGggPSBNYXRoLnJvdW5kKGVsLmNsaWVudEhlaWdodCAqIDAuMTYpO1xuICAgIGlmIChuYXYuZWxlbWVudC5zdHlsZS53aWR0aCAhPT0gYCR7d31weGAgfHwgbmF2LmVsZW1lbnQuc3R5bGUuaGVpZ2h0ICE9PSBgJHtofXB4YCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmF2LnNldFdpZHRoKHcpO1xuICAgICAgICBuYXYuc2V0SGVpZ2h0KGgpO1xuICAgICAgfSBjYXRjaCB7IC8qIG5hdmlnYXRvciB0b3JuIGRvd24gKi8gfVxuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgT1NEJ3MgY29udHJvbC1jb3JuZXIgc3RhY2sgc28gdGhlIG1pbmltYXAgc2l0cyBmbHVzaCBpbiB0aGVcbiAgICAvLyBjb3JuZXIsIGluc2V0IDEycHggdG8gbGluZSB1cCB3aXRoIHRoZSBzY2FsZSBiYXI6XG4gICAgLy8gIC0gdGhlIGlubGluZS1ibG9jayB3cmFwcGVyIGNhcnJpZXMgbGluZS1ib3ggc3RydXRzIGFuZCBjYW4gcmV0YWluIHN0YWxlXG4gICAgLy8gICAgc2l6aW5nIOKGkiBtYWtlIGl0IGEgdGlnaHQgYmxvY2s7XG4gICAgLy8gIC0gYW55dGhpbmcgZWxzZSBPU0QgbGVmdCBpbiB0aGUgY29ybmVyIHdvdWxkIHN0YWNrIGJlbG93IHRoZSBuYXZpZ2F0b3JcbiAgICAvLyAgICBhbmQgZmxvYXQgaXQgdXAg4oaSIGhpZGUgaXQ7XG4gICAgLy8gIC0gaW5zZXQgdGhlIGNvcm5lciBpdHNlbGYgKGJvdHRvbS9yaWdodCAxMnB4KSwga2VlcGluZyB0aGUgZWxlbWVudCBpblxuICAgIC8vICAgIG5vcm1hbCBmbG93LlxuICAgIGNvbnN0IHdyYXBwZXIgPSBuYXYuZWxlbWVudC5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBjb3JuZXIgPSB3cmFwcGVyPy5wYXJlbnRFbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAod3JhcHBlciAmJiBjb3JuZXIpIHtcbiAgICAgIHdyYXBwZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB3cmFwcGVyLnN0eWxlLmxpbmVIZWlnaHQgPSAnMCc7XG4gICAgICB3cmFwcGVyLnN0eWxlLmZvbnRTaXplID0gJzAnO1xuICAgICAgLy8gVGhlIHdyYXBwZXIga2VlcHMgdGhlIG5hdmlnYXRvcidzIHN0YWxlIHByZS1zZXR0bGUgaGVpZ2h0IGFzIGFuXG4gICAgICAvLyBleHBsaWNpdCBzaXplICh0aGUgbmF2IHdhcyAwLjE2eCB0aGUgVU5TRVRUTEVEIGNvbnRhaW5lciBhdCBjcmVhdGlvbiksXG4gICAgICAvLyBsZWF2aW5nIGFuIGVtcHR5IGJhbmQgdW5kZXIgdGhlIHJlc2l6ZWQgbWluaW1hcCDigJQgbWVhc3VyZWQgbGl2ZTpcbiAgICAgIC8vIG5hdkg9ODcgaW5zaWRlIHdyYXBIPTE2Ny4gRm9yY2UgaXQgdG8gaHVnIGl0cyBjb250ZW50LlxuICAgICAgd3JhcHBlci5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICB3cmFwcGVyLnN0eWxlLndpZHRoID0gJ2F1dG8nO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKGNvcm5lci5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IHdyYXBwZXIpIGNoaWxkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20od3JhcHBlci5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG5hdi5lbGVtZW50KSBjaGlsZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgICAgY29ybmVyLnN0eWxlLmJvdHRvbSA9ICcxMnB4JztcbiAgICAgIGNvcm5lci5zdHlsZS5yaWdodCA9ICcxMnB4JztcbiAgICB9XG4gICAgT2JqZWN0LmFzc2lnbihuYXYuZWxlbWVudC5zdHlsZSwgeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdG9wOiAnJywgbGVmdDogJycsIGJvdHRvbTogJycsIHJpZ2h0OiAnJywgbWFyZ2luOiAnMCcgfSk7XG4gICAgLy8gVE9ETyhkZWJ1Zyk6IHJlbW92ZSBhZnRlciB2ZXJpZmljYXRpb25cbiAgICBjb25zdCBuZXIgPSBuYXYuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3ciA9IHdyYXBwZXI/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGNyID0gY29ybmVyPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBwZXIgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zb2xlLndhcm4oYFt2aXo6bmF2XSBuYXZCb3R0b209JHtNYXRoLnJvdW5kKG5lci5ib3R0b20pfSB3cmFwQm90dG9tPSR7TWF0aC5yb3VuZCh3cj8uYm90dG9tID8/IC0xKX0gYCArXG4gICAgICBgY29ybmVyQm90dG9tPSR7TWF0aC5yb3VuZChjcj8uYm90dG9tID8/IC0xKX0gcGxvdEJvdHRvbT0ke01hdGgucm91bmQocGVyLmJvdHRvbSl9IGAgK1xuICAgICAgYG5hdkg9JHtNYXRoLnJvdW5kKG5lci5oZWlnaHQpfSB3cmFwSD0ke01hdGgucm91bmQod3I/LmhlaWdodCA/PyAtMSl9IGNvcm5lckg9JHtNYXRoLnJvdW5kKGNyPy5oZWlnaHQgPz8gLTEpfWApO1xuICB9XG5cbiAgLyoqIEZvcmNlIHRoZSBkb2NrZWQgdG9vbGJhciB0byByZXBhaW50IGFmdGVyIGFuIE9TRCB6b29tLiBDaHJvbWUgbGVhdmVzIGl0XG4gICAqICBsYWlkLW91dC1idXQtdW5wYWludGVkICh0aGUgY2FudmFzJ3MgY29tcG9zaXRpbmcgY2h1cm4gc3RyYW5kcyB0aGUgdG9vbGJhcidzXG4gICAqICByYXN0ZXIpLiBBIHN5bmNocm9ub3VzIGRpc3BsYXkgdG9nZ2xlIHJlLXJhc3RlcnMgaXQgd2l0aCBubyB2aXNpYmxlIGdvbmUtZnJhbWVcbiAgICogIGFuZCBubyBsYXlvdXQgc2hpZnQuIExvY2F0ZWQgdmlhIHRoZSBET00gc2luY2UgdGhpcyBzZXJ2aWNlIGRvZXNuJ3Qgb3duIHRoZVxuICAgKiAgdG9vbGJhcjsgYSBuby1vcCB3aGVuIHRoZXJlJ3Mgbm8gdG9vbGJhciAoZS5nLiBlbWJlZGRlZCB3aXRob3V0IG9uZSkuICovXG4gIHByaXZhdGUgbnVkZ2VUb29sYmFyUmVwYWludCgpOiB2b2lkIHtcbiAgICBjb25zdCBwbG90RWwgPSB0aGlzLnBsb3REaXYgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXYpIDogbnVsbDtcbiAgICBjb25zdCBkb2NrID0gcGxvdEVsPy5jbG9zZXN0KCd2aXN1YWxpemF0aW9uJyk/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcudG9vbGJhci1kb2NrJyk7XG4gICAgaWYgKCFkb2NrKSByZXR1cm47XG4gICAgY29uc3QgcHJldiA9IGRvY2suc3R5bGUuZGlzcGxheTtcbiAgICBkb2NrLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdm9pZCBkb2NrLm9mZnNldEhlaWdodDsgLy8gcmVmbG93IHNvIHRoZSB0b2dnbGUgcmUtcmFzdGVycyBvbiB0aGUgbmV4dCBwYWludFxuICAgIGRvY2suc3R5bGUuZGlzcGxheSA9IHByZXY7XG4gIH1cblxuICAvKiogSG9zdCBmb3IgdGhlIChzaGFyZWQpIHpvb20tdG8tYm94IHRvb2w6IGNvbnZlcnQgb3ZlcmxheSBwaXhlbHMgdG8gaW1hZ2VcbiAgICogIGNvb3JkcyB2aWEgdGhlIHZpZXdwb3J0LCBhbmQgZml0IHRoZSB2aWV3cG9ydCB0byB0aGUgY2hvc2VuIHJlY3RhbmdsZS4gKi9cbiAgcHJpdmF0ZSB6b29tQm94SG9zdCgpOiBab29tVG9Cb3hUb29sSG9zdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdldFBsb3REaXY6ICgpID0+IHRoaXMucGxvdERpdixcbiAgICAgIHBpeGVsVG9EYXRhOiAocHg6IG51bWJlciwgcHk6IG51bWJlcikgPT4gZWxlbWVudFRvSW1hZ2UodGhpcy52aWV3ZXIsIHB4LCBweSksXG4gICAgICBhcHBseVpvb21Ub0JveDogKGNvb3JkczogbnVtYmVyW10pID0+IHRoaXMuYXBwbHlab29tVG9Cb3goY29vcmRzKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEZpdCB0aGUgT1NEIHZpZXdwb3J0IHRvIGFuIGltYWdlLXNwYWNlIHJlY3RhbmdsZSAoY29vcmRzIG9yZGVyZWRcbiAgICogIFt4TWluLCB4TWF4LCB5TWF4LCB5TWluXSkuICovXG4gIHByaXZhdGUgYXBwbHlab29tVG9Cb3goY29vcmRpbmF0ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnZpZXdlciB8fCBjb29yZGluYXRlcy5sZW5ndGggPCA0KSByZXR1cm47XG4gICAgY29uc3QgW2EsIGIsIGMsIGRdID0gY29vcmRpbmF0ZXM7XG4gICAgY29uc3QgeCA9IE1hdGgubWluKGEsIGIpO1xuICAgIGNvbnN0IHcgPSBNYXRoLmFicyhiIC0gYSk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKGMsIGQpO1xuICAgIGNvbnN0IGggPSBNYXRoLmFicyhjIC0gZCk7XG4gICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybjtcbiAgICBjb25zdCByZWN0ID0gaW1hZ2VSZWN0VG9WaWV3cG9ydCh0aGlzLnZpZXdlciwgeCwgeSwgdywgaCk7XG4gICAgdGhpcy52aWV3ZXIudmlld3BvcnQuZml0Qm91bmRzKHJlY3QsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGJhY2sgdGhlICpjdXJyZW50bHkgcmVuZGVyZWQqIE9TRCBjYW52YXMgYXMgdGhlIHdhbmQncyBwaXhlbCBtYXRyaXguXG4gICAqIFRoZSBtYXRyaXggY292ZXJzIG9ubHkgdGhlIHZpc2libGUgdmlld3BvcnQgYXQgc2NyZWVuIHJlc29sdXRpb24sIHNvIHdoZW5cbiAgICogdGhlIHVzZXIgaXMgem9vbWVkIGludG8gYSBzdWItcmVnaW9uIHRoZSB3YW5kIHNhbXBsZXMgdGhhdCByZWdpb24ncyBkZXRhaWxcbiAgICogKHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpbWFnZSBhdCBwcmV2aWV3IHJlc29sdXRpb24pLiBgb3JpZ2luWC9vcmlnaW5ZYCBhbmRcbiAgICogYHJhdGlvc2AgbWFwIGltYWdlIGNvb3JkcyA8LT4gcmVhZGJhY2stcGl4ZWwgY29vcmRzIGZvciB0aGUgd2FuZCdzXG4gICAqIGRhdGEvcmF0aW8vb3JpZ2luIG1vZGVsLiBDYWNoZWQgdW50aWwgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRiYWNrVmlld3BvcnQoKTogQ2FjaGVkSW1hZ2VEYXRhIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMudmlld3BvcnRQaXhlbHMpIHJldHVybiB0aGlzLnZpZXdwb3J0UGl4ZWxzO1xuICAgIGNvbnN0IHZpZXdlciA9IHRoaXMudmlld2VyIGFzIGFueTtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gdmlld2VyPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBjb25zdCB2cCA9IHZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCFjYW52YXMgfHwgIWNhbnZhcy53aWR0aCB8fCAhY2FudmFzLmhlaWdodCB8fCAhdnApIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHcgPSBjYW52YXMud2lkdGg7IC8vIGRldmljZSBwaXhlbHNcbiAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDtcbiAgICBjb25zdCBkYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCB3LCBoKS5kYXRhOyAvLyBSR0JBLCByb3ctbWFqb3JcbiAgICAvLyBCdWlsZCB0aGUgW3ldW3hdID0gW3IsZyxiXSBtYXRyaXggdGhlIHdhbmQgZXhwZWN0cyBmb3IgUkdCIGZyYW1lcy5cbiAgICBjb25zdCBtYXRyaXg6IG51bWJlcltdW11bXSA9IG5ldyBBcnJheShoKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgY29uc3Qgcm93OiBudW1iZXJbXVtdID0gbmV3IEFycmF5KHcpO1xuICAgICAgY29uc3QgYmFzZSA9IHkgKiB3ICogNDtcbiAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgIGNvbnN0IG8gPSBiYXNlICsgeCAqIDQ7XG4gICAgICAgIHJvd1t4XSA9IFtkYXRhW29dLCBkYXRhW28gKyAxXSwgZGF0YVtvICsgMl1dO1xuICAgICAgfVxuICAgICAgbWF0cml4W3ldID0gcm93O1xuICAgIH1cblxuICAgIC8vIEltYWdlLWNvb3JkIHNwYW4gdGhlIHJlYWRiYWNrIGNvdmVycyAoQ1NTIHB4IGluLCBpbWFnZSBjb29yZHMgb3V0KS4gUm91dGVcbiAgICAvLyB0aHJvdWdoIHdvcmxkIGl0ZW0gMCAob3NkLWNvb3Jkcykgc28gaXQgc3RheXMgYWNjdXJhdGUg4oCUIGFuZCBxdWlldCDigJQgd2hlblxuICAgIC8vIHRoZSB3b3JsZCBob2xkcyBtdWx0aXBsZSBpbWFnZXMgKHBlci1jaGFubmVsIG11bHRpY2hhbm5lbCBsYXllcnMpLlxuICAgIGNvbnN0IGVsVyA9IGNhbnZhcy5jbGllbnRXaWR0aCB8fCB3O1xuICAgIGNvbnN0IGVsSCA9IGNhbnZhcy5jbGllbnRIZWlnaHQgfHwgaDtcbiAgICBjb25zdCB0bCA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCAwLCAwKTtcbiAgICBjb25zdCBiciA9IGVsZW1lbnRUb0ltYWdlKHRoaXMudmlld2VyLCBlbFcsIGVsSCk7XG4gICAgY29uc3QgcmF0aW9YID0gKGJyLnggLSB0bC54KSAvIHc7IC8vIGltYWdlIHB4IHBlciByZWFkYmFjayBweFxuICAgIGNvbnN0IHJhdGlvWSA9IChici55IC0gdGwueSkgLyBoO1xuXG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IHtcbiAgICAgIGZyYW1lczogW21hdHJpeF0sXG4gICAgICB3aWR0aDogdyxcbiAgICAgIGhlaWdodDogaCxcbiAgICAgIHJhdGlvczogW3JhdGlvWCwgcmF0aW9ZXSxcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSwgLy8gY2FudmFzIHJlYWRiYWNrIGlzIGFsd2F5cyBSR0JBXG4gICAgICBvcmlnaW5YOiB0bC54LFxuICAgICAgb3JpZ2luWTogdGwueSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLnZpZXdwb3J0UGl4ZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29sb3IgYSBncmF5c2NhbGUgdGlsZSB0aHJvdWdoIHRoZSBhY3RpdmUgY29sb3JtYXAgTFVULCB1c2luZyBPU0Qnc1xuICAgKiB0aWxlLWludmFsaWRhdGVkIHBpeGVsIHBpcGVsaW5lIChPU0QgNSsvNikuIE1hcHMgZWFjaCBwaXhlbCdzIGdyYXlzY2FsZVxuICAgKiB2YWx1ZSAocj09Zz09YikgdG8gdGhlIExVVCdzIFJHQi4gTm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgdW50aWwgdGhlIExVVCBpc1xuICAgKiBidWlsdC4gSGFuZGxlciBpcyBhc3luYyDigJQgT1NEIGF3YWl0cyBpdCAocmFpc2VFdmVudEF3YWl0aW5nKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb2xvclRpbGUoZXZlbnQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlY29sb3JDaGFubmVsVGlsZShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5kaXNwbGF5VG9rZW47XG4gICAgY29uc3QgZ3JheSA9IHRoaXMuaXNHcmF5c2NhbGVJbWFnZTtcbiAgICBpZiAoZ3JheSkge1xuICAgICAgaWYgKCF0aGlzLmNvbG9yTHV0KSByZXR1cm47XG4gICAgfSBlbHNlIGlmICghdGhpcy5kaXNwbGF5LnJnYk5lZWRzUmVjb2xvcigpKSB7XG4gICAgICByZXR1cm47IC8vIFJHQiBhdCBkZWZhdWx0IChhbGwgdmlzaWJsZSwgZnVsbCB3aW5kb3csIM6zPTEsIG5vIGludmVydCkg4oaSIHBhc3N0aHJvdWdoXG4gICAgfVxuXG4gICAgLy8gUmVhZCB0aGUgdGlsZSdzIHBpeGVscy4gUHJlZmVyIHRoZSByZW5kZXJpbmcgY29udGV4dCwgYnV0IHNvbWUgdGlsZSBjYWNoZXNcbiAgICAvLyAoYWpheCBQTkcgYmxvYnMpIGNvbnZlcnQgdG8gYW4gKmVtcHR5KiBjb250ZXh0MmQg4oCUIHJlY29sb3JpbmcgdGhhdCB3b3VsZFxuICAgIC8vIGJsYW5rIHRoZSB0aWxlICh3aGl0ZSBjYW52YXMpLiBTbyBpZiB0aGUgY29udGV4dCBoYXMgbm8gb3BhcXVlIHBpeGVscywgZHJhd1xuICAgIC8vIHRoZSB0aWxlJ3Mgb3duIGJpdG1hcC9pbWFnZSBhbmQgcmVjb2xvciB0aGF0IGluc3RlYWQuIFdlIG5ldmVyIHdyaXRlIGJhY2tcbiAgICAvLyB1bmxlc3Mgd2UgYWN0dWFsbHkgcmVjb2xvcmVkIHNvbWV0aGluZywgc28gYSB0aWxlIGlzIG5ldmVyIGJsYW5rZWQuXG4gICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGN0eCA9IGF3YWl0IGV2ZW50LmdldERhdGEoJ2NvbnRleHQyZCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdHJ5IGJpdG1hcCBiZWxvdyAqL1xuICAgIH1cbiAgICBsZXQgaW1nOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoY3R4ICYmIGN0eC5jYW52YXMgJiYgY3R4LmNhbnZhcy53aWR0aCAmJiBjdHguY2FudmFzLmhlaWdodCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW1nID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjdHguY2FudmFzLndpZHRoLCBjdHguY2FudmFzLmhlaWdodCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaW1nID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFpbWcgfHwgIXRoaXMuaGFzT3BhcXVlKGltZy5kYXRhKSkge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSB0aWxlJ3MgZGVjb2RlZCBpbWFnZS9iaXRtYXAuXG4gICAgICBsZXQgc3JjOiBhbnkgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2VCaXRtYXAnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBub25lICovXG4gICAgICB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2UnKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLyogbm9uZSAqL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNyYyB8fCAhc3JjLndpZHRoKSByZXR1cm47IC8vIGNhbid0IGdldCBwaXhlbHMg4oCUIGxlYXZlIHRoZSB0aWxlIHVudG91Y2hlZFxuICAgICAgY29uc3QgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgYy53aWR0aCA9IHNyYy53aWR0aDtcbiAgICAgIGMuaGVpZ2h0ID0gc3JjLmhlaWdodDtcbiAgICAgIGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKHNyYywgMCwgMCk7XG4gICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZGlzcGxheS5hcHBseVRvUmdiYShpbWcuZGF0YSkgfHwgIWN0eCkgcmV0dXJuOyAvLyBub3RoaW5nIG9wYXF1ZVxuICAgIC8vIEEgbmV3ZXIgZGlzcGxheSByb3VuZCBoYXMgYWxyZWFkeSByZXN0b3JlZCB0aGlzIHRpbGUg4oCUIHdyaXRpbmcgbm93IHdvdWxkXG4gICAgLy8gaGFuZCBPU0QgYSBzdXBlcnNlZGVkIGNhbnZhcyBhbmQgZGVzdHJveSB0aGUgY2FjaGUgcmVjb3JkLlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5kaXNwbGF5VG9rZW4pIHJldHVybjtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgLy8gVGhlIHRpbGUncyBjYWNoZSBjYW4gc3RpbGwgYmUgZXZpY3RlZCBiZXR3ZWVuIHRoZSBhd2FpdHMgYWJvdmUgYW5kIGhlcmUgKGFcbiAgICAvLyBzbGljZSBjaGFuZ2UpLCBtYWtpbmcgc2V0RGF0YSB0aHJvdyBhIERPTUV4Y2VwdGlvbiBvbiBhIGRlYWQgY2FudmFzLlxuICAgIC8vIFN3YWxsb3cgaXQg4oCUIHRoZSB0aWxlIGlzIGdvbmUsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byByZWNvbG9yLlxuICAgIHRyeSB7IGF3YWl0IGV2ZW50LnNldERhdGEoY3R4LCAnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiB0aWxlIGV2aWN0ZWQgKi8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFRpbnQgYSBzaW5nbGUgY2hhbm5lbCdzIHRpbGUgaW4gcGxhY2UuIEVhY2ggY2hhbm5lbCBpcyBpdHMgb3duIE9wZW5TZWFkcmFnb25cbiAgICogVGlsZWRJbWFnZSAoYSBzaW5nbGUtYmFuZCBncmF5c2NhbGUgdGlsZSk7IE9TRCBjb21wb3NpdGVzIHRoZSBOIGltYWdlc1xuICAgKiBhZGRpdGl2ZWx5ICgnbGlnaHRlcicpIGluIGl0cyBkcmF3ZXIg4oCUIHNvIHRoaXMganVzdCBtYXBzIHRoZSB0aWxlJ3MgaW50ZW5zaXR5XG4gICAqIHRocm91Z2ggdGhlIGNoYW5uZWwncyB3aW5kb3cvZ2FtbWEgYW5kIGl0cyBwc2V1ZG8tY29sb3VyLiBTeW5jaHJvbm91cyAobm9cbiAgICogY3Jvc3MtdGlsZSBmZXRjaCkg4oaSIG5vIHJhY2UsIG5vIHNlYW1zLiBDaGFubmVsIGlzIHBhcnNlZCBmcm9tIHRoZSB0aWxlIFVSTC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjb2xvckNoYW5uZWxUaWxlKGV2ZW50OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZGlzcGxheVRva2VuO1xuICAgIGNvbnN0IHRpbGUgPSBldmVudD8udGlsZTtcbiAgICBjb25zdCB1cmw6IHN0cmluZyA9ICh0aWxlICYmICh0eXBlb2YgdGlsZS5nZXRVcmwgPT09ICdmdW5jdGlvbicgPyB0aWxlLmdldFVybCgpIDogdGlsZS51cmwpKSB8fCAnJztcbiAgICBjb25zdCBtID0gL1s/Jl1jaGFubmVsPShcXGQrKS8uZXhlYyh1cmwpO1xuICAgIGNvbnN0IGNoID0gbSA/IHBhcnNlSW50KG1bMV0sIDEwKSA6IDA7XG4gICAgY29uc3Qgc3QgPSB0aGlzLmNoYW5uZWxTdGF0ZXNbY2hdO1xuXG4gICAgbGV0IGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHsgY3R4ID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnY29udGV4dDJkJyk7IH0gY2F0Y2ggeyAvKiBmYWxsYmFjayBiZWxvdyAqLyB9XG4gICAgbGV0IGltZzogSW1hZ2VEYXRhIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKGN0eCAmJiBjdHguY2FudmFzICYmIGN0eC5jYW52YXMud2lkdGggJiYgY3R4LmNhbnZhcy5oZWlnaHQpIHtcbiAgICAgIHRyeSB7IGltZyA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgY3R4LmNhbnZhcy53aWR0aCwgY3R4LmNhbnZhcy5oZWlnaHQpOyB9IGNhdGNoIHsgaW1nID0gbnVsbDsgfVxuICAgIH1cbiAgICBpZiAoIWltZyB8fCAhdGhpcy5oYXNPcGFxdWUoaW1nLmRhdGEpKSB7XG4gICAgICBsZXQgc3JjOiBhbnkgPSBudWxsO1xuICAgICAgdHJ5IHsgc3JjID0gYXdhaXQgZXZlbnQuZ2V0RGF0YSgnaW1hZ2VCaXRtYXAnKTsgfSBjYXRjaCB7IC8qIG5vbmUgKi8gfVxuICAgICAgaWYgKCFzcmMgfHwgIXNyYy53aWR0aCkgeyB0cnkgeyBzcmMgPSBhd2FpdCBldmVudC5nZXREYXRhKCdpbWFnZScpOyB9IGNhdGNoIHsgLyogbm9uZSAqLyB9IH1cbiAgICAgIGlmICghc3JjIHx8ICFzcmMud2lkdGgpIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIGMud2lkdGggPSBzcmMud2lkdGg7IGMuaGVpZ2h0ID0gc3JjLmhlaWdodDtcbiAgICAgIGN0eCA9IGMuZ2V0Q29udGV4dCgnMmQnLCB7IHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZSB9KTtcbiAgICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgICBjdHguZHJhd0ltYWdlKHNyYywgMCwgMCk7XG4gICAgICBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTtcbiAgICB9XG4gICAgaWYgKCFjdHgpIHJldHVybjtcblxuICAgIC8vIFByZWNvbXB1dGUgbHVtKDAuLjI1NSkg4oaSIHRpbnRlZCBSR0Igb25jZSwgdGhlbiBtYXAgZWFjaCBwaXhlbCBieSBsb29rdXAg4oCUXG4gICAgLy8gdGhlIGNoYW5uZWwgdGlsZSBpcyBzaW5nbGUtYmFuZCwgc28gdGhpcyB0dXJucyB+MjYyayBwZXItcGl4ZWxcbiAgICAvLyBjaGFubmVsSW50ZW5zaXR5KCkgKHdpdGggTWF0aC5wb3cgZm9yIGdhbW1hKSBjYWxscyBpbnRvIDI1NiDigJQgdGhlIGRpZmZlcmVuY2VcbiAgICAvLyBiZXR3ZWVuIGEgc25hcHB5IGFuZCBhIHNsdWdnaXNoIHNsaWRlciBvbiBhIDQtY2hhbm5lbCBzdGFjay5cbiAgICBjb25zdCB7IHI6IHJMLCBnOiBnTCwgYjogYkwgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICBjb25zdCBkID0gaW1nLmRhdGE7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGQubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgIGlmIChkW2kgKyAzXSA9PT0gMCkgY29udGludWU7XG4gICAgICBjb25zdCByID0gZFtpXSwgZyA9IGRbaSArIDFdLCBiID0gZFtpICsgMl07XG4gICAgICBjb25zdCBsdW0gPSByID49IGcgPyAociA+PSBiID8gciA6IGIpIDogZyA+PSBiID8gZyA6IGI7IC8vIHNpbmdsZS1iYW5kIOKGkiBtYXhcbiAgICAgIGRbaV0gPSByTFtsdW1dO1xuICAgICAgZFtpICsgMV0gPSBnTFtsdW1dO1xuICAgICAgZFtpICsgMl0gPSBiTFtsdW1dO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghY2hhbmdlZCkgcmV0dXJuO1xuICAgIC8vIEEgbmV3ZXIgZGlzcGxheSByb3VuZCAodGhlIG5leHQgdGljayBvZiBhIHNsaWRlciBkcmFnKSBoYXMgYWxyZWFkeSByZXN0b3JlZFxuICAgIC8vIHRoaXMgdGlsZS4gV3JpdGluZyBhIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIG1ha2VzIE9TRCdzIGNvbnZlcnNpb24gdGhyb3dcbiAgICAvLyBET01FeGNlcHRpb24sIHdoaWNoIGRlc3Ryb3lzIHRoZSBjYWNoZSByZWNvcmQgYW5kIHVubG9hZHMgdGhlIHRpbGUg4oCUIGRvXG4gICAgLy8gbm90aGluZyBhbmQgbGV0IHRoZSBuZXdlciByb3VuZCByZXBhaW50IGl0LlxuICAgIGlmICh0b2tlbiAhPT0gdGhpcy5kaXNwbGF5VG9rZW4pIHJldHVybjtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgLy8gU2VlIHJlY29sb3JUaWxlOiB0aGUgdGlsZSBjYWNoZSBjYW4gc3RpbGwgZGllIGJldHdlZW4gdGhlIGF3YWl0cyBhbmQgaGVyZS5cbiAgICB0cnkgeyBhd2FpdCBldmVudC5zZXREYXRhKGN0eCwgJ2NvbnRleHQyZCcpOyB9IGNhdGNoIHsgLyogdGlsZSBldmljdGVkICovIH1cbiAgfVxuXG4gIC8qKiBQZXItY2hhbm5lbCBoaXN0b2dyYW0gZm9yIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lLCBmcm9tIHRoZSBjdXJyZW50XG4gICAqICBzbGljZSdzIHNhbXBsZWQgdGlsZXMgKGdyYXlzY2FsZSDihpIgY2hhbm5lbCAwOyBSR0Ig4oaSIFIvRy9CKS4gTnVsbCB1bnRpbCB0aGVcbiAgICogIGFzeW5jIHNhbXBsaW5nIHJlc29sdmVzIG9yIGlmIGl0IHdhcyBza2lwcGVkLiAqL1xuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIF9iaW5zOiBudW1iZXIpOiBJSGlzdG9ncmFtIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlci5nZXQodGhpcy5jdXJyZW50WiwgY2hhbm5lbEluZGV4KTtcbiAgfVxuXG4gIC8qKiBOYXRpdmUgYml0IGRlcHRoIG9mIGEgY2hhbm5lbCBmcm9tIHRoZSB0aWxlIGRlc2NyaXB0b3IgKDggd2hlbiB1bmtub3duKS4gKi9cbiAgcHJpdmF0ZSBjaGFubmVsQml0RGVwdGgoY2hhbm5lbEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxJbmZvPy5bY2hhbm5lbEluZGV4XT8uYml0RGVwdGggPz8gODtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBoaXN0b2dyYW0gZm9yIHRoZSBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lLiBGb3IgPjgtYml0IGltYWdlcyBpdFxuICAgKiBmZXRjaGVzIHRoZSAqKm5hdGl2ZSoqIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBzZXJ2ZXIgYC9oaXN0b2dyYW1gIGVuZHBvaW50XG4gICAqICh0aGUgOC1iaXQgY2FudmFzIHRpbGVzIGNhbid0IGNhcnJ5IDE2LWJpdCB2YWx1ZXMpIGFuZCBjYWNoZXMgaXQgcGVyXG4gICAqIHNsaWNlK2NoYW5uZWw7IGZvciA4LWJpdC9SR0IgaXQgcmV0dXJucyB0aGUgZXhpc3RpbmcgY2xpZW50LXNhbXBsZWQgOC1iaXRcbiAgICogaGlzdG9ncmFtLiBSZWFkLW9ubHkg4oCUIGl0IG5ldmVyIHRvdWNoZXMgdGhlIHRpbGUvZGlzcGxheSBwaXBlbGluZS5cbiAgICovXG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICBpZiAodGhpcy5jaGFubmVsQml0RGVwdGgoY2hhbm5lbEluZGV4KSA8PSA4IHx8ICF0aGlzLmluZm9CNjQpIHtcbiAgICAgIHJldHVybiBvZih0aGlzLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2FtcGxlci5uYXRpdmUkKHRoaXMuaW5mb0I2NCwgdGhpcy5jdXJyZW50WiwgY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgdGhlIHVuZGVybHlpbmcgaW1hZ2UgZGF0YSBhcyBhIGRhdGEtcHJlc2VydmluZyBtdWx0aS1iYW5kIFRJRkYgYXRcbiAgICogbmF0aXZlIGJpdCBkZXB0aCB2aWEgYEdFVCAvZXhwb3J0L3RpZmZgICh0aGUgc2VydmVyIHJlYWRzIHRoZSByYXcgMTYtYml0XG4gICAqIHBsYW5lcyDigJQgdGhlIGNsaWVudCBuZXZlciBzZWVzIHRoZW0pLiBTZW5kcyBvbmx5IHRoZSB2aXNpYmxlIGNoYW5uZWxzOyB0aGVcbiAgICogZXhpc3RpbmcgOC1iaXQgY29tcG9zaXRlIFBORyBleHBvcnQgaXMgdW5hZmZlY3RlZC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmluZm9CNjQpIHJldHVybjtcbiAgICBjb25zdCB2aXNpYmxlID0gdGhpcy5jaGFubmVsU3RhdGVzLmZpbHRlcigoYykgPT4gYy52aXNpYmxlKS5tYXAoKGMpID0+IGMuaW5kZXgpO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGg7XG4gICAgLy8gT21pdCBgY2hhbm5lbHNgIHdoZW4gZXZlcnkgY2hhbm5lbCBpcyB2aXNpYmxlIChzZXJ2ZXIgZGVmYXVsdCA9IGFsbCkuXG4gICAgY29uc3QgY2hQYXJhbSA9XG4gICAgICB2aXNpYmxlLmxlbmd0aCAmJiB2aXNpYmxlLmxlbmd0aCA8IGFsbCA/IGAmY2hhbm5lbHM9JHt2aXNpYmxlLmpvaW4oJywnKX1gIDogJyc7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGl9ZXhwb3J0L3RpZmY/aW5mbz0ke3RoaXMuaW5mb0I2NH0mej0ke3RoaXMuY3VycmVudFp9JHtjaFBhcmFtfWA7XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLmdldCh1cmwsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcmVzcG9uc2VUeXBlOiAnYmxvYicgfSlcbiAgICAgICAgICAucGlwZSh0aW1lb3V0KDYwMDAwMCkpLCAvLyBsYXJnZSBleHBvcnRzIHN0cmVhbSBzbG93bHk7IGdlbmVyb3VzIGRlYWRsaW5lXG4gICAgICApO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSAxNi1iaXQgZXhwb3J0OiBmaWxlIHN0aWxsIGNhY2hpbmcg4oCUIHRyeSBhZ2FpbiBzaG9ydGx5LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBibG9iID0gcmVzcC5ib2R5O1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfV8xNmJpdC5vbWUudGlmYCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIDE2LWJpdCBUSUZGIGV4cG9ydCBmYWlsZWQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgdGhlIGN1cnJlbnQgc2xpY2UgYXMgYSBwdWJsaWNhdGlvbi1yZWFkeSBQTkcgY29tcG9zaXRlZCB3aXRoIHRoZVxuICAgKiBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCBvciBwZXItY2hhbm5lbCBwc2V1ZG8tXG4gICAqIGNvbG91cnMgLyBpbnZlcnQpLiBQaWNrcyB0aGUgbGFyZ2VzdCBweXJhbWlkIGxldmVsIHVuZGVyIGEgcGl4ZWwgY2FwICh0aGVcbiAgICogY29hcnNlciBvdmVydmlldyBmb3IgaHVnZSB3aG9sZS1zbGlkZXMpLCBmZXRjaGVzIHRoYXQgbGV2ZWwncyB0aWxlIGdyaWQsXG4gICAqIHN0aXRjaGVzIGl0IGludG8gb25lIGNhbnZhcywgcnVucyB0aGUgc2hhcmVkIGRpc3BsYXkgcGlwZWxpbmUsIGFuZCBzYXZlcyBpdC5cbiAgICovXG4gIGFzeW5jIGV4cG9ydENvbXBvc2l0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXNjID0gdGhpcy5kZXNjcmlwdG9yO1xuICAgIGNvbnN0IGxldmVscyA9IGRlc2M/LmxldmVscyA/PyBbXTtcbiAgICBpZiAoIWRlc2MgfHwgIXRoaXMuaW5mb0I2NCB8fCAhbGV2ZWxzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IENBUCA9IDMyXzAwMF8wMDA7IC8vIH4zMiBNUCDigJQgYm91bmRzIG1lbW9yeSBmb3Igd2hvbGUtc2xpZGUgaW1hZ2VzXG4gICAgbGV0IHJlcyA9IGxldmVscy5sZW5ndGggLSAxOyAvLyBjb2Fyc2VzdCBmYWxsYmFja1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGV2ZWxzW2ldLndpZHRoICogbGV2ZWxzW2ldLmhlaWdodCA8PSBDQVApIHsgcmVzID0gaTsgYnJlYWs7IH1cbiAgICB9XG4gICAgY29uc3QgbHcgPSBsZXZlbHNbcmVzXS53aWR0aDtcbiAgICBjb25zdCBsaCA9IGxldmVsc1tyZXNdLmhlaWdodDtcbiAgICBjb25zdCB0ID0gZGVzYy50aWxlU2l6ZTtcbiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGx3IC8gdCkpO1xuICAgIGNvbnN0IHJvd3MgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwobGggLyB0KSk7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gbHc7XG4gICAgY2FudmFzLmhlaWdodCA9IGxoO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgY29uc3QgeiA9IHRoaXMuY3VycmVudFo7XG4gICAgY29uc3Qgam9iczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93czsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGNvbHM7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGJ1aWxkVGlsZVVybCh0aGlzLmFwaSwgdGhpcy5pbmZvQjY0LCB7IHJlcywgY29sLCByb3csIHosIHRpbGVTaXplOiB0IH0pO1xuICAgICAgICBqb2JzLnB1c2goXG4gICAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJtcCA9IGF3YWl0IGZldGNoVGlsZUJpdG1hcCh0aGlzLmh0dHAsIHVybCwgMzAwMDApO1xuICAgICAgICAgICAgICBjdHguZHJhd0ltYWdlKGJtcCwgY29sICogdCwgcm93ICogdCk7XG4gICAgICAgICAgICAgIGJtcC5jbG9zZT8uKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBhIGZhaWxlZCB0aWxlIOKAlCB0aGUgZXhwb3J0ZWQgY29tcG9zaXRlIGhhcyBhIGdhcCB0aGVyZS5cbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdbdml6OmV4cG9ydF0gY29tcG9zaXRlIHRpbGUgZmV0Y2ggZmFpbGVkLCBza2lwcGluZycsIHVybCwgZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChqb2JzKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBsdywgbGgpO1xuICAgICAgaWYgKHRoaXMuZGlzcGxheS5hcHBseVRvUmdiYShpbWFnZURhdGEuZGF0YSkpIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEtlZXAgdGhlIHVuLXJlY29sb3JlZCBjb21wb3NpdGUgaWYgcmVhZGJhY2sgZmFpbHMg4oCUIGJ1dCBzYXkgd2h5LlxuICAgICAgY29uc29sZS53YXJuKCdbdml6OmV4cG9ydF0gY29tcG9zaXRlIHJlY29sb3IgcmVhZGJhY2sgZmFpbGVkIOKAlCBleHBvcnRpbmcgcmF3IHRpbGVzJywgZXJyKTtcbiAgICB9XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfV9jb21wb3NpdGUucG5nYCk7XG4gICAgfSwgJ2ltYWdlL3BuZycpO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgYW55IHBpeGVsIGluIHRoZSBSR0JBIGJ1ZmZlciBpcyBub24tdHJhbnNwYXJlbnQuICovXG4gIHByaXZhdGUgaGFzT3BhcXVlKGQ6IFVpbnQ4Q2xhbXBlZEFycmF5KTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBkLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICBpZiAoZFtpXSAhPT0gMCkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGlzcGxheU9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBWaXN1YWxpemVyU3RvcmUsIHNvIE9TRCBhbmQgUGxvdGx5IHN0YXkgaW4gbG9jay1zdGVwLiBPU0QgYXBwbGllcyB0aGVcbiAgLy8gY29sb3JtYXAgdG8gZ3JheXNjYWxlIHRpbGVzIHZpYSB0aGUgTFVUIHJlYWN0aXZlbHkgKHNlZSB0aGUgY29uc3RydWN0b3Inc1xuICAvLyBjb2xvcm1hcCBzdWJzY3JpcHRpb24pLCBub3QgaW4gc2V0Q29sb3JtYXAuXG5cbiAgLy8g4pSA4pSAIElWaXN1YWxpemVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbG9ybWFwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBudWxsO1xuICAgIC8vIERyb3AgYSBxdWV1ZWQgaW52YWxpZGF0aW9uIHNvIGl0IGNhbid0IGZpcmUgYWdhaW5zdCBhIHRvcm4tZG93biB2aWV3ZXIuXG4gICAgaWYgKHRoaXMuaW52YWxpZGF0ZUhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5pbnZhbGlkYXRlSGFuZGxlKTtcbiAgICAgIGVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuaW52YWxpZGF0ZUhhbmRsZSBhcyB1bmtub3duIGFzIFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+KTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG59XG4iXX0=