@jax-data-science/sci-image-visualizer 0.2.7 → 0.2.8

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.
@@ -801,14 +801,29 @@ export class OpenSeadragonVisualizerService extends BaseStoreVisualizer {
801
801
  // crisp nearest-neighbour blocks).
802
802
  minZoomImageRatio: 0.01,
803
803
  maxZoomPixelRatio: 20,
804
- // Switch to a finer pyramid level as soon as the current one would be
805
- // upscaled at all. OSD's default (0.5) tolerates displaying a level at up
806
- // to 2x magnification before fetching the next, which reads as a soft
807
- // image that abruptly sharpens when the threshold is crossed. At 1 the
808
- // displayed level always has at least one tile pixel per screen pixel, so
809
- // the only visible pixellation is past 1:1 - where the blocks are genuine
810
- // source pixels (paired with imageSmoothingEnabled=false).
811
- minPixelRatio: 1,
804
+ // OSD's stock value, restored. DO NOT RAISE IT: the name reads like
805
+ // "minimum sharpness" but it is the opposite. From OSD's own
806
+ // TiledImage._getLevelsInterval:
807
+ //
808
+ // highestLevel = floor( log2( currentZeroRatio / minPixelRatio ) )
809
+ //
810
+ // minPixelRatio is a floor on how small a tile pixel may shrink, and it
811
+ // DIVIDES into the ratio - so raising it lowers the chosen level, i.e.
812
+ // picks a COARSER image. OSD's own comment on the default says as much:
813
+ // "closer to 0 draws tiles meant for a higher zoom at this zoom".
814
+ //
815
+ // Measured on a flat 22304x24528 image (levels 697/1394/2788/5576/11152/
816
+ // 22304), predicted level matching actual in all nine trials:
817
+ //
818
+ // zoom 2 zoom 8 ~1:1
819
+ // 1.0 1.34x up 1.34x up 1.86x up
820
+ // 0.5 0.67x (none) 0.67x (none) 0.93x -> full res
821
+ // 0.25 0.33x 0.33x 0.93x
822
+ //
823
+ // 0.5 is what gives "never upscaled below native, full resolution at 1:1".
824
+ // 0.25 is not better - it jumps two rungs finer and fetches ~4x the tiles
825
+ // for no visible gain, and tiles are not cached by the ingress.
826
+ minPixelRatio: 0.5,
812
827
  // Wait for the view to settle before pulling new tiles (less churn).
813
828
  immediateRender: false,
814
829
  animationTime: 0.4,
@@ -2019,4 +2034,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
2019
2034
  type: Inject,
2020
2035
  args: [VIZ_CONFIG]
2021
2036
  }] }] });
2022
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVB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OzBCQTZJN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQU12QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQU1qQyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0ICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5cblxuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlQWNjZXNzUG9ydCwgVElMRV9BQ0NFU1NfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IFZpekNvbmZpZywgVklaX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFBpeGVsRGF0YSwgSW50ZW5zaXR5UHJvZmlsZSwgSUlzb3N1cmZhY2VDb250cm9scywgSUludGVuc2l0eUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9vc2QtcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgT3NkU2NhbGVCYXIgfSBmcm9tICcuL29zZC1zY2FsZS1iYXInO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXksIFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuL29zZC1jb29yZGluYXRlLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VSZWN0VG9WaWV3cG9ydCwgdmlld3BvcnRSZWN0VG9JbWFnZSB9IGZyb20gJy4vb3NkLWNvb3Jkcyc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZUJpdG1hcCB9IGZyb20gJy4vdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgU2xpY2VDYWNoZSB9IGZyb20gJy4vc2xpY2UtY2FjaGUnO1xuaW1wb3J0IHsgRGlzcGxheVBpcGVsaW5lIH0gZnJvbSAnLi9kaXNwbGF5LXBpcGVsaW5lJztcbmltcG9ydCB7IEhpc3RvZ3JhbVNhbXBsZXIgfSBmcm9tICcuL2hpc3RvZ3JhbS1zYW1wbGVyJztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UsIFpvb21Ub0JveFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci96b29tLXRvLWJveC96b29tLXRvLWJveC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IGJ1aWxkQ29sb3JtYXBMdXQsIFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5cbi8qKlxuICogUXVpZXQgT3BlblNlYWRyYWdvbidzIFwiW1ZpZXdwb3J0LipdIGlzIG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlXCIgYWR2aXNvcmllcy5cbiAqIEEgbXVsdGljaGFubmVsIGltYWdlIGlzIGNvbXBvc2l0ZWQgZnJvbSBvbmUgVGlsZWRJbWFnZSBwZXIgY2hhbm5lbCDigJQgYSBsZWdpdGltYXRlXG4gKiBtdWx0aS1pbWFnZSB3b3JsZCDigJQgYW5kIE9TRCBsb2dzIHRoYXQgYWR2aXNvcnkgKGF0IGVycm9yIGxldmVsKSBmcm9tIGl0cyBvd25cbiAqIG5hdmlnYXRvci9vdmVydmlldyByZW5kZXJpbmcgb24gZXZlcnkgYW5pbWF0aW9uIGZyYW1lLCBmbG9vZGluZyB0aGUgY29uc29sZS4gT3VyXG4gKiBvd24gaW1hZ2U8LT52aWV3cG9ydCBjb252ZXJzaW9ucyBhbHJlYWR5IHJvdXRlIHRocm91Z2ggd29ybGQgaXRlbSAwIChzZWVcbiAqIG9zZC1jb29yZHMpLCBzbyB0aGUgcmVtYWluaW5nIGFkdmlzb3JpZXMgYXJlIE9TRC1pbnRlcm5hbCBhbmQgb25seSBhZmZlY3QgdGhlXG4gKiBtaW5pbWFwJ3MgYm94IGFjY3VyYWN5IChjb3NtZXRpYykuIFRoaXMgd3JhcHMgT1NEJ3MgbG9nZ2VyIGluIGEgUHJveHkgdGhhdCBkcm9wc1xuICogb25seSB0aGF0IG9uZSBtZXNzYWdlIHN0cmluZyBhbmQgZm9yd2FyZHMgZXZlcnkgb3RoZXIgbG9nIHVudG91Y2hlZC4gSWRlbXBvdGVudC5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpOiB2b2lkIHtcbiAgY29uc3Qgb3NkOiBhbnkgPSBPU0QgYXMgYW55O1xuICBpZiAob3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCkgcmV0dXJuO1xuICBjb25zdCBiYXNlOiBhbnkgPSAob3NkLmNvbnNvbGUgJiYgdHlwZW9mIG9zZC5jb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKVxuICAgID8gb3NkLmNvbnNvbGVcbiAgICA6ICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zb2xlIDogbnVsbCk7XG4gIGlmICghYmFzZSkgcmV0dXJuO1xuICBjb25zdCBpc0Fkdmlzb3J5ID0gKGE6IHVua25vd24pID0+XG4gICAgdHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEuaW5kZXhPZignbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UnKSAhPT0gLTE7XG4gIG9zZC5jb25zb2xlID0gbmV3IFByb3h5KGJhc2UsIHtcbiAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZykge1xuICAgICAgY29uc3Qgb3JpZyA9IHRhcmdldFtwcm9wXTtcbiAgICAgIGlmICgocHJvcCA9PT0gJ2Vycm9yJyB8fCBwcm9wID09PSAnd2FybicpICYmIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHsgaWYgKGlzQWR2aXNvcnkoYXJnc1swXSkpIHJldHVybjsgb3JpZy5hcHBseSh0YXJnZXQsIGFyZ3MpOyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nID8gb3JpZy5iaW5kKHRhcmdldCkgOiBvcmlnO1xuICAgIH0sXG4gIH0pO1xuICBvc2QuX19tdWx0aUltYWdlRmlsdGVySW5zdGFsbGVkID0gdHJ1ZTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AuICovXG5pbnRlcmZhY2UgVGlsZUxldmVsIHsgcmVzOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgLyoqIFRydWUgb25seSBmb3IgZ2VudWluZSBtdWx0aS1jaGFubmVsIGNvbXBvc2l0ZXMgKGluZGV4ZWQvTFVULWJlYXJpbmdcbiAgICogIGZsdW9yZXNjZW5jZSBzdGFja3MpIHRoZSBjbGllbnQgc2hvdWxkIHNwbGl0IGludG8gcGVyLWNoYW5uZWwgbGF5ZXJzLiBUaGVcbiAgICogIHNlcnZlciBzZXRzIGl0OyBhbiBSR0IgcGhvdG8gcmVhZCBhcyBzZXBhcmF0ZWQgcGxhbmVzIGhhcyBjaGFubmVscz4xIGJ1dFxuICAgKiAgbXVsdGljaGFubmVsPWZhbHNlLCBzbyBpdCBzdGF5cyBhIHNpbmdsZSBjb21wb3NpdGUgdGlsZSBzb3VyY2UuICovXG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgdGhlIHJlbWFpbmluZ1xuICAgKiAgbGV2ZWxzIGFyZSBzeW50aGV0aWMgY29tcG9zaXRlZCBvdmVydmlld3MgKG5vIHBlci1jaGFubmVsIHRpbGVzKS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgLyoqIFBlci1jaGFubmVsIG1ldGFkYXRhIChuYW1lL2NvbG9yL2JpdERlcHRoL21pbi1tYXhBbGxvd2VkKSBmb3IgbmF0aXZlIDE2LWJpdFxuICAgKiAgd2luZG93aW5nICsgaGlzdG9ncmFtOyBudWxsIGZvciBwbGFpbiA4LWJpdC9SR0Igc291cmNlcy4gKi9cbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmc7IGJpdERlcHRoPzogbnVtYmVyOyBtaW5BbGxvd2VkPzogbnVtYmVyOyBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBgbG9hZCgpYCBoYW5kcyB0byBgcGxvdCgpYC4gKi9cbmludGVyZmFjZSBPc2RMb2FkZWQge1xuICBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGw7XG4gIGluZm9CNjQ6IHN0cmluZztcbiAgejogbnVtYmVyO1xuICAvKiogTWlycm9ycyB0aGUgbG9hZGVkIGltYWdlJ3MgZmlsZW5hbWUg4oCUIHRoZSBkaWFncmFtJ3MgcmVuZGVyIHBpcGVsaW5lXG4gICAqICBndWFyZHMgb24gYGxvYWRlZC5maWxlbmFtZSA9PT0gcGhhc2VJbmZvLmZpbGVOYW1lYCBiZWZvcmUgY2FsbGluZyBwbG90KCkuICovXG4gIGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBTaW1wbGUgKG5vbi10aWxlZCkgaW1hZ2U6IGBwbG90KClgIG9wZW5zIHtAbGluayB1cmx9IGRpcmVjdGx5IHZpYSBPU0Qnc1xuICAgKiAgc2luZ2xlLWltYWdlIHNvdXJjZSDigJQgbm8gdGlsZSBweXJhbWlkLCBubyBzZXJ2ZXIuIFNldCB3aGVuIHRoZSBpbWFnZVxuICAgKiAgY2FycmllcyBgdGlsZWQgPT09IGZhbHNlYCAoc2VlIHtAbGluayBJSW1hZ2VJbmZvLnRpbGVkfSkuICovXG4gIHNpbXBsZT86IGJvb2xlYW47XG4gIC8qKiBUaGUgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2UgVVJMIChgYmxvYjpgL2BkYXRhOmAvYGh0dHBgKSBmb3Igc2ltcGxlIG1vZGUuICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuU2VhZHJhZ29uIHZpc3VhbGl6YXRpb24gYmFja2VuZC5cbiAqXG4gKiBSZW5kZXJzIHRoZSAqaW1hZ2UqIHBsb3QgdHlwZSBhcyBhIG5hdGl2ZWx5LXRpbGVkLCB6b29tYWJsZSByYXN0ZXIsIGJhY2tlZCBieVxuICogdGhlIGppdC1zZXJ2aWNlIHRpbGUgZW5kcG9pbnRzIChgR0VUIC90aWxlcy9pbmZvYCArIGBHRVQgL3RpbGVgLCB3aGljaCByZXVzZVxuICogdGhlIEJpby1Gb3JtYXRzIFJPSSByZW5kZXJlcikuIFBsb3RseSBrZWVwcyB0aGUgc2NpZW50aWZpYy9kYXRhIHBsb3QgdHlwZXNcbiAqIChzY2FsYXIgaGVhdG1hcCwgc3VyZmFjZSwgY29udG91ciwgc2NhdHRlciwgbGluZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSDigJRcbiAqIGhlbmNlIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIG9ubHkgYEltYWdlRGlzcGxheWAuXG4gKlxuICogV2lyZWQ6IGxvYWQg4oaSIGRlc2NyaXB0b3IsIHBsb3Qg4oaSIG1vdW50IHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlLFxuICogem9vbS9wYW4g4oaSIHZpZXdwb3J0IEFQSS4gTk9UIHdpcmVkIHlldCAoZm9sbG93LXVwcyk6IHJlZ2lvbiBvdmVybGF5cyArIHRvb2xzXG4gKiAoYSBwb3NpdGlvbmVkIGNhbnZhcy9TVkcgb3ZlcmxheSBvciBBbm5vdG9yaW91cyksIHBpeGVsIHJlYWRiYWNrLCBhbmQgdGhlXG4gKiBwZXItdGlsZSBMVVQvY29udHJhc3QgcGFyYW1zLiBOb3QgcmVnaXN0ZXJlZCBpbiBESSBwcm92aWRlcnMg4oCUIGBQbG90bHlTZXJ2aWNlYFxuICogaXMgc3RpbGwgdGhlIG9ubHkgYWN0aXZlIGJhY2tlbmQ7IHRoaXMgcHJvdmVzIHRoZSBjb250cmFjdCBzdXBwb3J0cyBhIHNlY29uZFxuICogaW1wbGVtZW50YXRpb24gYWdhaW5zdCByZWFsIGVuZHBvaW50cy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICAvKiogT1NEJ3Mgc3RyZW5ndGggaXMgZGlzcGxheWluZyBhIGxhcmdlIHpvb21hYmxlIGltYWdlIOKAlCBub3RoaW5nIGVsc2UgaGVyZS4gKi9cbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXldKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdlcjogT3BlblNlYWRyYWdvbi5WaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBJUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBPc2RTY2FsZUJhciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCYXNlNjQgUmF3RmlsZUluZm8gKyBjdXJyZW50IHotc2xpY2UsIGtlcHQgc28gc2V0WkluZGV4IGNhbiByZWJ1aWxkIHRoZVxuICAgKiAgdGlsZSBzb3VyY2UgYW5kIHN3YXAgc2xpY2VzIGxpdmUgKHN0YWNrIG5hdmlnYXRpb24pLiAqL1xuICBwcml2YXRlIGluZm9CNjQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50WiA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBjdXJyZW50IGltYWdlIGlzIFwic2ltcGxlXCIgKHRpbGVkOmZhbHNlIOKAlCBzZWxmLWNvbnRhaW5lZFxuICAgKiAgcGVyLXNsaWNlIFVSTHMsIG5vIHRpbGUgc2VydmVyOyBlLmcuIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZFxuICAgKiAgY2xpZW50LXNpZGUgaW50byBhIHN0YWNrKS4gc2V0WkluZGV4IHN3YXBzIHRoZSBzaW5nbGUtaW1hZ2Ugc291cmNlIGZvclxuICAgKiAgdGhlIG5ldyBzbGljZSdzIFVSTCBpbnN0ZWFkIG9mIHVwZGF0aW5nIGEgdGlsZWQgei1wYXJhbS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVNb2RlID0gZmFsc2U7XG4gIC8qKiB1cmxzW10gZm9yIHRoZSBjdXJyZW50IHNpbXBsZS1tb2RlIGltYWdlLCBzbyBzZXRaSW5kZXggY2FuIGxvb2sgdXAgdGhlXG4gICAqICBzbGljZSBiZWluZyBzY3J1YmJlZCB0byAodmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UudXJsRm9yfSkuXG4gICAqICBVbnVzZWQgKGFuZCBsZWZ0IHN0YWxlLCBoYXJtbGVzc2x5KSBpbiB0aWxlZCBtb2RlLiAqL1xuICBwcml2YXRlIHNpbXBsZVVybHM6IHN0cmluZ1tdID0gW107XG4gIC8qKiBwcmV2aWV3IGJsb2IgVVJMIOKGkiBmdWxsLXJlcyB1cHNjYWxlZCBibG9iIFVSTCAoc2VlIHRvRnVsbFJlc1VybCksIHNvXG4gICAqICByZS12aXNpdGluZyBhIHNpbXBsZS1tb2RlIHNsaWNlIGRvZXNuJ3QgcmUtdXBzY2FsZS4gUmV2b2tlZCBvbiBmaWxlIGNoYW5nZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaW1wbGVGdWxsUmVzVXJscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsQ291bnQ+MSk6IHRoZSBzdGFjaydzXG4gICAqICBwZXItc2xpY2UgcGVyLWNoYW5uZWwgcGxhbmUgVVJMcywgdGhlIGN1cnJlbnQgc2xpY2UncyBkZWNvZGVkIHBsYW5lcywgYW5kXG4gICAqICB0aGUgbGFzdCBjb21wb3NpdGUgYmxvYiBVUkwuIENvbXBvc2l0ZWQgY2xpZW50LXNpZGUgdmlhIGRpc3BsYXkuY2hhbm5lbFJnYkx1dFxuICAgKiAgKG5vIHRpbGUgc2VydmVyKTsga2VwdCBPRkYgdGhlIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGguICovXG4gIHByaXZhdGUgc2ltcGxlTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFVybHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDaGFubmVsUGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICBwcml2YXRlIHNpbXBsZUNvbXBvc2l0ZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTa2lwIHRoZSBmdWxsLXJlcyB1cHNjYWxlIGFib3ZlIHRoaXMgbG9uZ2VzdC1zaWRlIGRpbWVuc2lvbiDigJQgYSBmb2xkZXJcbiAgICogIHN0YWNrIGlzIHBlci1maWxlIHByZXZpZXdzICh3ZWxsIHVuZGVyIHRoaXMpOyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYW5cbiAgICogIGFjY2lkZW50YWwgZW5vcm1vdXMgY2FudmFzIGFsbG9jYXRpb24uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgU0lNUExFX1VQU0NBTEVfTUFYX0RJTSA9IDgxOTI7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLy8gUmVnaW9uIHN0YXRlIChyZWdpb25zLCBzZWxlY3Rpb24sIHRoZSB1cGRhdGUgZXZlbnQpIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IHRoZSBJUmVnaW9uU3RvcmUgbWV0aG9kcyBiZWxvdyBkZWxlZ2F0ZSB0byBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLy8gSW1hZ2UgbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIGNvbG9ybWFwL3JldmVyc2Ugc28gT1NEIHJlY29sb3JzIGluXG4gICAqIGxvY2stc3RlcCB3aXRoIFBsb3RseS4gSWRlbXBvdGVudCBhbmQgc2VsZi1oZWFsaW5nOiB0aGlzIHNlcnZpY2UgaXMgYSByb290XG4gICAqIHNpbmdsZXRvbiwgYnV0IGB1bnN1YnNjcmliZSgpYCAoY2FsbGVkIG9uIFZpc3VhbGl6ZXJDb21wb25lbnQgZGVzdHJveSlcbiAgICogdGVhcnMgdGhlIHN1YnNjcmlwdGlvbiBkb3duIOKAlCBhbmQgdGhlIGNvbnN0cnVjdG9yIG5ldmVyIHJ1bnMgYWdhaW4uIFNvXG4gICAqIGBwbG90KClgIGNhbGxzIHRoaXMgdG8gcmUtZXN0YWJsaXNoIGl0IGFmdGVyIGEgY29tcG9uZW50IHRlYXJkb3duL3JlY3JlYXRlXG4gICAqIChlLmcuIHN3aXRjaGluZyBpbWFnZXMpLCBvdGhlcndpc2UgY29sb3JtYXAgY2hhbmdlcyB3b3VsZCBiZSBzaWxlbnRseVxuICAgKiBkcm9wcGVkIG9uIGV2ZXJ5IGltYWdlIGFmdGVyIHRoZSBmaXJzdCBzd2l0Y2guXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbG9ybWFwU3ViKSByZXR1cm47XG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCB0aGUgc2luZ2xlIHNvdXJjZVxuICAgIC8vIG9mIHRydXRoIGZvciBib3RoIGJhY2tlbmRzLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBlaXRoZXIgY2hhbmdlcywgc28gT1NEIHJlY29sb3JzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlICsgcGVyLWNoYW5uZWwgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkgKyBpbnZlcnQgYWxsIGxpdmUgaW5cbiAgICAvLyB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgYW55IG9mIHRoZW0gY2hhbmdlcywgc28gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgdXBkYXRlcyB0aGVcbiAgICAvLyBpbWFnZSBsaXZlIGFuZCBPU0Qgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY20sIHJldiwgY2hhbm5lbHMsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY29sb3JMdXQgPSBidWlsZENvbG9ybWFwTHV0KGNtPy5kYXRhPy52YWx1ZSwgISFyZXYpO1xuICAgICAgdGhpcy5jaGFubmVsU3RhdGVzID0gY2hhbm5lbHM7XG4gICAgICB0aGlzLmludmVydEJnID0gISFpbnZlcnQ7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbDogcmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZFxuICAgICAgLy8gcGxhbmVzIHdpdGggdGhlIG5ldyBjaGFubmVsIHN0YXRlcyArIHJlLW9wZW4gKG5vIHRpbGUtaW52YWxpZGF0ZSBwYXRoKS5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkgeyB2b2lkIHRoaXMucmVjb21wb3NpdGVBbmRPcGVuKCk7IHJldHVybjsgfVxuICAgICAgLy8gTXVsdGljaGFubmVsOiBlYWNoIGNoYW5uZWwgaXMgaXRzIG93biBUaWxlZEltYWdlIOKAlCB2aXNpYmlsaXR5IGlzIHRoZVxuICAgICAgLy8gaW1hZ2UncyBvcGFjaXR5ICh3aW5kb3cvZ2FtbWEvY29sb3VyIGFyZSBhcHBsaWVkIGJ5IHJlY29sb3JDaGFubmVsVGlsZVxuICAgICAgLy8gb24gdGhlIGludmFsaWRhdGUgYmVsb3cpLiBSZS1hcHBseWluZyB0aGUgY3VycmVudCBzbGljZSdzIHJldmVhbCBwaWNrcyB1cFxuICAgICAgLy8gdGhlIG5ldyBwZXItY2hhbm5lbCB2aXNpYmlsaXR5IChjYWNoZWQgc2xpY2VzIHN0YXkgaGlkZGVuKS5cbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuY2FjaGUucmV2ZWFsQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgfVxuICAgICAgLy8gcmVxdWVzdEludmFsaWRhdGUodHJ1ZSkgcmVzdG9yZXMgZWFjaCB0aWxlIHRvIGl0cyBvcmlnaW5hbCBkYXRhIGJlZm9yZVxuICAgICAgLy8gcmUtcnVubmluZyByZWNvbG9yVGlsZSwgc28gYSBjaGFuZ2UgYWx3YXlzIG1hcHMgYWZyZXNoIChubyBjb21wb3VuZGluZykuXG4gICAgICAvLyBSR0Igbm93IHJlY29sb3JzIHRvbyAocGVyLWNoYW5uZWwgd2luZG93L3Zpc2liaWxpdHkpLCBzbyBkb24ndCBnYXRlIG9uXG4gICAgICAvLyBncmF5c2NhbGUuIENvYWxlc2NlZDogUHJpbWVORydzIHNsaWRlciBmaXJlcyAob25DaGFuZ2UpIGNvbnRpbnVvdXNseSwgc29cbiAgICAgIC8vIGEgc2luZ2xlIGRyYWcgd291bGQgb3RoZXJ3aXNlIHF1ZXVlIGRvemVucyBvZiBvdmVybGFwcGluZyByZXN0b3JlICtcbiAgICAgIC8vIHJlLXByb2Nlc3Mgcm91bmRzIG92ZXIgZXZlcnkgY2hhbm5lbCBpbWFnZS5cbiAgICAgIHRoaXMuc2NoZWR1bGVJbnZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VlZCB0aGUgSW50ZW5zaXR5IGNoYW5uZWwgd2l0aCBhIG1lYXN1cmVkIGF1dG8td2luZG93IHdoaWxlIGl0J3Mgc3RpbGxcbiAgICogIGF0IGZ1bGwgcmFuZ2UgKG5ldmVyIGNsb2JiZXIgdGhlIHVzZXIncyBtYW51YWwgd2luZG93KTsgaWYgdGhlIHVzZXJcbiAgICogIGFscmVhZHkgd2luZG93ZWQsIGp1c3QgcmUtaW52YWxpZGF0ZSBzbyBwYWludGVkIHRpbGVzIHBpY2sgdGhlIExVVCB1cC4gKi9cbiAgcHJpdmF0ZSBzZWVkR3JheVdpbmRvdyhtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjaDAgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgaWYgKGNoMCAmJiBjaDAubWluID09PSAwICYmIGNoMC5tYXggPT09IDI1NSkge1xuICAgICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoMCwgeyBtaW4sIG1heCB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY29sb3JMdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I/LndvcmxkPy5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGF0YVJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgdGlsZS1zb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIHNlbGVjdGVkIGZpbGUuIFRoZSBgaW5mb2AgcGFyYW0gaXNcbiAgICogdGhlIGJhc2U2NCBSYXdGaWxlSW5mbyB0aGUgcmVzdCBvZiB0aGUgQVBJIHVzZXM7IHRoZSBHRVQgZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBhdXRoIGludGVyY2VwdG9yIChCZWFyZXIpLiBXZSBhbHNvIGdyYWIgYSB0b2tlbiBoZXJlIGZvciBPU0QncyBvd24gdGlsZVxuICAgKiBmZXRjaGVzIChpdHMgbG9hZGVyIGJ5cGFzc2VzIEh0dHBDbGllbnQpLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgLy8gQSBkaWZmZXJlbnQgaW1hZ2Ugd2FzIHNlbGVjdGVkIOKAlCBzdG9wIHRoZSBwcmV2aW91cyBzdGFjaydzIGJhY2tncm91bmRcbiAgICAvLyBsb2FkaW5nIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxldHRpbmcgaXQgZmluaXNoIGJlaGluZCB0aGUgbmV3IGltYWdlLlxuICAgIGlmIChmaWxlbmFtZSAmJiB0aGlzLmN1cnJlbnRGaWxlTmFtZSAmJiBmaWxlbmFtZSAhPT0gdGhpcy5jdXJyZW50RmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAgIHRoaXMucmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTtcbiAgICB9XG4gICAgdGhpcy5zaW1wbGVTdGFjay5ub3RlQWN0aXZlRmlsZShmaWxlbmFtZSk7XG4gICAgLy8gU2ltcGxlIChpbi1tZW1vcnkgLyBub24tdGlsZWQpIGltYWdlOiBza2lwIHRoZSB0aWxlIHNlcnZlciBlbnRpcmVseSDigJQgbm9cbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQsIG5vIC90aWxlcy9pbmZvIHBvbGwuIGB1cmxzW3pJbmRleF1gIGlzIGEgY29tcGxldGUgaW1hZ2VcbiAgICAvLyBPU0Qgb3BlbnMgdmlhIGl0cyBzaW5nbGUtaW1hZ2Ugc291cmNlIChzZWUgcGxvdCgpKS5cbiAgICBpZiAodGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbWFnZUluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkU2ltcGxlKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXMuZ2V0QXV0aEhlYWRlcnMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTsgLy8gZmFsbCBiYWNrIHRvIGNvb2tpZSBhdXRoIChhamF4V2l0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgICAvLyBQb2xsIC90aWxlcy9pbmZvOiB0aGUgYmFja2VuZCByZXR1cm5zIDIwMiB3aGlsZSB0aGUgc291cmNlIGZpbGUgaXMgc3RpbGxcbiAgICAvLyBiZWluZyBjYWNoZWQgKEdDUy0+UFZDKSDigJQgaXQga2lja3MgdGhlIGRvd25sb2FkIG9mZiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBlYWNoIHJlcXVlc3QgaXMgc2hvcnQgKG5vIGxvbmctaGVsZCBjb25uZWN0aW9uIHRvIHRyaXAgaW5ncmVzcy9wcm94eSBvclxuICAgIC8vIGNsaWVudCB0aW1lb3V0cyksIGFuZCAyMDAgd2l0aCB0aGUgZGVzY3JpcHRvciBvbmNlIGl0J3MgcmVhZHkuIFRoZVxuICAgIC8vIGNhY2hlLXByb2dyZXNzIG92ZXJsYXkgc2hvd3MgcHJvZ3Jlc3MgZHVyaW5nIHRoZSB3YWl0LiBXZSBnaXZlIHVwIGFmdGVyXG4gICAgLy8gdGlsZXNJbmZvVGltZW91dE1zIHNvIHRoZSByZW5kZXIgcGlwZWxpbmUgbmV2ZXIgaGFuZ3MgKHRoZSByb3V0ZXIgdGhlblxuICAgIC8vIGZhbGxzIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlKS5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy50aWxlc0luZm9UaW1lb3V0TXM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbGVzL2luZm8gbm90IHJlYWR5IGJlZm9yZSBkZWFkbGluZSDigJQgZmlsZSBzdGlsbCBjYWNoaW5nJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxUaWxlRGVzY3JpcHRvcj4odXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZSh0aW1lb3V0KDQ1MDAwKSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwICYmIHJlc3AuYm9keSkge1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHJlc3AuYm9keTtcbiAgICAgICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiByZXNwLmJvZHksIGluZm9CNjQsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiBBY2NlcHRlZCAob3IgZW1wdHkgYm9keSkg4oaSIHN0aWxsIGNhY2hpbmc7IGZhbGwgdGhyb3VnaCBhbmQgcmUtcG9sbC5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUb2xlcmF0ZSB0cmFuc2llbnQgZmFpbHVyZXMgV0hJTEUgdGhlIGZpbGUgaXMgYmVpbmcgcHJlcGFyZWQ6IGEgc2xvd1xuICAgICAgICAvLyBtZXRhZGF0YSByZWFkIG9uIGEgbXVsdGktR0IgZmlsZSAoSUZEIHdhbGspLCBhIDV4eCBtaWQtcGlwZWxpbmUsIGFcbiAgICAgICAgLy8gcHJveHkgaGljY3VwLiBBIHNpbmdsZSBiYWQgcG9sbCBtdXN0IE5PVCBkcm9wIHVzIHRvIFBsb3RseSDigJQgYSBsYXJnZVxuICAgICAgICAvLyBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhpcyBidXN5IHdpbmRvdywgc28gYmFpbGluZyBoZXJlIGlzIHdoeVxuICAgICAgICAvLyBpdCBcImFsd2F5cyBlbmRzIHVwIG9uIFBsb3RseVwiLiBLZWVwIHBvbGxpbmcgdW50aWwgcmVhZHkgb3IgZGVhZGxpbmUuXG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDE1MDApKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIGBwbG90KClgIHBheWxvYWQgZm9yIGEgc2ltcGxlICh0aWxlZDpmYWxzZSkgaW1hZ2U6IGEgc2luZ2xlLWxldmVsXG4gICAqICBkZXNjcmlwdG9yIHNpemVkIGZyb20gYHRydWVJbWFnZVNpemVgLCBwbHVzIHRoZSBkaXJlY3RseS1sb2FkYWJsZSBVUkwg4oCUXG4gICAqICByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEge0BsaW5rIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZX0gKHNoYXJlZCB3aXRoXG4gICAqICBuYXBhcmktanM7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSByYXcgYGZldGNoKClgL2A8aW1nPmApLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGUoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgeiA9IHpJbmRleCB8fCAwO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IG1ldGEgPSBpbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgLy8gU0VSVkVSTEVTUyBNVUxUSUNIQU5ORUw6IGNvbXBvc2l0ZSB0aGUgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXNcbiAgICAvLyBjbGllbnQtc2lkZSAobm8gdGlsZSBzZXJ2ZXIpLCBkcml2ZW4gYnkgdGhlIGNoYW5uZWwgcGFuZS4gS2VwdCBPRkYgdGhlXG4gICAgLy8gdGlsZWQgaXNNdWx0aUNoYW5uZWwgcGF0aCAoc2VlIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCkuXG4gICAgY29uc3QgY2hVcmxzID0gaW1hZ2VJbmZvLmNoYW5uZWxVcmxzO1xuICAgIHRoaXMuc2ltcGxlTXVsdGljaGFubmVsID0gISFjaFVybHM/Lmxlbmd0aCAmJiAobWV0YT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBsZXQgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gY2hVcmxzIGFzIHN0cmluZ1tdW107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKGNoVXJscyFbel0gPz8gY2hVcmxzIVswXSk7XG4gICAgICAgIHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgIC8vIE5COiBoaXN0b2dyYW1zIGFyZSBiaW5uZWQgaW4gcGxvdCgpLCBBRlRFUiBkZXN0cm95Vmlld2VyIGNsZWFycyB0aGVcbiAgICAgICAgLy8gc2FtcGxlciDigJQgY29tcHV0aW5nIHRoZW0gaGVyZSB3b3VsZCBiZSB3aXBlZCBieSB0aGF0IGNsZWFyLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgZmFpbGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IFtdO1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gW107XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVN0YWNrLnVybEZvcihpbWFnZUluZm8sIHopO1xuICAgICAgaWYgKHJhd1VybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybCk7XG4gICAgICAgICAgLy8gVXBzY2FsZSB0aGUgKGRvd25zY2FsZWQpIHByZXZpZXcgdG8gZnVsbCByZXNvbHV0aW9uIHNvIE9TRCdzIHdvcmxkXG4gICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2Ug4oCUIHNlZSB0b0Z1bGxSZXNVcmwuXG4gICAgICAgICAgdXJsID0gYXdhaXQgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsb2FkYWJsZSBVUkwgKGVtcHR5IHVybHNbXSBvciB0aGUgZmV0Y2ggZmFpbGVkKTogc2lnbmFsIFwiY291bGRuJ3RcbiAgICAvLyBsb2FkXCIgd2l0aCBhIG51bGwgZGVzY3JpcHRvciDigJQgc2FtZSBhcyB0aGUgdGlsZWQgcGF0aCB3aGVuIHRoZXJlJ3Mgbm9cbiAgICAvLyBzZWxlY3RlZC1maWxlIGluZm8g4oCUIHNvIHBsb3QoKSByZXR1cm5zIGZhbHNlIChpdHMgYGlmICghZClgIGd1YXJkKSBhbmRcbiAgICAvLyB0aGUgcm91dGVyIGNhbiBmYWxsIGJhY2ssIGluc3RlYWQgb2YgbW91bnRpbmcgYW4gPGltZz4gd2l0aCBhbiB1bmRlZmluZWRcbiAgICAvLyBzcmMgdGhhdCB0aHJvd3MgYXQgcnVudGltZS5cbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBoYXMgbm8gbG9hZGFibGUgVVJMOyBza2lwcGluZyBPU0QgcmVuZGVyJywgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHosIGZpbGVuYW1lIH07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aWxlU2l6ZTogMCwgICAgICAgICAgICAvLyB1bnVzZWQ6IHNpbXBsZSBtb2RlIG5ldmVyIGNhbGxzIGJ1aWxkVGlsZVNvdXJjZVxuICAgICAgejogMSwgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGZyYW1lXG4gICAgICBjaGFubmVsczogbWV0YT8ucmdiQ2hhbm5lbHMgPz8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSA/IDEgOiAzKSxcbiAgICAgIG11bHRpY2hhbm5lbDogZmFsc2UsXG4gICAgICByZWFsTGV2ZWxzOiAxLFxuICAgICAgbGV2ZWxzOiBbeyByZXM6IDAsIHdpZHRoLCBoZWlnaHQgfV0sXG4gICAgICBtcHBYOiBtZXRhPy5tcHBYID8/IDAsXG4gICAgICBtcHBZOiBtZXRhPy5tcHBZID8/IDAsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZm9CNjQ6ICcnLFxuICAgICAgeixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc2ltcGxlOiB0cnVlLFxuICAgICAgdXJsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT1NEJ3MgYHt0eXBlOidpbWFnZSd9YCBzb3VyY2Ugc2l6ZXMgaXRzIGNvb3JkaW5hdGUgd29ybGQgdG8gdGhlIGltYWdlJ3NcbiAgICogTkFUVVJBTCBwaXhlbHMuIEEgZm9sZGVyLXN0YWNrIHNsaWNlIGlzIGEgc2VydmVyIGAvcHJldmlld2Agd2hvc2UgcGl4ZWwgc2l6ZVxuICAgKiBuZWVkbid0IG1hdGNoIHRoZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ug4oCUIGl0IG1heSBiZSBkb3duc2NhbGVkIChsYXJnZVxuICAgKiBpbWFnZXMpIE9SIGxhcmdlciB0aGFuIHRoZSBkaW1lbnNpb25zIGAvbWV0YWRhdGFgIHJlcG9ydHMuIEVpdGhlciB3YXkgT1NEJ3NcbiAgICogd29ybGQgd291bGQgZGlmZmVyIGZyb20gdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIChRdVBhdGggZ2VvanNvbixcbiAgICogaW4gbGV2ZWwtMCBwaXhlbHMpOiBhIHNtYWxsZXIgcHJldmlldyByZW5kZXJzIFJPSXMgb3ZlcnNpemVkLCBhIGxhcmdlciBvbmVcbiAgICogcmVuZGVycyB0aGVtIHVuZGVyc2l6ZWQvb2Zmc2V0LiBSZXNhbXBsZSB0aGUgcHJldmlldyB0byBFWEFDVExZIHRoZVxuICAgKiBmdWxsLXJlc29sdXRpb24gZGltZW5zaW9ucyAoYmx1cnJ5IGJ1dCBwb3NpdGlvbmFsbHkgZXhhY3Qg4oCUIHNjYWxpbmcgdXAgb3JcbiAgICogZG93biBhcyBuZWVkZWQpIHNvIE9TRCdzIHdvcmxkIG1hdGNoZXMgdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlLCB3aGlsZSBzdGlsbFxuICAgKiB1c2luZyBPU0QncyByZWxpYWJsZSBzaW5nbGUtaW1hZ2UgcmVuZGVyZXIuIENhY2hlZCBwZXIgcHJldmlldyBVUkwgKHJldm9rZWRcbiAgICogb24gZmlsZSBjaGFuZ2UpOyBhIG5vLW9wIHdoZW4gdGhlIHByZXZpZXcgaXMgYWxyZWFkeSBleGFjdGx5IGZ1bGwtcmVzIChzbWFsbFxuICAgKiBpbWFnZXMsIGluLW1lbW9yeSBwaXBlbGluZSBibG9icyksIHdoZW4gdGhlIGRpbXMgYXJlIHVua25vd24sIG9yIHdoZW5cbiAgICogdGhleSdyZSBpbXBsYXVzaWJseSBsYXJnZSAoZ3VhcmRzIGFnYWluc3QgYW4gZW5vcm1vdXMgY2FudmFzKS4gKGppdC11aSM5MylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdG9GdWxsUmVzVXJsKHByZXZpZXdVcmw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSA+IHRoaXMuU0lNUExFX1VQU0NBTEVfTUFYX0RJTSkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5nZXQocHJldmlld1VybCk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHByZXZpZXdVcmw7IC8vIGNvdWxkbid0IGRlY29kZSDigJQgbGV0IE9TRCB0cnkgdGhlIFVSTCBhcy1pc1xuICAgIH1cbiAgICAvLyBBbHJlYWR5IHRoZSBleGFjdCBmdWxsLXJlcyB3b3JsZCDigJQgbm8gcmVzYW1wbGUgbmVlZGVkLiAoQSBwcmV2aWV3IHRoYXQgaXNcbiAgICAvLyBsYXJnZXIgT1Igc21hbGxlciB0aGFuIGZ1bGwtcmVzIG11c3Qgc3RpbGwgYmUgcmVzaXplZCBzbyBPU0QncyB3b3JsZCA9PVxuICAgIC8vIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZTsgb25seSBhbiBleGFjdCBtYXRjaCBpcyBza2lwcGFibGUuKVxuICAgIGlmIChpbWcubmF0dXJhbFdpZHRoID09PSB3aWR0aCAmJiBpbWcubmF0dXJhbEhlaWdodCA9PT0gaGVpZ2h0KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7IC8vIHNjYWxlIHByZXZpZXcgKHVwIG9yIGRvd24pIHRvIGZ1bGwtcmVzXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4gY2FudmFzLnRvQmxvYihyZXNvbHZlKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBmdWxsUmVzVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnNldChwcmV2aWV3VXJsLCBmdWxsUmVzVXJsKTtcbiAgICByZXR1cm4gZnVsbFJlc1VybDtcbiAgfVxuXG4gIC8qKiBTYW1wbGUgYSBTSU1QTEUtbW9kZSBzbGljZSdzIG93biBkZWNvZGVkIHBpeGVscyBpbnRvIHRoZSBoaXN0b2dyYW0g4oCUIHRoZVxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHNhbXBsZXJzIChubyB0aWxlIHNlcnZlcikuIEZpcmUtYW5kLWZvcmdldDtcbiAgICogIGEgZGVjb2RlIGZhaWx1cmUganVzdCBsZWF2ZXMgdGhlIHBhbmUgZW1wdHkgcmF0aGVyIHRoYW4gdGhyb3dpbmcuICovXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHVybCk7XG4gICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgaWYgKCF3IHx8ICFoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6LCBkYXRhLCB0aGlzLmlzR3JheXNjYWxlSW1hZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBoaXN0b2dyYW0gc2FtcGxlIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoICsgZGVjb2RlIGEgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXMgKHNpbmdsZS1iYW5kIGdyYXlzY2FsZSkgaW50b1xuICAgKiAgcGl4ZWwgYnVmZmVycywgZm9yIHRoZSBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCBjb21wb3NpdG9yLiBBdXRoLXNhZmU6IGdvZXNcbiAgICogIHRocm91Z2ggU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChibG9iOi9kYXRhOiBhcy1pczsgaHR0cCB2aWEgSHR0cENsaWVudCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJsczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChjb25zdCB1IG9mIHVybHMgPz8gW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHUpO1xuICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICBpZiAoIXcgfHwgIWgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWN0eCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGNoYW5uZWwgcGxhbmUgZGVjb2RlIGZhaWxlZCcsIGVycik7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBwbGFuZXM7XG4gIH1cblxuICAvKiogQ29tcG9zaXRlIHRoZSBjYWNoZWQgcGVyLWNoYW5uZWwgcGxhbmVzIGludG8gT05FIFJHQkEgaW1hZ2UgdXNpbmcgdGhlXG4gICAqICBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIChjb2xvdXIvd2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIOKAlCB0aGUgY2xpZW50LXNpZGUsXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgcGVyLWNoYW5uZWwgJ2xpZ2h0ZXInIGNvbXBvc2l0b3JcbiAgICogIChzYW1lIGRpc3BsYXkuY2hhbm5lbFJnYkx1dCBtYXRoIGFzIHJlY29sb3JDaGFubmVsVGlsZSwgYXBwbGllZCBwZXItcGxhbmUpLlxuICAgKiAgUmV0dXJucyBhIGJsb2I6IFVSTCBvZiB0aGUgY29tcG9zaXRlIFBORywgcmV2b2tpbmcgdGhlIHByZXZpb3VzIG9uZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwbGFuZXMgPSB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXM7XG4gICAgaWYgKCFwbGFuZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHcgPSBwbGFuZXNbMF0ud2lkdGgsIGggPSBwbGFuZXNbMF0uaGVpZ2h0O1xuICAgIGlmICghdyB8fCAhaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHcgKiBoICogNCk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBwbGFuZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzW2NdO1xuICAgICAgaWYgKHN0ICYmIHN0LnZpc2libGUgPT09IGZhbHNlKSBjb250aW51ZTsgLy8gaGlkZGVuIGNoYW5uZWwgY29udHJpYnV0ZXMgbm90aGluZ1xuICAgICAgY29uc3QgcGxhbmUgPSBwbGFuZXNbY107XG4gICAgICBpZiAocGxhbmUud2lkdGggIT09IHcgfHwgcGxhbmUuaGVpZ2h0ICE9PSBoIHx8ICFwbGFuZS5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICBjb25zdCB7IHIsIGcsIGIgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICAgIGNvbnN0IHBkID0gcGxhbmUuZGF0YTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChwZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsdW0gPSBwZFtpXTsgLy8gc2luZ2xlLWJhbmQgcGxhbmUgKFI9Rz1CKVxuICAgICAgICBvdXRbaV0gKz0gcltsdW1dOyAgICAgICAgICAvLyBVaW50OENsYW1wZWRBcnJheSBjbGFtcHMg4oaSIGFkZGl0aXZlICgnbGlnaHRlcicpXG4gICAgICAgIG91dFtpICsgMV0gKz0gZ1tsdW1dO1xuICAgICAgICBvdXRbaSArIDJdICs9IGJbbHVtXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIG91dFtpXSA9IDI1NTsgLy8gb3BhcXVlXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG91dCwgdywgaCksIDAsIDApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlcykgPT4gY2FudmFzLnRvQmxvYihyZXMsICdpbWFnZS9wbmcnKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7XG4gICAgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHJldHVybiB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybDtcbiAgfVxuXG4gIC8qKiBSZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkIHBsYW5lcyAobmV3IGNoYW5uZWwgc3RhdGVzKVxuICAgKiAgYW5kIHJlLW9wZW4g4oCUIHRoZSBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgaW52YWxpZGF0ZS1vbi1jaGFubmVsLWNoYW5nZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbXBvc2l0ZUFuZE9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICBpZiAoIXVybCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0cnkgeyB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTsgfSBjYXRjaCB7IC8qIHZpZXdlciBnb25lICovIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGEgVVJMIGludG8gYW4gSFRNTEltYWdlRWxlbWVudCAocmVzb2x2ZXMgb25jZSBkZWNvZGVkKS4gVXNlc1xuICAgKiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCByYXRoZXIgdGhhbiBgbmV3IEltYWdlKClgIGJlY2F1c2UgdGhpcyBmaWxlJ3NcbiAgICogIGBJbWFnZWAgaW1wb3J0IGlzIGltYWdlLWpzJ3MgZGVjb2Rlciwgbm90IHRoZSBET00gZWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VFbCh1cmw6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG4gICAgICBpbWcub25lcnJvciA9IChlKSA9PiByZWplY3QoZSk7XG4gICAgICBpbWcuc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXZva2VTaW1wbGVGdWxsUmVzVXJscygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy52YWx1ZXMoKSkgVVJMLnJldm9rZU9iamVjdFVSTCh1KTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpOyB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IG51bGw7IH1cbiAgfVxuXG4gIC8qKiBNb3VudCB0aGUgdmlld2VyIHdpdGggYSBjdXN0b20gdGlsZSBzb3VyY2UgcG9pbnRpbmcgYXQgYEdFVCAvdGlsZWAuICovXG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiBhbnksXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIF9zY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBfcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBpbWFnZUxvYWRlZCBhcyBPc2RMb2FkZWQ7XG4gICAgY29uc3QgZCA9IGxvYWRlZD8uZGVzY3JpcHRvcjtcbiAgICBpZiAoIWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIC8vIFJlLWVzdGFibGlzaCB0aGUgY29sb3JtYXAgc3Vic2NyaXB0aW9uIGlmIGEgcHJpb3IgY29tcG9uZW50IHRlYXJkb3duXG4gICAgLy8gKHVuc3Vic2NyaWJlKCkpIHRvcmUgaXQgZG93biDigJQgdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdCBzaW5nbGV0b24sIHNvIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yIHdvbid0IHJ1biBhZ2FpbiB0byByZWNyZWF0ZSBpdC5cbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gICAgLy8gT1NEIHRpbGVzIG5hdGl2ZWx5LCBzbyB0aGUgaW4tcGxhY2UgKGxhcmdlKSBwYXNzIGlzIG5vcm1hbGx5IGEgbm8tb3BcbiAgICAvLyBvbmNlIG1vdW50ZWQg4oCUIHRoZSB0aWxlIHB5cmFtaWQgSVMgdGhlIGZ1bGwgcmVzb2x1dGlvbiByZWdhcmRsZXNzIG9mXG4gICAgLy8gd2hpY2ggSW1hZ2VJbmZvIHRpZXIgcmVxdWVzdGVkIGl0LiBTaW1wbGUgbW9kZSBoYXMgbm8gcHlyYW1pZCB0byBmYWxsXG4gICAgLy8gYmFjayBvbjogaXQgZGlzcGxheXMgbGl0ZXJhbGx5IHdoYXRldmVyIFVSTCB3YXMgbGFzdCBvcGVuZWQsIHNvXG4gICAgLy8gd2l0aG91dCB0aGlzIHN3YXAgdGhlIHNtYWxsIHRpZXIncyAxMjhweCBwbGFjZWhvbGRlciB3b3VsZCBzdGF5IG9uXG4gICAgLy8gc2NyZWVuIGZvcmV2ZXIgKHBpeGVsYXRlZCwgbmV2ZXIgXCJzaGFycGVuaW5nXCIgbGlrZSB0aGUgdGlsZWQgcGF0aCkuXG4gICAgaWYgKGluUGxhY2UgJiYgdGhpcy52aWV3ZXIpIHtcbiAgICAgIGlmIChsb2FkZWQuc2ltcGxlICYmIGxvYWRlZC51cmwpIHtcbiAgICAgICAgLy8gQWxzbyByZWZyZXNoIHNpbXBsZVVybHMgdG8gVEhJUyBwaGFzZSdzIChsYXJnZS10aWVyKSB1cmxzW10g4oCUIGl0IHdhc1xuICAgICAgICAvLyBzZXQgZnJvbSB0aGUgc21hbGwgdGllcidzIDEyOHB4IHVybHMgb24gdGhlIGluaXRpYWwgbW91bnQgYmVsb3csXG4gICAgICAgIC8vIHdoaWNoIG5ldmVyIHJ1bnMgYWdhaW4gZm9yIHRoZSBpbi1wbGFjZSBwYXNzLiBXaXRob3V0IHRoaXMsXG4gICAgICAgIC8vIHNldFpJbmRleCdzIGxhdGVyIHNsaWRlciBzY3J1YnMgd291bGQga2VlcCByZWFkaW5nIHRoZSBzbWFsbFxuICAgICAgICAvLyB0aWVyJ3MgbG93LXJlcyBVUkxzIGZvcmV2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBpbml0aWFsIHNsaWNlIHdhc1xuICAgICAgICAvLyBjb3JyZWN0bHkgc3dhcHBlZCB0byBmdWxsIHJlc29sdXRpb24gaGVyZS5cbiAgICAgICAgdGhpcy5zaW1wbGVVcmxzID0gaW1hZ2VJbmZvPy51cmxzID8/IHRoaXMuc2ltcGxlVXJscztcbiAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIHRoaXMuY3VycmVudEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0b3IgPSBkO1xuICAgIHRoaXMuaW5mb0I2NCA9IGxvYWRlZC5pbmZvQjY0O1xuICAgIHRoaXMuY3VycmVudFogPSBsb2FkZWQuejtcbiAgICB0aGlzLnNpbXBsZU1vZGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgdGhpcy5zaW1wbGVVcmxzID0gbG9hZGVkLnNpbXBsZSA/IChpbWFnZUluZm8/LnVybHMgPz8gW10pIDogW107XG4gICAgLy8gVGhlIGRlc2NyaXB0b3IncyBwaHlzaWNhbCBwaXhlbCBzaXplIChzZXJ2ZXIgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBwdXNoIGl0IGludG8gdGhlIHNoYXJlZCBtZXRhIHNvIHRoZSBSZWdpb24gRWRpdG9yIHJlcG9ydHNcbiAgICAvLyBhcmVhcyBpbiDCtW3Csi9tbcKyLCBtYXRjaGluZyB0aGUgc2NhbGUgYmFyIGJ1aWx0IGZyb20gYGQubXBwWGAgYmVsb3cuXG4gICAgdGhpcy5zdG9yZS5zZXRQaHlzaWNhbFBpeGVsU2l6ZShkLm1wcFgsIGQubXBwWSk7XG4gICAgLy8gVXNlIHRoZSBTQU1FIGdyYXlzY2FsZSBmbGFnIHRoZSBjb2xvcm1hcCBkcm9wZG93biAvIFBsb3RseSB1c2VcbiAgICAvLyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlIOKGkCByZ2JDaGFubmVscyA9PT0gMSkuIFRoZSBkZXNjcmlwdG9yJ3MgYGNoYW5uZWxzYFxuICAgIC8vIChjaGFubmVsQ291bnQpIGRpdmVyZ2VzIGZyb20gcmdiQ2hhbm5lbHMgZm9yIHN0YWNrcywgd2hpY2ggbGVmdCBncmF5c2NhbGVcbiAgICAvLyBzdGFja3MgdW4tcmVjb2xvcmVkIGV2ZW4gdGhvdWdoIHRoZSBjb2xvcm1hcCBzZWxlY3RvciB3YXMgc2hvd24uXG4gICAgdGhpcy5pc0dyYXlzY2FsZUltYWdlID0gISFpbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgIC8vIFNpbXBsZSAobm9uLXRpbGVkLCBpbi1tZW1vcnkpIGltYWdlOiBubyBweXJhbWlkLCBubyBwZXItY2hhbm5lbCB0aWxlcywgYW5kXG4gICAgLy8gbm8gc2VydmVyLXNpZGUgaW50ZW5zaXR5IHNhbXBsaW5nIOKAlCBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXNcbiAgICAvLyB1cmxzW3pdIGRpcmVjdGx5LiBTa2lwIHRoZSB3aG9sZSB0aWxlZC1zZXR1cCBwYXRoIGJlbG93LlxuICAgIGNvbnN0IHNpbXBsZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICBpZiAoc2ltcGxlKSB7XG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSAxO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2VydmVybGVzcyBoaXN0b2dyYW0g4oCUIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgKGl0cyBsYXN0IGFjdCBpcyBzYW1wbGVyLmNsZWFyKCkpLlxuICAgICAgLy8gTXVsdGljaGFubmVsIGJpbnMgZWFjaCBjYWNoZWQgY2hhbm5lbCBwbGFuZTsgc2luZ2xlLWJhbmQgLyBSR0IgYmlucyB0aGVcbiAgICAgIC8vIGRlY29kZWQgZnJhbWUncyBvd24gcGl4ZWxzLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyhsb2FkZWQueiwgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgdGhpcy5zYW1wbGVTaW1wbGVIaXN0b2dyYW0obG9hZGVkLnVybCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChpbmRleGVkL0xVVC1iZWFyaW5nIHN0YWNrcykgY29tcG9zaXRlIGNsaWVudC1zaWRlXG4gICAgICAvLyBmcm9tIHBlci1jaGFubmVsIHRpbGVzLiBUcnVzdCB0aGUgc2VydmVyJ3MgZXhwbGljaXQgYG11bHRpY2hhbm5lbGAgZmxhZyDigJQgdGhlXG4gICAgICAvLyBvbGQgYGNoYW5uZWxzPjEgJiYgZ3JheXNjYWxlYCBoZXVyaXN0aWMgYWxzbyBtYXRjaGVkIFJHQiBwaG90b3MgQmlvLUZvcm1hdHNcbiAgICAgIC8vIHJlYWRzIGFzIHNlcGFyYXRlZCBwbGFuZXMgKGNoYW5uZWxzPjEsIHJnYkNoYW5uZWxzPT0xKSwgc3BsaXR0aW5nIHRoZW0gaW50byBOXG4gICAgICAvLyBwZXItY2hhbm5lbCBUaWxlZEltYWdlcyB0aGF0IGZsb29kZWQgdGhlIHRpbGUgZW5kcG9pbnQgYW5kIGh1bmcgb24gbG9hZC5cbiAgICAgIHRoaXMucmVhbExldmVscyA9IGQucmVhbExldmVscyA/PyBkLmxldmVscy5sZW5ndGg7XG4gICAgICAvLyBUaWxlcyB0byBjb3ZlciB0aGUgd2hvbGUgaW1hZ2UgYXQgdGhlIGNvYXJzZXN0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWwgKHRoZVxuICAgICAgLy8gc21hbGxlc3QgbGV2ZWwgdGhhdCBoYXMgcmVhbCwgcGVyLWNoYW5uZWwtZmV0Y2hhYmxlIHRpbGVzIOKAlCBzeW50aGV0aWMgb3ZlcnZpZXdcbiAgICAgIC8vIGxldmVscyBhcmUgc2VydmVyLWNvbXBvc2l0ZWQgb25seSkuIEEgcHlyYW1pZGFsIGltYWdlJ3MgY29hcnNlc3QgcmVhbCBsZXZlbCBpc1xuICAgICAgLy8gdGlueSAoZmV3IHRpbGVzKTsgYSBmbGF0L25vLXB5cmFtaWQgaW1hZ2UncyBpcyB0aGUgZnVsbC1yZXMgZ3JpZCAobWFueSB0aWxlcykuXG4gICAgICBjb25zdCBjb2Fyc2UgPSBkLmxldmVsc1t0aGlzLnJlYWxMZXZlbHMgLSAxXSA/PyBkLmxldmVsc1tkLmxldmVscy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGNvYXJzZVcgPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLndpZHRoIC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlSCA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2UuaGVpZ2h0IC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlVGlsZXMgPSBjb2Fyc2VXICogY29hcnNlSDtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSAhIWQubXVsdGljaGFubmVsO1xuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgLy8gUGVyLWNoYW5uZWwgcmVuZGVyaW5nIGNhbiBvbmx5IHVzZSB0aGUgUkVBTCBsZXZlbHMsIHNvIE9TRCByZXF1ZXN0cyB0aGVcbiAgICAgICAgLy8gY29hcnNlc3QgcmVhbCBsZXZlbCdzIHdob2xlIHRpbGUgZ3JpZCDDlyBOIGNoYW5uZWxzIGF0IGZpdC4gV2hlbiB0aGF0J3MgbGFyZ2VcbiAgICAgICAgLy8gKGEgd2hvbGUtc2xpZGUpLCBpdCdzIHRvbyBtYW55IChvZnRlbiBzbG93LCBweXJhbWlkLWxlc3MpIGZ1bGwtcmVzIHJlYWRzIOKAlFxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZSBzZXJ2ZXItY29tcG9zaXRlZCBzb3VyY2UgKHdoaWNoIGtlZXBzIHRoZSBmYXN0XG4gICAgICAgIC8vIHN5bnRoZXRpYyBvdmVydmlld3MpLiBBIHNtYWxsIHNpbmdsZS1GT1Ygei1zdGFjayBzdGF5cyBwZXItY2hhbm5lbC4gU2l6ZSBpblxuICAgICAgICAvLyBCWVRFUyBpc24ndCB0aGUgc2lnbmFsIOKAlCB0aWxlIGNvdW50IGlzLlxuICAgICAgICBjb25zdCBmaXRUaWxlcyA9IGNvYXJzZVRpbGVzICogTWF0aC5tYXgoMSwgZC5jaGFubmVscyA/PyAxKTtcbiAgICAgICAgaWYgKGZpdFRpbGVzID4gdGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFUykge1xuICAgICAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW09TRF0gbXVsdGljaGFubmVsIGNvbXBvc2l0ZSB0b28gbGFyZ2UgZm9yIHBlci1jaGFubmVsIHJlbmRlcmluZzogJyArXG4gICAgICAgICAgICBgJHtjb2Fyc2VXfXgke2NvYXJzZUh9IHRpbGVzIHggJHtkLmNoYW5uZWxzfSBjaGFubmVscyA9ICR7Zml0VGlsZXN9IGF0IHRoZSBjb2Fyc2VzdCBgICtcbiAgICAgICAgICAgIGByZWFsIGxldmVsICg+ICR7dGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFU30pOyByZW5kZXJpbmcgc2VydmVyLWNvbXBvc2l0ZWQgZm9yIHNwZWVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIC8vIEF1dG8tcmFuZ2UgZ3JheXNjYWxlIHRpbGVzIHRvIHRoZSBpbWFnZSdzIGFjdHVhbCBpbnRlbnNpdHkgc3BhbiAobGlrZSB0aGVcbiAgICAgIC8vIGhlYXRtYXApLCBzYW1wbGluZyB0aGUgY29hcnNlc3QgdGlsZSBsZXZlbCBzbyB0aGUgd2luZG93IG1hdGNoZXMgdGhlIHJhd1xuICAgICAgLy8gdGlsZSB2YWx1ZXMuIEZpcmUtYW5kLWZvcmdldDogaXQgcmUtaW52YWxpZGF0ZXMgb25jZSB0aGUgd2luZG93IGlzIGtub3duO1xuICAgICAgLy8gdGlsZXMgcGFpbnQgdW53aW5kb3dlZCB1bnRpbCB0aGVuLiAoTXVsdGljaGFubmVsIHdpbmRvd3MgYXJlIHBlci1jaGFubmVsLFxuICAgICAgLy8gZGVmYXVsdGluZyB0byBmdWxsIHJhbmdlOyB0aGUgdXNlciBhdXRvL2VkaXRzIGVhY2ggY2hhbm5lbC4pXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3coZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2l6ZSB0aGUgc2xpY2UgY2FjaGUgZm9yIHRoaXMgaW1hZ2U6IExSVSBjYXAgdG8gaG9sZCB0aGUgd2hvbGUgc3RhY2tcbiAgICAgIC8vIChjYXBwZWQpIGFuZCBza2lwIGJhY2tncm91bmQgcHJlbG9hZGluZyBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBwcmVsb2FkXG4gICAgICAvLyAod291bGQgZmxvb2QgZnVsbC1yZXMgcmVhZHMpLiBOb3JtYWwgc3RhY2tzIGtlZXAgdGhlIGZsaWNrZXItZnJlZSBwcmUtY2FjaGUuXG4gICAgICB0aGlzLmNhY2hlLmNvbmZpZ3VyZShkLnogPz8gMSwgY29hcnNlVGlsZXMpO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBtb2RlOiBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXMgdGhlIFVSTCAoYmxvYjovZGF0YTovaHR0cClcbiAgICAvLyBkaXJlY3RseSDigJQgbm8gcHlyYW1pZCwgbm8gc2VydmVyLiBUaWxlZCBtb2RlOiB0aGUgY3VzdG9tIHNlcnZlci1iYWNrZWQgdGlsZVxuICAgIC8vIHNvdXJjZSAobXVsdGljaGFubmVsIG9wZW5zIG9uIGNoYW5uZWwgMDsgdGhlIG9wZW4gaGFuZGxlciB0aGVuIHN3YXBzIGluIHRoaXNcbiAgICAvLyBzbGljZSdzIHBlci1jaGFubmVsIGdyb3VwIGFuZCB0aGUgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0KS5cbiAgICBjb25zdCB0aWxlU291cmNlID0gc2ltcGxlXG4gICAgICA/IHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH1cbiAgICAgIDogdGhpcy5idWlsZFRpbGVTb3VyY2UoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56LCB0aGlzLmlzTXVsdGlDaGFubmVsID8gMCA6IHVuZGVmaW5lZCk7XG4gICAgc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpO1xuICAgIHRoaXMudmlld2VyID0gKE9TRCBhcyBhbnkpKHtcbiAgICAgIGlkOiBwbG90RGl2LFxuICAgICAgLy8gU2ltcGxlLW1vZGUgei1zY3J1YiBjYWxscyB2aWV3ZXIub3BlbigpIGFnYWluIHBlciBzbGljZSAoc2VlXG4gICAgICAvLyBzZXRaSW5kZXgpIOKAlCB3aXRob3V0IHRoaXMgaXQgcmVzZXRzIHRvIHRoZSBob21lIHpvb20vcGFuIG9uIGV2ZXJ5XG4gICAgICAvLyBzbGljZSBjaGFuZ2UuIFRpbGVkIG1vZGUgbmV2ZXIgcmUtb3BlbnMgKGl0IHRvZ2dsZXMgcHJlLWFkZGVkXG4gICAgICAvLyBUaWxlZEltYWdlcycgb3BhY2l0eSBpbnN0ZWFkKSwgc28gdGhpcyBpcyBhIG5vLW9wIHRoZXJlLlxuICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgIC8vIFVzZSB0aGUgMkQgY2FudmFzIGRyYXdlciwgbm90IFdlYkdMOiBjcmVhdGluZy9kZXN0cm95aW5nIGEgdmlld2VyIG9uXG4gICAgICAvLyBlYWNoIGVuZ2luZSB0b2dnbGUgLyBpbWFnZSBsb2FkIGNodXJucyBXZWJHTCBjb250ZXh0cyAoYnJvd3NlcnMgY2FwXG4gICAgICAvLyBob3cgbWFueSBleGlzdCBhdCBvbmNlKSwgd2hpY2ggc3VyZmFjZXMgYXMgXCJXZWJHTCBjb250ZXh0IHdhcyBsb3N0XCJcbiAgICAgIC8vIGFuZCBibGFuayB0aWxlcy4gVGhlIGNhbnZhcyBkcmF3ZXIgaGFzIG5vIHN1Y2ggbGltaXQuXG4gICAgICBkcmF3ZXI6ICdjYW52YXMnLFxuICAgICAgc2hvd05hdmlnYXRpb25Db250cm9sOiBmYWxzZSwgLy8gYXZvaWRzIG5lZWRpbmcgdGhlIGljb24taW1hZ2UgYXNzZXRzXG4gICAgICAvLyBPdmVydmlldyB0aHVtYm5haWwgd2l0aCB0aGUgY3VycmVudC12aWV3cG9ydCByZWN0YW5nbGUsIGJvdHRvbS1yaWdodC5cbiAgICAgIHNob3dOYXZpZ2F0b3I6IHRoaXMubmF2aWdhdG9yVmlzaWJsZSxcbiAgICAgIC8vIE5lYXJlc3QtbmVpZ2hib3VyIHdoZW4gb2ZmIOKGkiBjcmlzcCBwaXhlbHMgb24gem9vbS1pbiAocGl4ZWwgaW5zcGVjdGlvbikuXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IHRoaXMuc21vb3RoaW5nRW5hYmxlZCxcbiAgICAgIG5hdmlnYXRvclBvc2l0aW9uOiAnQk9UVE9NX1JJR0hUJyxcbiAgICAgIG5hdmlnYXRvclNpemVSYXRpbzogMC4xNixcbiAgICAgIG5hdmlnYXRvckF1dG9GYWRlOiBmYWxzZSxcbiAgICAgIG5hdmlnYXRvckJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLDAuNSknLFxuICAgICAgbG9hZFRpbGVzV2l0aEFqYXg6IHRydWUsXG4gICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiB0cnVlLCAvLyBjb29raWUgYXV0aCAob2F1dGgyLXByb3h5KVxuICAgICAgYWpheEhlYWRlcnM6IHRoaXMuYXV0aEhlYWRlcnMsIC8vIGJlYXJlciBhdXRoIChBdXRoMCksIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjcm9zc09yaWdpblBvbGljeTogJ0Fub255bW91cycsXG4gICAgICAvLyBHZW50bGVyIHpvb206IHRoZSBkZWZhdWx0ICgxLjIpIGZlZWxzIGZhc3QgYW5kIGJpZyBqdW1wcyBjcm9zcyBzZXZlcmFsXG4gICAgICAvLyBweXJhbWlkIGxldmVscyBhdCBvbmNlLCBmaXJpbmcgYSBidXJzdCBvZiB0aWxlIHJlcXVlc3RzLlxuICAgICAgem9vbVBlclNjcm9sbDogMS4xLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIFN3aXRjaCB0byBhIGZpbmVyIHB5cmFtaWQgbGV2ZWwgYXMgc29vbiBhcyB0aGUgY3VycmVudCBvbmUgd291bGQgYmVcbiAgICAgIC8vIHVwc2NhbGVkIGF0IGFsbC4gT1NEJ3MgZGVmYXVsdCAoMC41KSB0b2xlcmF0ZXMgZGlzcGxheWluZyBhIGxldmVsIGF0IHVwXG4gICAgICAvLyB0byAyeCBtYWduaWZpY2F0aW9uIGJlZm9yZSBmZXRjaGluZyB0aGUgbmV4dCwgd2hpY2ggcmVhZHMgYXMgYSBzb2Z0XG4gICAgICAvLyBpbWFnZSB0aGF0IGFicnVwdGx5IHNoYXJwZW5zIHdoZW4gdGhlIHRocmVzaG9sZCBpcyBjcm9zc2VkLiBBdCAxIHRoZVxuICAgICAgLy8gZGlzcGxheWVkIGxldmVsIGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lIHRpbGUgcGl4ZWwgcGVyIHNjcmVlbiBwaXhlbCwgc29cbiAgICAgIC8vIHRoZSBvbmx5IHZpc2libGUgcGl4ZWxsYXRpb24gaXMgcGFzdCAxOjEgLSB3aGVyZSB0aGUgYmxvY2tzIGFyZSBnZW51aW5lXG4gICAgICAvLyBzb3VyY2UgcGl4ZWxzIChwYWlyZWQgd2l0aCBpbWFnZVNtb290aGluZ0VuYWJsZWQ9ZmFsc2UpLlxuICAgICAgbWluUGl4ZWxSYXRpbzogMSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBDaHJvbWUgY29tcG9zaXRvciBidWc6IGFmdGVyIGFuIE9TRCB6b29tIHRoZSBkb2NrZWQgdG9vbGJhciAoYSBzaWJsaW5nIG9mXG4gICAgICAgIC8vICNwbG90IGluIHRoZSA8dmlzdWFsaXplcj4gaG9zdCkgaXMgbGVmdCBsYWlkLW91dC1idXQtdW5wYWludGVkIGFuZFxuICAgICAgICAvLyB2YW5pc2hlcyDigJQgY29uZmlybWVkIHZpYSBEZXZUb29scyAoRE9NIGludGFjdCwgcmVnaW9uIHNpbXBseSBub3QgcGFpbnRlZCkuXG4gICAgICAgIC8vIENTUyAoei1pbmRleCAvIGlzb2xhdGlvbiAvIGNvbnRhaW4pIGFuZCBET00tcmVwYXJlbnRpbmcgZG9uJ3QgZml4IGl0OyBhXG4gICAgICAgIC8vIHJlcGFpbnQgcmVsaWFibHkgZG9lcy4gTnVkZ2UgaXQgZWFjaCBhbmltYXRpb24gZnJhbWUgKHNvIGl0IG5ldmVyIHZpc2libHlcbiAgICAgICAgLy8gZHJvcHMpIGFuZCBvbiBzZXR0bGUuIFRoZSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIHdpdGggbm9cbiAgICAgICAgLy8gdmlzaWJsZSBnb25lLWZyYW1lIGFuZCBubyBsYXlvdXQgc2hpZnQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24nLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5udWRnZVRvb2xiYXJSZXBhaW50KCkpO1xuICAgICAgICBpZiAoIXNpbXBsZSkgdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgIC8vIEZvcmNlIGZpdC10by12aWV3IGFzIHRoZSBzcGxpdC9mbGV4IGxheW91dCBzZXR0bGVzLiBBIHRhbGxcbiAgICAgICAgLy8gbm9uLXB5cmFtaWRhbCBpbWFnZSBjYW4gb3RoZXJ3aXNlIG9wZW4gem9vbWVkLWluIChpbWFnZSB3aWR0aCBmaWxsaW5nXG4gICAgICAgIC8vIHRoZSB2aWV3ZXIpLCBtYWtpbmcgT1NEIGRlbWFuZCBzbG93IGZ1bGwtcmVzIHJlcz0wIHRpbGVzIGZvciB0aGVcbiAgICAgICAgLy8gY2VudHJlIGluc3RlYWQgb2YgdGhlIGZhc3QgY29hcnNlIG92ZXJ2aWV3IOKGkiB3aGl0ZSBjYW52YXMuIGdvSG9tZVxuICAgICAgICAvLyBmaXRzIHRoZSB3aG9sZSBpbWFnZSBzbyBPU0Qgc2VsZWN0cyB0aGUgY29hcnNlIHN5bnRoZXRpYyBsZXZlbC4gUmV0cnlcbiAgICAgICAgLy8gYWNyb3NzIGEgZmV3IGZyYW1lcyBiZWNhdXNlIHRoZSBjb250YWluZXIgbWF5IG5vdCBoYXZlIGl0cyBmaW5hbCBzaXplXG4gICAgICAgIC8vIG9uIHRoZSBmaXJzdCBmcmFtZSBhZnRlciAnb3BlbicuXG4gICAgICAgIGNvbnN0IHJlZml0ID0gKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKHRydWUpO1xuICAgICAgICAgICAgLy8gVGhlIG5hdmlnYXRvciB3YXMgc2l6ZWQgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgQkVGT1JFIHRoZVxuICAgICAgICAgICAgLy8gbGF5b3V0IHNldHRsZWQg4oCUIHNvIGl0cyBlbGVtZW50IGNhbiBjYXJyeSBhIHN0YWxlIChldmVuXG4gICAgICAgICAgICAvLyB3cm9uZy1hc3BlY3QpIHNpemUgdGhhdCBmbG9hdHMgdGhlIHZpc2libGUgbWluaW1hcCBhYm92ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcm5lci4gUmUtc2l6ZSBpdCBmcm9tIHRoZSBzZXR0bGVkIGNvbnRhaW5lci5cbiAgICAgICAgICAgIHRoaXMucmVzaXplTmF2aWdhdG9yKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiB0b3JuIGRvd24gKi9cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZpdCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDE1MCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDQwMCk7XG4gICAgICAgIC8vIFRoZSB0aW1lZCByZXRyaWVzIGFib3ZlIG1pc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBTVElMTFxuICAgICAgICAvLyB6ZXJvLXNpemUgYXQgNDAwbXMg4oCUIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgcmVuZGVyIHN0YXJ0cyB3aGlsZSB0aGVcbiAgICAgICAgLy8gZmlsZSB2aWV3ZXIgaXMgbWlkLXN3aXRjaCBmcm9tIHRoZSBmb2xkZXIgdmlldyB0byB0aGUgZGlhZ3JhbSAoZS5nLlxuICAgICAgICAvLyBcIkxvYWQgYXMgU3RhY2tcIiBmcm9tIGEgZm9sZGVyLCB3aXRoIG5vIGltYWdlIG9wZW4gZmlyc3QpLiBCZWNhdXNlXG4gICAgICAgIC8vIHByZXNlcnZlVmlld3BvcnQgc3VwcHJlc3NlcyBPU0QncyBvd24gb3Blbi10aW1lIGZpdCwgdGhlIGltYWdlIHdvdWxkXG4gICAgICAgIC8vIHRoZW4gYmUgbGVmdCB1bi1maXR0ZWQgYXQgdGhlIHRvcC1sZWZ0IChcImEgdGlsZVwiKS4gQSBvbmUtc2hvdFxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBmaXRzIHRoZSBpbnN0YW50IHRoZSBjb250YWluZXIgZmlyc3QgaGFzIGEgcmVhbCBzaXplLFxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHJlbmRlciBiZWdhbiAoaml0LXVpIzEwNikuXG4gICAgICAgIHRoaXMuZml0V2hlbkNvbnRhaW5lclNpemVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpLCByZWZpdCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIG5hdmlnYXRvciBzaXplZCB0byB0aGUgY29udGFpbmVyIGFzIHRoZSBwYW5lbCByZXNpemVzLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVOYXZpZ2F0b3IoKSk7XG4gICAgICAgIGRvbmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gb3Blbi1mYWlsZWQnLCBlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghc2V0dGxlZCkgY29uc29sZS53YXJuKCdbT1NEXSB2aWV3ZXIgb3BlbiB0aW1lZCBvdXQnKTtcbiAgICAgICAgZG9uZShmYWxzZSk7XG4gICAgICB9LCA4MDAwKTtcbiAgICAgIHRoaXMudmlld2VyIS5vcGVuKHRpbGVTb3VyY2UgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXQtdG8taG9tZSBvbmNlIGBlbGAgZmlyc3QgaGFzIGEgbm9uLXplcm8gc2l6ZS4gSWYgaXQncyBhbHJlYWR5IHNpemVkIHdlXG4gICAqIHJlbHkgb24gdGhlIHRpbWVkIHJlZml0cyB0aGUgY2FsbGVyIHNjaGVkdWxlZDsgb3RoZXJ3aXNlIGEgb25lLXNob3RcbiAgICogUmVzaXplT2JzZXJ2ZXIgcnVucyBgcmVmaXRgIHRoZSBtb21lbnQgdGhlIGNvbnRhaW5lciBpcyBsYWlkIG91dCAodGhlblxuICAgKiBkaXNjb25uZWN0cyksIHNvIHRoZSBpbml0aWFsIGZpdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgcmVuZGVyJ3Mgc3RhcnQgdGltZVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZGlhZ3JhbSBjb250YWluZXIncyBsYXlvdXQuIE5vLW9wIHdpdGhvdXQgYSBjb250YWluZXIgb3JcbiAgICogUmVzaXplT2JzZXJ2ZXIgKHRoZSB0aW1lZCByZWZpdHMgcmVtYWluIHRoZSBmYWxsYmFjaykuIE9uZS1zaG90ICsgb25seVxuICAgKiBhdHRhY2hlZCBvbiBhIGZyZXNoIG1vdW50LCBzbyBzbGljZS1zY3J1YiByZS1vcGVucyBrZWVwIHRoZSB1c2VyJ3Mgem9vbS5cbiAgICovXG4gIHByaXZhdGUgZml0V2hlbkNvbnRhaW5lclNpemVkKGVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJlZml0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKCFlbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSByZXR1cm47IC8vIGFscmVhZHkgc2l6ZWQg4oCUIHRpbWVkIHJlZml0cyBzdWZmaWNlXG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgIHJvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVmaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByby5vYnNlcnZlKGVsKTtcbiAgICAvLyBTYWZldHkgbmV0OiBzdG9wIG9ic2VydmluZyBldmVuIGlmIGl0IG5ldmVyIGdhaW5zIGEgc2l6ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHJvLmRpc2Nvbm5lY3QoKSwgNTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIHRpbGUgc291cmNlIGJ1aWx0IGZyb20gdGhlIGRlc2NyaXB0b3IuIE9TRCBudW1iZXJzIGxldmVsc1xuICAgKiBjb2Fyc2VzdC1maXJzdDsgdGhlIGJhY2tlbmQgbnVtYmVycyByZXNvbHV0aW9ucyBmdWxsLXJlcy1maXJzdCwgc29cbiAgICogYHJlcyA9IChsZXZlbHMtMSkgLSBvc2RMZXZlbGAuIE92ZXJyaWRpbmcgZ2V0TGV2ZWxTY2FsZS9nZXROdW1UaWxlcyBsZXRzIHVzXG4gICAqIGhvbm91ciBCaW8tRm9ybWF0cycgYWN0dWFsIHBlci1sZXZlbCBkaW1lbnNpb25zIChub3QgYXNzdW1lIHBvd2VyLW9mLXR3bykuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZVNvdXJjZShkOiBUaWxlRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpOiBhbnkge1xuICAgIC8vIE11bHRpY2hhbm5lbCBpbWFnZXMgY29tcG9zaXRlIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMsIHdoaWNoIG9ubHkgZXhpc3QgYXRcbiAgICAvLyByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb25zIOKAlCBzbyBkcml2ZSBPU0Qgb2ZmIHRoZSByZWFsIGxldmVscyBhbG9uZSBhbmRcbiAgICAvLyBza2lwIHRoZSBzeW50aGV0aWMgKHNlcnZlci1jb21wb3NpdGVkKSBvdmVydmlld3MuIEV2ZXJ5IGRpc3BsYXllZCB0aWxlIGlzXG4gICAgLy8gdGhlbiBwZXItY2hhbm5lbC1mZXRjaGFibGUgYXQgYW55IHpvb20uXG4gICAgY29uc3QgbGV2ZWxzID0gdGhpcy5pc011bHRpQ2hhbm5lbCA/IGQubGV2ZWxzLnNsaWNlKDAsIHRoaXMucmVhbExldmVscykgOiBkLmxldmVscztcbiAgICBjb25zdCBuID0gbGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5hcGk7XG5cbiAgICAvLyBPU0QgbGV2ZWwgaSAoMCA9IGNvYXJzZXN0KSA8LT4gYmFja2VuZCByZXNvbHV0aW9uIChuLTEtaSkgKHJlcyAwID0gZnVsbCkuXG4gICAgLy8gVGhlIGJhY2tlbmQgcHlyYW1pZCBpcyBOT1QgbmVjZXNzYXJpbHkgcG93ZXItb2YtdHdvLCBzbyB3ZSBkcml2ZSBPU0Qgb2ZmXG4gICAgLy8gdGhlIGJhY2tlbmQncyByZWFsIHBlci1sZXZlbCBkaW1lbnNpb25zLiBXZSBvdmVycmlkZSBPTkxZIGdldExldmVsU2NhbGU6XG4gICAgLy8gT1NEIGRlcml2ZXMgZ2V0TnVtVGlsZXMsIGdldFRpbGVCb3VuZHMgQU5EIGl0cyBwZXItem9vbSBsZXZlbCBzZWxlY3Rpb25cbiAgICAvLyBmcm9tIGdldExldmVsU2NhbGUsIHNvIHRoZXkgYWxsIHN0YXkgY29uc2lzdGVudCDigJQgcmVxdWVzdGluZyBleGFjdGx5IHRoZVxuICAgIC8vIHRpbGVzIGVhY2ggcmVzb2x1dGlvbiBhY3R1YWxseSBoYXMgKG5vIG91dC1vZi1yYW5nZSA0MDBzLCBubyBmbG9vZCkuXG4gICAgY29uc3QgcmVzRm9yTGV2ZWwgPSAobGV2ZWw6IG51bWJlcikgPT4gbiAtIDEgLSBsZXZlbDtcbiAgICBjb25zdCB0czogYW55ID0gbmV3IChPU0QgYXMgYW55KS5UaWxlU291cmNlKHtcbiAgICAgIHdpZHRoOiBkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkLmhlaWdodCxcbiAgICAgIHRpbGVTaXplOiB0LFxuICAgICAgdGlsZU92ZXJsYXA6IDAsXG4gICAgICBtaW5MZXZlbDogMCxcbiAgICAgIG1heExldmVsOiBuIC0gMSxcbiAgICB9KTtcbiAgICB0cy5nZXRMZXZlbFNjYWxlID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgcmV0dXJuIGx2bCA/IGx2bC53aWR0aCAvIGQud2lkdGggOiAxO1xuICAgIH07XG4gICAgLy8gRHJpdmUgdGhlIHRpbGUgQ09VTlQgb2ZmIGVhY2ggbGV2ZWwncyBvd24gKGluZGVwZW5kZW50bHktcm91bmRlZCkgZGltZW5zaW9ucyxcbiAgICAvLyBub3QgT1NEJ3MgZGVmYXVsdCBgY2VpbChzY2FsZSAqIGZ1bGxEaW1lbnNpb24gLyB0aWxlU2l6ZSlgLiBTeW50aGV0aWMgQU5EIHJlYWxcbiAgICAvLyBCaW8tRm9ybWF0cyBsZXZlbHMgYXJlbid0IGV4YWN0IHByb3BvcnRpb25hbCBzY2FsZXMgb2YgdGhlIGZ1bGwgaW1hZ2UsIHNvXG4gICAgLy8gYHNjYWxlICogZnVsbEhlaWdodGAgY2FuIHJvdW5kIHVwIHRvIG9uZSBtb3JlIHJvdyAob3IgY29sdW1uKSB0aGFuIHRoZSBsZXZlbFxuICAgIC8vIGFjdHVhbGx5IGhhcyDigJQgT1NEIHRoZW4gcmVxdWVzdHMgYW4gb3V0LW9mLXJhbmdlIHRpbGUgdGhhdCB0aGUgc2VydmVyIDQwMHNcbiAgICAvLyAoXCJUaWxlIChjb2wscm93KSBvdXQgb2YgcmFuZ2VcIikuIFVzaW5nIHRoZSBsZXZlbCdzIHJlYWwgdy9oIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VydmVyJ3Mgb3duIGJvdW5kcyBjaGVjayBleGFjdGx5LlxuICAgIGNvbnN0IFBvaW50ID0gKE9TRCBhcyBhbnkpLlBvaW50O1xuICAgIHRzLmdldE51bVRpbGVzID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgaWYgKCFsdmwpIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICByZXR1cm4gbmV3IFBvaW50KE1hdGguY2VpbChsdmwud2lkdGggLyB0KSwgTWF0aC5jZWlsKGx2bC5oZWlnaHQgLyB0KSk7XG4gICAgfTtcbiAgICB0cy5nZXRUaWxlVXJsID0gKGxldmVsOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgICAgYnVpbGRUaWxlVXJsKGJhc2UsIGluZm9CNjQsIHsgcmVzOiByZXNGb3JMZXZlbChsZXZlbCksIGNvbDogeCwgcm93OiB5LCB6LCB0aWxlU2l6ZTogdCwgY2hhbm5lbCB9KTtcbiAgICByZXR1cm4gdHM7XG4gIH1cblxuICAvKiogUmUtYXBwbHkgdGhlIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9jb2xvdXIvaW52ZXJ0KSBhZnRlciBhIHN0YXRlIGNoYW5nZS5cbiAgICogIE11bHRpY2hhbm5lbCBpbnZhbGlkYXRlcyBPTkxZIHRoZSB2aXNpYmxlIHNsaWNlJ3MgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZ1xuICAgKiAgdGhlIHdob2xlIHdvcmxkIHdvdWxkIHJlLXByb2Nlc3MgZXZlcnkgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksXG4gICAqICBmbG9vZGluZyBPU0Qgd2l0aCBcIltDYWNoZVJlY29yZF0g4oCmIEludmFsaWRTdGF0ZUVycm9yXCIgYW5kIHdhc3Rpbmcgd29yayBvbiB0aWxlc1xuICAgKiAgdGhhdCBhcmVuJ3Qgb24gc2NyZWVuLiBUaGUgb3RoZXIgY2FjaGVkIHNsaWNlcyBhcmUgbWFya2VkIHN0YWxlIGFuZCByZS10aW50ZWRcbiAgICogIGxhemlseSB3aGVuIHJldmVhbGVkLiBDb21wb3NpdGUvZ3JheXNjYWxlIGludmFsaWRhdGUgdGhlIHdvcmxkIGFzIGJlZm9yZS4gKi9cbiAgLyoqIENvbGxhcHNlIGEgYnVyc3Qgb2YgZGlzcGxheS1zdGF0ZSBjaGFuZ2VzIGludG8gT05FIGludmFsaWRhdGlvbiBvbiB0aGUgbmV4dFxuICAgKiAgZnJhbWUuIERyYWdnaW5nIGEgd2luZG93IHNsaWRlciBlbWl0cyBwZXIgcGl4ZWwgb2YgdHJhdmVsLCBhbmQgZWFjaCByb3VuZFxuICAgKiAgcmVzdG9yZXMgYW5kIHJlLXByb2Nlc3NlcyBldmVyeSB0aWxlIG9mIGV2ZXJ5IGNoYW5uZWwg4oCUIHNvIHRoZSBidXJzdCBpcyBib3RoXG4gICAqICB3YXN0ZWQgd29yayBhbmQgdGhlIHJhY2UgdGhhdCBicmVha3MgY2FjaGUgcmVjb3JkcyAoc2VlIHtAbGluayBkaXNwbGF5VG9rZW59KS5cbiAgICogIFRoZSBzdG9yZSB3cml0ZSBzdGF5cyBsaXZlLCBzbyB0aGUgcGFuZSBpdHNlbGYgcmVtYWlucyByZXNwb25zaXZlLiAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgcXVldWVkIGZvciB0aGlzIGZyYW1lXG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgICB0aGlzLmludmFsaWRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVEaXNwbGF5KCk6IHZvaWQge1xuICAgIC8vIFN1cGVyc2VkZSBhbnkgaW4tZmxpZ2h0IHJlY29sb3Igcm91bmQgYmVmb3JlIHJlc3RhcnRpbmcgb25lIChzZWUgZGlzcGxheVRva2VuKS5cbiAgICB0aGlzLmRpc3BsYXlUb2tlbisrO1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLmNhY2hlLmludmFsaWRhdGVDaGFubmVsRGlzcGxheSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHsgdi53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTsgfSBjYXRjaCB7IC8qIG5vLW9wICovIH1cbiAgICB0cnkgeyB2Lm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Vmlld2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdmlld3BvcnQgbm90IHJlYWR5ICovXG4gICAgfVxuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/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==
2037
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBZ0IsYUFBYSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUYsT0FBTyxFQUFhLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQXNCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEcsT0FBTyxFQUFzQixhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVB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WUFDM0IsTUFBTSxHQUFHLEdBQWUsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsNEVBQTRFO1FBQzVFLHFFQUFxRTtRQUNyRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1FBQzdELE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpD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QUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQzs4R0F0MURVLDhCQUE4Qiw0Q0E0SS9CLGdCQUFnQixtTEFNSixjQUFjLDRNQU0xQixVQUFVO2tIQXhKVCw4QkFBOEIsY0FEakIsTUFBTTs7MkZBQ25CLDhCQUE4QjtrQkFEMUMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQTZJN0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQU12QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGNBQWM7OzBCQU1qQyxNQUFNOzJCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGNvbWJpbmVMYXRlc3QsIGZpcnN0VmFsdWVGcm9tLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEltYWdlIH0gZnJvbSAnaW1hZ2UtanMnO1xuaW1wb3J0ICogYXMgT3BlblNlYWRyYWdvbiBmcm9tICdvcGVuc2VhZHJhZ29uJztcbmltcG9ydCB7IE9TRCB9IGZyb20gJy4vb3NkLWxpYic7XG5cblxuaW1wb3J0IHsgVmlzdWFsaXplclN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblN0b3JlIH0gZnJvbSAnLi4vLi4vc3RvcmUvcmVnaW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBUaWxlQWNjZXNzUG9ydCwgVElMRV9BQ0NFU1NfUE9SVCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wb3J0cy90aWxlLWFjY2Vzcy5wb3J0JztcbmltcG9ydCB7IFZpekNvbmZpZywgVklaX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy92aXotY29uZmlnJztcbmltcG9ydCB7IFBsb3RUeXBlLCBQTE9UX1RZUEVfREVTQ1JJUFRPUlMsIFBsb3RUeXBlRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHsgSVZpc3VhbGl6ZXIsIFBpeGVsRGF0YSwgSW50ZW5zaXR5UHJvZmlsZSwgSUlzb3N1cmZhY2VDb250cm9scywgSUludGVuc2l0eUNvbnRyb2xzLCBJU3VyZmFjZTNkQ29udHJvbHMgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBWaWV3ZXJDYXBhYmlsaXRpZXMsIFZpZXdlckZlYXR1cmUsIGNhcGFiaWxpdGllc09mIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2NhcGFiaWxpdGllcy5jb250cmFjdCc7XG5pbXBvcnQgeyBPc2RSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9vc2QtcmVnaW9uLW92ZXJsYXknO1xuaW1wb3J0IHsgT3NkU2NhbGVCYXIgfSBmcm9tICcuL29zZC1zY2FsZS1iYXInO1xuaW1wb3J0IHsgSVJlZ2lvbk92ZXJsYXksIFJlZ2lvblRvb2xNb2RlIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3JlZ2lvbi1vdmVybGF5LmNvbnRyYWN0JztcbmltcG9ydCB7IElDb29yZGluYXRlVHJhbnNmb3JtIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL2Nvb3JkaW5hdGUtdHJhbnNmb3JtLmNvbnRyYWN0JztcbmltcG9ydCB7IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0gfSBmcm9tICcuL29zZC1jb29yZGluYXRlLXRyYW5zZm9ybSc7XG5pbXBvcnQgeyBlbGVtZW50VG9JbWFnZSwgaW1hZ2VSZWN0VG9WaWV3cG9ydCwgdmlld3BvcnRSZWN0VG9JbWFnZSB9IGZyb20gJy4vb3NkLWNvb3Jkcyc7XG5pbXBvcnQgeyBidWlsZFRpbGVVcmwsIGZldGNoVGlsZUJpdG1hcCB9IGZyb20gJy4vdGlsZS1jbGllbnQnO1xuaW1wb3J0IHsgU2xpY2VDYWNoZSB9IGZyb20gJy4vc2xpY2UtY2FjaGUnO1xuaW1wb3J0IHsgRGlzcGxheVBpcGVsaW5lIH0gZnJvbSAnLi9kaXNwbGF5LXBpcGVsaW5lJztcbmltcG9ydCB7IEhpc3RvZ3JhbVNhbXBsZXIgfSBmcm9tICcuL2hpc3RvZ3JhbS1zYW1wbGVyJztcbmltcG9ydCB7IEJhc2VTdG9yZVZpc3VhbGl6ZXIgfSBmcm9tICcuLi9iYXNlLXN0b3JlLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2ltcGxlLXNsaWNlLWFjY2Vzcy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlZEltYWdlRGF0YSwgV2FuZFRvb2xTZXJ2aWNlLCBXYW5kVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJ1c2hUb29sU2VydmljZSwgQnJ1c2hPcHRpb25zIH0gZnJvbSAnLi4vLi4vdG9vbGJhci9icnVzaC9icnVzaC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FtVG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbVBvaW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9zYW0tcG9pbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IENlbGxTZWdtZW50VG9vbFNlcnZpY2UgfSBmcm9tICcuLi8uLi90b29sYmFyL3NlZ21lbnRhdGlvbi9jZWxsLXNlZ21lbnQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IElDZWxsU2VnbWVudGVyLCBDRUxMX1NFR01FTlRFUiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jZWxsLXNlZ21lbnRlci5jb250cmFjdCc7XG5pbXBvcnQgeyBWZXJ0ZXhFcmFzZXJUb29sU2VydmljZSwgVmVydGV4RXJhc2VyVG9vbEhvc3QgfSBmcm9tICcuLi8uLi90b29sYmFyL3ZlcnRleC1lcmFzZXIvdmVydGV4LWVyYXNlci10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgWm9vbVRvQm94VG9vbFNlcnZpY2UsIFpvb21Ub0JveFRvb2xIb3N0IH0gZnJvbSAnLi4vLi4vdG9vbGJhci96b29tLXRvLWJveC96b29tLXRvLWJveC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgV2FuZE9wdGlvbnMgfSBmcm9tICcuLi8uLi90b29sYmFyL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IGJ1aWxkQ29sb3JtYXBMdXQsIFJnYiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgSUNoYW5uZWxTdGF0ZSwgSUhpc3RvZ3JhbSB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9jaGFubmVsLWhpc3RvZ3JhbS1hcGkuY29udHJhY3QnO1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZS1zYXZlcic7XG5cbi8qKlxuICogUXVpZXQgT3BlblNlYWRyYWdvbidzIFwiW1ZpZXdwb3J0LipdIGlzIG5vdCBhY2N1cmF0ZSB3aXRoIG11bHRpLWltYWdlXCIgYWR2aXNvcmllcy5cbiAqIEEgbXVsdGljaGFubmVsIGltYWdlIGlzIGNvbXBvc2l0ZWQgZnJvbSBvbmUgVGlsZWRJbWFnZSBwZXIgY2hhbm5lbCDigJQgYSBsZWdpdGltYXRlXG4gKiBtdWx0aS1pbWFnZSB3b3JsZCDigJQgYW5kIE9TRCBsb2dzIHRoYXQgYWR2aXNvcnkgKGF0IGVycm9yIGxldmVsKSBmcm9tIGl0cyBvd25cbiAqIG5hdmlnYXRvci9vdmVydmlldyByZW5kZXJpbmcgb24gZXZlcnkgYW5pbWF0aW9uIGZyYW1lLCBmbG9vZGluZyB0aGUgY29uc29sZS4gT3VyXG4gKiBvd24gaW1hZ2U8LT52aWV3cG9ydCBjb252ZXJzaW9ucyBhbHJlYWR5IHJvdXRlIHRocm91Z2ggd29ybGQgaXRlbSAwIChzZWVcbiAqIG9zZC1jb29yZHMpLCBzbyB0aGUgcmVtYWluaW5nIGFkdmlzb3JpZXMgYXJlIE9TRC1pbnRlcm5hbCBhbmQgb25seSBhZmZlY3QgdGhlXG4gKiBtaW5pbWFwJ3MgYm94IGFjY3VyYWN5IChjb3NtZXRpYykuIFRoaXMgd3JhcHMgT1NEJ3MgbG9nZ2VyIGluIGEgUHJveHkgdGhhdCBkcm9wc1xuICogb25seSB0aGF0IG9uZSBtZXNzYWdlIHN0cmluZyBhbmQgZm9yd2FyZHMgZXZlcnkgb3RoZXIgbG9nIHVudG91Y2hlZC4gSWRlbXBvdGVudC5cbiAqL1xuZnVuY3Rpb24gc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpOiB2b2lkIHtcbiAgY29uc3Qgb3NkOiBhbnkgPSBPU0QgYXMgYW55O1xuICBpZiAob3NkLl9fbXVsdGlJbWFnZUZpbHRlckluc3RhbGxlZCkgcmV0dXJuO1xuICBjb25zdCBiYXNlOiBhbnkgPSAob3NkLmNvbnNvbGUgJiYgdHlwZW9mIG9zZC5jb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKVxuICAgID8gb3NkLmNvbnNvbGVcbiAgICA6ICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zb2xlIDogbnVsbCk7XG4gIGlmICghYmFzZSkgcmV0dXJuO1xuICBjb25zdCBpc0Fkdmlzb3J5ID0gKGE6IHVua25vd24pID0+XG4gICAgdHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEuaW5kZXhPZignbm90IGFjY3VyYXRlIHdpdGggbXVsdGktaW1hZ2UnKSAhPT0gLTE7XG4gIG9zZC5jb25zb2xlID0gbmV3IFByb3h5KGJhc2UsIHtcbiAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZykge1xuICAgICAgY29uc3Qgb3JpZyA9IHRhcmdldFtwcm9wXTtcbiAgICAgIGlmICgocHJvcCA9PT0gJ2Vycm9yJyB8fCBwcm9wID09PSAnd2FybicpICYmIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHsgaWYgKGlzQWR2aXNvcnkoYXJnc1swXSkpIHJldHVybjsgb3JpZy5hcHBseSh0YXJnZXQsIGFyZ3MpOyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiBvcmlnID09PSAnZnVuY3Rpb24nID8gb3JpZy5iaW5kKHRhcmdldCkgOiBvcmlnO1xuICAgIH0sXG4gIH0pO1xuICBvc2QuX19tdWx0aUltYWdlRmlsdGVySW5zdGFsbGVkID0gdHJ1ZTtcbn1cblxuLyoqIE9uZSBweXJhbWlkIGxldmVsIGZyb20gYEdFVCAvdGlsZXMvaW5mb2AuICovXG5pbnRlcmZhY2UgVGlsZUxldmVsIHsgcmVzOiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyOyB9XG5cbi8qKiBUaWxlLXNvdXJjZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGBHRVQgL3RpbGVzL2luZm9gLiAqL1xuaW50ZXJmYWNlIFRpbGVEZXNjcmlwdG9yIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHRpbGVTaXplOiBudW1iZXI7XG4gIHo6IG51bWJlcjtcbiAgY2hhbm5lbHM6IG51bWJlcjtcbiAgLyoqIFRydWUgb25seSBmb3IgZ2VudWluZSBtdWx0aS1jaGFubmVsIGNvbXBvc2l0ZXMgKGluZGV4ZWQvTFVULWJlYXJpbmdcbiAgICogIGZsdW9yZXNjZW5jZSBzdGFja3MpIHRoZSBjbGllbnQgc2hvdWxkIHNwbGl0IGludG8gcGVyLWNoYW5uZWwgbGF5ZXJzLiBUaGVcbiAgICogIHNlcnZlciBzZXRzIGl0OyBhbiBSR0IgcGhvdG8gcmVhZCBhcyBzZXBhcmF0ZWQgcGxhbmVzIGhhcyBjaGFubmVscz4xIGJ1dFxuICAgKiAgbXVsdGljaGFubmVsPWZhbHNlLCBzbyBpdCBzdGF5cyBhIHNpbmdsZSBjb21wb3NpdGUgdGlsZSBzb3VyY2UuICovXG4gIG11bHRpY2hhbm5lbD86IGJvb2xlYW47XG4gIC8qKiBSZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIGF0IHRoZSBmcm9udCBvZiBgbGV2ZWxzYDsgdGhlIHJlbWFpbmluZ1xuICAgKiAgbGV2ZWxzIGFyZSBzeW50aGV0aWMgY29tcG9zaXRlZCBvdmVydmlld3MgKG5vIHBlci1jaGFubmVsIHRpbGVzKS4gKi9cbiAgcmVhbExldmVscz86IG51bWJlcjtcbiAgLyoqIFBlci1jaGFubmVsIG1ldGFkYXRhIChuYW1lL2NvbG9yL2JpdERlcHRoL21pbi1tYXhBbGxvd2VkKSBmb3IgbmF0aXZlIDE2LWJpdFxuICAgKiAgd2luZG93aW5nICsgaGlzdG9ncmFtOyBudWxsIGZvciBwbGFpbiA4LWJpdC9SR0Igc291cmNlcy4gKi9cbiAgY2hhbm5lbEluZm8/OiBBcnJheTx7XG4gICAgbmFtZT86IHN0cmluZzsgY29sb3I/OiBzdHJpbmc7IGJpdERlcHRoPzogbnVtYmVyOyBtaW5BbGxvd2VkPzogbnVtYmVyOyBtYXhBbGxvd2VkPzogbnVtYmVyO1xuICB9PiB8IG51bGw7XG4gIGxldmVsczogVGlsZUxldmVsW107XG4gIC8qKiBQaHlzaWNhbCBwaXhlbCBzaXplIGluIMK1bSAoMCB3aGVuIHRoZSBmb3JtYXQgZG9lc24ndCByZXBvcnQgaXQpLiAqL1xuICBtcHBYPzogbnVtYmVyO1xuICBtcHBZPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCBgbG9hZCgpYCBoYW5kcyB0byBgcGxvdCgpYC4gKi9cbmludGVyZmFjZSBPc2RMb2FkZWQge1xuICBkZXNjcmlwdG9yOiBUaWxlRGVzY3JpcHRvciB8IG51bGw7XG4gIGluZm9CNjQ6IHN0cmluZztcbiAgejogbnVtYmVyO1xuICAvKiogTWlycm9ycyB0aGUgbG9hZGVkIGltYWdlJ3MgZmlsZW5hbWUg4oCUIHRoZSBkaWFncmFtJ3MgcmVuZGVyIHBpcGVsaW5lXG4gICAqICBndWFyZHMgb24gYGxvYWRlZC5maWxlbmFtZSA9PT0gcGhhc2VJbmZvLmZpbGVOYW1lYCBiZWZvcmUgY2FsbGluZyBwbG90KCkuICovXG4gIGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBTaW1wbGUgKG5vbi10aWxlZCkgaW1hZ2U6IGBwbG90KClgIG9wZW5zIHtAbGluayB1cmx9IGRpcmVjdGx5IHZpYSBPU0Qnc1xuICAgKiAgc2luZ2xlLWltYWdlIHNvdXJjZSDigJQgbm8gdGlsZSBweXJhbWlkLCBubyBzZXJ2ZXIuIFNldCB3aGVuIHRoZSBpbWFnZVxuICAgKiAgY2FycmllcyBgdGlsZWQgPT09IGZhbHNlYCAoc2VlIHtAbGluayBJSW1hZ2VJbmZvLnRpbGVkfSkuICovXG4gIHNpbXBsZT86IGJvb2xlYW47XG4gIC8qKiBUaGUgZGlyZWN0bHktbG9hZGFibGUgaW1hZ2UgVVJMIChgYmxvYjpgL2BkYXRhOmAvYGh0dHBgKSBmb3Igc2ltcGxlIG1vZGUuICovXG4gIHVybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuU2VhZHJhZ29uIHZpc3VhbGl6YXRpb24gYmFja2VuZC5cbiAqXG4gKiBSZW5kZXJzIHRoZSAqaW1hZ2UqIHBsb3QgdHlwZSBhcyBhIG5hdGl2ZWx5LXRpbGVkLCB6b29tYWJsZSByYXN0ZXIsIGJhY2tlZCBieVxuICogdGhlIGppdC1zZXJ2aWNlIHRpbGUgZW5kcG9pbnRzIChgR0VUIC90aWxlcy9pbmZvYCArIGBHRVQgL3RpbGVgLCB3aGljaCByZXVzZVxuICogdGhlIEJpby1Gb3JtYXRzIFJPSSByZW5kZXJlcikuIFBsb3RseSBrZWVwcyB0aGUgc2NpZW50aWZpYy9kYXRhIHBsb3QgdHlwZXNcbiAqIChzY2FsYXIgaGVhdG1hcCwgc3VyZmFjZSwgY29udG91ciwgc2NhdHRlciwgbGluZSwgc2NhdHRlcjNkLCBpc29zdXJmYWNlKSDigJRcbiAqIGhlbmNlIHRoaXMgYmFja2VuZCBhZHZlcnRpc2VzIG9ubHkgYEltYWdlRGlzcGxheWAuXG4gKlxuICogV2lyZWQ6IGxvYWQg4oaSIGRlc2NyaXB0b3IsIHBsb3Qg4oaSIG1vdW50IHZpZXdlciB3aXRoIGEgY3VzdG9tIHRpbGUgc291cmNlLFxuICogem9vbS9wYW4g4oaSIHZpZXdwb3J0IEFQSS4gTk9UIHdpcmVkIHlldCAoZm9sbG93LXVwcyk6IHJlZ2lvbiBvdmVybGF5cyArIHRvb2xzXG4gKiAoYSBwb3NpdGlvbmVkIGNhbnZhcy9TVkcgb3ZlcmxheSBvciBBbm5vdG9yaW91cyksIHBpeGVsIHJlYWRiYWNrLCBhbmQgdGhlXG4gKiBwZXItdGlsZSBMVVQvY29udHJhc3QgcGFyYW1zLiBOb3QgcmVnaXN0ZXJlZCBpbiBESSBwcm92aWRlcnMg4oCUIGBQbG90bHlTZXJ2aWNlYFxuICogaXMgc3RpbGwgdGhlIG9ubHkgYWN0aXZlIGJhY2tlbmQ7IHRoaXMgcHJvdmVzIHRoZSBjb250cmFjdCBzdXBwb3J0cyBhIHNlY29uZFxuICogaW1wbGVtZW50YXRpb24gYWdhaW5zdCByZWFsIGVuZHBvaW50cy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgZXh0ZW5kcyBCYXNlU3RvcmVWaXN1YWxpemVyIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIge1xuICAvKiogT1NEJ3Mgc3RyZW5ndGggaXMgZGlzcGxheWluZyBhIGxhcmdlIHpvb21hYmxlIGltYWdlIOKAlCBub3RoaW5nIGVsc2UgaGVyZS4gKi9cbiAgcmVhZG9ubHkgY2FwYWJpbGl0aWVzOiBWaWV3ZXJDYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXNPZihbVmlld2VyRmVhdHVyZS5JbWFnZURpc3BsYXldKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFwaTogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdlcjogT3BlblNlYWRyYWdvbi5WaWV3ZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBJUmVnaW9uT3ZlcmxheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNjYWxlQmFyOiBPc2RTY2FsZUJhciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCYXNlNjQgUmF3RmlsZUluZm8gKyBjdXJyZW50IHotc2xpY2UsIGtlcHQgc28gc2V0WkluZGV4IGNhbiByZWJ1aWxkIHRoZVxuICAgKiAgdGlsZSBzb3VyY2UgYW5kIHN3YXAgc2xpY2VzIGxpdmUgKHN0YWNrIG5hdmlnYXRpb24pLiAqL1xuICBwcml2YXRlIGluZm9CNjQgPSAnJztcbiAgcHJpdmF0ZSBjdXJyZW50WiA9IDA7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBjdXJyZW50IGltYWdlIGlzIFwic2ltcGxlXCIgKHRpbGVkOmZhbHNlIOKAlCBzZWxmLWNvbnRhaW5lZFxuICAgKiAgcGVyLXNsaWNlIFVSTHMsIG5vIHRpbGUgc2VydmVyOyBlLmcuIGEgbnVtYmVyZWQgaW1hZ2Ugc2VyaWVzIGFzc2VtYmxlZFxuICAgKiAgY2xpZW50LXNpZGUgaW50byBhIHN0YWNrKS4gc2V0WkluZGV4IHN3YXBzIHRoZSBzaW5nbGUtaW1hZ2Ugc291cmNlIGZvclxuICAgKiAgdGhlIG5ldyBzbGljZSdzIFVSTCBpbnN0ZWFkIG9mIHVwZGF0aW5nIGEgdGlsZWQgei1wYXJhbS4gKi9cbiAgcHJpdmF0ZSBzaW1wbGVNb2RlID0gZmFsc2U7XG4gIC8qKiB1cmxzW10gZm9yIHRoZSBjdXJyZW50IHNpbXBsZS1tb2RlIGltYWdlLCBzbyBzZXRaSW5kZXggY2FuIGxvb2sgdXAgdGhlXG4gICAqICBzbGljZSBiZWluZyBzY3J1YmJlZCB0byAodmlhIHtAbGluayBTaW1wbGVTbGljZUFjY2Vzc1NlcnZpY2UudXJsRm9yfSkuXG4gICAqICBVbnVzZWQgKGFuZCBsZWZ0IHN0YWxlLCBoYXJtbGVzc2x5KSBpbiB0aWxlZCBtb2RlLiAqL1xuICBwcml2YXRlIHNpbXBsZVVybHM6IHN0cmluZ1tdID0gW107XG4gIC8qKiBwcmV2aWV3IGJsb2IgVVJMIOKGkiBmdWxsLXJlcyB1cHNjYWxlZCBibG9iIFVSTCAoc2VlIHRvRnVsbFJlc1VybCksIHNvXG4gICAqICByZS12aXNpdGluZyBhIHNpbXBsZS1tb2RlIHNsaWNlIGRvZXNuJ3QgcmUtdXBzY2FsZS4gUmV2b2tlZCBvbiBmaWxlIGNoYW5nZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzaW1wbGVGdWxsUmVzVXJscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCAodGlsZWQ6ZmFsc2UgKyBjaGFubmVsQ291bnQ+MSk6IHRoZSBzdGFjaydzXG4gICAqICBwZXItc2xpY2UgcGVyLWNoYW5uZWwgcGxhbmUgVVJMcywgdGhlIGN1cnJlbnQgc2xpY2UncyBkZWNvZGVkIHBsYW5lcywgYW5kXG4gICAqICB0aGUgbGFzdCBjb21wb3NpdGUgYmxvYiBVUkwuIENvbXBvc2l0ZWQgY2xpZW50LXNpZGUgdmlhIGRpc3BsYXkuY2hhbm5lbFJnYkx1dFxuICAgKiAgKG5vIHRpbGUgc2VydmVyKTsga2VwdCBPRkYgdGhlIHRpbGVkIGlzTXVsdGlDaGFubmVsIHBhdGguICovXG4gIHByaXZhdGUgc2ltcGxlTXVsdGljaGFubmVsID0gZmFsc2U7XG4gIHByaXZhdGUgc2ltcGxlQ2hhbm5lbFVybHM6IHN0cmluZ1tdW10gPSBbXTtcbiAgcHJpdmF0ZSBzaW1wbGVDaGFubmVsUGxhbmVzOiBBcnJheTx7IGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5OyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiA9IFtdO1xuICBwcml2YXRlIHNpbXBsZUNvbXBvc2l0ZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBTa2lwIHRoZSBmdWxsLXJlcyB1cHNjYWxlIGFib3ZlIHRoaXMgbG9uZ2VzdC1zaWRlIGRpbWVuc2lvbiDigJQgYSBmb2xkZXJcbiAgICogIHN0YWNrIGlzIHBlci1maWxlIHByZXZpZXdzICh3ZWxsIHVuZGVyIHRoaXMpOyB0aGlzIG9ubHkgZ3VhcmRzIGFnYWluc3QgYW5cbiAgICogIGFjY2lkZW50YWwgZW5vcm1vdXMgY2FudmFzIGFsbG9jYXRpb24uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgU0lNUExFX1VQU0NBTEVfTUFYX0RJTSA9IDgxOTI7XG4gIHByaXZhdGUgY29vcmRUcmFuc2Zvcm06IElDb29yZGluYXRlVHJhbnNmb3JtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2FuZEhvc3QhOiBXYW5kVG9vbEhvc3Q7XG4gIHByaXZhdGUgZXJhc2VySG9zdCE6IFZlcnRleEVyYXNlclRvb2xIb3N0O1xuICAvKiogV2FuZCBzYW1wbGluZyBtYXRyaXggcmVhZCBiYWNrIGZyb20gdGhlIHJlbmRlcmVkIHZpZXdwb3J0OyBjYWNoZWQgdW50aWxcbiAgICogIHRoZSB2aWV3cG9ydCBjaGFuZ2VzIChzZWUgcmVhZGJhY2tWaWV3cG9ydCkuICovXG4gIHByaXZhdGUgdmlld3BvcnRQaXhlbHM6IENhY2hlZEltYWdlRGF0YSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIERPTSBpZCBvZiB0aGUgZWxlbWVudCBPU0QgaXMgbW91bnRlZCBpbiAoc2hhcmVkIHdpdGggUGxvdGx5KTsgdGhlXG4gICAqICBvbi1jYW52YXMgdG9vbHMgYXR0YWNoIHRoZWlyIG92ZXJsYXlzIGhlcmUuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKiogQ3VycmVudCBmaWxlIG5hbWUsIHRhZ2dlZCBvbnRvIHdhbmQtY3JlYXRlZCBzaGFwZXMuICovXG4gIHByaXZhdGUgY3VycmVudEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiAyNTYtZW50cnkgUkdCIExVVCBmb3IgdGhlIGFjdGl2ZSBjb2xvcm1hcCwgYXBwbGllZCB0byBncmF5c2NhbGUgdGlsZXMgdmlhXG4gICAqICB0aGUgdGlsZS1pbnZhbGlkYXRlZCBwaXhlbCBwaXBlbGluZSAobWlycm9ycyBQbG90bHkncyBoZWF0bWFwIGNvbG9yc2NhbGUpLlxuICAgKiAgTnVsbCB3aGlsZSBvcHRpb25zIHJlc29sdmU7IHJlY29sb3JpbmcgaXMgc2tpcHBlZCB1bnRpbCBpdCdzIGJ1aWx0LiAqL1xuICBwcml2YXRlIGNvbG9yTHV0OiBSZ2JbXSB8IG51bGwgPSBudWxsO1xuICAvKiogT25seSBncmF5c2NhbGUgaW1hZ2VzIGdldCBhIGNvbG9ybWFwIChSR0IgdGlsZXMgcGFzcyB0aHJvdWdoIHVudG91Y2hlZCkuICovXG4gIHByaXZhdGUgaXNHcmF5c2NhbGVJbWFnZSA9IGZhbHNlO1xuICBwcml2YXRlIGNvbG9ybWFwU3ViOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBieSBldmVyeSBkaXNwbGF5IGludmFsaWRhdGlvbi4gQSByZWNvbG9yIHJvdW5kIGNhcHR1cmVzIGl0IGFuZCwgYWZ0ZXJcbiAgICogIGVhY2ggYGF3YWl0YCwgYWJhbmRvbnMgdGhlIHRpbGUgb25jZSBhIG5ld2VyIHJvdW5kIGhhcyBzdGFydGVkLiBXcml0aW5nIGFcbiAgICogIHN1cGVyc2VkZWQgY29udGV4dCBiYWNrIGlzIG5vdCBtZXJlbHkgd2FzdGVkIHdvcms6IE9TRCdzIGNvbnZlcnNpb24gc2VlcyBhXG4gICAqICBjYW52YXMgdGhlIG5ld2VyIHJvdW5kIGFscmVhZHkgcmVwbGFjZWQsIHRocm93cyBgRE9NRXhjZXB0aW9uYCwgYW5kXG4gICAqICBgX2hhbmRsZUNvbnZlcnNpb25FcnJvcmAgREVTVFJPWVMgdGhlIGNhY2hlIHJlY29yZCBhbmQgdW5sb2FkcyB0aGUgdGlsZVxuICAgKiAgKHVubGlrZSB0aGUgZHJhd2VyJ3MgcmFzdGVyQmxvYiBwYXRoLCBpdCBkb2VzIG5vdCByZS1wcmVwYXJlKS4gRW5vdWdoIG9mXG4gICAqICB0aG9zZSBhbmQgdGhlIHZpZXdlciBnb2VzIHdoaXRlIG1pZC1kcmFnLiAqL1xuICBwcml2YXRlIGRpc3BsYXlUb2tlbiA9IDA7XG4gIC8qKiBQZW5kaW5nIGNvYWxlc2NlZCBpbnZhbGlkYXRpb24gKHNlZSB7QGxpbmsgc2NoZWR1bGVJbnZhbGlkYXRlfSkuICovXG4gIHByaXZhdGUgaW52YWxpZGF0ZUhhbmRsZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBMYXRlc3QgcGVyLWNoYW5uZWwgZGlzcGxheSBzdGF0ZSAod2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIGZyb20gdGhlIHN0b3JlLFxuICAgKiAgcmVhZCBzeW5jaHJvbm91c2x5IGJ5IHJlY29sb3JUaWxlLiBDaGFubmVsIDAgZHJpdmVzIGdyYXlzY2FsZSB3aW5kb3dpbmc7XG4gICAqICBSL0cvQiAoaW5kaWNlcyAwLTIpIGRyaXZlIFJHQiBwZXItY2hhbm5lbCB3aW5kb3dpbmcuICovXG4gIHByaXZhdGUgY2hhbm5lbFN0YXRlczogSUNoYW5uZWxTdGF0ZVtdID0gW107XG4gIC8qKiBUcnVlIGZvciBtdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChjaGFubmVsQ291bnQgPiAxLCBub3QgUkdCKTogdGlsZXMgYXJlXG4gICAqICBjb21wb3NpdGVkIGNsaWVudC1zaWRlIGZyb20gcGVyLWNoYW5uZWwgc2luZ2xlLWJhbmQgZmV0Y2hlcyAoc2VlXG4gICAqICByZWNvbG9yTXVsdGlDaGFubmVsVGlsZSkgcmF0aGVyIHRoYW4gcmVjb2xvcmVkIGluIHBsYWNlLiAqL1xuICBwcml2YXRlIGlzTXVsdGlDaGFubmVsID0gZmFsc2U7XG4gIC8qKiBDb3VudCBvZiByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb24gbGV2ZWxzIChwZXItY2hhbm5lbCB0aWxlcyBleGlzdCBvbmx5XG4gICAqICBoZXJlKS4gRm9yIG11bHRpY2hhbm5lbCBpbWFnZXMgdGhlIHRpbGUgc291cmNlIGlzIGJ1aWx0IGZyb20gdGhlc2UgYWxvbmUgc29cbiAgICogIGV2ZXJ5IGRpc3BsYXllZCB0aWxlIHN1cHBvcnRzIGEgcGVyLWNoYW5uZWwgZmV0Y2guICovXG4gIHByaXZhdGUgcmVhbExldmVscyA9IDA7XG4gIC8qKiBJbnZlcnRlZCBiYWNrZ3JvdW5kICh3aGl0ZSA9IHplcm8pOiBpbnZlcnRzIHRoZSBkaXNwbGF5IHZhbHVlIGJlZm9yZSB0aGVcbiAgICogIExVVCAoZ3JheXNjYWxlKSAvIHBlciBjaGFubmVsIChSR0IpLiAqL1xuICBwcml2YXRlIGludmVydEJnID0gZmFsc2U7XG4gIC8qKiBCZWFyZXIgdG9rZW4gZm9yIE9TRCdzIG93biB0aWxlIGZldGNoZXMgKEh0dHBDbGllbnQgY2FsbHMgZ2V0IGl0IHZpYSB0aGVcbiAgICogIGludGVyY2VwdG9yOyBPU0QncyBsb2FkZXIgZG9lcyBub3QsIHNvIHdlIHBhc3MgaXQgYXMgYW4gYWpheCBoZWFkZXIpLiAqL1xuICBwcml2YXRlIGF1dGhIZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIC8qKiBXaGV0aGVyIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IgKG1pbmltYXApIGlzIHNob3duLiBSZWFkIGF0IHZpZXdlciBjcmVhdGlvbjtcbiAgICogIGEgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhbnQgaXQgKGUuZy4gYSBzbWFsbCBlbWJlZGRlZCBwcmV2aWV3KSBzZXRzIGl0IG9mZlxuICAgKiAgdmlhIHtAbGluayBzZXROYXZpZ2F0b3JWaXNpYmxlfSBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlci4gKi9cbiAgcHJpdmF0ZSBuYXZpZ2F0b3JWaXNpYmxlID0gdHJ1ZTtcbiAgLyoqIEltYWdlIHNtb290aGluZyAoYmlsaW5lYXIpLiBgZmFsc2VgIOKGkiBuZWFyZXN0LW5laWdoYm91ciwgc28gem9vbWVkLWluIHBpeGVsc1xuICAgKiAgcmVuZGVyIGFzIGNyaXNwIGJsb2NrcyAocGl4ZWwgaW5zcGVjdGlvbikuIERlZmF1bHRzIHRvIGBmYWxzZWAgc28gdGhlIGltYWdlXG4gICAqICBvcGVucyBzaG93aW5nIHJhdyBwaXhlbHMuIFJlYWQgYXQgdmlld2VyIGNyZWF0aW9uOyB0b2dnbGVkIHZpYVxuICAgKiAge0BsaW5rIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZH0uICovXG4gIHByaXZhdGUgc21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG4gIC8qKiBPdmVyYWxsIGRlYWRsaW5lIGZvciB0aGUgL3RpbGVzL2luZm8gcG9sbCBsb29wLiBBbiB1bmNhY2hlZCB3aG9sZS1zbGlkZVxuICAgKiAgaW1hZ2UgKGUuZy4gLm5kcGkpIGlzIGNhY2hlZCBzZXJ2ZXItc2lkZSBmaXJzdCAoR0NTLT5QVkMpLCB3aGljaCBjYW4gdGFrZVxuICAgKiAgc2V2ZXJhbCBtaW51dGVzIOKAlCB3ZSBwb2xsIChzaG9ydCByZXF1ZXN0czsgdGhlIGNhY2hlLXByb2dyZXNzIG92ZXJsYXlcbiAgICogIHNob3dzIHRoZSB3YWl0KSB1bnRpbCBpdCdzIHJlYWR5LiBHZW5lcm91cyBiZWNhdXNlIGVhY2ggcG9sbCBpcyBjaGVhcDsgb25cbiAgICogIGV4cGlyeSB0aGUgcmVuZGVyIHBpcGVsaW5lIGdpdmVzIHVwIGFuZCB0aGUgcm91dGVyIGZhbGxzIGJhY2sgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbGVzSW5mb1RpbWVvdXRNcyA9IDYwMDAwMDsgLy8gMTAgbWluXG5cbiAgLyoqIFBlci1jaGFubmVsIGZpdC12aWV3IHRpbGUgYnVkZ2V0ICh0aWxlcyBhdCB0aGUgY29hcnNlc3QgcmVhbCBsZXZlbCDDlyBjaGFubmVscykuXG4gICAqICBBYm92ZSBpdCwgYSBtdWx0aWNoYW5uZWwgaW1hZ2UgcmVuZGVycyBzZXJ2ZXItY29tcG9zaXRlZCBpbnN0ZWFkIG9mIHBlci1jaGFubmVsXG4gICAqICDigJQgaXRzIGZ1bGwtcmVzIHJlYWRzIChpdCBoYXMgbm8gb3ZlcnZpZXcgcHlyYW1pZCkgd291bGQgYmUgdG9vIG1hbnkgw5cgTiBjaGFubmVscy5cbiAgICogIDY0IChlLmcuIGEgNHg0IHNpbmdsZS1GT1Ygei1zdGFjayDDlyA0Y2gpIHN0YXlzIHBlci1jaGFubmVsOyBhIHdob2xlLXNsaWRlXG4gICAqICAoaHVuZHJlZHPigJN0aG91c2FuZHMpIGZhbGxzIGJhY2suICovXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX01VTFRJQ0hBTk5FTF9GSVRfVElMRVMgPSAyNTY7XG5cbiAgLyoqIFBpeGVsIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9pbnZlcnQvY29sb3JtYXAgKyBhZGRpdGl2ZSB0aW50KSDigJRcbiAgICogIHNoYXJlZCBieSB0aWxlIHJlY29sb3JpbmcgYW5kIHRoZSBjb21wb3NpdGUgZXhwb3J0IHNvIHRoZXkgc3RheSBpZGVudGljYWxcbiAgICogIChzZWUgRGlzcGxheVBpcGVsaW5lKS4gSG9zdCBjbG9zdXJlcyByZWFkIHRoZSBzZXJ2aWNlJ3MgbGl2ZSBmaWVsZHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGxheSA9IG5ldyBEaXNwbGF5UGlwZWxpbmUoe1xuICAgIGlzR3JheXNjYWxlOiAoKSA9PiB0aGlzLmlzR3JheXNjYWxlSW1hZ2UsXG4gICAgY29sb3JMdXQ6ICgpID0+IHRoaXMuY29sb3JMdXQsXG4gICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5jaGFubmVsU3RhdGVzLFxuICAgIGludmVydEJnOiAoKSA9PiB0aGlzLmludmVydEJnLFxuICB9KTtcblxuICAvKiogSGlzdG9ncmFtICsgYXV0by13aW5kb3cgc2FtcGxpbmcgKHNlZSBIaXN0b2dyYW1TYW1wbGVyKS4gQ29uc3RydWN0ZWQgaW5cbiAgICogIHRoZSBjdG9yIGJvZHkgYmVjYXVzZSBpdCBjYXB0dXJlcyB0aGUgcmVzb2x2ZWQgQVBJIGJhc2UgVVJMLiAqL1xuICBwcml2YXRlIHNhbXBsZXIhOiBIaXN0b2dyYW1TYW1wbGVyO1xuXG4gIC8qKiBTdGFjay1zbGljZSBjYWNoZSArIGJhY2tncm91bmQgcHJlbG9hZGVyIChzZWUgU2xpY2VDYWNoZSDigJQgcmVmYWN0b3JpbmdcbiAgICogIHBsYW4gU3RlcCAzKS4gVGhlIGhvc3QgYWNjZXNzb3JzIGFyZSBsaXZlIGNsb3N1cmVzLCBzbyB0aGUgY2FjaGUgYWx3YXlzXG4gICAqICByZWFkcyB0aGUgc2VydmljZSdzIGN1cnJlbnQgdmlld2VyL2Rlc2NyaXB0b3IveiDigJQgZXhhY3RseSB0aGUgZmllbGRzIHRoZVxuICAgKiAgbW92ZWQgY29kZSB1c2VkIHRvIHJlYWQgZGlyZWN0bHkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGUgPSBuZXcgU2xpY2VDYWNoZSh7XG4gICAgdmlld2VyOiAoKSA9PiB0aGlzLnZpZXdlcixcbiAgICBoYXNJbWFnZTogKCkgPT4gISEodGhpcy52aWV3ZXIgJiYgdGhpcy5kZXNjcmlwdG9yICYmIHRoaXMuaW5mb0I2NCksXG4gICAgc2xpY2VDb3VudDogKCkgPT4gdGhpcy5kZXNjcmlwdG9yPy56ID8/IDEsXG4gICAgY3VycmVudFo6ICgpID0+IHRoaXMuY3VycmVudFosXG4gICAgaXNNdWx0aUNoYW5uZWw6ICgpID0+IHRoaXMuaXNNdWx0aUNoYW5uZWwsXG4gICAgY2hhbm5lbENvdW50OiAoKSA9PiBNYXRoLm1heCgxLCB0aGlzLmNoYW5uZWxTdGF0ZXMubGVuZ3RoIHx8ICh0aGlzLmRlc2NyaXB0b3I/LmNoYW5uZWxzID8/IDEpKSxcbiAgICBjaGFubmVsVmlzaWJsZTogKGM6IG51bWJlcikgPT4gdGhpcy5jaGFubmVsU3RhdGVzW2NdPy52aXNpYmxlICE9PSBmYWxzZSxcbiAgICBidWlsZFRpbGVTb3VyY2U6ICh6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpID0+XG4gICAgICB0aGlzLmJ1aWxkVGlsZVNvdXJjZSh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHosIGNoYW5uZWwpLFxuICAgIG9uQ29tcG9zaXRlU2xpY2VBZGRlZDogKHo6IG51bWJlcikgPT4gdGhpcy5zYW1wbGVyLmNvbXB1dGVJbWFnZVdpbmRvdyh0aGlzLmRlc2NyaXB0b3IhLCB0aGlzLmluZm9CNjQsIHopLFxuICB9KTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgQEluamVjdChUSUxFX0FDQ0VTU19QT1JUKSBwcml2YXRlIHRpbGVzOiBUaWxlQWNjZXNzUG9ydCxcbiAgICBwcml2YXRlIHdhbmRUb29sOiBXYW5kVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBicnVzaFRvb2w6IEJydXNoVG9vbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYW1Ub29sOiBTYW1Ub29sU2VydmljZSxcbiAgICBwcml2YXRlIHNhbVBvaW50VG9vbDogU2FtUG9pbnRUb29sU2VydmljZSxcbiAgICBwcml2YXRlIGNlbGxTZWdtZW50VG9vbDogQ2VsbFNlZ21lbnRUb29sU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KENFTExfU0VHTUVOVEVSKSBwcml2YXRlIGNlbGxTZWdtZW50ZXI6IElDZWxsU2VnbWVudGVyIHwgbnVsbCxcbiAgICBwcml2YXRlIGVyYXNlclRvb2w6IFZlcnRleEVyYXNlclRvb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgem9vbVRvQm94VG9vbDogWm9vbVRvQm94VG9vbFNlcnZpY2UsXG4gICAgc3RvcmU6IFZpc3VhbGl6ZXJTdG9yZSxcbiAgICByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzaW1wbGVTdGFjazogU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgY29uZmlnOiBWaXpDb25maWcsXG4gICkge1xuICAgIHN1cGVyKHJlZ2lvblN0b3JlLCBzdG9yZSk7XG4gICAgdGhpcy5hcGkgPSBjb25maWcuc2xpZGVDcm9wU2VydmVyO1xuICAgIHRoaXMuc2FtcGxlciA9IG5ldyBIaXN0b2dyYW1TYW1wbGVyKHRoaXMuaHR0cCwgdGhpcy5hcGksIHtcbiAgICAgIHJlYWxMZXZlbHM6ICgpID0+IHRoaXMucmVhbExldmVscyxcbiAgICAgIGNoYW5uZWxDb3VudDogKGQpID0+IHRoaXMuY2hhbm5lbFN0YXRlcy5sZW5ndGggfHwgKGQuY2hhbm5lbHMgPz8gMSksXG4gICAgICBpc0dyYXlzY2FsZTogKCkgPT4gdGhpcy5pc0dyYXlzY2FsZUltYWdlLFxuICAgICAgLy8gTnVkZ2UgdGhlIGNoYW5uZWwtc3RhdGVzIHN0cmVhbSBzbyB0aGUgcGFuZSByZS1yZWFkcyBnZXRIaXN0b2dyYW0gbm93LFxuICAgICAgLy8gaW4gY2FzZSBpdHMgYm91bmRlZCByZXRyeSB3aW5kb3cgYWxyZWFkeSBsYXBzZWQuXG4gICAgICBvbkNoYW5uZWxIaXN0b2dyYW1zU2FtcGxlZDogKCkgPT4gdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGVzKHRoaXMuc3RvcmUuY3VycmVudENoYW5uZWxTdGF0ZXMoKSksXG4gICAgICBvbkdyYXlXaW5kb3dTYW1wbGVkOiAobWluLCBtYXgpID0+IHRoaXMuc2VlZEdyYXlXaW5kb3cobWluLCBtYXgpLFxuICAgIH0pO1xuICAgIHRoaXMuZW5zdXJlQ29sb3JtYXBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhY2tMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTG9hZGluZ1Byb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvc2NhbGVFdmVudCQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gIC8qKiBWaXNpYmxlIGltYWdlIHJlZ2lvbiAoZnVsbC1pbWFnZSBwaXhlbCBjb29yZHMpIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcywgc28gdGhlIGludGVuc2l0eSBpbnNldCBjYW4gcmUtc2FtcGxlIGF0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3BvcnRDaGFuZ2UkID0gbmV3IFN1YmplY3Q8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4oKTtcbiAgLy8gUmVnaW9uIHN0YXRlIChyZWdpb25zLCBzZWxlY3Rpb24sIHRoZSB1cGRhdGUgZXZlbnQpIGxpdmVzIGluIHRoZSBzaGFyZWRcbiAgLy8gUmVnaW9uU3RvcmU7IHRoZSBJUmVnaW9uU3RvcmUgbWV0aG9kcyBiZWxvdyBkZWxlZ2F0ZSB0byBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlQcm9maWxlJCA9IG5ldyBTdWJqZWN0PEludGVuc2l0eVByb2ZpbGVbXT4oKTtcbiAgLy8gSW1hZ2UgbWV0YWRhdGEgYW5kIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIGNvbG9ybWFwL3JldmVyc2Ugc28gT1NEIHJlY29sb3JzIGluXG4gICAqIGxvY2stc3RlcCB3aXRoIFBsb3RseS4gSWRlbXBvdGVudCBhbmQgc2VsZi1oZWFsaW5nOiB0aGlzIHNlcnZpY2UgaXMgYSByb290XG4gICAqIHNpbmdsZXRvbiwgYnV0IGB1bnN1YnNjcmliZSgpYCAoY2FsbGVkIG9uIFZpc3VhbGl6ZXJDb21wb25lbnQgZGVzdHJveSlcbiAgICogdGVhcnMgdGhlIHN1YnNjcmlwdGlvbiBkb3duIOKAlCBhbmQgdGhlIGNvbnN0cnVjdG9yIG5ldmVyIHJ1bnMgYWdhaW4uIFNvXG4gICAqIGBwbG90KClgIGNhbGxzIHRoaXMgdG8gcmUtZXN0YWJsaXNoIGl0IGFmdGVyIGEgY29tcG9uZW50IHRlYXJkb3duL3JlY3JlYXRlXG4gICAqIChlLmcuIHN3aXRjaGluZyBpbWFnZXMpLCBvdGhlcndpc2UgY29sb3JtYXAgY2hhbmdlcyB3b3VsZCBiZSBzaWxlbnRseVxuICAgKiBkcm9wcGVkIG9uIGV2ZXJ5IGltYWdlIGFmdGVyIHRoZSBmaXJzdCBzd2l0Y2guXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbG9ybWFwU3ViKSByZXR1cm47XG4gICAgLy8gQ29sb3JtYXAvcmV2ZXJzZSBsaXZlIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCB0aGUgc2luZ2xlIHNvdXJjZVxuICAgIC8vIG9mIHRydXRoIGZvciBib3RoIGJhY2tlbmRzLiBSZWJ1aWxkIHRoZSBMVVQgYW5kIHJlLXJ1biB0aGUgcGl4ZWwgcGlwZWxpbmVcbiAgICAvLyB3aGVuZXZlciBlaXRoZXIgY2hhbmdlcywgc28gT1NEIHJlY29sb3JzIGluIGxvY2stc3RlcCB3aXRoIFBsb3RseS5cbiAgICAvLyBDb2xvcm1hcC9yZXZlcnNlICsgcGVyLWNoYW5uZWwgd2luZG93L2dhbW1hL3Zpc2liaWxpdHkgKyBpbnZlcnQgYWxsIGxpdmUgaW5cbiAgICAvLyB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZS4gUmVidWlsZCB0aGUgTFVUIGFuZCByZS1ydW4gdGhlIHBpeGVsIHBpcGVsaW5lXG4gICAgLy8gd2hlbmV2ZXIgYW55IG9mIHRoZW0gY2hhbmdlcywgc28gdGhlIENoYW5uZWxzICYgSGlzdG9ncmFtIHBhbmUgdXBkYXRlcyB0aGVcbiAgICAvLyBpbWFnZSBsaXZlIGFuZCBPU0Qgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggUGxvdGx5LlxuICAgIHRoaXMuY29sb3JtYXBTdWIgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0UmV2ZXJzZVNjYWxlKCksXG4gICAgICB0aGlzLnN0b3JlLmdldENoYW5uZWxTdGF0ZXMoKSxcbiAgICAgIHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCksXG4gICAgXSkuc3Vic2NyaWJlKChbY20sIHJldiwgY2hhbm5lbHMsIGludmVydF0pID0+IHtcbiAgICAgIHRoaXMuY29sb3JMdXQgPSBidWlsZENvbG9ybWFwTHV0KGNtPy5kYXRhPy52YWx1ZSwgISFyZXYpO1xuICAgICAgdGhpcy5jaGFubmVsU3RhdGVzID0gY2hhbm5lbHM7XG4gICAgICB0aGlzLmludmVydEJnID0gISFpbnZlcnQ7XG4gICAgICAvLyBTZXJ2ZXJsZXNzIG11bHRpY2hhbm5lbDogcmUtY29tcG9zaXRlIHRoZSBjdXJyZW50IHNsaWNlIGZyb20gaXRzIGNhY2hlZFxuICAgICAgLy8gcGxhbmVzIHdpdGggdGhlIG5ldyBjaGFubmVsIHN0YXRlcyArIHJlLW9wZW4gKG5vIHRpbGUtaW52YWxpZGF0ZSBwYXRoKS5cbiAgICAgIGlmICh0aGlzLnNpbXBsZU11bHRpY2hhbm5lbCkgeyB2b2lkIHRoaXMucmVjb21wb3NpdGVBbmRPcGVuKCk7IHJldHVybjsgfVxuICAgICAgLy8gTXVsdGljaGFubmVsOiBlYWNoIGNoYW5uZWwgaXMgaXRzIG93biBUaWxlZEltYWdlIOKAlCB2aXNpYmlsaXR5IGlzIHRoZVxuICAgICAgLy8gaW1hZ2UncyBvcGFjaXR5ICh3aW5kb3cvZ2FtbWEvY29sb3VyIGFyZSBhcHBsaWVkIGJ5IHJlY29sb3JDaGFubmVsVGlsZVxuICAgICAgLy8gb24gdGhlIGludmFsaWRhdGUgYmVsb3cpLiBSZS1hcHBseWluZyB0aGUgY3VycmVudCBzbGljZSdzIHJldmVhbCBwaWNrcyB1cFxuICAgICAgLy8gdGhlIG5ldyBwZXItY2hhbm5lbCB2aXNpYmlsaXR5IChjYWNoZWQgc2xpY2VzIHN0YXkgaGlkZGVuKS5cbiAgICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgIHRoaXMuY2FjaGUucmV2ZWFsQ2hhbm5lbFNsaWNlKHRoaXMuY3VycmVudFopO1xuICAgICAgfVxuICAgICAgLy8gcmVxdWVzdEludmFsaWRhdGUodHJ1ZSkgcmVzdG9yZXMgZWFjaCB0aWxlIHRvIGl0cyBvcmlnaW5hbCBkYXRhIGJlZm9yZVxuICAgICAgLy8gcmUtcnVubmluZyByZWNvbG9yVGlsZSwgc28gYSBjaGFuZ2UgYWx3YXlzIG1hcHMgYWZyZXNoIChubyBjb21wb3VuZGluZykuXG4gICAgICAvLyBSR0Igbm93IHJlY29sb3JzIHRvbyAocGVyLWNoYW5uZWwgd2luZG93L3Zpc2liaWxpdHkpLCBzbyBkb24ndCBnYXRlIG9uXG4gICAgICAvLyBncmF5c2NhbGUuIENvYWxlc2NlZDogUHJpbWVORydzIHNsaWRlciBmaXJlcyAob25DaGFuZ2UpIGNvbnRpbnVvdXNseSwgc29cbiAgICAgIC8vIGEgc2luZ2xlIGRyYWcgd291bGQgb3RoZXJ3aXNlIHF1ZXVlIGRvemVucyBvZiBvdmVybGFwcGluZyByZXN0b3JlICtcbiAgICAgIC8vIHJlLXByb2Nlc3Mgcm91bmRzIG92ZXIgZXZlcnkgY2hhbm5lbCBpbWFnZS5cbiAgICAgIHRoaXMuc2NoZWR1bGVJbnZhbGlkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VlZCB0aGUgSW50ZW5zaXR5IGNoYW5uZWwgd2l0aCBhIG1lYXN1cmVkIGF1dG8td2luZG93IHdoaWxlIGl0J3Mgc3RpbGxcbiAgICogIGF0IGZ1bGwgcmFuZ2UgKG5ldmVyIGNsb2JiZXIgdGhlIHVzZXIncyBtYW51YWwgd2luZG93KTsgaWYgdGhlIHVzZXJcbiAgICogIGFscmVhZHkgd2luZG93ZWQsIGp1c3QgcmUtaW52YWxpZGF0ZSBzbyBwYWludGVkIHRpbGVzIHBpY2sgdGhlIExVVCB1cC4gKi9cbiAgcHJpdmF0ZSBzZWVkR3JheVdpbmRvdyhtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjaDAgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKClbMF07XG4gICAgaWYgKGNoMCAmJiBjaDAubWluID09PSAwICYmIGNoMC5tYXggPT09IDI1NSkge1xuICAgICAgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoMCwgeyBtaW4sIG1heCB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmlld2VyICYmIHRoaXMuY29sb3JMdXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8qIG5vLW9wICovXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAodGhpcy52aWV3ZXIgYXMgYW55KS5uYXZpZ2F0b3I/LndvcmxkPy5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcCAqL1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBJRGF0YVJlbmRlcmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgdGlsZS1zb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIHNlbGVjdGVkIGZpbGUuIFRoZSBgaW5mb2AgcGFyYW0gaXNcbiAgICogdGhlIGJhc2U2NCBSYXdGaWxlSW5mbyB0aGUgcmVzdCBvZiB0aGUgQVBJIHVzZXM7IHRoZSBHRVQgZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBhdXRoIGludGVyY2VwdG9yIChCZWFyZXIpLiBXZSBhbHNvIGdyYWIgYSB0b2tlbiBoZXJlIGZvciBPU0QncyBvd24gdGlsZVxuICAgKiBmZXRjaGVzIChpdHMgbG9hZGVyIGJ5cGFzc2VzIEh0dHBDbGllbnQpLlxuICAgKi9cbiAgYXN5bmMgbG9hZChpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTxPc2RMb2FkZWQ+IHtcbiAgICBjb25zdCBmaWxlbmFtZSA9IGltYWdlSW5mbz8uZmlsZU5hbWU7XG4gICAgLy8gQSBkaWZmZXJlbnQgaW1hZ2Ugd2FzIHNlbGVjdGVkIOKAlCBzdG9wIHRoZSBwcmV2aW91cyBzdGFjaydzIGJhY2tncm91bmRcbiAgICAvLyBsb2FkaW5nIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxldHRpbmcgaXQgZmluaXNoIGJlaGluZCB0aGUgbmV3IGltYWdlLlxuICAgIGlmIChmaWxlbmFtZSAmJiB0aGlzLmN1cnJlbnRGaWxlTmFtZSAmJiBmaWxlbmFtZSAhPT0gdGhpcy5jdXJyZW50RmlsZU5hbWUpIHtcbiAgICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAgIHRoaXMucmV2b2tlU2ltcGxlRnVsbFJlc1VybHMoKTtcbiAgICB9XG4gICAgdGhpcy5zaW1wbGVTdGFjay5ub3RlQWN0aXZlRmlsZShmaWxlbmFtZSk7XG4gICAgLy8gU2ltcGxlIChpbi1tZW1vcnkgLyBub24tdGlsZWQpIGltYWdlOiBza2lwIHRoZSB0aWxlIHNlcnZlciBlbnRpcmVseSDigJQgbm9cbiAgICAvLyBnZXRTZWxlY3RlZEluZm9CNjQsIG5vIC90aWxlcy9pbmZvIHBvbGwuIGB1cmxzW3pJbmRleF1gIGlzIGEgY29tcGxldGUgaW1hZ2VcbiAgICAvLyBPU0Qgb3BlbnMgdmlhIGl0cyBzaW5nbGUtaW1hZ2Ugc291cmNlIChzZWUgcGxvdCgpKS5cbiAgICBpZiAodGhpcy5zaW1wbGVTdGFjay5pc1NpbXBsZShpbWFnZUluZm8pKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2FkU2ltcGxlKGltYWdlSW5mbywgekluZGV4KTtcbiAgICB9XG4gICAgY29uc3QgaW5mb0I2NCA9IHRoaXMudGlsZXMuZ2V0U2VsZWN0ZWRJbmZvQjY0KCk7XG4gICAgaWYgKCFpbmZvQjY0KSByZXR1cm4geyBkZXNjcmlwdG9yOiBudWxsLCBpbmZvQjY0OiAnJywgejogekluZGV4IHx8IDAsIGZpbGVuYW1lIH07XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5hdXRoSGVhZGVycyA9IGF3YWl0IHRoaXMudGlsZXMuZ2V0QXV0aEhlYWRlcnMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuYXV0aEhlYWRlcnMgPSB7fTsgLy8gZmFsbCBiYWNrIHRvIGNvb2tpZSBhdXRoIChhamF4V2l0aENyZWRlbnRpYWxzKVxuICAgIH1cbiAgICAvLyBQb2xsIC90aWxlcy9pbmZvOiB0aGUgYmFja2VuZCByZXR1cm5zIDIwMiB3aGlsZSB0aGUgc291cmNlIGZpbGUgaXMgc3RpbGxcbiAgICAvLyBiZWluZyBjYWNoZWQgKEdDUy0+UFZDKSDigJQgaXQga2lja3MgdGhlIGRvd25sb2FkIG9mZiBpbiB0aGUgYmFja2dyb3VuZCwgc29cbiAgICAvLyBlYWNoIHJlcXVlc3QgaXMgc2hvcnQgKG5vIGxvbmctaGVsZCBjb25uZWN0aW9uIHRvIHRyaXAgaW5ncmVzcy9wcm94eSBvclxuICAgIC8vIGNsaWVudCB0aW1lb3V0cyksIGFuZCAyMDAgd2l0aCB0aGUgZGVzY3JpcHRvciBvbmNlIGl0J3MgcmVhZHkuIFRoZVxuICAgIC8vIGNhY2hlLXByb2dyZXNzIG92ZXJsYXkgc2hvd3MgcHJvZ3Jlc3MgZHVyaW5nIHRoZSB3YWl0LiBXZSBnaXZlIHVwIGFmdGVyXG4gICAgLy8gdGlsZXNJbmZvVGltZW91dE1zIHNvIHRoZSByZW5kZXIgcGlwZWxpbmUgbmV2ZXIgaGFuZ3MgKHRoZSByb3V0ZXIgdGhlblxuICAgIC8vIGZhbGxzIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlKS5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaX10aWxlcy9pbmZvP2luZm89JHtpbmZvQjY0fWA7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy50aWxlc0luZm9UaW1lb3V0TXM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKERhdGUubm93KCkgPiBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RpbGVzL2luZm8gbm90IHJlYWR5IGJlZm9yZSBkZWFkbGluZSDigJQgZmlsZSBzdGlsbCBjYWNoaW5nJyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxUaWxlRGVzY3JpcHRvcj4odXJsLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZSh0aW1lb3V0KDQ1MDAwKSksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gMjAwICYmIHJlc3AuYm9keSkge1xuICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IHJlc3AuYm9keTtcbiAgICAgICAgICByZXR1cm4geyBkZXNjcmlwdG9yOiByZXNwLmJvZHksIGluZm9CNjQsIHo6IHpJbmRleCB8fCAwLCBmaWxlbmFtZSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIDIwMiBBY2NlcHRlZCAob3IgZW1wdHkgYm9keSkg4oaSIHN0aWxsIGNhY2hpbmc7IGZhbGwgdGhyb3VnaCBhbmQgcmUtcG9sbC5cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBUb2xlcmF0ZSB0cmFuc2llbnQgZmFpbHVyZXMgV0hJTEUgdGhlIGZpbGUgaXMgYmVpbmcgcHJlcGFyZWQ6IGEgc2xvd1xuICAgICAgICAvLyBtZXRhZGF0YSByZWFkIG9uIGEgbXVsdGktR0IgZmlsZSAoSUZEIHdhbGspLCBhIDV4eCBtaWQtcGlwZWxpbmUsIGFcbiAgICAgICAgLy8gcHJveHkgaGljY3VwLiBBIHNpbmdsZSBiYWQgcG9sbCBtdXN0IE5PVCBkcm9wIHVzIHRvIFBsb3RseSDigJQgYSBsYXJnZVxuICAgICAgICAvLyBpbWFnZSBhbHdheXMgcGFzc2VzIHRocm91Z2ggdGhpcyBidXN5IHdpbmRvdywgc28gYmFpbGluZyBoZXJlIGlzIHdoeVxuICAgICAgICAvLyBpdCBcImFsd2F5cyBlbmRzIHVwIG9uIFBsb3RseVwiLiBLZWVwIHBvbGxpbmcgdW50aWwgcmVhZHkgb3IgZGVhZGxpbmUuXG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gdGlsZXMvaW5mbyBwb2xsIHJldHJ5JywgZXJyKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDE1MDApKTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgdGhlIGBwbG90KClgIHBheWxvYWQgZm9yIGEgc2ltcGxlICh0aWxlZDpmYWxzZSkgaW1hZ2U6IGEgc2luZ2xlLWxldmVsXG4gICAqICBkZXNjcmlwdG9yIHNpemVkIGZyb20gYHRydWVJbWFnZVNpemVgLCBwbHVzIHRoZSBkaXJlY3RseS1sb2FkYWJsZSBVUkwg4oCUXG4gICAqICByZXNvbHZlZCBhbmQgZmV0Y2hlZCB2aWEge0BsaW5rIFNpbXBsZVNsaWNlQWNjZXNzU2VydmljZX0gKHNoYXJlZCB3aXRoXG4gICAqICBuYXBhcmktanM7IHNlZSBpdHMgZG9jcyBmb3Igd2h5IHRoaXMgY2FuJ3QgYmUgYSByYXcgYGZldGNoKClgL2A8aW1nPmApLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRTaW1wbGUoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8T3NkTG9hZGVkPiB7XG4gICAgY29uc3QgeiA9IHpJbmRleCB8fCAwO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmF1dGhIZWFkZXJzID0ge307XG4gICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gaW1hZ2VJbmZvLnRydWVJbWFnZVNpemUgPz8gWzAsIDBdO1xuICAgIGNvbnN0IG1ldGEgPSBpbWFnZUluZm8uaW1hZ2VNZXRhPy5bMF07XG4gICAgLy8gU0VSVkVSTEVTUyBNVUxUSUNIQU5ORUw6IGNvbXBvc2l0ZSB0aGUgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXNcbiAgICAvLyBjbGllbnQtc2lkZSAobm8gdGlsZSBzZXJ2ZXIpLCBkcml2ZW4gYnkgdGhlIGNoYW5uZWwgcGFuZS4gS2VwdCBPRkYgdGhlXG4gICAgLy8gdGlsZWQgaXNNdWx0aUNoYW5uZWwgcGF0aCAoc2VlIGNvbXBvc2l0ZVNpbXBsZU11bHRpY2hhbm5lbCkuXG4gICAgY29uc3QgY2hVcmxzID0gaW1hZ2VJbmZvLmNoYW5uZWxVcmxzO1xuICAgIHRoaXMuc2ltcGxlTXVsdGljaGFubmVsID0gISFjaFVybHM/Lmxlbmd0aCAmJiAobWV0YT8uY2hhbm5lbENvdW50ID8/IDEpID4gMTtcbiAgICBsZXQgdXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzID0gY2hVcmxzIGFzIHN0cmluZ1tdW107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKGNoVXJscyFbel0gPz8gY2hVcmxzIVswXSk7XG4gICAgICAgIHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgIC8vIE5COiBoaXN0b2dyYW1zIGFyZSBiaW5uZWQgaW4gcGxvdCgpLCBBRlRFUiBkZXN0cm95Vmlld2VyIGNsZWFycyB0aGVcbiAgICAgICAgLy8gc2FtcGxlciDigJQgY29tcHV0aW5nIHRoZW0gaGVyZSB3b3VsZCBiZSB3aXBlZCBieSB0aGF0IGNsZWFyLlxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlIG11bHRpY2hhbm5lbCBjb21wb3NpdGUgZmFpbGVkJywgZXJyKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsVXJscyA9IFtdO1xuICAgICAgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzID0gW107XG4gICAgICBjb25zdCByYXdVcmwgPSB0aGlzLnNpbXBsZVN0YWNrLnVybEZvcihpbWFnZUluZm8sIHopO1xuICAgICAgaWYgKHJhd1VybCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybCk7XG4gICAgICAgICAgLy8gVXBzY2FsZSB0aGUgKGRvd25zY2FsZWQpIHByZXZpZXcgdG8gZnVsbCByZXNvbHV0aW9uIHNvIE9TRCdzIHdvcmxkXG4gICAgICAgICAgLy8gbWF0Y2hlcyB0aGUgZnVsbC1yZXMgUk9JIGNvb3JkaW5hdGUgc3BhY2Ug4oCUIHNlZSB0b0Z1bGxSZXNVcmwuXG4gICAgICAgICAgdXJsID0gYXdhaXQgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW09TRF0gc2ltcGxlLW1vZGUgc2xpY2UgZmV0Y2ggZmFpbGVkJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBObyBsb2FkYWJsZSBVUkwgKGVtcHR5IHVybHNbXSBvciB0aGUgZmV0Y2ggZmFpbGVkKTogc2lnbmFsIFwiY291bGRuJ3RcbiAgICAvLyBsb2FkXCIgd2l0aCBhIG51bGwgZGVzY3JpcHRvciDigJQgc2FtZSBhcyB0aGUgdGlsZWQgcGF0aCB3aGVuIHRoZXJlJ3Mgbm9cbiAgICAvLyBzZWxlY3RlZC1maWxlIGluZm8g4oCUIHNvIHBsb3QoKSByZXR1cm5zIGZhbHNlIChpdHMgYGlmICghZClgIGd1YXJkKSBhbmRcbiAgICAvLyB0aGUgcm91dGVyIGNhbiBmYWxsIGJhY2ssIGluc3RlYWQgb2YgbW91bnRpbmcgYW4gPGltZz4gd2l0aCBhbiB1bmRlZmluZWRcbiAgICAvLyBzcmMgdGhhdCB0aHJvd3MgYXQgcnVudGltZS5cbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBzbGljZSBoYXMgbm8gbG9hZGFibGUgVVJMOyBza2lwcGluZyBPU0QgcmVuZGVyJywgZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIHsgZGVzY3JpcHRvcjogbnVsbCwgaW5mb0I2NDogJycsIHosIGZpbGVuYW1lIH07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3I6IFRpbGVEZXNjcmlwdG9yID0ge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aWxlU2l6ZTogMCwgICAgICAgICAgICAvLyB1bnVzZWQ6IHNpbXBsZSBtb2RlIG5ldmVyIGNhbGxzIGJ1aWxkVGlsZVNvdXJjZVxuICAgICAgejogMSwgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlIGZyYW1lXG4gICAgICBjaGFubmVsczogbWV0YT8ucmdiQ2hhbm5lbHMgPz8gKGltYWdlSW5mby5pc0dyYXlzY2FsZSA/IDEgOiAzKSxcbiAgICAgIG11bHRpY2hhbm5lbDogZmFsc2UsXG4gICAgICByZWFsTGV2ZWxzOiAxLFxuICAgICAgbGV2ZWxzOiBbeyByZXM6IDAsIHdpZHRoLCBoZWlnaHQgfV0sXG4gICAgICBtcHBYOiBtZXRhPy5tcHBYID8/IDAsXG4gICAgICBtcHBZOiBtZXRhPy5tcHBZID8/IDAsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZGVzY3JpcHRvcixcbiAgICAgIGluZm9CNjQ6ICcnLFxuICAgICAgeixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc2ltcGxlOiB0cnVlLFxuICAgICAgdXJsLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogT1NEJ3MgYHt0eXBlOidpbWFnZSd9YCBzb3VyY2Ugc2l6ZXMgaXRzIGNvb3JkaW5hdGUgd29ybGQgdG8gdGhlIGltYWdlJ3NcbiAgICogTkFUVVJBTCBwaXhlbHMuIEEgZm9sZGVyLXN0YWNrIHNsaWNlIGlzIGEgc2VydmVyIGAvcHJldmlld2Agd2hvc2UgcGl4ZWwgc2l6ZVxuICAgKiBuZWVkbid0IG1hdGNoIHRoZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ug4oCUIGl0IG1heSBiZSBkb3duc2NhbGVkIChsYXJnZVxuICAgKiBpbWFnZXMpIE9SIGxhcmdlciB0aGFuIHRoZSBkaW1lbnNpb25zIGAvbWV0YWRhdGFgIHJlcG9ydHMuIEVpdGhlciB3YXkgT1NEJ3NcbiAgICogd29ybGQgd291bGQgZGlmZmVyIGZyb20gdGhlIGZ1bGwtcmVzIFJPSSBjb29yZGluYXRlIHNwYWNlIChRdVBhdGggZ2VvanNvbixcbiAgICogaW4gbGV2ZWwtMCBwaXhlbHMpOiBhIHNtYWxsZXIgcHJldmlldyByZW5kZXJzIFJPSXMgb3ZlcnNpemVkLCBhIGxhcmdlciBvbmVcbiAgICogcmVuZGVycyB0aGVtIHVuZGVyc2l6ZWQvb2Zmc2V0LiBSZXNhbXBsZSB0aGUgcHJldmlldyB0byBFWEFDVExZIHRoZVxuICAgKiBmdWxsLXJlc29sdXRpb24gZGltZW5zaW9ucyAoYmx1cnJ5IGJ1dCBwb3NpdGlvbmFsbHkgZXhhY3Qg4oCUIHNjYWxpbmcgdXAgb3JcbiAgICogZG93biBhcyBuZWVkZWQpIHNvIE9TRCdzIHdvcmxkIG1hdGNoZXMgdGhlIFJPSSBjb29yZGluYXRlIHNwYWNlLCB3aGlsZSBzdGlsbFxuICAgKiB1c2luZyBPU0QncyByZWxpYWJsZSBzaW5nbGUtaW1hZ2UgcmVuZGVyZXIuIENhY2hlZCBwZXIgcHJldmlldyBVUkwgKHJldm9rZWRcbiAgICogb24gZmlsZSBjaGFuZ2UpOyBhIG5vLW9wIHdoZW4gdGhlIHByZXZpZXcgaXMgYWxyZWFkeSBleGFjdGx5IGZ1bGwtcmVzIChzbWFsbFxuICAgKiBpbWFnZXMsIGluLW1lbW9yeSBwaXBlbGluZSBibG9icyksIHdoZW4gdGhlIGRpbXMgYXJlIHVua25vd24sIG9yIHdoZW5cbiAgICogdGhleSdyZSBpbXBsYXVzaWJseSBsYXJnZSAoZ3VhcmRzIGFnYWluc3QgYW4gZW5vcm1vdXMgY2FudmFzKS4gKGppdC11aSM5MylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdG9GdWxsUmVzVXJsKHByZXZpZXdVcmw6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghd2lkdGggfHwgIWhlaWdodCB8fCBNYXRoLm1heCh3aWR0aCwgaGVpZ2h0KSA+IHRoaXMuU0lNUExFX1VQU0NBTEVfTUFYX0RJTSkgcmV0dXJuIHByZXZpZXdVcmw7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zaW1wbGVGdWxsUmVzVXJscy5nZXQocHJldmlld1VybCk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIHRyeSB7XG4gICAgICBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHByZXZpZXdVcmw7IC8vIGNvdWxkbid0IGRlY29kZSDigJQgbGV0IE9TRCB0cnkgdGhlIFVSTCBhcy1pc1xuICAgIH1cbiAgICAvLyBBbHJlYWR5IHRoZSBleGFjdCBmdWxsLXJlcyB3b3JsZCDigJQgbm8gcmVzYW1wbGUgbmVlZGVkLiAoQSBwcmV2aWV3IHRoYXQgaXNcbiAgICAvLyBsYXJnZXIgT1Igc21hbGxlciB0aGFuIGZ1bGwtcmVzIG11c3Qgc3RpbGwgYmUgcmVzaXplZCBzbyBPU0QncyB3b3JsZCA9PVxuICAgIC8vIHRoZSBST0kgY29vcmRpbmF0ZSBzcGFjZTsgb25seSBhbiBleGFjdCBtYXRjaCBpcyBza2lwcGFibGUuKVxuICAgIGlmIChpbWcubmF0dXJhbFdpZHRoID09PSB3aWR0aCAmJiBpbWcubmF0dXJhbEhlaWdodCA9PT0gaGVpZ2h0KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7IC8vIHNjYWxlIHByZXZpZXcgKHVwIG9yIGRvd24pIHRvIGZ1bGwtcmVzXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPigocmVzb2x2ZSkgPT4gY2FudmFzLnRvQmxvYihyZXNvbHZlKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gcHJldmlld1VybDtcbiAgICBjb25zdCBmdWxsUmVzVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLnNldChwcmV2aWV3VXJsLCBmdWxsUmVzVXJsKTtcbiAgICByZXR1cm4gZnVsbFJlc1VybDtcbiAgfVxuXG4gIC8qKiBTYW1wbGUgYSBTSU1QTEUtbW9kZSBzbGljZSdzIG93biBkZWNvZGVkIHBpeGVscyBpbnRvIHRoZSBoaXN0b2dyYW0g4oCUIHRoZVxuICAgKiAgc2VydmVybGVzcyBhbmFsb2cgb2YgdGhlIHRpbGVkIHNhbXBsZXJzIChubyB0aWxlIHNlcnZlcikuIEZpcmUtYW5kLWZvcmdldDtcbiAgICogIGEgZGVjb2RlIGZhaWx1cmUganVzdCBsZWF2ZXMgdGhlIHBhbmUgZW1wdHkgcmF0aGVyIHRoYW4gdGhyb3dpbmcuICovXG4gIHByaXZhdGUgYXN5bmMgc2FtcGxlU2ltcGxlSGlzdG9ncmFtKHVybDogc3RyaW5nIHwgdW5kZWZpbmVkLCB6OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHVybCk7XG4gICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgaWYgKCF3IHx8ICFoKSByZXR1cm47XG4gICAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjLndpZHRoID0gdzsgYy5oZWlnaHQgPSBoO1xuICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHcsIGgpLmRhdGE7XG4gICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZVNpbXBsZUhpc3RvZ3JhbSh6LCBkYXRhLCB0aGlzLmlzR3JheXNjYWxlSW1hZ2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzaW1wbGUtbW9kZSBoaXN0b2dyYW0gc2FtcGxlIGZhaWxlZCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoICsgZGVjb2RlIGEgc2xpY2UncyBwZXItY2hhbm5lbCBwbGFuZXMgKHNpbmdsZS1iYW5kIGdyYXlzY2FsZSkgaW50b1xuICAgKiAgcGl4ZWwgYnVmZmVycywgZm9yIHRoZSBTRVJWRVJMRVNTIG11bHRpY2hhbm5lbCBjb21wb3NpdG9yLiBBdXRoLXNhZmU6IGdvZXNcbiAgICogIHRocm91Z2ggU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChibG9iOi9kYXRhOiBhcy1pczsgaHR0cCB2aWEgSHR0cENsaWVudCkuICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZFNpbXBsZUNoYW5uZWxQbGFuZXModXJsczogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwbGFuZXM6IEFycmF5PHsgZGF0YTogVWludDhDbGFtcGVkQXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+ID0gW107XG4gICAgZm9yIChjb25zdCB1IG9mIHVybHMgPz8gW10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByZXZpZXdVcmwgPSBhd2FpdCB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHUpO1xuICAgICAgICBjb25zdCBpbWcgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUVsKHByZXZpZXdVcmwpO1xuICAgICAgICBjb25zdCB3ID0gaW1nLm5hdHVyYWxXaWR0aCwgaCA9IGltZy5uYXR1cmFsSGVpZ2h0O1xuICAgICAgICBpZiAoIXcgfHwgIWgpIHsgcGxhbmVzLnB1c2goeyBkYXRhOiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCksIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7IGNvbnRpbnVlOyB9XG4gICAgICAgIGNvbnN0IGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgYy53aWR0aCA9IHc7IGMuaGVpZ2h0ID0gaDtcbiAgICAgICAgY29uc3QgY3R4ID0gYy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgICBpZiAoIWN0eCkgeyBwbGFuZXMucHVzaCh7IGRhdGE6IG5ldyBVaW50OENsYW1wZWRBcnJheSgwKSwgd2lkdGg6IDAsIGhlaWdodDogMCB9KTsgY29udGludWU7IH1cbiAgICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDApO1xuICAgICAgICBwbGFuZXMucHVzaCh7IGRhdGE6IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCkuZGF0YSwgd2lkdGg6IHcsIGhlaWdodDogaCB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tPU0RdIGNoYW5uZWwgcGxhbmUgZGVjb2RlIGZhaWxlZCcsIGVycik7XG4gICAgICAgIHBsYW5lcy5wdXNoKHsgZGF0YTogbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApLCB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMgPSBwbGFuZXM7XG4gIH1cblxuICAvKiogQ29tcG9zaXRlIHRoZSBjYWNoZWQgcGVyLWNoYW5uZWwgcGxhbmVzIGludG8gT05FIFJHQkEgaW1hZ2UgdXNpbmcgdGhlXG4gICAqICBjdXJyZW50IGNoYW5uZWwgc3RhdGVzIChjb2xvdXIvd2luZG93L2dhbW1hL3Zpc2liaWxpdHkpIOKAlCB0aGUgY2xpZW50LXNpZGUsXG4gICAqICBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgcGVyLWNoYW5uZWwgJ2xpZ2h0ZXInIGNvbXBvc2l0b3JcbiAgICogIChzYW1lIGRpc3BsYXkuY2hhbm5lbFJnYkx1dCBtYXRoIGFzIHJlY29sb3JDaGFubmVsVGlsZSwgYXBwbGllZCBwZXItcGxhbmUpLlxuICAgKiAgUmV0dXJucyBhIGJsb2I6IFVSTCBvZiB0aGUgY29tcG9zaXRlIFBORywgcmV2b2tpbmcgdGhlIHByZXZpb3VzIG9uZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBwbGFuZXMgPSB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXM7XG4gICAgaWYgKCFwbGFuZXMubGVuZ3RoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHcgPSBwbGFuZXNbMF0ud2lkdGgsIGggPSBwbGFuZXNbMF0uaGVpZ2h0O1xuICAgIGlmICghdyB8fCAhaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZXMgPSB0aGlzLnN0b3JlLmN1cnJlbnRDaGFubmVsU3RhdGVzKCk7XG4gICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHcgKiBoICogNCk7XG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBwbGFuZXMubGVuZ3RoOyBjKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc3RhdGVzW2NdO1xuICAgICAgaWYgKHN0ICYmIHN0LnZpc2libGUgPT09IGZhbHNlKSBjb250aW51ZTsgLy8gaGlkZGVuIGNoYW5uZWwgY29udHJpYnV0ZXMgbm90aGluZ1xuICAgICAgY29uc3QgcGxhbmUgPSBwbGFuZXNbY107XG4gICAgICBpZiAocGxhbmUud2lkdGggIT09IHcgfHwgcGxhbmUuaGVpZ2h0ICE9PSBoIHx8ICFwbGFuZS5kYXRhLmxlbmd0aCkgY29udGludWU7XG4gICAgICBjb25zdCB7IHIsIGcsIGIgfSA9IHRoaXMuZGlzcGxheS5jaGFubmVsUmdiTHV0KHN0KTtcbiAgICAgIGNvbnN0IHBkID0gcGxhbmUuZGF0YTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAgIGlmIChwZFtpICsgM10gPT09IDApIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsdW0gPSBwZFtpXTsgLy8gc2luZ2xlLWJhbmQgcGxhbmUgKFI9Rz1CKVxuICAgICAgICBvdXRbaV0gKz0gcltsdW1dOyAgICAgICAgICAvLyBVaW50OENsYW1wZWRBcnJheSBjbGFtcHMg4oaSIGFkZGl0aXZlICgnbGlnaHRlcicpXG4gICAgICAgIG91dFtpICsgMV0gKz0gZ1tsdW1dO1xuICAgICAgICBvdXRbaSArIDJdICs9IGJbbHVtXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDM7IGkgPCBvdXQubGVuZ3RoOyBpICs9IDQpIG91dFtpXSA9IDI1NTsgLy8gb3BhcXVlXG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdzsgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY3R4LnB1dEltYWdlRGF0YShuZXcgSW1hZ2VEYXRhKG91dCwgdywgaCksIDAsIDApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4oKHJlcykgPT4gY2FudmFzLnRvQmxvYihyZXMsICdpbWFnZS9wbmcnKSk7XG4gICAgaWYgKCFibG9iKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCkgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCk7XG4gICAgdGhpcy5zaW1wbGVDb21wb3NpdGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHJldHVybiB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybDtcbiAgfVxuXG4gIC8qKiBSZS1jb21wb3NpdGUgdGhlIGN1cnJlbnQgc2xpY2UgZnJvbSBpdHMgY2FjaGVkIHBsYW5lcyAobmV3IGNoYW5uZWwgc3RhdGVzKVxuICAgKiAgYW5kIHJlLW9wZW4g4oCUIHRoZSBzZXJ2ZXJsZXNzIGFuYWxvZyBvZiB0aGUgdGlsZWQgaW52YWxpZGF0ZS1vbi1jaGFubmVsLWNoYW5nZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyByZWNvbXBvc2l0ZUFuZE9wZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5jb21wb3NpdGVTaW1wbGVNdWx0aWNoYW5uZWwoKTtcbiAgICBpZiAoIXVybCB8fCAhdGhpcy52aWV3ZXIpIHJldHVybjtcbiAgICB0cnkgeyB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTsgfSBjYXRjaCB7IC8qIHZpZXdlciBnb25lICovIH1cbiAgfVxuXG4gIC8qKiBMb2FkIGEgVVJMIGludG8gYW4gSFRNTEltYWdlRWxlbWVudCAocmVzb2x2ZXMgb25jZSBkZWNvZGVkKS4gVXNlc1xuICAgKiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCByYXRoZXIgdGhhbiBgbmV3IEltYWdlKClgIGJlY2F1c2UgdGhpcyBmaWxlJ3NcbiAgICogIGBJbWFnZWAgaW1wb3J0IGlzIGltYWdlLWpzJ3MgZGVjb2Rlciwgbm90IHRoZSBET00gZWxlbWVudC4gKi9cbiAgcHJpdmF0ZSBsb2FkSW1hZ2VFbCh1cmw6IHN0cmluZyk6IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltZyk7XG4gICAgICBpbWcub25lcnJvciA9IChlKSA9PiByZWplY3QoZSk7XG4gICAgICBpbWcuc3JjID0gdXJsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXZva2VTaW1wbGVGdWxsUmVzVXJscygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHUgb2YgdGhpcy5zaW1wbGVGdWxsUmVzVXJscy52YWx1ZXMoKSkgVVJMLnJldm9rZU9iamVjdFVSTCh1KTtcbiAgICB0aGlzLnNpbXBsZUZ1bGxSZXNVcmxzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuc2ltcGxlQ29tcG9zaXRlVXJsKSB7IFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zaW1wbGVDb21wb3NpdGVVcmwpOyB0aGlzLnNpbXBsZUNvbXBvc2l0ZVVybCA9IG51bGw7IH1cbiAgfVxuXG4gIC8qKiBNb3VudCB0aGUgdmlld2VyIHdpdGggYSBjdXN0b20gdGlsZSBzb3VyY2UgcG9pbnRpbmcgYXQgYEdFVCAvdGlsZWAuICovXG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiBhbnksXG4gICAgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLFxuICAgIF9zY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBfcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBsb2FkZWQgPSBpbWFnZUxvYWRlZCBhcyBPc2RMb2FkZWQ7XG4gICAgY29uc3QgZCA9IGxvYWRlZD8uZGVzY3JpcHRvcjtcbiAgICBpZiAoIWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgIC8vIFJlLWVzdGFibGlzaCB0aGUgY29sb3JtYXAgc3Vic2NyaXB0aW9uIGlmIGEgcHJpb3IgY29tcG9uZW50IHRlYXJkb3duXG4gICAgLy8gKHVuc3Vic2NyaWJlKCkpIHRvcmUgaXQgZG93biDigJQgdGhpcyBzZXJ2aWNlIGlzIGEgcm9vdCBzaW5nbGV0b24sIHNvIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yIHdvbid0IHJ1biBhZ2FpbiB0byByZWNyZWF0ZSBpdC5cbiAgICB0aGlzLmVuc3VyZUNvbG9ybWFwU3Vic2NyaXB0aW9uKCk7XG4gICAgLy8gT1NEIHRpbGVzIG5hdGl2ZWx5LCBzbyB0aGUgaW4tcGxhY2UgKGxhcmdlKSBwYXNzIGlzIG5vcm1hbGx5IGEgbm8tb3BcbiAgICAvLyBvbmNlIG1vdW50ZWQg4oCUIHRoZSB0aWxlIHB5cmFtaWQgSVMgdGhlIGZ1bGwgcmVzb2x1dGlvbiByZWdhcmRsZXNzIG9mXG4gICAgLy8gd2hpY2ggSW1hZ2VJbmZvIHRpZXIgcmVxdWVzdGVkIGl0LiBTaW1wbGUgbW9kZSBoYXMgbm8gcHlyYW1pZCB0byBmYWxsXG4gICAgLy8gYmFjayBvbjogaXQgZGlzcGxheXMgbGl0ZXJhbGx5IHdoYXRldmVyIFVSTCB3YXMgbGFzdCBvcGVuZWQsIHNvXG4gICAgLy8gd2l0aG91dCB0aGlzIHN3YXAgdGhlIHNtYWxsIHRpZXIncyAxMjhweCBwbGFjZWhvbGRlciB3b3VsZCBzdGF5IG9uXG4gICAgLy8gc2NyZWVuIGZvcmV2ZXIgKHBpeGVsYXRlZCwgbmV2ZXIgXCJzaGFycGVuaW5nXCIgbGlrZSB0aGUgdGlsZWQgcGF0aCkuXG4gICAgaWYgKGluUGxhY2UgJiYgdGhpcy52aWV3ZXIpIHtcbiAgICAgIGlmIChsb2FkZWQuc2ltcGxlICYmIGxvYWRlZC51cmwpIHtcbiAgICAgICAgLy8gQWxzbyByZWZyZXNoIHNpbXBsZVVybHMgdG8gVEhJUyBwaGFzZSdzIChsYXJnZS10aWVyKSB1cmxzW10g4oCUIGl0IHdhc1xuICAgICAgICAvLyBzZXQgZnJvbSB0aGUgc21hbGwgdGllcidzIDEyOHB4IHVybHMgb24gdGhlIGluaXRpYWwgbW91bnQgYmVsb3csXG4gICAgICAgIC8vIHdoaWNoIG5ldmVyIHJ1bnMgYWdhaW4gZm9yIHRoZSBpbi1wbGFjZSBwYXNzLiBXaXRob3V0IHRoaXMsXG4gICAgICAgIC8vIHNldFpJbmRleCdzIGxhdGVyIHNsaWRlciBzY3J1YnMgd291bGQga2VlcCByZWFkaW5nIHRoZSBzbWFsbFxuICAgICAgICAvLyB0aWVyJ3MgbG93LXJlcyBVUkxzIGZvcmV2ZXIsIGV2ZW4gdGhvdWdoIHRoZSBpbml0aWFsIHNsaWNlIHdhc1xuICAgICAgICAvLyBjb3JyZWN0bHkgc3dhcHBlZCB0byBmdWxsIHJlc29sdXRpb24gaGVyZS5cbiAgICAgICAgdGhpcy5zaW1wbGVVcmxzID0gaW1hZ2VJbmZvPy51cmxzID8/IHRoaXMuc2ltcGxlVXJscztcbiAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybDogbG9hZGVkLnVybCB9IGFzIGFueSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIHRoaXMuY3VycmVudEZpbGVOYW1lID0gaW1hZ2VJbmZvPy5maWxlTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0b3IgPSBkO1xuICAgIHRoaXMuaW5mb0I2NCA9IGxvYWRlZC5pbmZvQjY0O1xuICAgIHRoaXMuY3VycmVudFogPSBsb2FkZWQuejtcbiAgICB0aGlzLnNpbXBsZU1vZGUgPSAhIWxvYWRlZC5zaW1wbGU7XG4gICAgdGhpcy5zaW1wbGVVcmxzID0gbG9hZGVkLnNpbXBsZSA/IChpbWFnZUluZm8/LnVybHMgPz8gW10pIDogW107XG4gICAgLy8gVGhlIGRlc2NyaXB0b3IncyBwaHlzaWNhbCBwaXhlbCBzaXplIChzZXJ2ZXIgQmlvLUZvcm1hdHMgYC90aWxlcy9pbmZvYCkgaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBwdXNoIGl0IGludG8gdGhlIHNoYXJlZCBtZXRhIHNvIHRoZSBSZWdpb24gRWRpdG9yIHJlcG9ydHNcbiAgICAvLyBhcmVhcyBpbiDCtW3Csi9tbcKyLCBtYXRjaGluZyB0aGUgc2NhbGUgYmFyIGJ1aWx0IGZyb20gYGQubXBwWGAgYmVsb3cuXG4gICAgdGhpcy5zdG9yZS5zZXRQaHlzaWNhbFBpeGVsU2l6ZShkLm1wcFgsIGQubXBwWSk7XG4gICAgLy8gVXNlIHRoZSBTQU1FIGdyYXlzY2FsZSBmbGFnIHRoZSBjb2xvcm1hcCBkcm9wZG93biAvIFBsb3RseSB1c2VcbiAgICAvLyAoaW1hZ2VJbmZvLmlzR3JheXNjYWxlIOKGkCByZ2JDaGFubmVscyA9PT0gMSkuIFRoZSBkZXNjcmlwdG9yJ3MgYGNoYW5uZWxzYFxuICAgIC8vIChjaGFubmVsQ291bnQpIGRpdmVyZ2VzIGZyb20gcmdiQ2hhbm5lbHMgZm9yIHN0YWNrcywgd2hpY2ggbGVmdCBncmF5c2NhbGVcbiAgICAvLyBzdGFja3MgdW4tcmVjb2xvcmVkIGV2ZW4gdGhvdWdoIHRoZSBjb2xvcm1hcCBzZWxlY3RvciB3YXMgc2hvd24uXG4gICAgdGhpcy5pc0dyYXlzY2FsZUltYWdlID0gISFpbWFnZUluZm8/LmlzR3JheXNjYWxlO1xuICAgIC8vIFNpbXBsZSAobm9uLXRpbGVkLCBpbi1tZW1vcnkpIGltYWdlOiBubyBweXJhbWlkLCBubyBwZXItY2hhbm5lbCB0aWxlcywgYW5kXG4gICAgLy8gbm8gc2VydmVyLXNpZGUgaW50ZW5zaXR5IHNhbXBsaW5nIOKAlCBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXNcbiAgICAvLyB1cmxzW3pdIGRpcmVjdGx5LiBTa2lwIHRoZSB3aG9sZSB0aWxlZC1zZXR1cCBwYXRoIGJlbG93LlxuICAgIGNvbnN0IHNpbXBsZSA9ICEhbG9hZGVkLnNpbXBsZTtcbiAgICBpZiAoc2ltcGxlKSB7XG4gICAgICB0aGlzLnJlYWxMZXZlbHMgPSAxO1xuICAgICAgdGhpcy5pc011bHRpQ2hhbm5lbCA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2VydmVybGVzcyBoaXN0b2dyYW0g4oCUIEFGVEVSIGRlc3Ryb3lWaWV3ZXIgKGl0cyBsYXN0IGFjdCBpcyBzYW1wbGVyLmNsZWFyKCkpLlxuICAgICAgLy8gTXVsdGljaGFubmVsIGJpbnMgZWFjaCBjYWNoZWQgY2hhbm5lbCBwbGFuZTsgc2luZ2xlLWJhbmQgLyBSR0IgYmlucyB0aGVcbiAgICAgIC8vIGRlY29kZWQgZnJhbWUncyBvd24gcGl4ZWxzLlxuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyhsb2FkZWQueiwgdGhpcy5zaW1wbGVDaGFubmVsUGxhbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZvaWQgdGhpcy5zYW1wbGVTaW1wbGVIaXN0b2dyYW0obG9hZGVkLnVybCwgbG9hZGVkLnopO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdWx0aWNoYW5uZWwgZmx1b3Jlc2NlbmNlIChpbmRleGVkL0xVVC1iZWFyaW5nIHN0YWNrcykgY29tcG9zaXRlIGNsaWVudC1zaWRlXG4gICAgICAvLyBmcm9tIHBlci1jaGFubmVsIHRpbGVzLiBUcnVzdCB0aGUgc2VydmVyJ3MgZXhwbGljaXQgYG11bHRpY2hhbm5lbGAgZmxhZyDigJQgdGhlXG4gICAgICAvLyBvbGQgYGNoYW5uZWxzPjEgJiYgZ3JheXNjYWxlYCBoZXVyaXN0aWMgYWxzbyBtYXRjaGVkIFJHQiBwaG90b3MgQmlvLUZvcm1hdHNcbiAgICAgIC8vIHJlYWRzIGFzIHNlcGFyYXRlZCBwbGFuZXMgKGNoYW5uZWxzPjEsIHJnYkNoYW5uZWxzPT0xKSwgc3BsaXR0aW5nIHRoZW0gaW50byBOXG4gICAgICAvLyBwZXItY2hhbm5lbCBUaWxlZEltYWdlcyB0aGF0IGZsb29kZWQgdGhlIHRpbGUgZW5kcG9pbnQgYW5kIGh1bmcgb24gbG9hZC5cbiAgICAgIHRoaXMucmVhbExldmVscyA9IGQucmVhbExldmVscyA/PyBkLmxldmVscy5sZW5ndGg7XG4gICAgICAvLyBUaWxlcyB0byBjb3ZlciB0aGUgd2hvbGUgaW1hZ2UgYXQgdGhlIGNvYXJzZXN0IFJFQUwgQmlvLUZvcm1hdHMgbGV2ZWwgKHRoZVxuICAgICAgLy8gc21hbGxlc3QgbGV2ZWwgdGhhdCBoYXMgcmVhbCwgcGVyLWNoYW5uZWwtZmV0Y2hhYmxlIHRpbGVzIOKAlCBzeW50aGV0aWMgb3ZlcnZpZXdcbiAgICAgIC8vIGxldmVscyBhcmUgc2VydmVyLWNvbXBvc2l0ZWQgb25seSkuIEEgcHlyYW1pZGFsIGltYWdlJ3MgY29hcnNlc3QgcmVhbCBsZXZlbCBpc1xuICAgICAgLy8gdGlueSAoZmV3IHRpbGVzKTsgYSBmbGF0L25vLXB5cmFtaWQgaW1hZ2UncyBpcyB0aGUgZnVsbC1yZXMgZ3JpZCAobWFueSB0aWxlcykuXG4gICAgICBjb25zdCBjb2Fyc2UgPSBkLmxldmVsc1t0aGlzLnJlYWxMZXZlbHMgLSAxXSA/PyBkLmxldmVsc1tkLmxldmVscy5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGNvYXJzZVcgPSBjb2Fyc2UgPyBNYXRoLmNlaWwoY29hcnNlLndpZHRoIC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlSCA9IGNvYXJzZSA/IE1hdGguY2VpbChjb2Fyc2UuaGVpZ2h0IC8gZC50aWxlU2l6ZSkgOiAxO1xuICAgICAgY29uc3QgY29hcnNlVGlsZXMgPSBjb2Fyc2VXICogY29hcnNlSDtcbiAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSAhIWQubXVsdGljaGFubmVsO1xuICAgICAgaWYgKHRoaXMuaXNNdWx0aUNoYW5uZWwpIHtcbiAgICAgICAgLy8gUGVyLWNoYW5uZWwgcmVuZGVyaW5nIGNhbiBvbmx5IHVzZSB0aGUgUkVBTCBsZXZlbHMsIHNvIE9TRCByZXF1ZXN0cyB0aGVcbiAgICAgICAgLy8gY29hcnNlc3QgcmVhbCBsZXZlbCdzIHdob2xlIHRpbGUgZ3JpZCDDlyBOIGNoYW5uZWxzIGF0IGZpdC4gV2hlbiB0aGF0J3MgbGFyZ2VcbiAgICAgICAgLy8gKGEgd2hvbGUtc2xpZGUpLCBpdCdzIHRvbyBtYW55IChvZnRlbiBzbG93LCBweXJhbWlkLWxlc3MpIGZ1bGwtcmVzIHJlYWRzIOKAlFxuICAgICAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIHNpbmdsZSBzZXJ2ZXItY29tcG9zaXRlZCBzb3VyY2UgKHdoaWNoIGtlZXBzIHRoZSBmYXN0XG4gICAgICAgIC8vIHN5bnRoZXRpYyBvdmVydmlld3MpLiBBIHNtYWxsIHNpbmdsZS1GT1Ygei1zdGFjayBzdGF5cyBwZXItY2hhbm5lbC4gU2l6ZSBpblxuICAgICAgICAvLyBCWVRFUyBpc24ndCB0aGUgc2lnbmFsIOKAlCB0aWxlIGNvdW50IGlzLlxuICAgICAgICBjb25zdCBmaXRUaWxlcyA9IGNvYXJzZVRpbGVzICogTWF0aC5tYXgoMSwgZC5jaGFubmVscyA/PyAxKTtcbiAgICAgICAgaWYgKGZpdFRpbGVzID4gdGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFUykge1xuICAgICAgICAgIHRoaXMuaXNNdWx0aUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnW09TRF0gbXVsdGljaGFubmVsIGNvbXBvc2l0ZSB0b28gbGFyZ2UgZm9yIHBlci1jaGFubmVsIHJlbmRlcmluZzogJyArXG4gICAgICAgICAgICBgJHtjb2Fyc2VXfXgke2NvYXJzZUh9IHRpbGVzIHggJHtkLmNoYW5uZWxzfSBjaGFubmVscyA9ICR7Zml0VGlsZXN9IGF0IHRoZSBjb2Fyc2VzdCBgICtcbiAgICAgICAgICAgIGByZWFsIGxldmVsICg+ICR7dGhpcy5NQVhfTVVMVElDSEFOTkVMX0ZJVF9USUxFU30pOyByZW5kZXJpbmcgc2VydmVyLWNvbXBvc2l0ZWQgZm9yIHNwZWVkLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZS5jbGVhckNoYW5uZWxHcm91cHMoKTtcbiAgICAgIC8vIEF1dG8tcmFuZ2UgZ3JheXNjYWxlIHRpbGVzIHRvIHRoZSBpbWFnZSdzIGFjdHVhbCBpbnRlbnNpdHkgc3BhbiAobGlrZSB0aGVcbiAgICAgIC8vIGhlYXRtYXApLCBzYW1wbGluZyB0aGUgY29hcnNlc3QgdGlsZSBsZXZlbCBzbyB0aGUgd2luZG93IG1hdGNoZXMgdGhlIHJhd1xuICAgICAgLy8gdGlsZSB2YWx1ZXMuIEZpcmUtYW5kLWZvcmdldDogaXQgcmUtaW52YWxpZGF0ZXMgb25jZSB0aGUgd2luZG93IGlzIGtub3duO1xuICAgICAgLy8gdGlsZXMgcGFpbnQgdW53aW5kb3dlZCB1bnRpbCB0aGVuLiAoTXVsdGljaGFubmVsIHdpbmRvd3MgYXJlIHBlci1jaGFubmVsLFxuICAgICAgLy8gZGVmYXVsdGluZyB0byBmdWxsIHJhbmdlOyB0aGUgdXNlciBhdXRvL2VkaXRzIGVhY2ggY2hhbm5lbC4pXG4gICAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgICB0aGlzLnNhbXBsZXIuY29tcHV0ZU11bHRpQ2hhbm5lbEhpc3RvZ3JhbXMoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlSW1hZ2VXaW5kb3coZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICAgICAgLy8gU2l6ZSB0aGUgc2xpY2UgY2FjaGUgZm9yIHRoaXMgaW1hZ2U6IExSVSBjYXAgdG8gaG9sZCB0aGUgd2hvbGUgc3RhY2tcbiAgICAgIC8vIChjYXBwZWQpIGFuZCBza2lwIGJhY2tncm91bmQgcHJlbG9hZGluZyBmb3Igc3RhY2tzIHRvbyBsYXJnZSB0byBwcmVsb2FkXG4gICAgICAvLyAod291bGQgZmxvb2QgZnVsbC1yZXMgcmVhZHMpLiBOb3JtYWwgc3RhY2tzIGtlZXAgdGhlIGZsaWNrZXItZnJlZSBwcmUtY2FjaGUuXG4gICAgICB0aGlzLmNhY2hlLmNvbmZpZ3VyZShkLnogPz8gMSwgY29hcnNlVGlsZXMpO1xuICAgIH1cblxuICAgIC8vIFNpbXBsZSBtb2RlOiBPU0QncyBzaW5nbGUtaW1hZ2Ugc291cmNlIGRlY29kZXMgdGhlIFVSTCAoYmxvYjovZGF0YTovaHR0cClcbiAgICAvLyBkaXJlY3RseSDigJQgbm8gcHlyYW1pZCwgbm8gc2VydmVyLiBUaWxlZCBtb2RlOiB0aGUgY3VzdG9tIHNlcnZlci1iYWNrZWQgdGlsZVxuICAgIC8vIHNvdXJjZSAobXVsdGljaGFubmVsIG9wZW5zIG9uIGNoYW5uZWwgMDsgdGhlIG9wZW4gaGFuZGxlciB0aGVuIHN3YXBzIGluIHRoaXNcbiAgICAvLyBzbGljZSdzIHBlci1jaGFubmVsIGdyb3VwIGFuZCB0aGUgYmFja2dyb3VuZCBsb2FkZXIgcHJlLWZpbGxzIHRoZSByZXN0KS5cbiAgICBjb25zdCB0aWxlU291cmNlID0gc2ltcGxlXG4gICAgICA/IHsgdHlwZTogJ2ltYWdlJywgdXJsOiBsb2FkZWQudXJsIH1cbiAgICAgIDogdGhpcy5idWlsZFRpbGVTb3VyY2UoZCwgbG9hZGVkLmluZm9CNjQsIGxvYWRlZC56LCB0aGlzLmlzTXVsdGlDaGFubmVsID8gMCA6IHVuZGVmaW5lZCk7XG4gICAgc2lsZW5jZU9zZE11bHRpSW1hZ2VBZHZpc29yeSgpO1xuICAgIHRoaXMudmlld2VyID0gKE9TRCBhcyBhbnkpKHtcbiAgICAgIGlkOiBwbG90RGl2LFxuICAgICAgLy8gU2ltcGxlLW1vZGUgei1zY3J1YiBjYWxscyB2aWV3ZXIub3BlbigpIGFnYWluIHBlciBzbGljZSAoc2VlXG4gICAgICAvLyBzZXRaSW5kZXgpIOKAlCB3aXRob3V0IHRoaXMgaXQgcmVzZXRzIHRvIHRoZSBob21lIHpvb20vcGFuIG9uIGV2ZXJ5XG4gICAgICAvLyBzbGljZSBjaGFuZ2UuIFRpbGVkIG1vZGUgbmV2ZXIgcmUtb3BlbnMgKGl0IHRvZ2dsZXMgcHJlLWFkZGVkXG4gICAgICAvLyBUaWxlZEltYWdlcycgb3BhY2l0eSBpbnN0ZWFkKSwgc28gdGhpcyBpcyBhIG5vLW9wIHRoZXJlLlxuICAgICAgcHJlc2VydmVWaWV3cG9ydDogdHJ1ZSxcbiAgICAgIC8vIFVzZSB0aGUgMkQgY2FudmFzIGRyYXdlciwgbm90IFdlYkdMOiBjcmVhdGluZy9kZXN0cm95aW5nIGEgdmlld2VyIG9uXG4gICAgICAvLyBlYWNoIGVuZ2luZSB0b2dnbGUgLyBpbWFnZSBsb2FkIGNodXJucyBXZWJHTCBjb250ZXh0cyAoYnJvd3NlcnMgY2FwXG4gICAgICAvLyBob3cgbWFueSBleGlzdCBhdCBvbmNlKSwgd2hpY2ggc3VyZmFjZXMgYXMgXCJXZWJHTCBjb250ZXh0IHdhcyBsb3N0XCJcbiAgICAgIC8vIGFuZCBibGFuayB0aWxlcy4gVGhlIGNhbnZhcyBkcmF3ZXIgaGFzIG5vIHN1Y2ggbGltaXQuXG4gICAgICBkcmF3ZXI6ICdjYW52YXMnLFxuICAgICAgc2hvd05hdmlnYXRpb25Db250cm9sOiBmYWxzZSwgLy8gYXZvaWRzIG5lZWRpbmcgdGhlIGljb24taW1hZ2UgYXNzZXRzXG4gICAgICAvLyBPdmVydmlldyB0aHVtYm5haWwgd2l0aCB0aGUgY3VycmVudC12aWV3cG9ydCByZWN0YW5nbGUsIGJvdHRvbS1yaWdodC5cbiAgICAgIHNob3dOYXZpZ2F0b3I6IHRoaXMubmF2aWdhdG9yVmlzaWJsZSxcbiAgICAgIC8vIE5lYXJlc3QtbmVpZ2hib3VyIHdoZW4gb2ZmIOKGkiBjcmlzcCBwaXhlbHMgb24gem9vbS1pbiAocGl4ZWwgaW5zcGVjdGlvbikuXG4gICAgICBpbWFnZVNtb290aGluZ0VuYWJsZWQ6IHRoaXMuc21vb3RoaW5nRW5hYmxlZCxcbiAgICAgIG5hdmlnYXRvclBvc2l0aW9uOiAnQk9UVE9NX1JJR0hUJyxcbiAgICAgIG5hdmlnYXRvclNpemVSYXRpbzogMC4xNixcbiAgICAgIG5hdmlnYXRvckF1dG9GYWRlOiBmYWxzZSxcbiAgICAgIG5hdmlnYXRvckJhY2tncm91bmQ6ICdyZ2JhKDAsMCwwLDAuNSknLFxuICAgICAgbG9hZFRpbGVzV2l0aEFqYXg6IHRydWUsXG4gICAgICBhamF4V2l0aENyZWRlbnRpYWxzOiB0cnVlLCAvLyBjb29raWUgYXV0aCAob2F1dGgyLXByb3h5KVxuICAgICAgYWpheEhlYWRlcnM6IHRoaXMuYXV0aEhlYWRlcnMsIC8vIGJlYXJlciBhdXRoIChBdXRoMCksIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjcm9zc09yaWdpblBvbGljeTogJ0Fub255bW91cycsXG4gICAgICAvLyBHZW50bGVyIHpvb206IHRoZSBkZWZhdWx0ICgxLjIpIGZlZWxzIGZhc3QgYW5kIGJpZyBqdW1wcyBjcm9zcyBzZXZlcmFsXG4gICAgICAvLyBweXJhbWlkIGxldmVscyBhdCBvbmNlLCBmaXJpbmcgYSBidXJzdCBvZiB0aWxlIHJlcXVlc3RzLlxuICAgICAgem9vbVBlclNjcm9sbDogMS4xLFxuICAgICAgLy8gQ2xpY2stdG8tem9vbSB0b3dhcmQgdGhlIGNsaWNrZWQgcG9pbnQgKE9wZW5TZWFkcmFnb24ncyBkZWZhdWx0IGRlbW9cbiAgICAgIC8vIGJlaGF2aW91cikuIE9ubHkgYXBwbGllcyB3aGVuIG5vIHJlZ2lvbiB0b29sIGlzIGFjdGl2ZSDigJQgYW4gYWN0aXZlIHRvb2xcbiAgICAgIC8vIGRpc2FibGVzIE9TRCBtb3VzZS1uYXYgc28gY2xpY2tzIGRyYXcvc2VsZWN0IGluc3RlYWQgb2Ygem9vbWluZy5cbiAgICAgIGdlc3R1cmVTZXR0aW5nc01vdXNlOiB7IGNsaWNrVG9ab29tOiB0cnVlLCBzY3JvbGxUb1pvb206IHRydWUgfSxcbiAgICAgIC8vIFpvb20gbGltaXRzIChqaXQtdWkjOTQpLiBEZWZhdWx0IG1pblpvb21JbWFnZVJhdGlvICgwLjkpIHN0b3BzIHlvdSBmcm9tXG4gICAgICAvLyB6b29taW5nIHRoZSBpbWFnZSBzbWFsbGVyIHRoYW4gfmhvbWU7IGRyb3AgaXQgc28gdGhlIGltYWdlIGNhbiBiZSBzaHJ1bmtcbiAgICAgIC8vIGZyZWVseSAoZWZmZWN0aXZlbHkgbm8gbWluaW11bSkuIERlZmF1bHQgbWF4Wm9vbVBpeGVsUmF0aW8gKDEuMSkgY2Fwc1xuICAgICAgLy8gem9vbS1pbiBhdCB+MSBzY3JlZW4gcHggcGVyIGltYWdlIHB4OyByYWlzZSBpdCBzbyB5b3UgY2FuIHpvb20gaW4gdG9cbiAgICAgIC8vIGluc3BlY3QgaW5kaXZpZHVhbCBwaXhlbHMgKHBhaXJlZCB3aXRoIGltYWdlU21vb3RoaW5nRW5hYmxlZD1mYWxzZSBmb3JcbiAgICAgIC8vIGNyaXNwIG5lYXJlc3QtbmVpZ2hib3VyIGJsb2NrcykuXG4gICAgICBtaW5ab29tSW1hZ2VSYXRpbzogMC4wMSxcbiAgICAgIG1heFpvb21QaXhlbFJhdGlvOiAyMCxcbiAgICAgIC8vIE9TRCdzIHN0b2NrIHZhbHVlLCByZXN0b3JlZC4gRE8gTk9UIFJBSVNFIElUOiB0aGUgbmFtZSByZWFkcyBsaWtlXG4gICAgICAvLyBcIm1pbmltdW0gc2hhcnBuZXNzXCIgYnV0IGl0IGlzIHRoZSBvcHBvc2l0ZS4gRnJvbSBPU0QncyBvd25cbiAgICAgIC8vIFRpbGVkSW1hZ2UuX2dldExldmVsc0ludGVydmFsOlxuICAgICAgLy9cbiAgICAgIC8vICAgaGlnaGVzdExldmVsID0gZmxvb3IoIGxvZzIoIGN1cnJlbnRaZXJvUmF0aW8gLyBtaW5QaXhlbFJhdGlvICkgKVxuICAgICAgLy9cbiAgICAgIC8vIG1pblBpeGVsUmF0aW8gaXMgYSBmbG9vciBvbiBob3cgc21hbGwgYSB0aWxlIHBpeGVsIG1heSBzaHJpbmssIGFuZCBpdFxuICAgICAgLy8gRElWSURFUyBpbnRvIHRoZSByYXRpbyAtIHNvIHJhaXNpbmcgaXQgbG93ZXJzIHRoZSBjaG9zZW4gbGV2ZWwsIGkuZS5cbiAgICAgIC8vIHBpY2tzIGEgQ09BUlNFUiBpbWFnZS4gT1NEJ3Mgb3duIGNvbW1lbnQgb24gdGhlIGRlZmF1bHQgc2F5cyBhcyBtdWNoOlxuICAgICAgLy8gXCJjbG9zZXIgdG8gMCBkcmF3cyB0aWxlcyBtZWFudCBmb3IgYSBoaWdoZXIgem9vbSBhdCB0aGlzIHpvb21cIi5cbiAgICAgIC8vXG4gICAgICAvLyBNZWFzdXJlZCBvbiBhIGZsYXQgMjIzMDR4MjQ1MjggaW1hZ2UgKGxldmVscyA2OTcvMTM5NC8yNzg4LzU1NzYvMTExNTIvXG4gICAgICAvLyAyMjMwNCksIHByZWRpY3RlZCBsZXZlbCBtYXRjaGluZyBhY3R1YWwgaW4gYWxsIG5pbmUgdHJpYWxzOlxuICAgICAgLy9cbiAgICAgIC8vICAgICAgICAgICAgem9vbSAyICAgICAgICB6b29tIDggICAgICAgIH4xOjFcbiAgICAgIC8vICAgMS4wICAgICAgMS4zNHggdXAgICAgICAxLjM0eCB1cCAgICAgIDEuODZ4IHVwXG4gICAgICAvLyAgIDAuNSAgICAgIDAuNjd4IChub25lKSAgMC42N3ggKG5vbmUpICAwLjkzeCAtPiBmdWxsIHJlc1xuICAgICAgLy8gICAwLjI1ICAgICAwLjMzeCAgICAgICAgIDAuMzN4ICAgICAgICAgMC45M3hcbiAgICAgIC8vXG4gICAgICAvLyAwLjUgaXMgd2hhdCBnaXZlcyBcIm5ldmVyIHVwc2NhbGVkIGJlbG93IG5hdGl2ZSwgZnVsbCByZXNvbHV0aW9uIGF0IDE6MVwiLlxuICAgICAgLy8gMC4yNSBpcyBub3QgYmV0dGVyIC0gaXQganVtcHMgdHdvIHJ1bmdzIGZpbmVyIGFuZCBmZXRjaGVzIH40eCB0aGUgdGlsZXNcbiAgICAgIC8vIGZvciBubyB2aXNpYmxlIGdhaW4sIGFuZCB0aWxlcyBhcmUgbm90IGNhY2hlZCBieSB0aGUgaW5ncmVzcy5cbiAgICAgIG1pblBpeGVsUmF0aW86IDAuNSxcbiAgICAgIC8vIFdhaXQgZm9yIHRoZSB2aWV3IHRvIHNldHRsZSBiZWZvcmUgcHVsbGluZyBuZXcgdGlsZXMgKGxlc3MgY2h1cm4pLlxuICAgICAgaW1tZWRpYXRlUmVuZGVyOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvblRpbWU6IDAuNCxcbiAgICAgIC8vIFJlbGVhc2UgbWVtb3J5IGFnZ3Jlc3NpdmVseTogY2FwIHRoZSB0aWxlIGNhY2hlIHNvIHRpbGVzIG91dHNpZGUgdGhlXG4gICAgICAvLyBjdXJyZW50IHZpZXcgKGUuZy4gdGhlIGNvYXJzZXIgbGV2ZWxzIGxlZnQgYmVoaW5kIGFmdGVyIHpvb21pbmcgaW4pIGFyZVxuICAgICAgLy8gZXZpY3RlZCBpbnN0ZWFkIG9mIGFjY3VtdWxhdGluZy4gTGFyZ2Ugd2hvbGUtc2xpZGUgdGlsZXMg4oCUIGRvdWJsZWQgd2hlblxuICAgICAgLy8gdGhlIGNvbG9ybWFwIHBpcGVsaW5lIGtlZXBzIGEgcmVjb2xvcmVkIGNvcHkg4oCUIG1ha2UgYW4gdW5ib3VuZGVkIGNhY2hlXG4gICAgICAvLyBjb3N0bHkuIFR1bmFibGU7IGxvd2VyID0gbGVzcyBtZW1vcnksIG1vcmUgcmUtZmV0Y2ggb24gcGFuLWJhY2suXG4gICAgICAvLyBTdGFja3Mga2VlcCBtYW55IHNsaWNlcyByZXNpZGVudCAodGhlIHdob2xlIHN0YWNrIGlzIGJhY2tncm91bmQtbG9hZGVkKSxcbiAgICAgIC8vIHNvIHRoZXkgZ2V0IGEgbXVjaCBsYXJnZXIgdGlsZSBidWRnZXQg4oCUIG90aGVyd2lzZSBzd2l0Y2hpbmcgc2xpY2VzIGV2aWN0c1xuICAgICAgLy8gZWFjaCBvdGhlcidzIHRpbGVzIGFuZCBzY3J1YmJpbmcgYmFjayByZS1mZXRjaGVzLiBTY2FsZWQgdG8gdGhlIHJlc2lkZW50XG4gICAgICAvLyBzbGljZSBjb3VudDsgc2luZ2xlIGltYWdlcyBrZWVwIHRoZSBsZWFuIGRlZmF1bHQuXG4gICAgICBtYXhJbWFnZUNhY2hlQ291bnQ6IChkLnogPz8gMSkgPiAxID8gTWF0aC5taW4oMjQwMCwgTWF0aC5tYXgoNjAwLCB0aGlzLmNhY2hlLm1heFNsaWNlcygpICogNDApKSA6IDE1MCxcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgLy8gQWx3YXlzIHNldHRsZTogaWYgT1NEIG5ldmVyIGVtaXRzIG9wZW4vb3Blbi1mYWlsZWQgKGEgYmFkIHRpbGUgc291cmNlLFxuICAgICAgLy8gYSB2aWV3ZXIgdG9ybiBkb3duIG1pZC1vcGVuKSwgdGhlIHJlbmRlciBwaXBlbGluZSBtdXN0IG5vdCBoYW5nIOKAlCBhIGhhbmdcbiAgICAgIC8vIGxlYXZlcyBpbWFnZUxvYWRpbmc9dHJ1ZSwgc3RpY2tpbmcgdGhlIHNwaW5uZXIgYW5kIHRoZSA1MDBtc1xuICAgICAgLy8gY2FjaGUtcHJvZ3Jlc3MgcG9sbCBmb3JldmVyIChOU19CSU5ESU5HX0FCT1JURUQgc3Rvcm0pLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGRvbmUgPSAob2s6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShvayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnZpZXdlciEuYWRkT25jZUhhbmRsZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlZ2lvbiBvdmVybGF5IHJlYWRzL3dyaXRlcyB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyByZWdpb25zIHN0YXlcbiAgICAgICAgLy8gaW4gc3luYyB3aXRoIFBsb3RseSBhbmQgdGhlIFJlZ2lvbiBFZGl0b3IuIFJlY3JlYXRlIGl0IHBlciBvcGVuKCkgc29cbiAgICAgICAgLy8gaXQgYmluZHMgdG8gdGhlIGZyZXNobHktb3BlbmVkIHZpZXdlcidzIGNhbnZhcy9Nb3VzZVRyYWNrZXIuXG4gICAgICAgIHRoaXMub3ZlcmxheT8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLm92ZXJsYXkgPSBuZXcgT3NkUmVnaW9uT3ZlcmxheSh0aGlzLnZpZXdlciBhcyBhbnksIHRoaXMucmVnaW9uU3RvcmUpO1xuICAgICAgICB0aGlzLmNvb3JkVHJhbnNmb3JtID0gbmV3IE9zZENvb3JkaW5hdGVUcmFuc2Zvcm0odGhpcy52aWV3ZXIgYXMgYW55KTtcbiAgICAgICAgdGhpcy5zY2FsZUJhciA9IG5ldyBPc2RTY2FsZUJhcih0aGlzLnZpZXdlciBhcyBhbnksIGQubXBwWCA/PyAwKTtcbiAgICAgICAgdGhpcy5idWlsZFRvb2xIb3N0cygpO1xuICAgICAgICAvLyBTaW1wbGUgbW9kZSBpcyBhIHNpbmdsZSwgc2VsZi1jb250YWluZWQgaW1hZ2Ug4oCUIG5vIHNsaWNlIGNhY2hlIHRvIHNlZWQuXG4gICAgICAgIGlmIChzaW1wbGUpIHtcbiAgICAgICAgICAvKiBub3RoaW5nIHRvIGNhY2hlOiBvbmUgZnJhbWUsIG5vIHB5cmFtaWQgKi9cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgLy8gRHJvcCB0aGUgc2luZ2xlIG9wZW5lZCAoY2hhbm5lbC0wKSBpbWFnZSBhbmQgYWRkIHRoaXMgc2xpY2UncyBjaGFubmVsXG4gICAgICAgICAgLy8gZ3JvdXAgdG8gdGhlIHBlci1zbGljZSBjYWNoZS4gVGhlIHNoYXJlZCBiYWNrZ3JvdW5kIGxvYWRlciAvIExSVSB0aGVuXG4gICAgICAgICAgLy8gcHJlLWZpbGxzIHRoZSBvdGhlciBzbGljZXMnIGNoYW5uZWwgZ3JvdXBzIHNvIHotc2NydWIgaXMgZmxpY2tlci1mcmVlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBpdDAgPSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZD8uZ2V0SXRlbUF0Py4oMCk7XG4gICAgICAgICAgICBpZiAoaXQwKSAodGhpcy52aWV3ZXIgYXMgYW55KS53b3JsZC5yZW1vdmVJdGVtKGl0MCk7XG4gICAgICAgICAgfSBjYXRjaCB7IC8qIG5vdGhpbmcgdG8gcmVtb3ZlICovIH1cbiAgICAgICAgICB0aGlzLmNhY2hlLmFkZENoYW5uZWxTbGljZSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTZWVkIHRoZSBzbGljZSBjYWNoZSB3aXRoIHRoZSBqdXN0LW9wZW5lZCBzbGljZSAod29ybGQgaXRlbSAwKSwgc29cbiAgICAgICAgICAvLyBzY3J1YmJpbmcgYmFjayB0byBpdCBsYXRlciBpcyBhbiBpbnN0YW50IG9wYWNpdHkgdG9nZ2xlLCBub3QgYSByZS1vcGVuLlxuICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9ICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkPy5nZXRJdGVtQXQ/LigwKTtcbiAgICAgICAgICBpZiAoZmlyc3RJdGVtKSB0aGlzLmNhY2hlLnNlZWRDb21wb3NpdGUodGhpcy5jdXJyZW50WiwgZmlyc3RJdGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgd2FuZCBzYW1wbGVzIHRoZSAqcmVuZGVyZWQgdmlld3BvcnQqLCBzbyBpdHMgcGl4ZWwgbWF0cml4IGlzIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgZm9yIHRoZSBjdXJyZW50IHZpZXcg4oCUIGRyb3AgaXQgd2hlbmV2ZXIgdGhlIHZpZXdwb3J0IGNoYW5nZXMuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCd2aWV3cG9ydC1jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmF5c2NhbGUgdGlsZXMgZ2V0IHRoZSBhY3RpdmUgY29sb3JtYXAgdmlhIHRoZSBwaXhlbCBwaXBlbGluZS4gVGhlXG4gICAgICAgIC8vIGhhbmRsZXIgcnVucyBwZXIgdGlsZSBvbiBsb2FkIChhbmQgb24gcmVxdWVzdEludmFsaWRhdGUpOyByZWNvbG9yaW5nXG4gICAgICAgIC8vIGlzIGEgbm8tb3AgZm9yIFJHQiBpbWFnZXMgb3IgYmVmb3JlIHRoZSBMVVQgcmVzb2x2ZXMuXG4gICAgICAgIC8vIChpc0dyYXlzY2FsZUltYWdlIGlzIHNldCBmcm9tIGltYWdlSW5mby5pc0dyYXlzY2FsZSBpbiBwbG90KCkgYWJvdmUuKVxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigndGlsZS1pbnZhbGlkYXRlZCcsIChldmVudDogYW55KSA9PiB0aGlzLnJlY29sb3JUaWxlKGV2ZW50KSk7XG4gICAgICAgIC8vIFRoZSBvdmVydmlldyBuYXZpZ2F0b3IgaXMgYSBzZXBhcmF0ZSBtaW5pLXZpZXdlciB3aXRoIGl0cyBvd24gdGlsZXMsXG4gICAgICAgIC8vIHNvIGl0IGRvZXNuJ3QgcmVjZWl2ZSB0aGUgbWFpbiB2aWV3ZXIncyB0aWxlLWludmFsaWRhdGVkIGV2ZW50cy4gQXBwbHlcbiAgICAgICAgLy8gdGhlIHNhbWUgcmVjb2xvciBwaXBlbGluZSB0byBpdCBzbyB0aGUgbWluaW1hcCB0cmFja3MgdGhlIG1haW4gaW1hZ2Unc1xuICAgICAgICAvLyBjb2xvcm1hcC9MVVQgaW5zdGVhZCBvZiBzdGF5aW5nIGdyYXlzY2FsZS5cbiAgICAgICAgY29uc3QgbmF2ID0gKHRoaXMudmlld2VyIGFzIGFueSkubmF2aWdhdG9yO1xuICAgICAgICBuYXY/LmFkZEhhbmRsZXIoJ3RpbGUtaW52YWxpZGF0ZWQnLCAoZXZlbnQ6IGFueSkgPT4gdGhpcy5yZWNvbG9yVGlsZShldmVudCkpO1xuICAgICAgICBpZiAoKHRoaXMuaXNHcmF5c2NhbGVJbWFnZSAmJiB0aGlzLmNvbG9yTHV0KSB8fCB0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICh0aGlzLnZpZXdlciBhcyBhbnkpLndvcmxkLnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5hdj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLyogbm8tb3AgKi9cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJlZmV0Y2ggYWRqYWNlbnQgei1zbGljZXMgb25jZSB0aGUgdmlldyBzZXR0bGVzIChhbmQgb24gZWFjaCBzZXR0bGUsXG4gICAgICAgIC8vIHNvIGl0IHRyYWNrcyB0aGUgY3VycmVudCB2aWV3cG9ydCBhcyB0aGUgdXNlciBwYW5zL3pvb21zKS4gU2ltcGxlIG1vZGVcbiAgICAgICAgLy8gaGFzIGEgc2luZ2xlIGZyYW1lLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gcHJlZmV0Y2guXG4gICAgICAgIGlmICghc2ltcGxlKSB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuY2FjaGUuc2NoZWR1bGVQcmVmZXRjaCgpKTtcbiAgICAgICAgLy8gVGVsbCBsaXN0ZW5lcnMgKHRoZSBpbnRlbnNpdHkgaW5zZXQpIHRoZSB2aXNpYmxlIGltYWdlIHJlZ2lvbiB3aGVuZXZlclxuICAgICAgICAvLyB0aGUgdmlldyBzZXR0bGVzLCBzbyB0aGV5IGNhbiByZS1zYW1wbGUgYXQgdGhlIGN1cnJlbnQgem9vbSByZXNvbHV0aW9uLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcignYW5pbWF0aW9uLWZpbmlzaCcsICgpID0+IHRoaXMuZW1pdFZpZXdwb3J0Q2hhbmdlKCkpO1xuICAgICAgICAvLyBDaHJvbWUgY29tcG9zaXRvciBidWc6IGFmdGVyIGFuIE9TRCB6b29tIHRoZSBkb2NrZWQgdG9vbGJhciAoYSBzaWJsaW5nIG9mXG4gICAgICAgIC8vICNwbG90IGluIHRoZSA8dmlzdWFsaXplcj4gaG9zdCkgaXMgbGVmdCBsYWlkLW91dC1idXQtdW5wYWludGVkIGFuZFxuICAgICAgICAvLyB2YW5pc2hlcyDigJQgY29uZmlybWVkIHZpYSBEZXZUb29scyAoRE9NIGludGFjdCwgcmVnaW9uIHNpbXBseSBub3QgcGFpbnRlZCkuXG4gICAgICAgIC8vIENTUyAoei1pbmRleCAvIGlzb2xhdGlvbiAvIGNvbnRhaW4pIGFuZCBET00tcmVwYXJlbnRpbmcgZG9uJ3QgZml4IGl0OyBhXG4gICAgICAgIC8vIHJlcGFpbnQgcmVsaWFibHkgZG9lcy4gTnVkZ2UgaXQgZWFjaCBhbmltYXRpb24gZnJhbWUgKHNvIGl0IG5ldmVyIHZpc2libHlcbiAgICAgICAgLy8gZHJvcHMpIGFuZCBvbiBzZXR0bGUuIFRoZSBzeW5jaHJvbm91cyBkaXNwbGF5IHRvZ2dsZSByZS1yYXN0ZXJzIHdpdGggbm9cbiAgICAgICAgLy8gdmlzaWJsZSBnb25lLWZyYW1lIGFuZCBubyBsYXlvdXQgc2hpZnQuXG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24nLCAoKSA9PiB0aGlzLm51ZGdlVG9vbGJhclJlcGFpbnQoKSk7XG4gICAgICAgIHRoaXMudmlld2VyIS5hZGRIYW5kbGVyKCdhbmltYXRpb24tZmluaXNoJywgKCkgPT4gdGhpcy5udWRnZVRvb2xiYXJSZXBhaW50KCkpO1xuICAgICAgICBpZiAoIXNpbXBsZSkgdGhpcy5jYWNoZS5zY2hlZHVsZVByZWZldGNoKCk7XG4gICAgICAgIC8vIEZvcmNlIGZpdC10by12aWV3IGFzIHRoZSBzcGxpdC9mbGV4IGxheW91dCBzZXR0bGVzLiBBIHRhbGxcbiAgICAgICAgLy8gbm9uLXB5cmFtaWRhbCBpbWFnZSBjYW4gb3RoZXJ3aXNlIG9wZW4gem9vbWVkLWluIChpbWFnZSB3aWR0aCBmaWxsaW5nXG4gICAgICAgIC8vIHRoZSB2aWV3ZXIpLCBtYWtpbmcgT1NEIGRlbWFuZCBzbG93IGZ1bGwtcmVzIHJlcz0wIHRpbGVzIGZvciB0aGVcbiAgICAgICAgLy8gY2VudHJlIGluc3RlYWQgb2YgdGhlIGZhc3QgY29hcnNlIG92ZXJ2aWV3IOKGkiB3aGl0ZSBjYW52YXMuIGdvSG9tZVxuICAgICAgICAvLyBmaXRzIHRoZSB3aG9sZSBpbWFnZSBzbyBPU0Qgc2VsZWN0cyB0aGUgY29hcnNlIHN5bnRoZXRpYyBsZXZlbC4gUmV0cnlcbiAgICAgICAgLy8gYWNyb3NzIGEgZmV3IGZyYW1lcyBiZWNhdXNlIHRoZSBjb250YWluZXIgbWF5IG5vdCBoYXZlIGl0cyBmaW5hbCBzaXplXG4gICAgICAgIC8vIG9uIHRoZSBmaXJzdCBmcmFtZSBhZnRlciAnb3BlbicuXG4gICAgICAgIGNvbnN0IHJlZml0ID0gKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKHRydWUpO1xuICAgICAgICAgICAgLy8gVGhlIG5hdmlnYXRvciB3YXMgc2l6ZWQgaW4gdGhlIFZpZXdlciBjb25zdHJ1Y3RvciDigJQgQkVGT1JFIHRoZVxuICAgICAgICAgICAgLy8gbGF5b3V0IHNldHRsZWQg4oCUIHNvIGl0cyBlbGVtZW50IGNhbiBjYXJyeSBhIHN0YWxlIChldmVuXG4gICAgICAgICAgICAvLyB3cm9uZy1hc3BlY3QpIHNpemUgdGhhdCBmbG9hdHMgdGhlIHZpc2libGUgbWluaW1hcCBhYm92ZSB0aGVcbiAgICAgICAgICAgIC8vIGNvcm5lci4gUmUtc2l6ZSBpdCBmcm9tIHRoZSBzZXR0bGVkIGNvbnRhaW5lci5cbiAgICAgICAgICAgIHRoaXMucmVzaXplTmF2aWdhdG9yKCk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvKiB0b3JuIGRvd24gKi9cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShyZWZpdCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDE1MCk7XG4gICAgICAgIHNldFRpbWVvdXQocmVmaXQsIDQwMCk7XG4gICAgICAgIC8vIFRoZSB0aW1lZCByZXRyaWVzIGFib3ZlIG1pc3MgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnRhaW5lciBpcyBTVElMTFxuICAgICAgICAvLyB6ZXJvLXNpemUgYXQgNDAwbXMg4oCUIHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgcmVuZGVyIHN0YXJ0cyB3aGlsZSB0aGVcbiAgICAgICAgLy8gZmlsZSB2aWV3ZXIgaXMgbWlkLXN3aXRjaCBmcm9tIHRoZSBmb2xkZXIgdmlldyB0byB0aGUgZGlhZ3JhbSAoZS5nLlxuICAgICAgICAvLyBcIkxvYWQgYXMgU3RhY2tcIiBmcm9tIGEgZm9sZGVyLCB3aXRoIG5vIGltYWdlIG9wZW4gZmlyc3QpLiBCZWNhdXNlXG4gICAgICAgIC8vIHByZXNlcnZlVmlld3BvcnQgc3VwcHJlc3NlcyBPU0QncyBvd24gb3Blbi10aW1lIGZpdCwgdGhlIGltYWdlIHdvdWxkXG4gICAgICAgIC8vIHRoZW4gYmUgbGVmdCB1bi1maXR0ZWQgYXQgdGhlIHRvcC1sZWZ0IChcImEgdGlsZVwiKS4gQSBvbmUtc2hvdFxuICAgICAgICAvLyBSZXNpemVPYnNlcnZlciBmaXRzIHRoZSBpbnN0YW50IHRoZSBjb250YWluZXIgZmlyc3QgaGFzIGEgcmVhbCBzaXplLFxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZW4gdGhlIHJlbmRlciBiZWdhbiAoaml0LXVpIzEwNikuXG4gICAgICAgIHRoaXMuZml0V2hlbkNvbnRhaW5lclNpemVkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBsb3REaXYpLCByZWZpdCk7XG4gICAgICAgIC8vIEtlZXAgdGhlIG5hdmlnYXRvciBzaXplZCB0byB0aGUgY29udGFpbmVyIGFzIHRoZSBwYW5lbCByZXNpemVzLlxuICAgICAgICB0aGlzLnZpZXdlciEuYWRkSGFuZGxlcigncmVzaXplJywgKCkgPT4gdGhpcy5yZXNpemVOYXZpZ2F0b3IoKSk7XG4gICAgICAgIGRvbmUodHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMudmlld2VyIS5hZGRPbmNlSGFuZGxlcignb3Blbi1mYWlsZWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW09TRF0gb3Blbi1mYWlsZWQnLCBlPy5tZXNzYWdlID8/IGUpO1xuICAgICAgICBkb25lKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghc2V0dGxlZCkgY29uc29sZS53YXJuKCdbT1NEXSB2aWV3ZXIgb3BlbiB0aW1lZCBvdXQnKTtcbiAgICAgICAgZG9uZShmYWxzZSk7XG4gICAgICB9LCA4MDAwKTtcbiAgICAgIHRoaXMudmlld2VyIS5vcGVuKHRpbGVTb3VyY2UgYXMgYW55KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXQtdG8taG9tZSBvbmNlIGBlbGAgZmlyc3QgaGFzIGEgbm9uLXplcm8gc2l6ZS4gSWYgaXQncyBhbHJlYWR5IHNpemVkIHdlXG4gICAqIHJlbHkgb24gdGhlIHRpbWVkIHJlZml0cyB0aGUgY2FsbGVyIHNjaGVkdWxlZDsgb3RoZXJ3aXNlIGEgb25lLXNob3RcbiAgICogUmVzaXplT2JzZXJ2ZXIgcnVucyBgcmVmaXRgIHRoZSBtb21lbnQgdGhlIGNvbnRhaW5lciBpcyBsYWlkIG91dCAodGhlblxuICAgKiBkaXNjb25uZWN0cyksIHNvIHRoZSBpbml0aWFsIGZpdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgcmVuZGVyJ3Mgc3RhcnQgdGltZVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZGlhZ3JhbSBjb250YWluZXIncyBsYXlvdXQuIE5vLW9wIHdpdGhvdXQgYSBjb250YWluZXIgb3JcbiAgICogUmVzaXplT2JzZXJ2ZXIgKHRoZSB0aW1lZCByZWZpdHMgcmVtYWluIHRoZSBmYWxsYmFjaykuIE9uZS1zaG90ICsgb25seVxuICAgKiBhdHRhY2hlZCBvbiBhIGZyZXNoIG1vdW50LCBzbyBzbGljZS1zY3J1YiByZS1vcGVucyBrZWVwIHRoZSB1c2VyJ3Mgem9vbS5cbiAgICovXG4gIHByaXZhdGUgZml0V2hlbkNvbnRhaW5lclNpemVkKGVsOiBIVE1MRWxlbWVudCB8IG51bGwsIHJlZml0OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKCFlbCB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSByZXR1cm47IC8vIGFscmVhZHkgc2l6ZWQg4oCUIHRpbWVkIHJlZml0cyBzdWZmaWNlXG4gICAgY29uc3Qgcm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGVsLmNsaWVudFdpZHRoID4gMCAmJiBlbC5jbGllbnRIZWlnaHQgPiAwKSB7XG4gICAgICAgIHJvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVmaXQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByby5vYnNlcnZlKGVsKTtcbiAgICAvLyBTYWZldHkgbmV0OiBzdG9wIG9ic2VydmluZyBldmVuIGlmIGl0IG5ldmVyIGdhaW5zIGEgc2l6ZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHJvLmRpc2Nvbm5lY3QoKSwgNTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9tIHRpbGUgc291cmNlIGJ1aWx0IGZyb20gdGhlIGRlc2NyaXB0b3IuIE9TRCBudW1iZXJzIGxldmVsc1xuICAgKiBjb2Fyc2VzdC1maXJzdDsgdGhlIGJhY2tlbmQgbnVtYmVycyByZXNvbHV0aW9ucyBmdWxsLXJlcy1maXJzdCwgc29cbiAgICogYHJlcyA9IChsZXZlbHMtMSkgLSBvc2RMZXZlbGAuIE92ZXJyaWRpbmcgZ2V0TGV2ZWxTY2FsZS9nZXROdW1UaWxlcyBsZXRzIHVzXG4gICAqIGhvbm91ciBCaW8tRm9ybWF0cycgYWN0dWFsIHBlci1sZXZlbCBkaW1lbnNpb25zIChub3QgYXNzdW1lIHBvd2VyLW9mLXR3bykuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkVGlsZVNvdXJjZShkOiBUaWxlRGVzY3JpcHRvciwgaW5mb0I2NDogc3RyaW5nLCB6OiBudW1iZXIsIGNoYW5uZWw/OiBudW1iZXIpOiBhbnkge1xuICAgIC8vIE11bHRpY2hhbm5lbCBpbWFnZXMgY29tcG9zaXRlIGZyb20gcGVyLWNoYW5uZWwgdGlsZXMsIHdoaWNoIG9ubHkgZXhpc3QgYXRcbiAgICAvLyByZWFsIEJpby1Gb3JtYXRzIHJlc29sdXRpb25zIOKAlCBzbyBkcml2ZSBPU0Qgb2ZmIHRoZSByZWFsIGxldmVscyBhbG9uZSBhbmRcbiAgICAvLyBza2lwIHRoZSBzeW50aGV0aWMgKHNlcnZlci1jb21wb3NpdGVkKSBvdmVydmlld3MuIEV2ZXJ5IGRpc3BsYXllZCB0aWxlIGlzXG4gICAgLy8gdGhlbiBwZXItY2hhbm5lbC1mZXRjaGFibGUgYXQgYW55IHpvb20uXG4gICAgY29uc3QgbGV2ZWxzID0gdGhpcy5pc011bHRpQ2hhbm5lbCA/IGQubGV2ZWxzLnNsaWNlKDAsIHRoaXMucmVhbExldmVscykgOiBkLmxldmVscztcbiAgICBjb25zdCBuID0gbGV2ZWxzLmxlbmd0aDtcbiAgICBjb25zdCB0ID0gZC50aWxlU2l6ZTtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5hcGk7XG5cbiAgICAvLyBPU0QgbGV2ZWwgaSAoMCA9IGNvYXJzZXN0KSA8LT4gYmFja2VuZCByZXNvbHV0aW9uIChuLTEtaSkgKHJlcyAwID0gZnVsbCkuXG4gICAgLy8gVGhlIGJhY2tlbmQgcHlyYW1pZCBpcyBOT1QgbmVjZXNzYXJpbHkgcG93ZXItb2YtdHdvLCBzbyB3ZSBkcml2ZSBPU0Qgb2ZmXG4gICAgLy8gdGhlIGJhY2tlbmQncyByZWFsIHBlci1sZXZlbCBkaW1lbnNpb25zLiBXZSBvdmVycmlkZSBPTkxZIGdldExldmVsU2NhbGU6XG4gICAgLy8gT1NEIGRlcml2ZXMgZ2V0TnVtVGlsZXMsIGdldFRpbGVCb3VuZHMgQU5EIGl0cyBwZXItem9vbSBsZXZlbCBzZWxlY3Rpb25cbiAgICAvLyBmcm9tIGdldExldmVsU2NhbGUsIHNvIHRoZXkgYWxsIHN0YXkgY29uc2lzdGVudCDigJQgcmVxdWVzdGluZyBleGFjdGx5IHRoZVxuICAgIC8vIHRpbGVzIGVhY2ggcmVzb2x1dGlvbiBhY3R1YWxseSBoYXMgKG5vIG91dC1vZi1yYW5nZSA0MDBzLCBubyBmbG9vZCkuXG4gICAgY29uc3QgcmVzRm9yTGV2ZWwgPSAobGV2ZWw6IG51bWJlcikgPT4gbiAtIDEgLSBsZXZlbDtcbiAgICBjb25zdCB0czogYW55ID0gbmV3IChPU0QgYXMgYW55KS5UaWxlU291cmNlKHtcbiAgICAgIHdpZHRoOiBkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBkLmhlaWdodCxcbiAgICAgIHRpbGVTaXplOiB0LFxuICAgICAgdGlsZU92ZXJsYXA6IDAsXG4gICAgICBtaW5MZXZlbDogMCxcbiAgICAgIG1heExldmVsOiBuIC0gMSxcbiAgICB9KTtcbiAgICB0cy5nZXRMZXZlbFNjYWxlID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgcmV0dXJuIGx2bCA/IGx2bC53aWR0aCAvIGQud2lkdGggOiAxO1xuICAgIH07XG4gICAgLy8gRHJpdmUgdGhlIHRpbGUgQ09VTlQgb2ZmIGVhY2ggbGV2ZWwncyBvd24gKGluZGVwZW5kZW50bHktcm91bmRlZCkgZGltZW5zaW9ucyxcbiAgICAvLyBub3QgT1NEJ3MgZGVmYXVsdCBgY2VpbChzY2FsZSAqIGZ1bGxEaW1lbnNpb24gLyB0aWxlU2l6ZSlgLiBTeW50aGV0aWMgQU5EIHJlYWxcbiAgICAvLyBCaW8tRm9ybWF0cyBsZXZlbHMgYXJlbid0IGV4YWN0IHByb3BvcnRpb25hbCBzY2FsZXMgb2YgdGhlIGZ1bGwgaW1hZ2UsIHNvXG4gICAgLy8gYHNjYWxlICogZnVsbEhlaWdodGAgY2FuIHJvdW5kIHVwIHRvIG9uZSBtb3JlIHJvdyAob3IgY29sdW1uKSB0aGFuIHRoZSBsZXZlbFxuICAgIC8vIGFjdHVhbGx5IGhhcyDigJQgT1NEIHRoZW4gcmVxdWVzdHMgYW4gb3V0LW9mLXJhbmdlIHRpbGUgdGhhdCB0aGUgc2VydmVyIDQwMHNcbiAgICAvLyAoXCJUaWxlIChjb2wscm93KSBvdXQgb2YgcmFuZ2VcIikuIFVzaW5nIHRoZSBsZXZlbCdzIHJlYWwgdy9oIG1hdGNoZXMgdGhlXG4gICAgLy8gc2VydmVyJ3Mgb3duIGJvdW5kcyBjaGVjayBleGFjdGx5LlxuICAgIGNvbnN0IFBvaW50ID0gKE9TRCBhcyBhbnkpLlBvaW50O1xuICAgIHRzLmdldE51bVRpbGVzID0gKGxldmVsOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGx2bCA9IGxldmVsc1tyZXNGb3JMZXZlbChsZXZlbCldO1xuICAgICAgaWYgKCFsdmwpIHJldHVybiBuZXcgUG9pbnQoMCwgMCk7XG4gICAgICByZXR1cm4gbmV3IFBvaW50KE1hdGguY2VpbChsdmwud2lkdGggLyB0KSwgTWF0aC5jZWlsKGx2bC5oZWlnaHQgLyB0KSk7XG4gICAgfTtcbiAgICB0cy5nZXRUaWxlVXJsID0gKGxldmVsOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgICAgYnVpbGRUaWxlVXJsKGJhc2UsIGluZm9CNjQsIHsgcmVzOiByZXNGb3JMZXZlbChsZXZlbCksIGNvbDogeCwgcm93OiB5LCB6LCB0aWxlU2l6ZTogdCwgY2hhbm5lbCB9KTtcbiAgICByZXR1cm4gdHM7XG4gIH1cblxuICAvKiogUmUtYXBwbHkgdGhlIGRpc3BsYXkgcGlwZWxpbmUgKHdpbmRvdy9nYW1tYS9jb2xvdXIvaW52ZXJ0KSBhZnRlciBhIHN0YXRlIGNoYW5nZS5cbiAgICogIE11bHRpY2hhbm5lbCBpbnZhbGlkYXRlcyBPTkxZIHRoZSB2aXNpYmxlIHNsaWNlJ3MgY2hhbm5lbCBpbWFnZXMg4oCUIGludmFsaWRhdGluZ1xuICAgKiAgdGhlIHdob2xlIHdvcmxkIHdvdWxkIHJlLXByb2Nlc3MgZXZlcnkgaGlkZGVuL3ByZWxvYWRlZCBzbGljZSdzIHRpbGVzIChodW5kcmVkcyksXG4gICAqICBmbG9vZGluZyBPU0Qgd2l0aCBcIltDYWNoZVJlY29yZF0g4oCmIEludmFsaWRTdGF0ZUVycm9yXCIgYW5kIHdhc3Rpbmcgd29yayBvbiB0aWxlc1xuICAgKiAgdGhhdCBhcmVuJ3Qgb24gc2NyZWVuLiBUaGUgb3RoZXIgY2FjaGVkIHNsaWNlcyBhcmUgbWFya2VkIHN0YWxlIGFuZCByZS10aW50ZWRcbiAgICogIGxhemlseSB3aGVuIHJldmVhbGVkLiBDb21wb3NpdGUvZ3JheXNjYWxlIGludmFsaWRhdGUgdGhlIHdvcmxkIGFzIGJlZm9yZS4gKi9cbiAgLyoqIENvbGxhcHNlIGEgYnVyc3Qgb2YgZGlzcGxheS1zdGF0ZSBjaGFuZ2VzIGludG8gT05FIGludmFsaWRhdGlvbiBvbiB0aGUgbmV4dFxuICAgKiAgZnJhbWUuIERyYWdnaW5nIGEgd2luZG93IHNsaWRlciBlbWl0cyBwZXIgcGl4ZWwgb2YgdHJhdmVsLCBhbmQgZWFjaCByb3VuZFxuICAgKiAgcmVzdG9yZXMgYW5kIHJlLXByb2Nlc3NlcyBldmVyeSB0aWxlIG9mIGV2ZXJ5IGNoYW5uZWwg4oCUIHNvIHRoZSBidXJzdCBpcyBib3RoXG4gICAqICB3YXN0ZWQgd29yayBhbmQgdGhlIHJhY2UgdGhhdCBicmVha3MgY2FjaGUgcmVjb3JkcyAoc2VlIHtAbGluayBkaXNwbGF5VG9rZW59KS5cbiAgICogIFRoZSBzdG9yZSB3cml0ZSBzdGF5cyBsaXZlLCBzbyB0aGUgcGFuZSBpdHNlbGYgcmVtYWlucyByZXNwb25zaXZlLiAqL1xuICBwcml2YXRlIHNjaGVkdWxlSW52YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnZhbGlkYXRlSGFuZGxlICE9PSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgcXVldWVkIGZvciB0aGlzIGZyYW1lXG4gICAgY29uc3QgcmFmID1cbiAgICAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgOiAoY2I6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBzZXRUaW1lb3V0KCgpID0+IGNiKDApLCAxNikgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5pbnZhbGlkYXRlSGFuZGxlID0gcmFmKCgpID0+IHtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZUhhbmRsZSA9IG51bGw7XG4gICAgICB0aGlzLmludmFsaWRhdGVEaXNwbGF5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGludmFsaWRhdGVEaXNwbGF5KCk6IHZvaWQge1xuICAgIC8vIFN1cGVyc2VkZSBhbnkgaW4tZmxpZ2h0IHJlY29sb3Igcm91bmQgYmVmb3JlIHJlc3RhcnRpbmcgb25lIChzZWUgZGlzcGxheVRva2VuKS5cbiAgICB0aGlzLmRpc3BsYXlUb2tlbisrO1xuICAgIGNvbnN0IHY6IGFueSA9IHRoaXMudmlld2VyO1xuICAgIGlmICghdikgcmV0dXJuO1xuICAgIGlmICh0aGlzLmlzTXVsdGlDaGFubmVsKSB7XG4gICAgICB0aGlzLmNhY2hlLmludmFsaWRhdGVDaGFubmVsRGlzcGxheSh0aGlzLmN1cnJlbnRaKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHsgdi53b3JsZC5yZXF1ZXN0SW52YWxpZGF0ZSh0cnVlKTsgfSBjYXRjaCB7IC8qIG5vLW9wICovIH1cbiAgICB0cnkgeyB2Lm5hdmlnYXRvcj8ud29ybGQ/LnJlcXVlc3RJbnZhbGlkYXRlKHRydWUpOyB9IGNhdGNoIHsgLyogbm8tb3AgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95Vmlld2VyKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUuY2FuY2VsQmFja2dyb3VuZExvYWQoKTtcbiAgICAvLyBUZWFyIGRvd24gYW55IGFjdGl2ZSB0b29sIG92ZXJsYXlzIChzaGFyZWQgc2luZ2xldG9ucykuXG4gICAgdGhpcy53YW5kVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmJydXNoVG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLnNhbVBvaW50VG9vbC5zZXRNb2RlKGZhbHNlKTtcbiAgICB0aGlzLmVyYXNlclRvb2wuc2V0TW9kZShmYWxzZSk7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNjYWxlQmFyKSB7XG4gICAgICB0aGlzLnNjYWxlQmFyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuc2NhbGVCYXIgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy52aWV3ZXIpIHtcbiAgICAgIHRoaXMudmlld2VyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudmlld2VyID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb29yZFRyYW5zZm9ybSA9IG51bGw7XG4gICAgdGhpcy5jYWNoZS5yZXNldCgpO1xuICAgIHRoaXMuc2FtcGxlci5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoaXMgYmFja2VuZCdzIHJlZ2lvbiByZW5kZXJlciAodGhlIFNWRyBvdmVybGF5KSwgb25jZSBhIHBsb3QgaXMgbW91bnRlZC4gKi9cbiAgZ2V0UmVnaW9uT3ZlcmxheSgpOiBJUmVnaW9uT3ZlcmxheSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXk7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gaXNvc3VyZmFjZSwgc28gbm8gY29udHJvbHMuICovXG4gIGdldElzb3N1cmZhY2VDb250cm9scygpOiBJSXNvc3VyZmFjZUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gM0Qgc2NlbmVzLCBzbyBubyBjb250cm9scy4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogT1NEIHJlbmRlcnMgb25seSB0aGUgaW1hZ2UgdHlwZSDigJQgbm8gTElORSBpbnRlbnNpdHkgUk9Jcywgc28gbm8gY29udHJvbHMuICovXG4gIGdldEludGVuc2l0eUNvbnRyb2xzKCk6IElJbnRlbnNpdHlDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB0b092ZXJsYXlNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogUmVnaW9uVG9vbE1vZGUge1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSAnZHJhd3JlY3QnOlxuICAgICAgICByZXR1cm4gJ2RyYXdyZWN0JztcbiAgICAgIGNhc2UgJ2RyYXdjbG9zZWRwYXRoJzpcbiAgICAgICAgcmV0dXJuICdkcmF3Y2xvc2VkcGF0aCc7XG4gICAgICBjYXNlICdkcmF3b3BlbnBhdGgnOlxuICAgICAgICByZXR1cm4gJ2RyYXdvcGVucGF0aCc7XG4gICAgICBjYXNlICdkcmF3cG9seWdvbic6XG4gICAgICAgIHJldHVybiAnZHJhd3BvbHlnb24nO1xuICAgICAgY2FzZSAnYWRkcG9pbnQnOlxuICAgICAgICByZXR1cm4gJ2FkZHBvaW50JztcbiAgICAgIGNhc2UgJ2RlbGV0ZXBvaW50JzpcbiAgICAgICAgcmV0dXJuICdkZWxldGVwb2ludCc7XG4gICAgICBjYXNlICdtb3ZlJzpcbiAgICAgICAgcmV0dXJuICdtb3ZlJztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICAvKiBob3N0IHJlLWRyaXZlcyBwbG90KCkgdmlhIHRoZSBpbWFnZS1pbmZvIHN0cmVhbSAqL1xuICB9XG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVZpZXdlcigpO1xuICB9XG4gIHJlbGF5b3V0KF90cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBjb25zdCB2cCA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwKSByZXR1cm47XG4gICAgLy8gS2VlcCB0aGUgdXNlcidzIGN1cnJlbnQgdmlldyBhY3Jvc3MgYSBjb250YWluZXIvc3BsaXQgcmVzaXplIGluc3RlYWQgb2ZcbiAgICAvLyBzbmFwcGluZyBob21lLiBWaWV3cG9ydCBib3VuZHMgYXJlIGltYWdlLXJlbGF0aXZlIChpbWFnZSB3aWR0aCA9IDEpLCBzb1xuICAgIC8vIHRoZXkncmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbnRhaW5lcidzIHBpeGVsIHNpemUg4oCUIGNhcHR1cmUgdGhlIHZpc2libGVcbiAgICAvLyByZWdpb24gbm93IGFuZCByZS1maXQgaXQgb25jZSB0aGUgbmV3IHNpemUgaGFzIHNldHRsZWQuIE9TRCdzIGF1dG9SZXNpemVcbiAgICAvLyBmaXJlcyBhc3luY2hyb25vdXNseSBhbmQgdGhlIGFuZ3VsYXItc3BsaXQgdHJhbnNpdGlvbiBhbmltYXRlcyB0aGUgd2lkdGhcbiAgICAvLyBvdmVyIGEgZmV3IGh1bmRyZWQgbXMsIHNvIHJlc3RvcmUgb24gdGhlIG5leHQgZnJhbWUgYW5kIGFnYWluIGFmdGVyIHRoZVxuICAgIC8vIHRyYW5zaXRpb24gY29tcGxldGVzLlxuICAgIGNvbnN0IGJvdW5kcyA9IHZwLmdldEJvdW5kcyh0cnVlKTtcbiAgICBjb25zdCByZXN0b3JlID0gKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0LmZpdEJvdW5kcyhib3VuZHMsIHRydWUpO1xuICAgICAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuYXBwbHlDb25zdHJhaW50cyh0cnVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiB2aWV3ZXIgdG9ybiBkb3duICovXG4gICAgICB9XG4gICAgfTtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzdG9yZSk7XG4gICAgc2V0VGltZW91dChyZXN0b3JlLCAzNTApO1xuICB9XG4gIHJlc2V0QXhlcygpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuZ29Ib21lKCk7XG4gIH1cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5nb0hvbWUoKTtcbiAgICB0aGlzLmF1dG9zY2FsZUV2ZW50JC5uZXh0KCdhdXRvc2NhbGUnKTtcbiAgfVxuICB6b29tSW4oKTogdm9pZCB7XG4gICAgdGhpcy52aWV3ZXI/LnZpZXdwb3J0Lnpvb21CeSgxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdlcj8udmlld3BvcnQuem9vbUJ5KDEgLyAxLjMpO1xuICAgIHRoaXMudmlld2VyPy52aWV3cG9ydC5hcHBseUNvbnN0cmFpbnRzKCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBSZWN0YW5nbGUvcG9seWdvbiBkcmF3aW5nIHJ1biBvbiB0aGUgU1ZHIG92ZXJsYXk7IHdhbmQvZXJhc2VyL3pvb20tYm94XG4gICAgLy8gKGN1c3RvbSBQbG90bHkgb3ZlcmxheXMpIGFyZSByb3V0ZWQgdG8gUGxvdGx5IGJ5IHRoZSByb3V0ZXIgYW5kIGFyZW4ndFxuICAgIC8vIGhhbmRsZWQgaGVyZSB5ZXQuXG4gICAgdGhpcy5vdmVybGF5Py5zZXRNb2RlKHRoaXMudG9PdmVybGF5TW9kZShtb2RlKSk7XG4gIH1cblxuICBzZXRTaG93U3RhY2soX3Nob3dzdGFjazogYm9vbGVhbik6IHZvaWQge1xuICAgIC8qIE9TRCBuYXZpZ2F0ZXMgdGhlIHN0YWNrIHZpYSB0aGUgei1zbGlkZXIgLT4gc2V0WkluZGV4ICovXG4gIH1cblxuICAvKiogU2hvdy9oaWRlIHRoZSBvdmVydmlldyBuYXZpZ2F0b3IuIFN0b3JlZCBmb3IgdGhlIG5leHQgdmlld2VyIGNyZWF0aW9uLCBhbmRcbiAgICogIGFwcGxpZWQgbGl2ZSB3aGVuIGEgdmlld2VyIGlzIGFscmVhZHkgbW91bnRlZCAoaGlkZXMvcmV2ZWFscyBpdHMgZWxlbWVudCDigJRcbiAgICogIHRoZSBuYXZpZ2F0b3IgaW5zdGFuY2UgaXRzZWxmIG9ubHkgZXhpc3RzIHdoZW4gY3JlYXRlZCB3aXRoIHNob3dOYXZpZ2F0b3IpLiAqL1xuICBzZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRvclZpc2libGUgPSB2aXNpYmxlO1xuICAgIGNvbnN0IG5hdkVsOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5uYXZpZ2F0b3I/LmVsZW1lbnQ7XG4gICAgaWYgKG5hdkVsKSBuYXZFbC5zdHlsZS5kaXNwbGF5ID0gdmlzaWJsZSA/ICcnIDogJ25vbmUnO1xuICB9XG5cbiAgLyoqIFRvZ2dsZSBiaWxpbmVhciBzbW9vdGhpbmcgdnMgbmVhcmVzdC1uZWlnaGJvdXIgKGNyaXNwIHBpeGVscykuIFN0b3JlZCBmb3IgdGhlXG4gICAqICBuZXh0IHZpZXdlciBjcmVhdGlvbiwgYW5kIGFwcGxpZWQgbGl2ZSAod2l0aCBhIHJlZHJhdykgdG8gYSBtb3VudGVkIHZpZXdlci4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBlbmFibGVkO1xuICAgIGNvbnN0IGRyYXdlcjogYW55ID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcjtcbiAgICBpZiAoZHJhd2VyPy5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgIGRyYXdlci5zZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZCk7XG4gICAgICB0aGlzLnZpZXdlcj8uZm9yY2VSZWRyYXcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dhcCB0aGUgZGlzcGxheWVkIHotc2xpY2UgbGl2ZS4gU2xpY2VzIGFyZSBrZXB0IGFzIHNlcGFyYXRlIHRpbGVkIGltYWdlcyBpblxuICAgKiB0aGUgd29ybGQsIHNvIHN3aXRjaGluZyBpcyBqdXN0IGFuIG9wYWNpdHkgdG9nZ2xlOiBhIHByZXZpb3VzbHktdmlzaXRlZCBzbGljZVxuICAgKiBzaG93cyBpbnN0YW50bHkgKGl0cyBkZWNvZGVkICsgcmVjb2xvcmVkIHRpbGVzIGFyZSBzdGlsbCByZXNpZGVudCksIGFuZCBhXG4gICAqIG5ldmVyLXNlZW4gc2xpY2UgaXMgYWRkZWQgb25jZS4gVGhlIHJlZ2lvbiBvdmVybGF5LCBjb29yZGluYXRlIHRyYW5zZm9ybSxcbiAgICogc2NhbGUgYmFyLCBjb2xvcm1hcCBwaXBlbGluZSBhbmQgY3VycmVudCB6b29tL3BhbiBhbGwgcGVyc2lzdCDigJQgdGhlIHgveVxuICAgKiBnZW9tZXRyeSBpcyBpZGVudGljYWwgYWNyb3NzIHNsaWNlcy5cbiAgICpcbiAgICogU2ltcGxlIG1vZGUgKHRpbGVkOmZhbHNlIOKAlCBhIG51bWJlcmVkIGltYWdlIHNlcmllcyBhc3NlbWJsZWQgY2xpZW50LXNpZGUsXG4gICAqIGVhY2ggc2xpY2UgaXRzIG93biBjb21wbGV0ZSBpbWFnZSB3aXRoIG5vIHNoYXJlZCB0aWxlIHNlcnZlcikgaGFzIG5vXG4gICAqIHB5cmFtaWQgdG8gdG9nZ2xlIG9wYWNpdHkgb24sIHNvIGl0IHJlLW9wZW5zIHRoZSB2aWV3ZXIgb24gdGhlIG5ld1xuICAgKiBzbGljZSdzIFVSTCBpbnN0ZWFkLiBwcmVzZXJ2ZVZpZXdwb3J0ICh2aWV3ZXIgb3B0aW9uLCBzZWUgcGxvdCgpKSBrZWVwc1xuICAgKiB0aGUgY3VycmVudCB6b29tL3BhbiBhY3Jvc3MgdGhhdCByZW9wZW4uXG4gICAqL1xuICBzZXRaSW5kZXgoekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB6ID0gekluZGV4IHx8IDA7XG4gICAgaWYgKHogPT09IHRoaXMuY3VycmVudFopIHJldHVybjtcbiAgICBpZiAoIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2ltcGxlTW9kZSkge1xuICAgICAgaWYgKHRoaXMuc2ltcGxlTXVsdGljaGFubmVsKSB7XG4gICAgICAgIGNvbnN0IHVybHMgPSB0aGlzLnNpbXBsZUNoYW5uZWxVcmxzW3pdID8/IHRoaXMuc2ltcGxlQ2hhbm5lbFVybHNbMF07XG4gICAgICAgIGlmICghdXJscykgcmV0dXJuO1xuICAgICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7XG4gICAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTaW1wbGVDaGFubmVsUGxhbmVzKHVybHMpO1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRaICE9PSB6IHx8ICF0aGlzLnZpZXdlcikgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuc2FtcGxlci5jb21wdXRlU2ltcGxlTXVsdGljaGFubmVsSGlzdG9ncmFtcyh6LCB0aGlzLnNpbXBsZUNoYW5uZWxQbGFuZXMpO1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuY29tcG9zaXRlU2ltcGxlTXVsdGljaGFubmVsKCk7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyIHx8ICF1cmwpIHJldHVybjtcbiAgICAgICAgICB0aGlzLnZpZXdlci5vcGVuKHsgdHlwZTogJ2ltYWdlJywgdXJsIH0gYXMgYW55KTtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3VXJsID0gdGhpcy5zaW1wbGVVcmxzW3pdID8/IHRoaXMuc2ltcGxlVXJsc1swXTtcbiAgICAgIGlmICghcmF3VXJsKSByZXR1cm47XG4gICAgICB0aGlzLmN1cnJlbnRaID0gejtcbiAgICAgIHRoaXMudmlld3BvcnRQaXhlbHMgPSBudWxsO1xuICAgICAgLy8gRmV0Y2hlZCB2aWEgU2ltcGxlU2xpY2VBY2Nlc3NTZXJ2aWNlIChhdXRoIGludGVyY2VwdG9yIGFwcGxpZXMpIHRoZW5cbiAgICAgIC8vIHVwc2NhbGVkIHRvIGZ1bGwtcmVzIChzYW1lIGFzIHRoZSBpbml0aWFsIGxvYWQg4oCUIHNlZSB0b0Z1bGxSZXNVcmwpIHNvXG4gICAgICAvLyB0aGUgd29ybGQgc3RheXMgZnVsbC1yZXMgYWNyb3NzIHNsaWNlcyBhbmQgUk9JcyBrZWVwIGFsaWduaW5nLiBHdWFyZFxuICAgICAgLy8gYWdhaW5zdCBhIG5ld2VyIHNjcnViIGxhbmRpbmcgZmlyc3QuXG4gICAgICB0aGlzLnNpbXBsZVN0YWNrLmZldGNoQXNCbG9iVXJsKHJhd1VybClcbiAgICAgICAgLnRoZW4oKHByZXZpZXdVcmwpID0+XG4gICAgICAgICAgdGhpcy50b0Z1bGxSZXNVcmwocHJldmlld1VybCwgdGhpcy5kZXNjcmlwdG9yPy53aWR0aCA/PyAwLCB0aGlzLmRlc2NyaXB0b3I/LmhlaWdodCA/PyAwKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbigodXJsKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY3VycmVudFogIT09IHogfHwgIXRoaXMudmlld2VyKSByZXR1cm47XG4gICAgICAgICAgdGhpcy52aWV3ZXIuYWRkT25jZUhhbmRsZXIoJ29wZW4tZmFpbGVkJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbT1NEXSBzbGljZSByZS1vcGVuIGZhaWxlZCcsIGU/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy52aWV3ZXIub3Blbih7IHR5cGU6ICdpbWFnZScsIHVybCB9IGFzIGFueSk7XG4gICAgICAgICAgdm9pZCB0aGlzLnNhbXBsZVNpbXBsZUhpc3RvZ3JhbSh1cmwsIHopOyAvLyByZS1iaW4gdGhlIHNjcnViYmVkIHNsaWNlXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLndhcm4oJ1tPU0RdIHNsaWNlIGZldGNoIGZhaWxlZCcsIGVycikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGVzY3JpcHRvciB8fCAhdGhpcy5pbmZvQjY0KSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50WiA9IHo7XG4gICAgdGhpcy52aWV3cG9ydFBpeGVscyA9IG51bGw7IC8vIHdhbmQgcmVhZGJhY2sgaXMgc2xpY2Utc3BlY2lmaWNcbiAgICB0aGlzLmNhY2hlLnNob3dTbGljZSh6KTtcbiAgICBpZiAodGhpcy5pc011bHRpQ2hhbm5lbCkge1xuICAgICAgdGhpcy5zYW1wbGVyLmNvbXB1dGVNdWx0aUNoYW5uZWxIaXN0b2dyYW1zKHRoaXMuZGVzY3JpcHRvciwgdGhpcy5pbmZvQjY0LCB6KTtcbiAgICB9XG4gIH1cblxuICBzZXRTdGFja0xvYWRpbmcoc3RhY2tMb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5zdGFja0xvYWRpbmckLm5leHQoc3RhY2tMb2FkaW5nKTtcbiAgfVxuICBpc1N0YWNrTG9hZGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdGFja0xvYWRpbmckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tMb2FkaW5nUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0VHJ1ZUltYWdlU2l6ZSgpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yID8geyB3aWR0aDogdGhpcy5kZXNjcmlwdG9yLndpZHRoLCBoZWlnaHQ6IHRoaXMuZGVzY3JpcHRvci5oZWlnaHQgfSA6IG51bGw7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGRpc3BsYXllZCBwaXhlbHMg4oCUIHRoZSByZW5kZXJlZCB2aWV3cG9ydCAod2hhdCB0aGUgdXNlciBzZWVzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgem9vbSBhbmQgYW55IGNvbG9ybWFwIHJlY29sb3IpLCBhcyBSR0JBLiBGZWVkcyB0aGVcbiAgICogcHJvY2Vzc2luZy1waXBlbGluZSBkaWFsb2cncyBcInVzZSBjdXJyZW50IHZpZXdcIi4gUmV0dXJucyBudWxsIHVudGlsIHRpbGVzXG4gICAqIGFyZSBkcmF3bi5cbiAgICovXG4gIGdldERpc3BsYXllZFBpeGVsRGF0YSgpOiBQaXhlbERhdGEgfCBudWxsIHtcbiAgICBjb25zdCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkID0gKHRoaXMudmlld2VyIGFzIGFueSk/LmRyYXdlcj8uY2FudmFzO1xuICAgIGlmICghY2FudmFzIHx8ICFjYW52YXMud2lkdGggfHwgIWNhbnZhcy5oZWlnaHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgIGlmICghY3R4KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGNhbnZhcztcbiAgICBjb25zdCBpbWcgPSBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzOiA0LCBkYXRhOiBpbWcuZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEltYWdlLXBpeGVsIHJlY3RhbmdsZSB0aGUgZHJhd2VyIGNhbnZhcyAod2hhdCB7QGxpbmsgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhfVxuICAgKiByZWFkcykgY3VycmVudGx5IGNvdmVycy4gVW5saWtlIHtAbGluayBlbWl0Vmlld3BvcnRDaGFuZ2V9LCB0aGlzIGlzIE5PVFxuICAgKiBjbGFtcGVkIHRvIHRoZSBpbWFnZSBib3VuZHM6IHRoZSBjYW52YXMgbWFwcyAxOjEgdG8gdGhlIHZpZXdwb3J0IHJlY3RhbmdsZSxcbiAgICogc28gbGVhdmluZyBpdCB1bmNsYW1wZWQga2VlcHMgYGNhbnZhc1B4IC0+IGltYWdlUHhgIGFuIGV4YWN0IGFmZmluZSBtYXBcbiAgICogKGNsYW1waW5nIHdvdWxkIHNrZXcgY29vcmRpbmF0ZXMgbmVhciB0aGUgaW1hZ2UgZWRnZXMpLiBSb3V0ZWQgdGhyb3VnaCB3b3JsZFxuICAgKiBpdGVtIDAgKHNlZSB7QGxpbmsgdmlld3BvcnRSZWN0VG9JbWFnZX0pIGZvciBtdWx0aS1sYXllciBhY2N1cmFjeS5cbiAgICovXG4gIGdldERpc3BsYXllZFNvdXJjZVJlY3QoKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZwOiBhbnkgPSB0aGlzLnZpZXdlcj8udmlld3BvcnQ7XG4gICAgaWYgKCF2cCB8fCAhdGhpcy5kZXNjcmlwdG9yKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IHZpZXdwb3J0UmVjdFRvSW1hZ2UodGhpcy52aWV3ZXIsIHZwLmdldEJvdW5kcyh0cnVlKSk7XG4gICAgICByZXR1cm4geyB4OiByLngsIHk6IHIueSwgd2lkdGg6IHIud2lkdGgsIGhlaWdodDogci5oZWlnaHQgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRvd25sb2FkSW1hZ2UoKTogdm9pZCB7XG4gICAgLy8gU25hcHNob3QgdGhlIGN1cnJlbnRseSByZW5kZXJlZCBPU0QgdmlldyBhcyBhIFBORyAoV1lTSVdZRykg4oCUIHRoZSBwYXJhbGxlbFxuICAgIC8vIHRvIFBsb3RseSdzIGRvd25sb2FkSW1hZ2UuIE9TRCB1c2VzIHRoZSAyRCBjYW52YXMgZHJhd2VyIGFuZCBiYWtlcyB0aGVcbiAgICAvLyBhY3RpdmUgZGlzcGxheSBzZXR0aW5ncyAod2luZG93IC8gZ2FtbWEgLyBjb2xvcm1hcCAvIHBlci1jaGFubmVsIGNvbG91cnMgL1xuICAgIC8vIGludmVydCkgaW50byB0aGUgdGlsZXMgdmlhIHRoZSByZWNvbG9yIHBpcGVsaW5lLCBzbyB0aGUgZHJhd2VyIGNhbnZhc1xuICAgIC8vIGFscmVhZHkgcmVmbGVjdHMgZXhhY3RseSB3aGF0J3Mgb24gc2NyZWVuIGF0IHRoZSBjdXJyZW50IHpvb20vcGFuLiBUaGVcbiAgICAvLyBmdWxsLXJlc29sdXRpb24gc3RpdGNoZWQgZXhwb3J0IGxpdmVzIGluIGV4cG9ydENvbXBvc2l0ZSgpIChDaGFubmVscyAmXG4gICAgLy8gSGlzdG9ncmFtIGRpYWxvZykuXG4gICAgY29uc3QgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZCA9ICh0aGlzLnZpZXdlciBhcyBhbnkpPy5kcmF3ZXI/LmNhbnZhcztcbiAgICBpZiAoIWNhbnZhcyB8fCAhY2FudmFzLndpZHRoIHx8ICFjYW52YXMuaGVpZ2h0KSByZXR1cm47XG4gICAgY29uc3Qgc3RlbSA9ICh0aGlzLmN1cnJlbnRGaWxlTmFtZSB8fCAnaW1hZ2UnKS5yZXBsYWNlKC9cXC5bXi5dKyQvLCAnJyk7XG4gICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xuICAgICAgaWYgKGJsb2IpIHNhdmVBcyhibG9iLCBgJHtzdGVtfS5wbmdgKTtcbiAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gIH1cblxuICBzZXRQbG90VHlwZShfcGxvdFR5cGU6IFBsb3RUeXBlKTogdm9pZCB7XG4gICAgLyogT1NEIG9ubHkgcmVuZGVycyB0aGUgaW1hZ2UgdHlwZSAqL1xuICB9XG4gIHNldFN1cmZhY2VEcmFnTW9kZShfbW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuICByZXNldFN1cmZhY2VDYW1lcmEoKTogdm9pZCB7XG4gICAgLyogM0Qgbm90IHN1cHBvcnRlZCBieSBPU0QgKi9cbiAgfVxuXG4gIGdldEF1dG9zY2FsZUV2ZW50KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b3NjYWxlRXZlbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFZpc2libGUgaW1hZ2UgcmVnaW9uIChmdWxsLWltYWdlIHBpeGVsIGNvb3JkcyksIGVtaXR0ZWQgd2hlbiB0aGUgdmlld1xuICAgKiAgc2V0dGxlcy4gVGhlIGludGVuc2l0eSBpbnNldCByZS1zYW1wbGVzIHRoaXMgcmVnaW9uIGF0IHRoZSB6b29tIHJlc29sdXRpb24uICovXG4gIGdldFZpZXdwb3J0Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy52aWV3cG9ydENoYW5nZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKioge0BsaW5rIElJbnRlbnNpdHlTYW1wbGluZ30gc3R1YiDigJQgaW50ZW5zaXR5IHNhbXBsaW5nIGxpdmVzIGluIHRoZSBQbG90bHlcbiAgICogIGJhY2tlbmQgKGl0IG93bnMgcGl4ZWwgcmVhZGJhY2spLiBPU0QgZmVlZHMgaXQgb25seSB2aWEgZ2V0Vmlld3BvcnRDaGFuZ2UkO1xuICAgKiAgdGhlIHNhbXBsaW5nLWNhY2hlIHByaW1pbmcgaXRzZWxmIGlzIGEgbm8tb3AgaGVyZS4gKi9cbiAgYXN5bmMgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoX2ltYWdlSW5mbzogSUltYWdlSW5mbywgX3pJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLyogbm8tb3A6IFBsb3RseSBvd25zIGludGVuc2l0eSBzYW1wbGluZyAoc2VlIElJbnRlbnNpdHlTYW1wbGluZykgKi9cbiAgfVxuXG4gIC8qKiB7QGxpbmsgSUludGVuc2l0eVNhbXBsaW5nfSBzdHViIOKAlCBzZWUge0BsaW5rIGVuc3VyZUludGVuc2l0eVNhbXBsaW5nfS4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKF94OiBudW1iZXIsIF95OiBudW1iZXIsIF93aWR0aDogbnVtYmVyLCBfaGVpZ2h0OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvKiBuby1vcDogUGxvdGx5IG93bnMgaW50ZW5zaXR5IHNhbXBsaW5nIChzZWUgSUludGVuc2l0eVNhbXBsaW5nKSAqL1xuICB9XG5cbiAgLyoqIENvbXB1dGUgdGhlIGN1cnJlbnQgdmlld3BvcnQncyBpbWFnZS1waXhlbCByZWN0YW5nbGUgKGNsYW1wZWQgdG8gdGhlIGltYWdlKVxuICAgKiAgYW5kIGJyb2FkY2FzdCBpdC4gKi9cbiAgcHJpdmF0ZSBlbWl0Vmlld3BvcnRDaGFuZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgdnA6IGFueSA9IHRoaXMudmlld2VyPy52aWV3cG9ydDtcbiAgICBpZiAoIXZwIHx8ICF0aGlzLmRlc2NyaXB0b3IpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB3b3JsZCBpdGVtIDAgKG9zZC1jb29yZHMpOiB2cC52aWV3cG9ydFRvSW1hZ2VSZWN0YW5nbGUgaXNcbiAgICAgIC8vIGluYWNjdXJhdGUgYW5kIHdhcm5zIHdoZW4gdGhlIHdvcmxkIGhvbGRzIG11bHRpcGxlIGltYWdlcyAocGVyLWNoYW5uZWxcbiAgICAgIC8vIG11bHRpY2hhbm5lbCBsYXllcnMpLCB3aGljaCBmZWQgdGhlIGludGVuc2l0eSBpbnNldCBhIHdyb25nIFJPSS5cbiAgICAgIGNvbnN0IHIgPSB2aWV3cG9ydFJlY3RUb0ltYWdlKHRoaXMudmlld2VyLCB2cC5nZXRCb3VuZHModHJ1ZSkpO1xuICAgICAgY29uc3QgaXcgPSB0aGlzLmRlc2NyaXB0b3Iud2lkdGgsIGloID0gdGhpcy5kZXNjcmlwdG9yLmhlaWdodDtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihpdywgci54KSk7XG4gICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaWgsIHIueSkpO1xuICAgICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpdyAtIHgsIHIud2lkdGgpKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGloIC0geSwgci5oZWlnaHQpKTtcbiAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2UkLm5leHQoeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLyogdmlld3BvcnQgbm90IHJlYWR5ICovXG4gICAgfVxuICB9XG5cbiAgLyoqIE9TRCB0YXJnZXRzIHRoZSBpbWFnZSBkaXNwbGF5OyB0aGUgc2NhbGFyLzNEIHBsb3QgdHlwZXMgYmVsb25nIHRvIFBsb3RseS4gKi9cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIFtQTE9UX1RZUEVfREVTQ1JJUFRPUlNbUGxvdFR5cGUuSEVBVE1BUF0hXTtcbiAgfVxuXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5UHJvZmlsZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cbiAgLyoqIE9TRCBvbmx5IHJlbmRlcnMgdGhlIGltYWdlIHR5cGU7IHRoZSBMSU5FIGludGVuc2l0eSBpbnNldCBpcyBQbG90bHktb25seS4gKi9cbiAgcmVuZGVySW50ZW5zaXR5SW5zZXQoX2RpdklkOiBzdHJpbmcsIF9wcm9maWxlczogSW50ZW5zaXR5UHJvZmlsZVtdKTogdm9pZCB7XG4gICAgLyogbm8gTElORSBtb2RlIG9uIE9TRCAqL1xuICB9XG5cbiAgLy8g4pSA4pSAIElSZWdpb25TdG9yZSArIGNsYXNzaWZpY2F0aW9uIGNvbG91cnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIEluaGVyaXRlZCBmcm9tIEJhc2VTdG9yZVZpc3VhbGl6ZXIg4oCUIHB1cmUgZGVsZWdhdGlvbnMgdG8gdGhlIHNoYXJlZFxuICAvLyBSZWdpb25TdG9yZSAvIFZpc3VhbGl6ZXJTdG9yZSAoaWRlbnRpY2FsIHRvIG5hcGFyaS1qcykuIFRoZSBPU0QgcmVnaW9uXG4gIC8vIG92ZXJsYXkgKGNvbnN0cnVjdGVkIGluIHBsb3QoKSkgcmVhZHMvd3JpdGVzIHRoYXQgc2FtZSBzdG9yZSwgc28gcmVnaW9uc1xuICAvLyBzdGF5IGluIHN5bmMgd2l0aCBQbG90bHkgYW5kIHRoZSBSZWdpb24gRWRpdG9yOyBPU0QgcmVuZGVycyB0aGVtIGFzIGFuIFNWR1xuICAvLyBvdmVybGF5IHJhdGhlciB0aGFuIGNhcnJ5aW5nIFBsb3RseSBzaGFwZSBkaWN0cy5cblxuICAvLyDilIDilIAgSVRvb2xDb250cm9sbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyBXYW5kICsgdmVydGV4IGVyYXNlciBydW4gb3ZlciBPU0QgdmlhIElDb29yZGluYXRlVHJhbnNmb3JtLiBUaGV5IHNoYXJlIHRoZVxuICAvLyBzaW5nbGV0b24gdG9vbCBzZXJ2aWNlcyB3aXRoIFBsb3RseSwgc28gd2UgcmUtYmluZCB0byBvdXIgaG9zdHMgb24gYWN0aXZhdGUuXG4gIHNldFdhbmRNb2RlKGFjdGl2ZTogYm9vbGVhbiwgb3B0aW9ucz86IGFueSk6IHZvaWQge1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLndhbmRUb29sLnNldE1vZGUoZmFsc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUYWtlIHRoZSBwb2ludGVyIGZyb20gT1NEIHNvIHRoZSBkcmFnIGRyYXdzIGluc3RlYWQgb2YgcGFubmluZy4gKE5hdiBpc1xuICAgIC8vIHJlLWVuYWJsZWQgd2hlbiB0aGUgcmVnaW9uIG92ZXJsYXkgcmV0dXJucyB0byAnbm9uZScgb24gdG9vbCBzd2l0Y2guKVxuICAgIHRoaXMudmlld2VyPy5zZXRNb3VzZU5hdkVuYWJsZWQoZmFsc2UpO1xuICAgIC8vIFRoZSB3YW5kIHNhbXBsZXMgdGhlIHJlbmRlcmVkIHZpZXdwb3J0IOKAlCByZWFkIGJhY2sgbGF6aWx5IG9uIGZpcnN0IHVzZS5cbiAgICB0aGlzLnZpZXdwb3J0UGl4ZWxzID0gbnVsbDtcbiAgICB0aGlzLndhbmRUb29sLmJpbmRIb3N0KHRoaXMud2FuZEhvc3QpO1xuICAgIHRoaXMud2FuZFRvb2wuc2V0TW9kZSh0cnVlLCAob3B0aW9ucyA/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==