obsidian-integration-testing 11.0.0 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/appium-server-marker.cjs +115 -0
- package/dist/lib/cjs/appium-server-marker.d.cts +81 -0
- package/dist/lib/cjs/cli.cjs +104 -19
- package/dist/lib/cjs/cli.d.cts +16 -8
- package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
- package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
- package/dist/lib/cjs/context-provider.cjs +12 -1
- package/dist/lib/cjs/context-provider.d.cts +26 -3
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +113 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +36 -9
- package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
- package/dist/lib/cjs/index.cjs +13 -1
- package/dist/lib/cjs/index.d.cts +8 -4
- package/dist/lib/cjs/installer-asset.cjs +1 -1
- package/dist/lib/cjs/installer-asset.d.cts +1 -1
- package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
- package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
- package/dist/lib/cjs/jest/global-setup.cjs +2 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/kill-process-tree.cjs +18 -7
- package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +161 -0
- package/dist/lib/cjs/mobile-input.d.cts +160 -0
- package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
- package/dist/lib/cjs/obsidian-installer.cjs +1 -1
- package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
- package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
- package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
- package/dist/lib/cjs/release-catalog.cjs +73 -0
- package/dist/lib/cjs/release-catalog.d.cts +125 -0
- package/dist/lib/cjs/transport-appium.cjs +122 -1
- package/dist/lib/cjs/transport-appium.d.cts +51 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +7 -1
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +1 -0
- package/dist/lib/cjs/transport-factory.cjs +237 -32
- package/dist/lib/cjs/transport-factory.d.cts +10 -1
- package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
- package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/vitest/setup.cjs +2 -1
- package/dist/lib/cjs/vitest/setup.d.cts +5 -0
- package/dist/lib/cjs/vitest/typings.d.cts +6 -4
- package/dist/lib/cjs/webview-cdp.cjs +264 -0
- package/dist/lib/cjs/webview-cdp.d.cts +152 -0
- package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
- package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
- package/dist/lib/esm/appium-server-marker.d.mts +81 -0
- package/dist/lib/esm/appium-server-marker.mjs +83 -0
- package/dist/lib/esm/cli.d.mts +16 -8
- package/dist/lib/esm/cli.mjs +110 -19
- package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
- package/dist/lib/esm/community-plugin-registry.mjs +23 -0
- package/dist/lib/esm/context-provider.d.mts +26 -3
- package/dist/lib/esm/context-provider.mjs +10 -1
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +113 -0
- package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
- package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
- package/dist/lib/esm/demo-vault-populate.mjs +33 -8
- package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/index.d.mts +8 -4
- package/dist/lib/esm/index.mjs +16 -2
- package/dist/lib/esm/installer-asset.d.mts +1 -1
- package/dist/lib/esm/installer-asset.mjs +1 -1
- package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
- package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
- package/dist/lib/esm/jest/global-setup.d.mts +5 -1
- package/dist/lib/esm/jest/global-setup.mjs +2 -2
- package/dist/lib/esm/kill-process-tree.d.mts +10 -2
- package/dist/lib/esm/kill-process-tree.mjs +16 -6
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +160 -0
- package/dist/lib/esm/mobile-input.mjs +132 -0
- package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
- package/dist/lib/esm/obsidian-installer.mjs +1 -1
- package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
- package/dist/lib/esm/obsidian-metadata.mjs +123 -17
- package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
- package/dist/lib/esm/release-catalog.d.mts +125 -0
- package/dist/lib/esm/release-catalog.mjs +46 -0
- package/dist/lib/esm/transport-appium.d.mts +51 -0
- package/dist/lib/esm/transport-appium.mjs +126 -1
- package/dist/lib/esm/transport-desktop-cdp.d.mts +1 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +7 -1
- package/dist/lib/esm/transport-factory.d.mts +10 -1
- package/dist/lib/esm/transport-factory.mjs +249 -35
- package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
- package/dist/lib/esm/vitest/global-setup.mjs +14 -7
- package/dist/lib/esm/vitest/setup.d.mts +5 -0
- package/dist/lib/esm/vitest/setup.mjs +3 -1
- package/dist/lib/esm/vitest/typings.d.mts +6 -4
- package/dist/lib/esm/webview-cdp.d.mts +152 -0
- package/dist/lib/esm/webview-cdp.mjs +236 -0
- package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
- package/dist/lib/esm/wedged-appium-server.mjs +86 -0
- package/package.json +2 -1
|
@@ -614,8 +614,14 @@ class DesktopCdpTransport {
|
|
|
614
614
|
* Fetches the list of page-type targets from the CDP `/json` endpoint.
|
|
615
615
|
*
|
|
616
616
|
* @returns The list of page targets.
|
|
617
|
+
* @throws {Error} When no CDP endpoint is configured yet.
|
|
617
618
|
*/
|
|
618
619
|
async getPageTargets() {
|
|
620
|
+
if (!this.cdpUrl) {
|
|
621
|
+
throw new Error(
|
|
622
|
+
"No CDP endpoint configured: the owned Obsidian instance has not been launched yet, and no `port` was given to attach to a running one. A test worker in this state usually means its global setup failed, or the project is missing the per-worker setup file in `setupFiles`."
|
|
623
|
+
);
|
|
624
|
+
}
|
|
619
625
|
const response = await fetch(`${this.cdpUrl}/json`);
|
|
620
626
|
const targets = await response.json();
|
|
621
627
|
return targets.filter((t) => t.type === "page");
|
|
@@ -997,4 +1003,4 @@ async function getObsidianLaunchCommand(port) {
|
|
|
997
1003
|
export {
|
|
998
1004
|
DesktopCdpTransport
|
|
999
1005
|
};
|
|
1000
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLm1qcyc7XG5pbXBvcnQge1xuICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcsXG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2gubWpzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24gfSBmcm9tICcuL293bmVkLXZhdWx0LXNlZWQubWpzJztcbmltcG9ydCB7IGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24gfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5tanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICByZXNvbHZlUmVuZGVyZXJCb290U3RhdGVcbn0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IubWpzJztcbmltcG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5pbXBvcnQgeyBhcmVWYXVsdFBhdGhzTWF0Y2hpbmcgfSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2gubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gYDMwMDAwYC5cbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcG9zdC1ib290ICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiAodGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZGlmZmVyc1xuICAgKiBmcm9tIHRoZSBzd2FwcGVkLWluIHBpbikgZmFpbHMgZmFzdCB3aXRoIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0uIFRoZVxuICAgKiB2ZXJkaWN0IGlzIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEFzYXJGYWxsYmFja307IHRoaXMgZ2F0ZXMgb25seSB0aGUgdGhyb3cuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlIHJ1bm5pbmcgYSBzd2FwcGVkLWluIGFzYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGxhdW5jaGVzIGFuZCBvd25zIGl0cyBvd24gT2JzaWRpYW4gcHJvY2Vzc1xuICogYWdhaW5zdCBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYXR0YWNoaW5nIHRvIGEgcnVubmluZyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQ29uZmlnIHtcbiAgLyoqXG4gIE9wdGlvbmFsIGFzYXIgdG8gcHJvdmlzaW9uIGludG8ge0BsaW5rIHVzZXJEYXRhRGlyZWN0b3J5fSBiZWZvcmUgbGF1bmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuIENyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoZVxuICAgKiB0cmFuc3BvcnQsIGFuZCBkZWxldGVkIG9uIGRpc3Bvc2UuXG4gICAqL1xuXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIENEUCBlbmRwb2ludCBvZiBhIGxhdW5jaGVkLCBoYXJuZXNzLW93bmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKlxuICBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGZyZWUgQ0RQIHBvcnQgdGhlIG93bmVkIGluc3RhbmNlIHdhcyBsYXVuY2hlZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbkRldGFpbHMge1xuICBleGNlcHRpb24/OiBDZHBFeGNlcHRpb25PYmplY3Q7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbk9iamVjdCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2Uge1xuICBpZDogbnVtYmVyO1xuICByZXN1bHQ/OiBDZHBSZXNwb25zZVJlc3VsdDtcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSByZXR1cm5lZCBieSBgUGFnZS5jYXB0dXJlU2NyZWVuc2hvdGAuXG4gICAqL1xuICByZWFkb25seSBkYXRhPzogc3RyaW5nO1xuICByZWFkb25seSBleGNlcHRpb25EZXRhaWxzPzogQ2RwRXhjZXB0aW9uRGV0YWlscztcbiAgcmVhZG9ubHkgcmVzdWx0PzogQ2RwVmFsdWU7XG59XG5cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICB3ZWJTb2NrZXREZWJ1Z2dlclVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwVmFsdWUge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlPzogdW5rbm93bjtcbn1cblxuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbmNvbnN0IFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIG9jY2FzaW9uYWxseSBib290cyB3aXRob3V0IHRoZSB3b3Jrc3BhY2UgZXZlclxuLy8gSW5pdGlhbGl6aW5nLCBzbyB0aGUgdmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhblxuLy8gSW5kZXBlbmRlbnQgY2hhbmNlOyByZWxhdW5jaCB1cCB0byB0aGlzIG1hbnkgdGltZXMgYmVmb3JlIGdpdmluZyB1cC5cbmNvbnN0IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMgPSAzO1xuLy8gQnJpZWYgc2V0dGxlIGJlZm9yZSBhIHJlbGF1bmNoIHNvIHRoZSBraWxsZWQgaW5zdGFuY2UncyBtZW1vcnkvaGFuZGxlcyBhcmVcbi8vIFJlY2xhaW1lZCBiZWZvcmUgdGhlIG5leHQgYm9vdCBcdTIwMTQgaW1wcm92ZXMgdGhlIG9kZHMgb24gYSBsb2FkZWQgbWFjaGluZS5cbmNvbnN0IE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyNTA7XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIENvbm5lY3RzIHRvIE9ic2lkaWFuJ3MgQ0RQIFdlYlNvY2tldCBlbmRwb2ludCwgc2VuZHMgYFJ1bnRpbWUuZXZhbHVhdGVgXG4gKiBjb21tYW5kcywgYW5kIHJvdXRlcyBleHByZXNzaW9ucyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2RwVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVWYXVsdFBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGFzYXJGYWxsYmFjazogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkcEhvc3Q6IHN0cmluZztcbiAgcHJpdmF0ZSBjZHBQb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgY2RwVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGVsZWN0cm9uQ29tcGF0aWJpbGl0eTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNPYnNpZGlhbkFwcFZpc2libGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWVzc2FnZUlkID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBvd25lZENvbmZpZzogT3duZWRJbnN0YW5jZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvd25lZEluc3RhbmNlOiBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xuICBwcml2YXRlIHdzOiBudWxsIHwgV2ViU29ja2V0ID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDRFAgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ0RQIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgLy8gRGVzdHJ1Y3R1cmUgd2l0aCBwZXItZmllbGQgZGVmYXVsdHMgKGVhY2ggYXBwbGllcyB3aGVuIHRoZSBmaWVsZCBpcyBvbWl0dGVkLFxuICAgIC8vIEV4YWN0bHkgbGlrZSB0aGUgZm9ybWVyIGBjb25maWc/LnggPz8gZGVmYXVsdGApIHNvIHRoZSBjb25zdHJ1Y3RvciBzdGF5c1xuICAgIC8vIFVuZGVyIHRoZSBjeWNsb21hdGljLWNvbXBsZXhpdHkgbGltaXQgYXMgZmllbGRzIGFyZSBhZGRlZC5cbiAgICBjb25zdCB7XG4gICAgICBjZHBIb3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgICBjZHBQb3J0LFxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlID0gZmFsc2UsXG4gICAgICBpc09ic2lkaWFuQXBwVmlzaWJsZSA9IHRydWUsXG4gICAgICBvd25lZEluc3RhbmNlLFxuICAgICAgc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBmYWxzZSxcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSB0cnVlLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHRydWVcbiAgICB9ID0gY29uZmlnID8/IHt9O1xuICAgIHRoaXMuY2RwSG9zdCA9IGNkcEhvc3Q7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBpc0hhcm5lc3NPd25lZEluc3RhbmNlO1xuICAgIHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUgPSBpc09ic2lkaWFuQXBwVmlzaWJsZTtcbiAgICB0aGlzLm93bmVkQ29uZmlnID0gb3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLnNob3VsZERpc2FibGVTYW5kYm94ID0gc2hvdWxkRGlzYWJsZVNhbmRib3g7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaztcbiAgICB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzO1xuICAgIC8vIE93bmVkIG1vZGUgcGlja3MgYSBmcmVlIHBvcnQgYXQgbGF1bmNoIChhc3NpZ25lZCBpbiByZWdpc3RlclZhdWx0KS5cbiAgICAvLyBBdHRhY2ggbW9kZSBjb25uZWN0cyB0byB0aGUgY29uZmlndXJlZCBwb3J0OyBubyBwb3J0IGlzIGhhcmRjb2RlZC5cbiAgICB0aGlzLmNkcFBvcnQgPSBjZHBQb3J0ID8/IDA7XG4gICAgdGhpcy5jZHBVcmwgPSBjZHBQb3J0ID09PSB1bmRlZmluZWQgPyAnJyA6IGBodHRwOi8vJHtjZHBIb3N0fToke1N0cmluZyhjZHBQb3J0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIE9ic2lkaWFuIHdpbmRvdyBzaG93aW5nIHRoZSBnaXZlbiB2YXVsdC5cbiAgICpcbiAgICogV2hlbiBhIHNpemUgaXMgcmVxdWVzdGVkIHRoZSB2aWV3cG9ydCBpcyBwaW5uZWQgdG8gaXQgd2l0aFxuICAgKiBgRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZWAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FwdHVyZSwgc28gdGhlXG4gICAqIGVtaXR0ZWQgUE5HIGlzIGV4YWN0bHkgdGhhdCBzaXplIHdoYXRldmVyIHNpemUgdGhlIHdpbmRvdyBoYXBwZW5zIHRvIGJlIFx1MjAxNFxuICAgKiBhbmQgdGhlIG92ZXJyaWRlIGlzIGFsd2F5cyBjbGVhcmVkIGFmdGVyd2FyZHMsIGluY2x1ZGluZyB3aGVuIHRoZSBjYXB0dXJlXG4gICAqIHRocm93cywgc28gYSBmYWlsZWQgY2FwdHVyZSBjYW5ub3QgbGVhdmUgdGhlIHdpbmRvdyBzdHVjayBhdCB0aGUgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXaGljaCB2YXVsdCB3aW5kb3cgdG8gY2FwdHVyZSwgYW5kIHRoZSBleGFjdCBzaXplIHRvIGNhcHR1cmUgaXQgYXQuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIENEUCByZXR1cm5zIG5vIGltYWdlIGRhdGEsIG9yIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKHBhcmFtcy5jd2QpO1xuICAgIGNvbnN0IGRldmljZU1ldHJpY3NPdmVycmlkZSA9IGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlKHBhcmFtcyk7XG4gICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUnLCBkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAvLyBUaGUgb3ZlcnJpZGUgYWxyZWFkeSBzaXplcyB0aGUgdmlld3BvcnQsIHNvIGNhcHR1cmluZyBiZXlvbmQgaXQgd291bGRcbiAgICAgICAgLy8gUmUtaW50cm9kdWNlIHRoZSBzY3JvbGwgaGVpZ2h0IHRoZSBvdmVycmlkZSBleGlzdHMgdG8gcGluIGRvd24uXG4gICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogJ3BuZydcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UucmVzdWx0Py5kYXRhO1xuICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIG5vIGltYWdlIGRhdGEuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGRhdGEpO1xuICAgICAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRFAgc2NyZWVuc2hvdCBlcnJvcjogUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCByZXR1cm5lZCBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5jbGVhckRldmljZU1ldHJpY3NPdmVycmlkZScsIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBhbmQsIGluIG93bmVkLWluc3RhbmNlIG1vZGUsXG4gICAqIGtpbGxzIHRoZSBvd25lZCBPYnNpZGlhbiBwcm9jZXNzIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbCBpcyByZXRyaWVkIGJlY2F1c2UgV2luZG93cyBicmllZmx5IGhvbGRzIHRoZSBqdXN0LWtpbGxlZFxuICAgKiBwcm9jZXNzJ3MgZmlsZSBoYW5kbGVzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgZmFpbCBgcm1TeW5jYCB3aXRoIGBFUEVSTWAuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICBjb25zdCB7IHVzZXJEYXRhRGlyZWN0b3J5IH0gPSB0aGlzLm93bmVkQ29uZmlnO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBpZiAoZGlkUmVtb3ZlRGlyZWN0b3J5KHVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShVU0VSX0RBVEFfUk1fUkVUUllfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgcmVtb3ZlIG93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgd2l0aGluICR7U3RyaW5nKFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbCk6ICR7dXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIFx1MjAxNCBraWxscyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIG1ha2VzIGEgYmVzdC1lZmZvcnRcbiAgICogcmVtb3ZhbCBvZiBpdHMgdXNlci1kYXRhIGRpcmVjdG9yeS4gU2FmZSB0byBjYWxsIGZyb20gYSBwcm9jZXNzIGBleGl0YCBoYW5kbGVyXG4gICAqICh3aGVyZSBhc3luYyByZXRyaWVzIGFyZSBpbXBvc3NpYmxlOyBhIGxlZnRvdmVyIHRlbXAgZGlyZWN0b3J5IGlzIGFjY2VwdGFibGUpLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICAgIGlmICghZGlkUmVtb3ZlRGlyZWN0b3J5KHRoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgbm90IHJlbW92ZWQgc3luY2hyb25vdXNseSAocHJvY2VzcyBtYXkgc3RpbGwgaG9sZCBoYW5kbGVzKTogJHt0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIHZpYSBDRFAgYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICAgKlxuICAgKiBSb3V0ZXMgdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0IGJhc2VkIG9uIGBvcHRpb25zLmN3ZGAuXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHJlc3VsdCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ob3B0aW9ucy5jd2QpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICBleHByZXNzaW9uLFxuICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8uZXhjZXB0aW9uRGV0YWlscykge1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb25cbiAgICAgICAgPz8gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMudGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ0RQIGV2YWx1YXRpb24gZXJyb3I6ICR7ZGVzY31gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdE9iamVjdCB8fCByZXN1bHRPYmplY3QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHRPYmplY3QudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0IHdoZXRoZXIgdGhlXG4gICAqIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yIHRoZSBpbnN0YWxsZXJcbiAgICogc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIgKHJlYWQgbGl2ZSBwb3N0LWJvb3QpLiBSZXR1cm5zXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90IGJvb3RlZFxuICAgKiB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB0aGUgbGl2ZVxuICAgKiB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlKS4gQSBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW5cbiAgICogdGhlIHRocm93IGlzIGRpc2FibGVkICh7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrfVxuICAgKiBgZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNhckZhbGxiYWNrKCk6IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXNhckZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWRcbiAgICogaW5zdGFuY2UsIHNvIGNhbGxlcnMgY2FuIGFzc2VydCBvbiBpdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90XG4gICAqIGFuIG93bmVkIGluc3RhbmNlLCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBhblxuICAgKiB1bmRldGVjdGFibGUgc2hlbGwgdmVyc2lvbiwgb3IgdGhlIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZSB0YWJsZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBhdGliaWxpdHkoKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3duZWRDb25maWc/LmNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0XG4gICAqIHdoZXRoZXIgdGhlIEVsZWN0cm9uIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBpcyBuZXcgZW5vdWdoIGZvciB0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiAocmVhZCBsaXZlIHBvc3QtYm9vdDsgc2VlIHtAbGluayBPYnNpZGlhblZlcnNpb25NZXRhZGF0YS5taW5SZWNvbW1lbmRlZEVsZWN0cm9uVmVyc2lvbn0pLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90XG4gICAqIGJvb3RlZCB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICh0aGUgbGl2ZSB2ZXJzaW9uIHdhc1xuICAgKiB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBubyByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHkoKTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQ0RQIGVuZHBvaW50IG9mIHRoZSBvd25lZCwgbGF1bmNoZWQgaW5zdGFuY2Ugc28gdGhlIGdsb2JhbCBzZXR1cFxuICAgKiBjYW4gaGFuZCBpdCB0byB0ZXN0IHdvcmtlcnMgKHdoaWNoIHRoZW4gKiphdHRhY2gqKiB0byBpdCBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyB0aGVpciBvd24pLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyB0cmFuc3BvcnQgaXMgbm90IGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciBpdHMgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGhvc3QgYW5kIHBvcnQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpOiBPd25lZEluc3RhbmNlRW5kcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZyB8fCAhdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBob3N0OiB0aGlzLmNkcEhvc3QsIHBvcnQ6IHRoaXMuY2RwUG9ydCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIENEUCBlbmRwb2ludCBpcyByZWFjaGFibGUgYW5kIGhhcyBPYnNpZGlhbiB0YXJnZXRzLlxuICAgKlxuICAgKiBJZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgYXR0ZW1wdHMgdG8gYXV0by1zdGFydCBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCAodXNlZCBmb3IgdmF1bHQgcmVnaXN0cmF0aW9uIGNoZWNrKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVmbGlnaHRDaGVjayh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnIHx8IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgLy8gT3duZWQgaW5zdGFuY2UgKGxhdW5jaGVkIGhlcmUpIG9yIGEgd29ya2VyIGF0dGFjaGVkIHRvIG9uZTogcmVhZGluZXNzIGlzXG4gICAgICAvLyBHdWFyYW50ZWVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAncyByZWdpc3RlclZhdWx0LCBhbmQgdGhlIHZhdWx0IGxpdmVzIGluXG4gICAgICAvLyBUaGUgaXNvbGF0ZWQgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSB1c2VyLXNjb3BlXG4gICAgICAvLyBSZWdpc3RyeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyKCkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhZ2UgdGFyZ2V0cycpO1xuICAgICAgfVxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ0RQIHJlYWNoYWJsZSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCB2aWEgRWxlY3Ryb24gSVBDIGV2YWx1YXRlZCB0aHJvdWdoIENEUC5cbiAgICpcbiAgICogVXNlcyBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQgdG8gc2VuZCB0aGUgYHZhdWx0LW9wZW5gIElQQyBjb21tYW5kLFxuICAgKiB0aGVuIHBvbGxzIHVudGlsIHRoZSBuZXcgdmF1bHQncyB0YXJnZXQgYXBwZWFycy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBieSBkZXN0cm95aW5nIGl0cyB3aW5kb3cgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZTsgbm8gcGVyLXZhdWx0XG4gICAgICAvLyBVbnJlZ2lzdGVyIGlzIG5lZWRlZCAoYW5kIHRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgaXNvbGF0ZWQgY29uZmlnKS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgd2luZG93RGVzdHJveUV4cHJlc3Npb24gPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdpbmRvdyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBgdmF1bHQtcmVtb3ZlYCBJUEMgaXMgc2VudCB0aHJvdWdoIGEgc3RpbGwtb3BlbiB3aW5kb3cgKGB0YXJnZXRzWzBdYCkgXHUyMDE0XG4gICAgICAvLyBgdmF1bHRQYXRoYCdzIG93biB3aW5kb3cgd2FzIGp1c3QgZGVzdHJveWVkIGFib3ZlLCBzbyBib290c3RyYXAgdGhlIG5hbWVzcGFjZVxuICAgICAgLy8gT24gdGhlIGV4aXN0aW5nIHdpbmRvdydzIE9XTiBiYXNlIHBhdGgsIG5vdCBvbiBgdmF1bHRQYXRoYCAod2hpY2ggbm8gbG9uZ2VyIGhhc1xuICAgICAgLy8gQSBsaXZlIHRhcmdldCB0byBtYXRjaCkuXG4gICAgICBjb25zdCByZW1vdmFsVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgICBjb25zdCByZW1vdmFsQmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHJlbW92YWxUYXJnZXQpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChyZW1vdmFsVGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCByZW1vdmFsQmFzZVBhdGgpO1xuICAgICAgICBjb25zdCB2YXVsdFJlbW92ZUV4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1yZW1vdmUnLCBjaGFubmVsQXJndW1lbnRzOiBbdmF1bHRQYXRoXSB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTm8gQ0RQIHRhcmdldHMgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCByZW1vdmluZyBkaXJlY3RseSBmcm9tIG9ic2lkaWFuLmpzb24uJyk7XG4gICAgICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgcnVudGltZS1FbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgKG9uXG4gICAqIHtAbGluayBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9KSBmcm9tIGFuIGFscmVhZHktcmVhZCB2ZXJzaW9uIHBhaXIsIHdhcm5pbmdcbiAgICogd2hlbiB0aGUgbGl2ZSBFbGVjdHJvbiBpcyBiZWxvdyB0aGUgYXBwJ3MgcmVjb21tZW5kZWQgbWluaW11bS4gTmV2ZXIgdGhyb3dzOyBhXG4gICAqIGJvb3Qgd2hvc2UgcnVubmluZyBhcHAgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSBpcyBza2lwcGVkIChub3RoaW5nIHRvIGp1ZGdlKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqIEBwYXJhbSBhY3R1YWxFbGVjdHJvblZlcnNpb24gLSBUaGUgbGl2ZSBFbGVjdHJvbiB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0dWFsRWxlY3Ryb25WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHJlc29sdmVFbGVjdHJvbkNvbXBhdGliaWxpdHkoe1xuICAgICAgYWN0dWFsRWxlY3Ryb25WZXJzaW9uLFxuICAgICAgYXBwVmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgICB9KTtcbiAgICB0aGlzLmVsZWN0cm9uQ29tcGF0aWJpbGl0eSA9IHZlcmRpY3Q7XG4gICAgaWYgKHZlcmRpY3QudGllciA9PT0gJ25hZ2dlZCcgJiYgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSAke2Vuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvaW50cyB0aGUgb3duZWQgaW5zdGFuY2UncyByZW5kZXJlciBhdCB0aGlzIHByb2Nlc3MncyBsaXZlbmVzcyBzb2NrZXQgc28gaXRcbiAgICogZGVzdHJveXMgaXRzZWxmIGlmIHdlIGRpZSB3aXRob3V0IHJ1bm5pbmcgdGVhcmRvd24gKHNlZSBgcGFyZW50LWxpdmVuZXNzLnRzYCkuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0IGJ5IGRlc2lnbi4gQSByZW5kZXJlciB3aXRob3V0IE5vZGUgYWNjZXNzIHJlcG9ydHMgYCd1bmF2YWlsYWJsZSdgXG4gICAqIGFuZCBhbiBldmFsdWF0aW9uIGZhaWx1cmUgaXMgbG9nZ2VkIGFuZCBzd2FsbG93ZWQ6IHRoZSB3YXRjaGRvZyBpcyBhIGJhY2tzdG9wXG4gICAqIGZvciBhbiBhbHJlYWR5LWFibm9ybWFsIGV4aXQsIG5ldmVyIGEgcmVhc29uIHRvIGZhaWwgYW4gb3RoZXJ3aXNlIGdvb2QgbGF1bmNoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqIEBwYXJhbSBwYXJlbnRMaXZlbmVzc1BvcnQgLSBUaGUgbG9vcGJhY2sgcG9ydCB0aGUgcmVuZGVyZXIgc2hvdWxkIGNvbm5lY3QgYmFjayB0by5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGg6IHN0cmluZywgcGFyZW50TGl2ZW5lc3NQb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShidWlsZFBhcmVudExpdmVuZXNzV2F0Y2hkb2dFeHByZXNzaW9uKHBhcmVudExpdmVuZXNzUG9ydCksIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgb24gcG9ydCAke1N0cmluZyhwYXJlbnRMaXZlbmVzc1BvcnQpfTogJHtyZXN1bHR9LmApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgYXJtIHRoZSBwYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgKGluc3RhbmNlIG1heSBvdXRsaXZlIGEga2lsbGVkIGhhcm5lc3MpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCAoYXNhcikgdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgc3RvcmluZyB0aGVcbiAgICogdmVyZGljdCBvbiB7QGxpbmsgZ2V0QXNhckZhbGxiYWNrfS4gT24gYSAqKnNpbGVudCBmYWxsYmFjayoqICh0aGUgaW5zdGFsbGVyIHJhblxuICAgKiBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHRoZSBwaW4pIGl0IHRocm93cyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9XG4gICAqIHdoZW4gdGhlIHRocm93IGlzIGVuYWJsZWQsIG90aGVyd2lzZSB3YXJucyAod2hlbiB3YXJuaW5ncyBhcmUgb24pIGFuZCBsZXRzIHRoZVxuICAgKiBib290IHByb2NlZWQuIEEgYm9vdCB3aXRoIG5vIHN3YXBwZWQtaW4gYXNhciwgb3IgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb24sXG4gICAqIGlzIGAndW5rbm93bidgIFx1MjAxNCBub3RoaW5nIGlzIHRocm93biBvciB3YXJuZWQuIFRoaXMgaXMgdGhlIGhlYWx0aHktVUkgY29tcGFuaW9uIHRvXG4gICAqIHRoZSBibGFjay1zY3JlZW4ge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9IGRlYWQtYm9vdCBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBwYXJhbSBydW5uaW5nQXBpVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKHJ1bm5pbmdBcGlWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUFzYXJGYWxsYmFjayh7XG4gICAgICByZXF1ZXN0ZWRWZXJzaW9uOiB0aGlzLm93bmVkQ29uZmlnPy5hc2FyPy52ZXJzaW9uLFxuICAgICAgcnVubmluZ0FwaVZlcnNpb25cbiAgICB9KTtcbiAgICB0aGlzLmFzYXJGYWxsYmFjayA9IHZlcmRpY3Q7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uKHtcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICAgIHRpZXI6IHZlcmRpY3QudGllclxuICAgIH0pO1xuICAgIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICAgIHRocm93IG5ldyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcih7XG4gICAgICAgIHJlcXVlc3RlZFZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucmVxdWVzdGVkVmVyc2lvbiksXG4gICAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJ1bm5pbmdBcGlWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICd3YXJuJykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBwb3N0LWJvb3QgcnVudGltZSBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIG9uY2UgdGhlXG4gICAqIHZhdWx0IGlzIHJlYWR5LiBSZWFkcyB0aGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFuZCBFbGVjdHJvbiB2ZXJzaW9uICoqb25jZSoqXG4gICAqIGZyb20gdGhlIGJvb3RlZCByZW5kZXJlcidzIG1haW4gcHJvY2VzcywgdGhlbjogKDEpIHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcFxuICAgKiB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluIFx1MjAxNCB0aHJvd2luZyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9IG9uXG4gICAqIGEgc2lsZW50IGZhbGxiYWNrICh3aGVuIGVuYWJsZWQpOyBhbmQgKDIpIHJ1bnMgdGhlIGJlc3QtZWZmb3J0IHJ1bnRpbWUtRWxlY3Ryb25cbiAgICogbmFnLiBPbmx5IHRoZSBhc2FyLWZhbGxiYWNrIGNoZWNrIGNhbiB0aHJvdywgc28gdGhpcyBtdXN0IHJ1biBvdXRzaWRlIHRoZVxuICAgKiByZWFkaW5lc3MgcG9sbCdzIHRyeS9jYXRjaCAoYSBzd2FsbG93ZWQgdGhyb3cgd291bGQgbG9vcCB1bnRpbCB0aW1lb3V0KS5cbiAgICpcbiAgICogQm90aCBhcmUgcmVhZCBhdCB0aGUgcmVuZGVyZXIgdG9wIGxldmVsOiBgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZlcnNpb24nKWAgKHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uLCB0cnV0aGZ1bCBldmVuIHVuZGVyIGEgc2lsZW50IGFzYXIgZmFsbGJhY2spIGFuZFxuICAgKiBgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbmAgKHRoZSBsaXZlIHNoZWxsIEVsZWN0cm9uKTsgbmVpdGhlciB1c2VzXG4gICAqIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggcmVzb2x2ZXMgb25seSBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBBIHJlYWRcbiAgICogZmFpbHVyZSBsZWF2ZXMgYm90aCB1bmtub3duIChsb2dnZWQsIG5vbi1mYXRhbCkgXHUyMDE0IGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uXG4gICAqIGNhbm5vdCBiZSBqdWRnZWQgYSBmYWxsYmFjaywgc28gdGhlIGJvb3QgaXMgbm90IGJyb2tlbiBieSBhIGZsYWt5IHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdBcHBWZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhcXCd2ZXJzaW9uXFwnKSknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgYXBwVmVyc2lvbiA9IHJhd0FwcFZlcnNpb24gPT09ICcnIHx8IHJhd0FwcFZlcnNpb24gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogcmF3QXBwVmVyc2lvbjtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyhwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZWFkIHJ1bnRpbWUgdmVyc2lvbnMgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGYWlscyBmYXN0ICh3aGVuIGVuYWJsZWQpIG9uIGEgc2lsZW50IGFzYXIgZmFsbGJhY2sgXHUyMDE0IE1VU1QgcnVuIGJlZm9yZSB0aGVcbiAgICAvLyBCZXN0LWVmZm9ydCBuYWcgYW5kIG91dHNpZGUgYW55IHRyeS9jYXRjaCBzbyB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgcG9sbC5cbiAgICB0aGlzLmNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhhcHBWZXJzaW9uKTtcbiAgICB0aGlzLmFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb24sIGFjdHVhbEVsZWN0cm9uVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBDRFAgdGFyZ2V0J3MgV2ViU29ja2V0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gY29ubmVjdCB0by5cbiAgICogQHJldHVybnMgVGhlIG9wZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1RhcmdldCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gQ0RQIHRhcmdldDogJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmx9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMud3MgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQWN0cyBhcyBhIHNhZmV0eSBuZXQgd2hlbiBgZW5hYmxlLXBsdWdpbi08aWQ+YCBpcyB3cml0dGVuIGluIG9uZSByZW5kZXJlclxuICAgKiBidXQgbm90IHlldCB2aXNpYmxlIHRvIHRoZSBuZXdseS1vcGVuZWQgdmF1bHQncyByZW5kZXJlciAocmFjZSBvYnNlcnZlZFxuICAgKiBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gQW4gb3BlbiBXZWJTb2NrZXQgdG8gYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0LlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHdzOiBXZWJTb2NrZXQsIHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZXJlIGlzIGFuIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gICAqXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgdmF1bHQuXG4gICAqIE90aGVyd2lzZSwgZmluZHMgdGhlIGNvcnJlY3QgdGFyZ2V0IGFuZCByZWNvbm5lY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMud3M7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgIHRoaXMud3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICAgIHJldHVybiB0aGlzLndzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIHdpdGggYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIG5vdCByZWFjaGFibGUuIFN0YXJ0aW5nIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZy4uLicpO1xuXG4gICAgY29uc3QgbGF1bmNoQ29tbWFuZCA9IGF3YWl0IGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCh0aGlzLmNkcFBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGxhdW5jaENvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIENEUCBlbmRwb2ludCBhdCAke3RoaXMuY2RwVXJsfSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCByZWFkeSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ0RQIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ0RQIHRhcmdldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdmF1bHQgb3Blbi5cbiAgICpcbiAgICogUHJvYmVzIGV2ZXJ5IHRhcmdldCBieSBldmFsdWF0aW5nIGBnZXRCYXNlUGF0aCgpYCBhbmQgcmV0dXJucyB0aGUgb25lIHdob3NlXG4gICAqIGJhc2UgcGF0aCBtYXRjaGVzIGB2YXVsdFBhdGhgICh2aWEge0BsaW5rIGFyZVZhdWx0UGF0aHNNYXRjaGluZ30sIHRvbGVyYW50IG9mXG4gICAqIHNlcGFyYXRvci9jYXNlIGRpZmZlcmVuY2VzKS4gQSBzaW5nbGUgdGFyZ2V0IGlzICoqbm90KiogcmV0dXJuZWQgYmxpbmRseTogd2l0aFxuICAgKiBtb3JlIHRoYW4gb25lIHZhdWx0IG9wZW4gKGF0dGFjaCBtb2RlJ3Mgc2hhcmVkIGluc3RhbmNlKSwgdGhlIHNvbGUtdGFyZ2V0XG4gICAqIHNob3J0Y3V0IHdvdWxkIHJldHVybiB3aGljaGV2ZXIgd2luZG93IGhhcHBlbnMgdG8gYmUgb3BlbiByZWdhcmRsZXNzIG9mIHdoaWNoXG4gICAqIHZhdWx0IHdhcyByZXF1ZXN0ZWQgXHUyMDE0IHRoZSBleGFjdCBtaXMtcm91dGluZyB0aGlzIG1ldGhvZCBtdXN0IGF2b2lkLiBBIHRhcmdldFxuICAgKiB3aG9zZSBwcm9iZSB0aHJvd3MgaXMgdHJlYXRlZCBhcyBub3QtcmVhZHkgYW5kIHNraXBwZWQgKHRoZSBjYWxsZXIncyByZWFkaW5lc3NcbiAgICogcG9sbCByZXRyaWVzKTsgYSB0YXJnZXQgd2hvc2UgcHJvYmUgc3VjY2VlZHMgYnV0IGRvZXMgbm90IG1hdGNoIGlzIG5ldmVyXG4gICAqIHJldHVybmVkLiBXaGVuIG5vdGhpbmcgbWF0Y2hlcywgdGhyb3cgc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gbWF0Y2guXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBDRFAgdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgZm91bmQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgodGFyZ2V0KTtcbiAgICAgICAgaWYgKGFyZVZhdWx0UGF0aHNNYXRjaGluZyhiYXNlUGF0aCwgdmF1bHRQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBOb3QgYSB2YXVsdCB0YXJnZXQgb3Igbm90IHJlYWR5LlxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ0RQIHRhcmdldCBmb3VuZCBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgcGFnZS10eXBlIHRhcmdldHMgZnJvbSB0aGUgQ0RQIGAvanNvbmAgZW5kcG9pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHBhZ2UgdGFyZ2V0cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFnZVRhcmdldHMoKTogUHJvbWlzZTxDZHBUYXJnZXRbXT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5jZHBVcmx9L2pzb25gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdO1xuICAgIHJldHVybiB0YXJnZXRzLmZpbHRlcigodCkgPT4gdC50eXBlID09PSAncGFnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtpbGxzIHRoZSBjdXJyZW50bHktcnVubmluZyBvd25lZCBpbnN0YW5jZSAoaWYgYW55KSBhbmQgd2FpdHMgZm9yIGl0IHRvIGV4aXQsXG4gICAqIHNvIHRoZSBuZXh0IGxhdW5jaCBnZXRzIGEgcHJpc3RpbmUgc2luZ2xlLXdpbmRvdyBpbnN0YW5jZS5cbiAgICpcbiAgICogUmVsYXVuY2hpbmcgb3ZlciBhIGxpdmUgaW5zdGFuY2UgaXMgZm9yd2FyZGVkIGJ5IEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGFuZCBzdXJmYWNlcyB0aGUgdmF1bHQgcGlja2VyLCBhbmQgb3BlbmluZyBhXG4gICAqIHNlY29uZCB3aW5kb3cgdmlhIElQQyBsZWF2ZXMgc3RhbGUgd2luZG93cyB0aGF0IGJyZWFrIHZhdWx0LXRhcmdldCByb3V0aW5nIFx1MjAxNFxuICAgKiBoZW5jZSBhIGZ1bGwga2lsbCArIHdhaXQtZm9yLWV4aXQgKHJlbGVhc2luZyB0aGUgbG9jaykgYmV0d2VlbiBsYXVuY2hlcy4gQVxuICAgKiBuby1vcCBvbiB0aGUgZmlyc3QgYXR0ZW1wdCwgd2hlbiBubyBpbnN0YW5jZSBpcyBydW5uaW5nIHlldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMga2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIEtpbGxpbmcgcnVubmluZyBvd25lZCBpbnN0YW5jZSBiZWZvcmUgKHJlKWxhdW5jaC4nKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBjb25zdCBwcmV2aW91c0NkcFVybCA9IHRoaXMuY2RwVXJsO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZS5raWxsKCk7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckluc3RhbmNlRXhpdChwcmV2aW91c0NkcFVybCk7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIG93bmVkIGluc3RhbmNlJ3Mgd2luZG93IG9mZi1zY3JlZW4gc28gYSBoaWRkZW4gcnVuIG5ldmVyIHN0ZWFsc1xuICAgKiBmb2N1cy4gVXNlcyBFbGVjdHJvbidzIHJlbW90ZSBicmlkZ2UgKGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYCkgXHUyMDE0IHRoZSBvbmx5XG4gICAqIGNyb3NzLXBsYXRmb3JtIHdheSB0byByZXBvc2l0aW9uIHRoZSB3aW5kb3cgXHUyMDE0IHBsYWNpbmcgaXQganVzdCBiZXlvbmQgdGhlXG4gICAqIHJpZ2h0IGVkZ2Ugb2YgYWxsIGRpc3BsYXlzLiBUaGUgd2luZG93IHN0YXlzIFwidmlzaWJsZVwiIHRvIENocm9taXVtIChzb1xuICAgKiB0aW1lcnMsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQga2VlcCB3b3JraW5nKSxcbiAgICogdW5saWtlIG1pbmltaXppbmcsIHdoaWNoIHdvdWxkIGZyZWV6ZSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC5cbiAgICpcbiAgICogVGhlIHJlbW90ZSBicmlkZ2UgaXMgbm90IGF2YWlsYWJsZSB0aGUgaW5zdGFudCBDRFAgc3RhcnRzIHNlcnZpbmcsIHNvIHRoaXNcbiAgICogcG9sbHMgdW50aWwgdGhlIG1vdmUgc3VjY2VlZHMuIEJlc3QtZWZmb3J0OiBpZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtb3ZlZFxuICAgKiB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBrZWVwLWFsaXZlIGxhdW5jaCBmbGFncyBzdGlsbCBhcHBseSBhbmQgdGhlIHJ1blxuICAgKiBwcm9jZWVkcyAod29yc3QgY2FzZSB0aGUgd2luZG93IGlzIGJyaWVmbHkgdmlzaWJsZSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBSZXNvbHZlIHRoZSBFbGVjdHJvbiByZW1vdGUgYnJpZGdlIHR3byB3YXlzIHNvIEJPVEggbW9kZXJuIGFuZCBvbGQgT2JzaWRpYW5cbiAgICAvLyBDYW4gYmUgbW92ZWQgb2ZmLXNjcmVlbjogbW9kZXJuIGluamVjdHMgYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgOyBvbGRcbiAgICAvLyBWZXJzaW9ucyAobm8gYHdpbmRvdy5lbGVjdHJvbmApIHN0aWxsIGV4cG9zZSB0aGUgYnVpbHQtaW4gYHJlbW90ZWAgbW9kdWxlIHZpYVxuICAgIC8vIGByZXF1aXJlKCdlbGVjdHJvbicpYCBpbiB0aGUgbm9kZS1pbnRlZ3JhdGVkIHJlbmRlcmVyIChyZW1vdmVkIGZyb20gRWxlY3Ryb25cbiAgICAvLyAxNCssIGJ1dCBwcmVzZW50IG9uIHRoZSBFbGVjdHJvbiA4LTEzIHNoZWxscyBvbGQgT2JzaWRpYW4gc2hpcHMpLiBSZXR1cm5pbmdcbiAgICAvLyBgbW92ZWRgIG9uIHRoZSBmaXJzdCBzdWNjZXNzIGlzIGltcG9ydGFudCBvbiBFbGVjdHJvbiAxMC1lcmEgYnVpbGRzOiBwb2xsaW5nXG4gICAgLy8gT24gd2l0aG91dCBhIHJlc29sdmFibGUgYnJpZGdlIGhhbW1lcnMgdGhlIHJlbmRlcmVyIHdpdGggQ0RQIHJvdW5kLXRyaXBzXG4gICAgLy8gRHVyaW5nIGJvb3QgYW5kIGludGVybWl0dGVudGx5IHByZXZlbnRzIHRoZSB3b3Jrc3BhY2UgZnJvbSBpbml0aWFsaXppbmcuXG4gICAgY29uc3QgbW92ZUV4cHJlc3Npb24gPSBgKCgpID0+IHtcbiAgICAgIGxldCByZW1vdGUgPSAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHx8IG51bGw7XG4gICAgICBpZiAoIXJlbW90ZSkge1xuICAgICAgICB0cnkgeyByZW1vdGUgPSByZXF1aXJlKCdlbGVjdHJvbicpLnJlbW90ZSB8fCBudWxsOyB9IGNhdGNoIChyZXF1aXJlRXJyb3IpIHsgcmVtb3RlID0gbnVsbDsgfVxuICAgICAgfVxuICAgICAgaWYgKCFyZW1vdGUgfHwgdHlwZW9mIHJlbW90ZS5nZXRDdXJyZW50V2luZG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHdpbmRvdy5hcHAgPT09ICd1bmRlZmluZWQnKSA/ICdub3QtcmVhZHknIDogJ25vLWJyaWRnZSc7XG4gICAgICB9XG4gICAgICBjb25zdCB3aW4gPSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpO1xuICAgICAgY29uc3QgZGlzcGxheXMgPSByZW1vdGUuc2NyZWVuLmdldEFsbERpc3BsYXlzKCk7XG4gICAgICBjb25zdCBtYXhSaWdodCA9IE1hdGgubWF4KC4uLmRpc3BsYXlzLm1hcCgoZGlzcGxheSkgPT4gZGlzcGxheS5ib3VuZHMueCArIGRpc3BsYXkuYm91bmRzLndpZHRoKSk7XG4gICAgICB3aW4uc2V0UG9zaXRpb24obWF4UmlnaHQgKyAke1N0cmluZyhPV05FRF9XSU5ET1dfT0ZGU0NSRUVOX01BUkdJTl9JTl9QSVhFTFMpfSwgMCk7XG4gICAgICByZXR1cm4gJ21vdmVkJztcbiAgICB9KSgpYDtcblxuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgICAgICBleHByZXNzaW9uOiBtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlID09PSAnbW92ZWQnKSB7XG4gICAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE1vdmVkIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBvZmYtc2NyZWVuIChoaWRkZW4gbW9kZSkuJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDRFAgZW5kcG9pbnQgLyB0YXJnZXQgLyByZW1vdGUgYnJpZGdlIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGtlZXAgcG9sbGluZy5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1dJTkRPV19ISURFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IG1vdmUgb3duZWQgd2luZG93IG9mZi1zY3JlZW4gd2l0aGluICR7U3RyaW5nKE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsOyBrZWVwLWFsaXZlIGZsYWdzIHN0aWxsIGFwcGxpZWQpLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIGEgdmF1bHQgaW4gYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSB0aGUgYHZhdWx0LW9wZW5gXG4gICAqIEVsZWN0cm9uIElQQyAoZXZhbHVhdGVkIHRocm91Z2ggQ0RQIG9uIGFuIGV4aXN0aW5nIHRhcmdldCksIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIG5ldyB2YXVsdCdzIHdpbmRvdyB0YXJnZXQgYXBwZWFycywgaXMgbGF5b3V0LXJlYWR5LCBhbmQgaXRzIHRydXN0IGRpYWxvZ1xuICAgKiAoaWYgYW55KSBoYXMgYmVlbiBkaXNtaXNzZWQuXG4gICAqXG4gICAqIFNoYXJlZCBieSB0aGUgYXR0YWNoLW1vZGUge0BsaW5rIHJlZ2lzdGVyVmF1bHR9IGFuZCB0aGUgb3duZWQtbW9kZVxuICAgKiBcImluc3RhbmNlIGFscmVhZHkgbGF1bmNoZWRcIiBwYXRoLCBzbyBvcGVuaW5nIGFuIGFkZGl0aW9uYWwgdmF1bHQgbmV2ZXJcbiAgICogcmVsYXVuY2hlcyB0aGUgcHJvY2VzcyAod2hpY2ggd291bGQgc3VyZmFjZSB0aGUgdmF1bHQgcGlja2VyKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGF2YWlsYWJsZS4gSXMgT2JzaWRpYW4gcnVubmluZz8nKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgYHZhdWx0LW9wZW5gIElQQyBpcyBzZW50IHRocm91Z2ggYW4gRVhJU1RJTkcgd2luZG93IChgdGFyZ2V0c1swXWApLCBzbyB0aGVcbiAgICAvLyBIZWxwZXIgbmFtZXNwYWNlIG11c3QgYmUgYm9vdHN0cmFwcGVkIG9uIFRIQVQgd2luZG93IFx1MjAxNCBub3Qgb24gYHZhdWx0UGF0aGAsIHdob3NlXG4gICAgLy8gV2luZG93IGRvZXMgbm90IGV4aXN0IHlldC4gQm9vdHN0cmFwcGluZyBhZ2FpbnN0IGB2YXVsdFBhdGhgIGhlcmUgd291bGQgcm91dGVcbiAgICAvLyBUaHJvdWdoIGBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKWAgd2l0aCBvbmx5IHRoZSBleGlzdGluZyB3aW5kb3cgcHJlc2VudCBhbmRcbiAgICAvLyBQb2lzb24gdGhlIGNvbm5lY3Rpb24gY2FjaGUgKGxhYmVsIGB2YXVsdFBhdGhgLCBzb2NrZXQgXHUyMTkyIHRoZSBleGlzdGluZyB3aW5kb3cpLCBzb1xuICAgIC8vIEV2ZXJ5IGxhdGVyIGV2YWwgZm9yIGB2YXVsdFBhdGhgIHdvdWxkIG1pcy1yb3V0ZSB0byB0aGUgZXhpc3Rpbmcgd2luZG93LiBQcm9iZSB0aGVcbiAgICAvLyBFeGlzdGluZyB3aW5kb3cncyBvd24gYmFzZSBwYXRoIGFuZCBib290c3RyYXAgYWdhaW5zdCB0aGF0IGluc3RlYWQuXG4gICAgY29uc3QgZXhpc3RpbmdUYXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgoZXhpc3RpbmdUYXJnZXQpO1xuICAgIGNvbnN0IGlwY1dzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQoZXhpc3RpbmdUYXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgaXBjRXhwcmVzc2lvbiA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbDogJ3ZhdWx0LW9wZW4nLCBjaGFubmVsQXJndW1lbnRzOiBbdmF1bHRQYXRoLCBmYWxzZV0gfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKGlwY1dzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICBleHByZXNzaW9uOiBpcGNFeHByZXNzaW9uLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UoaXBjV3MsIHZhdWx0UGF0aCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlwY1dzLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgdmF1bHQgdGFyZ2V0ICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gVmF1bHQgdGFyZ2V0IGZvdW5kLicpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgdGFyZ2V0IG5vdCByZWFkeSB5ZXQuXG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbXBsZXMgdGhlIHZhdWx0IHJlbmRlcmVyJ3MgYm9vdHN0cmFwIHN0YXRlIFx1MjAxNCB3aGV0aGVyIHRoZSBkb2N1bWVudCBpc1xuICAgKiBgY29tcGxldGVgLCB3aGV0aGVyIGB3aW5kb3cuYXBwYCBleGlzdHMsIGFuZCB0aGUgYDxib2R5PmAgY2hpbGQgY291bnQgXHUyMDE0IGZyb21cbiAgICogdGhlIGZpcnN0IHBhZ2UgdGFyZ2V0LCBmb3IgZGVhZC1ib290IGRldGVjdGlvbi4gVGhpcyB3b3JrcyBldmVuIHdoZW4gdGhlIGFwcFxuICAgKiBuZXZlciBib290c3RyYXBwZWQgKHRoZSByZW5kZXJlciBwYWdlIHRhcmdldCBzdGlsbCBleGlzdHMpLCB3aGljaCBpcyBleGFjdGx5XG4gICAqIHRoZSBzdGF0ZSBpdCBtdXN0IG9ic2VydmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzYW1wbGVkIG9ic2VydmF0aW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIHRhcmdldCBpcyByZWFjaGFibGVcbiAgICogICBvciB0aGUgcHJvYmUgZmFpbGVkIChzbyB0aGUgY2FsbGVyIGtlZXBzIHBvbGxpbmcgcmF0aGVyIHRoYW4gZmFzdC1mYWlsaW5nKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpOiBQcm9taXNlPFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFt0YXJnZXRdID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcHJvYmVFeHByZXNzaW9uID0gYEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBib2R5Q2hpbGRFbGVtZW50Q291bnQ6IGRvY3VtZW50LmJvZHkgPyBkb2N1bWVudC5ib2R5LmNoaWxkRWxlbWVudENvdW50IDogMCxcbiAgICAgICAgICBoYXNXaW5kb3dBcHA6IHR5cGVvZiB3aW5kb3cuYXBwICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICBpc0RvY3VtZW50Q29tcGxldGU6IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZSdcbiAgICAgICAgfSlgO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGV4cHJlc3Npb246IHByb2JlRXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyBSZW5kZXJlckJvb3RPYnNlcnZhdGlvbjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgYSB0YXJnZXQgdG8gZGlzY292ZXIgd2hpY2ggdmF1bHQgcGF0aCBpdCBoYXMgb3Blbi5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBXZWJTb2NrZXQgY29ubmVjdGlvbiwgZXZhbHVhdGVzIGBnZXRCYXNlUGF0aCgpYCxcbiAgICogYW5kIHJldHVybnMgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBDRFAgdGFyZ2V0IHRvIHByb2JlLlxuICAgKiBAcmV0dXJucyBUaGUgdmF1bHQncyBiYXNlIHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlVmF1bHRQYXRoKHRhcmdldDogQ2RwVGFyZ2V0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgICAgLy8gRXhwb3NlIHRoZSBgYmFzZVBhdGhgIHByb3BlcnR5OyB0aGUgbWV0aG9kIGV4aXN0cyBmcm9tIH4wLjkuMjAgb253YXJkLlxuICAgICAgICBleHByZXNzaW9uOiAnYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpIDogYXBwLnZhdWx0LmFkYXB0ZXIuYmFzZVBhdGgnLFxuICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBTdHJpbmcocmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgd3MuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgYW5kIGNvbm5lY3RzIHRvIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UgZm9yIGFcbiAgICogdmF1bHQ6IHByb3Zpc2lvbnMgdGhlIGFzYXIgKGlmIGFueSksIHByZS1zZWVkcyB0aGUgaXNvbGF0ZWQgYG9ic2lkaWFuLmpzb25gXG4gICAqIHNvIHRoZSB2YXVsdCBvcGVucyBkaXJlY3RseSwgbGF1bmNoZXMgdGhlIGluc3RhbmNlIG9uIGEgZnJlZSBDRFAgcG9ydCwgdGhlblxuICAgKiB3YWl0cyB1bnRpbCB0aGUgdmF1bHQgd2luZG93IGlzIHJlYWR5IGFuZCBkaXNtaXNzZXMgdGhlIHRydXN0IGRpYWxvZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLm93bmVkQ29uZmlnKTtcblxuICAgIG1rZGlyU3luYyhjb25maWcudXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGlmIChjb25maWcuYXNhcikge1xuICAgICAgY29weUFzYXJJbnRvVXNlckRhdGEoY29uZmlnLmFzYXIucGF0aCwgY29uZmlnLmFzYXIudmVyc2lvbiwgY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5KTtcbiAgICB9XG5cbiAgICBjb25zdCB2YXVsdElkID0gcmFuZG9tQnl0ZXMoVkFVTFRfSURfQllURV9MRU5HVEgpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBvYnNpZGlhbkpzb24gPSBidWlsZE93bmVkT2JzaWRpYW5Kc29uKHsgdHM6IERhdGUubm93KCksIHZhdWx0SWQsIHZhdWx0UGF0aCB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5LCAnb2JzaWRpYW4uanNvbicpLCBKU09OLnN0cmluZ2lmeShvYnNpZGlhbkpzb24pKTtcblxuICAgIC8vIFJlbGF1bmNoLXJldHJ5OiBzb21lIG9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiBidWlsZHMgaW50ZXJtaXR0ZW50bHlcbiAgICAvLyBCb290IHdpdGggYHdpbmRvdy5hcHBgIHByZXNlbnQgYnV0IHRoZSB3b3Jrc3BhY2UgbmV2ZXIgaW5pdGlhbGl6aW5nLCBzbyB0aGVcbiAgICAvLyBWYXVsdCBuZXZlciBiZWNvbWVzIHJlYWR5LiBBIGZyZXNoIGluc3RhbmNlIGlzIGFuIGluZGVwZW5kZW50IGNoYW5jZS4gQVxuICAgIC8vIERldGVybWluaXN0aWMgZmFpbHVyZSAoZGVhZCBib290LCBzaWxlbnQgYXNhciBmYWxsYmFjaykgaXMgcmUtdGhyb3duIGF0IG9uY2UgXHUyMDE0XG4gICAgLy8gUmV0cnlpbmcgaXQgb25seSB3YXN0ZXMgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGxldCBsYXN0RXJyb3I6IHVua25vd247XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICBhd2FpdCB0aGlzLmtpbGxSdW5uaW5nT3duZWRJbnN0YW5jZSgpO1xuICAgICAgaWYgKGF0dGVtcHQgPiAxKSB7XG4gICAgICAgIGF3YWl0IGRlbGF5KE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGF3YWl0IGxhdW5jaE93bmVkT2JzaWRpYW5JbnN0YW5jZSh7XG4gICAgICAgIGNkcEhvc3Q6IHRoaXMuY2RwSG9zdCxcbiAgICAgICAgZXhlUGF0aDogY29uZmlnLmV4ZVBhdGgsXG4gICAgICAgIGV4dHJhQXJndW1lbnRzOiBbXG4gICAgICAgICAgLi4ucmVzb2x2ZU93bmVkSGlkZGVuTGF1bmNoQXJndW1lbnRzKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpLFxuICAgICAgICAgIC4uLnJlc29sdmVTYW5kYm94TGF1bmNoQXJndW1lbnRzKHRoaXMuc2hvdWxkRGlzYWJsZVNhbmRib3gpXG4gICAgICAgIF0sXG5cbiAgICAgICAgdXNlckRhdGFEaXJlY3Rvcnk6IGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeVxuICAgICAgfSk7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgIHRoaXMuY2RwUG9ydCA9IGluc3RhbmNlLnBvcnQ7XG4gICAgICB0aGlzLmNkcFVybCA9IGluc3RhbmNlLmNkcFVybDtcblxuICAgICAgaWYgKHNob3VsZEhpZGVPYnNpZGlhbkFwcCh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLm1vdmVPd25lZFdpbmRvd09mZnNjcmVlbigpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aCwgaW5zdGFuY2UucGFyZW50TGl2ZW5lc3NQb3J0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IG5vdCByZWFkeSAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcoT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUyl9KTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBsYXN0RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGxhc3RFcnJvciA6IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5YCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBDRFAgY29tbWFuZCBvdmVyIFdlYlNvY2tldCBhbmQgd2FpdHMgZm9yIHRoZSByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gVGhlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBDRFAgcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmRDb21tYW5kKHdzOiBXZWJTb2NrZXQsIG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxDZHBSZXNwb25zZT4ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLm1lc3NhZ2VJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDZHBSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB3cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENEUCBjb21tYW5kIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOiAke21ldGhvZH1gKSk7XG4gICAgICB9LCB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoU3RyaW5nKGV2ZW50LmRhdGEpKSBhcyBDZHBSZXNwb25zZTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaWQgPT09IGlkKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHdzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBpZCwgbWV0aG9kLCBwYXJhbXMgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIGEga2lsbGVkIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGVuZHBvaW50IHVudGlsIGl0IHN0b3BzIHJlc3BvbmRpbmcsXG4gICAqIGNvbmZpcm1pbmcgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBhbmQgcmVsZWFzZWQgRWxlY3Ryb24ncyBzaW5nbGUtaW5zdGFuY2VcbiAgICogbG9jayBvbiB0aGUgc2hhcmVkIHVzZXItZGF0YSBkaXJlY3RvcnkgYmVmb3JlIGEgZnJlc2ggaW5zdGFuY2UgaXMgbGF1bmNoZWQgaW50byBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNkcFVybCAtIFRoZSBDRFAgVVJMIG9mIHRoZSBpbnN0YW5jZSB0aGF0IHdhcyBqdXN0IGtpbGxlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluc3RhbmNlRXhpdChjZHBVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHByZXZpb3VzIG93bmVkIGluc3RhbmNlIGF0ICR7Y2RwVXJsfSB0byBleGl0Li4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbmApO1xuICAgICAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgZW5kcG9pbnQgaXMgZ29uZTogdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBhbmQgcmVsZWFzZWQgdGhlIGxvY2suXG4gICAgICAgIGF3YWl0IGRlbGF5KElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gUHJldmlvdXMgaW5zdGFuY2Ugc3RpbGwgcmVzcG9uZGVkIGJlZm9yZSB0aW1lb3V0OyByZWxhdW5jaGluZyBhbnl3YXkuJyk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSB2YXVsdCdzIGBhcHAud29ya3NwYWNlYCB0byByZWFjaCBsYXlvdXQtcmVhZHkgc3RhdGUuXG4gICAqXG4gICAqIGBmaW5kVGFyZ2V0Rm9yVmF1bHRgIHJldHVybnMgYXMgc29vbiBhcyBgYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKWBcbiAgICogbWF0Y2hlcyBcdTIwMTQgd2hpY2ggaXMgdHJ1ZSBzaG9ydGx5IGFmdGVyIHRoZSBgQXBwYCBjb25zdHJ1Y3RvciBydW5zLCBiZWZvcmVcbiAgICogYHBsdWdpbnMuaW5pdGlhbGl6ZSgpYCAoYW5kIGFueSB0cnVzdCBkaWFsb2cpIGhhcyBleGVjdXRlZC4gQm9vdHN0cmFwcGluZ1xuICAgKiB0aGUgbmFtZXNwYWNlIGFuZCBjYWxsaW5nIGBwb2xsVmF1bHRCYXNlUGF0aCgpYCBhd2FpdHMgYGxheW91dFJlYWR5YCwgc29cbiAgICogYnkgdGhlIHRpbWUgdGhpcyByZXR1cm5zIHRoZSBkaWFsb2cgaGFzIGVpdGhlciByZW5kZXJlZCBvciBpcyBub3QgZ29pbmdcbiAgICogdG8gcmVuZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnBvbGxWYXVsdEJhc2VQYXRoKCknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHRoZSBvd25lZCBpbnN0YW5jZSB1bnRpbCB0aGUgdmF1bHQgdGFyZ2V0IGV4aXN0cywgbGF5b3V0IGlzIHJlYWR5LCBhbmRcbiAgICogdGhlIHRydXN0IGRpYWxvZyAoaWYgYW55KSBoYXMgYmVlbiBkaXNtaXNzZWQuXG4gICAqXG4gICAqIEJldHdlZW4gcmVhZGluZXNzIGF0dGVtcHRzIGl0IGFsc28gY2hlY2tzIGZvciBhICoqZGVhZCBib290KiogXHUyMDE0IHRoZSByZW5kZXJlclxuICAgKiBsb2FkZWQgKGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApIGJ1dCB0aGUgYXBwIG5ldmVyIGJvb3RzdHJhcHBlZFxuICAgKiAoZW1wdHkgYDxib2R5PmAsIG5vIGB3aW5kb3cuYXBwYCksIHRoZSB0ZXJtaW5hbCBzdGF0ZSB3aGVuIHRoZSBhc2FyIGNhbm5vdFxuICAgKiBydW4gb24gdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsLiBPbmNlIHRoYXQgc3RhdGUgaGFzIGhlbGQgZm9yIHRoZVxuICAgKiBjb25maWd1cmVkIGdyYWNlIHdpbmRvdyBpdCB0aHJvd3MgYSB7QGxpbmsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcn1cbiAgICogaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbCByZWFkaW5lc3MgdGltZW91dC4gQSBncmFjZSBvZlxuICAgKiBgMGAgZGlzYWJsZXMgdGhlIGZhc3QtZmFpbC4gVGhlIGdyYWNlIGNsb2NrIHN0YXJ0cyB3aGVuIHRoZSByZW5kZXJlciBmaXJzdFxuICAgKiByZXBvcnRzIGBjb21wbGV0ZWAsIHNvIGEgc2xvdyBsb2FkIGJlZm9yZSB0aGVuIGlzIG5ldmVyIGNvdW50ZWQgYWdhaW5zdCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JPd25lZFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBvd25lZCB2YXVsdCB0byBiZWNvbWUgcmVhZHkgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICBsZXQgZG9jdW1lbnRDb21wbGV0ZVNpbmNlOiBudWxsIHwgbnVtYmVyID0gbnVsbDtcbiAgICBsZXQgaXNSZWFkeSA9IGZhbHNlO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIGlzUmVhZHkgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgdmF1bHQgaXMgbm90IHJlYWR5IHlldCBcdTIwMTQgYWxzbyBkcm9wIHRoZSBjYWNoZWQgQ0RQIGNvbm5lY3Rpb24gYmVmb3JlXG4gICAgICAgIC8vIFJldHJ5aW5nLiBPbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gcmVsb2FkcyB0aGUgb3duZWQgd2luZG93IGR1cmluZ1xuICAgICAgICAvLyBCb290LCB3aGljaCBjYW4gbGVhdmUgdGhlIGNhY2hlZCBXZWJTb2NrZXQgcGlubmVkIHRvIGEgc3RhbGUgZXhlY3V0aW9uXG4gICAgICAgIC8vIENvbnRleHQ7IHJlY29ubmVjdGluZyBlYWNoIGF0dGVtcHQgcmUtYmluZHMgdG8gdGhlIGxpdmUgY29udGV4dC5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA+IDApIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YXRpb24gPSBhd2FpdCB0aGlzLnByb2JlUmVuZGVyZXJCb290U3RhdGUoKTtcbiAgICAgICAgaWYgKG9ic2VydmF0aW9uKSB7XG4gICAgICAgICAgaWYgKG9ic2VydmF0aW9uLmlzRG9jdW1lbnRDb21wbGV0ZSAmJiBkb2N1bWVudENvbXBsZXRlU2luY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGhhc0dyYWNlRWxhcHNlZCA9IGRvY3VtZW50Q29tcGxldGVTaW5jZSAhPT0gbnVsbFxuICAgICAgICAgICAgJiYgRGF0ZS5ub3coKSAtIGRvY3VtZW50Q29tcGxldGVTaW5jZSA+PSB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICAgICAgICBpZiAocmVzb2x2ZVJlbmRlcmVyQm9vdFN0YXRlKHsgLi4ub2JzZXJ2YXRpb24sIGhhc0dyYWNlRWxhcHNlZCB9KSA9PT0gJ2RlYWQnKSB7XG4gICAgICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBPd25lZCByZW5kZXJlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAoZGVhZCBib290KTsgZmFpbGluZyBmYXN0LicpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IodmF1bHRQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGlmICghaXNSZWFkeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPd25lZCB2YXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHZhdWx0IGlzIHJlYWR5LiBSdW4gdGhlIHBvc3QtYm9vdCBjb21wYXRpYmlsaXR5IGNoZWNrcyBoZXJlIFx1MjAxNCBPVVRTSURFIHRoZVxuICAgIC8vIFBvbGwncyB0cnkvY2F0Y2ggXHUyMDE0IHNvIGEgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgZmFpbHMgZmFzdCBpbnN0ZWFkIG9mIGJlaW5nXG4gICAgLy8gU3dhbGxvd2VkIGFzIFwibm90IHJlYWR5IHlldFwiIGFuZCBsb29waW5nIHVudGlsIHRoZSByZWFkaW5lc3MgdGltZW91dC5cbiAgICBhd2FpdCB0aGlzLmNoZWNrUnVudGltZUNvbXBhdGliaWxpdHkodmF1bHRQYXRoKTtcbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBPd25lZCB2YXVsdCBpcyByZWFkeS4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIHJlbW92ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseSwgcmV0dXJuaW5nIHdoZXRoZXIgaXQgc3VjY2VlZGVkLlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiByZW1vdmVkLCBgZmFsc2VgIGlmIHRoZSByZW1vdmFsIHRocmV3IChlLmcuIGhhbmRsZXMgaGVsZCkuXG4gKi9cbmZ1bmN0aW9uIGRpZFJlbW92ZURpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJtU3luYyhkaXJlY3RvcnksIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggT2JzaWRpYW4gd2l0aCByZW1vdGUgZGVidWdnaW5nIGVuYWJsZWQuXG4gKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBpbnN0YWxsZWQgT2JzaWRpYW4gZXhlY3V0YWJsZSAoY292ZXJpbmcgaW5zdGFsbGVyLWJhc2VkXG4gKiBhbmQgYFBBVEhgLWJhc2VkIGluc3RhbGxzIHN1Y2ggYXMgYHNjb29wYCkgYW5kIHZlcmlmaWVzIGl0IGV4aXN0cyBiZWZvcmVcbiAqIHJldHVybmluZyBhIGNvbW1hbmQuIFRocm93cyBpZiBPYnNpZGlhbiBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0IHRvIHVzZS5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgT2JzaWRpYW4gY2Fubm90IGJlIGxvY2F0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICBjb25zdCBmbGFnID0gYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0PSR7U3RyaW5nKHBvcnQpfWA7XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfWA7XG4gIH1cblxuICByZXR1cm4gYFwiJHtleGVQYXRofVwiICR7ZmxhZ30gJmA7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwK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
|
|
1006
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMubWpzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5Lm1qcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLm1qcyc7XG5pbXBvcnQge1xuICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcsXG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2gubWpzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24gfSBmcm9tICcuL293bmVkLXZhdWx0LXNlZWQubWpzJztcbmltcG9ydCB7IGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24gfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5tanMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICByZXNvbHZlUmVuZGVyZXJCb290U3RhdGVcbn0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5tanMnO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IubWpzJztcbmltcG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5pbXBvcnQgeyBhcmVWYXVsdFBhdGhzTWF0Y2hpbmcgfSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2gubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gYDMwMDAwYC5cbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcG9zdC1ib290ICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiAodGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZGlmZmVyc1xuICAgKiBmcm9tIHRoZSBzd2FwcGVkLWluIHBpbikgZmFpbHMgZmFzdCB3aXRoIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0uIFRoZVxuICAgKiB2ZXJkaWN0IGlzIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEFzYXJGYWxsYmFja307IHRoaXMgZ2F0ZXMgb25seSB0aGUgdGhyb3cuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlIHJ1bm5pbmcgYSBzd2FwcGVkLWluIGFzYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGxhdW5jaGVzIGFuZCBvd25zIGl0cyBvd24gT2JzaWRpYW4gcHJvY2Vzc1xuICogYWdhaW5zdCBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYXR0YWNoaW5nIHRvIGEgcnVubmluZyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQ29uZmlnIHtcbiAgLyoqXG4gIE9wdGlvbmFsIGFzYXIgdG8gcHJvdmlzaW9uIGludG8ge0BsaW5rIHVzZXJEYXRhRGlyZWN0b3J5fSBiZWZvcmUgbGF1bmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuIENyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoZVxuICAgKiB0cmFuc3BvcnQsIGFuZCBkZWxldGVkIG9uIGRpc3Bvc2UuXG4gICAqL1xuXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIENEUCBlbmRwb2ludCBvZiBhIGxhdW5jaGVkLCBoYXJuZXNzLW93bmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKlxuICBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGZyZWUgQ0RQIHBvcnQgdGhlIG93bmVkIGluc3RhbmNlIHdhcyBsYXVuY2hlZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbkRldGFpbHMge1xuICBleGNlcHRpb24/OiBDZHBFeGNlcHRpb25PYmplY3Q7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcEV4Y2VwdGlvbk9iamVjdCB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwUmVzcG9uc2Uge1xuICBpZDogbnVtYmVyO1xuICByZXN1bHQ/OiBDZHBSZXNwb25zZVJlc3VsdDtcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBiYXNlNjQtZW5jb2RlZCBpbWFnZSByZXR1cm5lZCBieSBgUGFnZS5jYXB0dXJlU2NyZWVuc2hvdGAuXG4gICAqL1xuICByZWFkb25seSBkYXRhPzogc3RyaW5nO1xuICByZWFkb25seSBleGNlcHRpb25EZXRhaWxzPzogQ2RwRXhjZXB0aW9uRGV0YWlscztcbiAgcmVhZG9ubHkgcmVzdWx0PzogQ2RwVmFsdWU7XG59XG5cbmludGVyZmFjZSBDZHBUYXJnZXQge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICB3ZWJTb2NrZXREZWJ1Z2dlclVybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2RwVmFsdWUge1xuICB0eXBlOiBzdHJpbmc7XG4gIHZhbHVlPzogdW5rbm93bjtcbn1cblxuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbmNvbnN0IFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIG9jY2FzaW9uYWxseSBib290cyB3aXRob3V0IHRoZSB3b3Jrc3BhY2UgZXZlclxuLy8gSW5pdGlhbGl6aW5nLCBzbyB0aGUgdmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhblxuLy8gSW5kZXBlbmRlbnQgY2hhbmNlOyByZWxhdW5jaCB1cCB0byB0aGlzIG1hbnkgdGltZXMgYmVmb3JlIGdpdmluZyB1cC5cbmNvbnN0IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMgPSAzO1xuLy8gQnJpZWYgc2V0dGxlIGJlZm9yZSBhIHJlbGF1bmNoIHNvIHRoZSBraWxsZWQgaW5zdGFuY2UncyBtZW1vcnkvaGFuZGxlcyBhcmVcbi8vIFJlY2xhaW1lZCBiZWZvcmUgdGhlIG5leHQgYm9vdCBcdTIwMTQgaW1wcm92ZXMgdGhlIG9kZHMgb24gYSBsb2FkZWQgbWFjaGluZS5cbmNvbnN0IE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyNTA7XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIENvbm5lY3RzIHRvIE9ic2lkaWFuJ3MgQ0RQIFdlYlNvY2tldCBlbmRwb2ludCwgc2VuZHMgYFJ1bnRpbWUuZXZhbHVhdGVgXG4gKiBjb21tYW5kcywgYW5kIHJvdXRlcyBleHByZXNzaW9ucyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2RwVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVWYXVsdFBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGFzYXJGYWxsYmFjazogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkcEhvc3Q6IHN0cmluZztcbiAgcHJpdmF0ZSBjZHBQb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgY2RwVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGVsZWN0cm9uQ29tcGF0aWJpbGl0eTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNPYnNpZGlhbkFwcFZpc2libGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWVzc2FnZUlkID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBvd25lZENvbmZpZzogT3duZWRJbnN0YW5jZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvd25lZEluc3RhbmNlOiBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xuICBwcml2YXRlIHdzOiBudWxsIHwgV2ViU29ja2V0ID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDRFAgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ0RQIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgLy8gRGVzdHJ1Y3R1cmUgd2l0aCBwZXItZmllbGQgZGVmYXVsdHMgKGVhY2ggYXBwbGllcyB3aGVuIHRoZSBmaWVsZCBpcyBvbWl0dGVkLFxuICAgIC8vIEV4YWN0bHkgbGlrZSB0aGUgZm9ybWVyIGBjb25maWc/LnggPz8gZGVmYXVsdGApIHNvIHRoZSBjb25zdHJ1Y3RvciBzdGF5c1xuICAgIC8vIFVuZGVyIHRoZSBjeWNsb21hdGljLWNvbXBsZXhpdHkgbGltaXQgYXMgZmllbGRzIGFyZSBhZGRlZC5cbiAgICBjb25zdCB7XG4gICAgICBjZHBIb3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgICBjZHBQb3J0LFxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlID0gZmFsc2UsXG4gICAgICBpc09ic2lkaWFuQXBwVmlzaWJsZSA9IHRydWUsXG4gICAgICBvd25lZEluc3RhbmNlLFxuICAgICAgc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBmYWxzZSxcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSB0cnVlLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHRydWVcbiAgICB9ID0gY29uZmlnID8/IHt9O1xuICAgIHRoaXMuY2RwSG9zdCA9IGNkcEhvc3Q7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBpc0hhcm5lc3NPd25lZEluc3RhbmNlO1xuICAgIHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUgPSBpc09ic2lkaWFuQXBwVmlzaWJsZTtcbiAgICB0aGlzLm93bmVkQ29uZmlnID0gb3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLnNob3VsZERpc2FibGVTYW5kYm94ID0gc2hvdWxkRGlzYWJsZVNhbmRib3g7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaztcbiAgICB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzO1xuICAgIC8vIE93bmVkIG1vZGUgcGlja3MgYSBmcmVlIHBvcnQgYXQgbGF1bmNoIChhc3NpZ25lZCBpbiByZWdpc3RlclZhdWx0KS5cbiAgICAvLyBBdHRhY2ggbW9kZSBjb25uZWN0cyB0byB0aGUgY29uZmlndXJlZCBwb3J0OyBubyBwb3J0IGlzIGhhcmRjb2RlZC5cbiAgICB0aGlzLmNkcFBvcnQgPSBjZHBQb3J0ID8/IDA7XG4gICAgdGhpcy5jZHBVcmwgPSBjZHBQb3J0ID09PSB1bmRlZmluZWQgPyAnJyA6IGBodHRwOi8vJHtjZHBIb3N0fToke1N0cmluZyhjZHBQb3J0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIE9ic2lkaWFuIHdpbmRvdyBzaG93aW5nIHRoZSBnaXZlbiB2YXVsdC5cbiAgICpcbiAgICogV2hlbiBhIHNpemUgaXMgcmVxdWVzdGVkIHRoZSB2aWV3cG9ydCBpcyBwaW5uZWQgdG8gaXQgd2l0aFxuICAgKiBgRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZWAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FwdHVyZSwgc28gdGhlXG4gICAqIGVtaXR0ZWQgUE5HIGlzIGV4YWN0bHkgdGhhdCBzaXplIHdoYXRldmVyIHNpemUgdGhlIHdpbmRvdyBoYXBwZW5zIHRvIGJlIFx1MjAxNFxuICAgKiBhbmQgdGhlIG92ZXJyaWRlIGlzIGFsd2F5cyBjbGVhcmVkIGFmdGVyd2FyZHMsIGluY2x1ZGluZyB3aGVuIHRoZSBjYXB0dXJlXG4gICAqIHRocm93cywgc28gYSBmYWlsZWQgY2FwdHVyZSBjYW5ub3QgbGVhdmUgdGhlIHdpbmRvdyBzdHVjayBhdCB0aGUgb3ZlcnJpZGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXaGljaCB2YXVsdCB3aW5kb3cgdG8gY2FwdHVyZSwgYW5kIHRoZSBleGFjdCBzaXplIHRvIGNhcHR1cmUgaXQgYXQuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIENEUCByZXR1cm5zIG5vIGltYWdlIGRhdGEsIG9yIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2FwdHVyZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKHBhcmFtcy5jd2QpO1xuICAgIGNvbnN0IGRldmljZU1ldHJpY3NPdmVycmlkZSA9IGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlKHBhcmFtcyk7XG4gICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5zZXREZXZpY2VNZXRyaWNzT3ZlcnJpZGUnLCBkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdQYWdlLmNhcHR1cmVTY3JlZW5zaG90Jywge1xuICAgICAgICAvLyBUaGUgb3ZlcnJpZGUgYWxyZWFkeSBzaXplcyB0aGUgdmlld3BvcnQsIHNvIGNhcHR1cmluZyBiZXlvbmQgaXQgd291bGRcbiAgICAgICAgLy8gUmUtaW50cm9kdWNlIHRoZSBzY3JvbGwgaGVpZ2h0IHRoZSBvdmVycmlkZSBleGlzdHMgdG8gcGluIGRvd24uXG4gICAgICAgIGNhcHR1cmVCZXlvbmRWaWV3cG9ydDogZmFsc2UsXG4gICAgICAgIGZvcm1hdDogJ3BuZydcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UucmVzdWx0Py5kYXRhO1xuICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIG5vIGltYWdlIGRhdGEuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGRhdGEpO1xuICAgICAgaWYgKCFpc1BuZyhieXRlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDRFAgc2NyZWVuc2hvdCBlcnJvcjogUGFnZS5jYXB0dXJlU2NyZWVuc2hvdCByZXR1cm5lZCBkYXRhIHRoYXQgaXMgbm90IGEgUE5HLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChkZXZpY2VNZXRyaWNzT3ZlcnJpZGUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ0VtdWxhdGlvbi5jbGVhckRldmljZU1ldHJpY3NPdmVycmlkZScsIHt9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBhbmQsIGluIG93bmVkLWluc3RhbmNlIG1vZGUsXG4gICAqIGtpbGxzIHRoZSBvd25lZCBPYnNpZGlhbiBwcm9jZXNzIGFuZCByZW1vdmVzIGl0cyBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbCBpcyByZXRyaWVkIGJlY2F1c2UgV2luZG93cyBicmllZmx5IGhvbGRzIHRoZSBqdXN0LWtpbGxlZFxuICAgKiBwcm9jZXNzJ3MgZmlsZSBoYW5kbGVzLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgZmFpbCBgcm1TeW5jYCB3aXRoIGBFUEVSTWAuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICBjb25zdCB7IHVzZXJEYXRhRGlyZWN0b3J5IH0gPSB0aGlzLm93bmVkQ29uZmlnO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBpZiAoZGlkUmVtb3ZlRGlyZWN0b3J5KHVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShVU0VSX0RBVEFfUk1fUkVUUllfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgcmVtb3ZlIG93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgd2l0aGluICR7U3RyaW5nKFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbCk6ICR7dXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIFx1MjAxNCBraWxscyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIG1ha2VzIGEgYmVzdC1lZmZvcnRcbiAgICogcmVtb3ZhbCBvZiBpdHMgdXNlci1kYXRhIGRpcmVjdG9yeS4gU2FmZSB0byBjYWxsIGZyb20gYSBwcm9jZXNzIGBleGl0YCBoYW5kbGVyXG4gICAqICh3aGVyZSBhc3luYyByZXRyaWVzIGFyZSBpbXBvc3NpYmxlOyBhIGxlZnRvdmVyIHRlbXAgZGlyZWN0b3J5IGlzIGFjY2VwdGFibGUpLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICB0aGlzLm93bmVkSW5zdGFuY2U/LmtpbGwoKTtcbiAgICAgIGlmICghZGlkUmVtb3ZlRGlyZWN0b3J5KHRoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE93bmVkIHVzZXItZGF0YSBkaXJlY3Rvcnkgbm90IHJlbW92ZWQgc3luY2hyb25vdXNseSAocHJvY2VzcyBtYXkgc3RpbGwgaG9sZCBoYW5kbGVzKTogJHt0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5fWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIHZpYSBDRFAgYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICAgKlxuICAgKiBSb3V0ZXMgdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0IGJhc2VkIG9uIGBvcHRpb25zLmN3ZGAuXG4gICAqXG4gICAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFdmFsdWF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHJlc3VsdCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ob3B0aW9ucy5jd2QpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICBleHByZXNzaW9uLFxuICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8uZXhjZXB0aW9uRGV0YWlscykge1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLmV4Y2VwdGlvbj8uZGVzY3JpcHRpb25cbiAgICAgICAgPz8gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMudGV4dDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ0RQIGV2YWx1YXRpb24gZXJyb3I6ICR7ZGVzY31gKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHRPYmplY3QgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdE9iamVjdCB8fCByZXN1bHRPYmplY3QudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhyZXN1bHRPYmplY3QudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0IHdoZXRoZXIgdGhlXG4gICAqIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yIHRoZSBpbnN0YWxsZXJcbiAgICogc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIgKHJlYWQgbGl2ZSBwb3N0LWJvb3QpLiBSZXR1cm5zXG4gICAqIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90IGJvb3RlZFxuICAgKiB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB0aGUgbGl2ZVxuICAgKiB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlKS4gQSBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW5cbiAgICogdGhlIHRocm93IGlzIGRpc2FibGVkICh7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrfVxuICAgKiBgZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXNhckZhbGxiYWNrKCk6IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXNhckZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWRcbiAgICogaW5zdGFuY2UsIHNvIGNhbGxlcnMgY2FuIGFzc2VydCBvbiBpdC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90XG4gICAqIGFuIG93bmVkIGluc3RhbmNlLCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAoZS5nLiBhblxuICAgKiB1bmRldGVjdGFibGUgc2hlbGwgdmVyc2lvbiwgb3IgdGhlIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZSB0YWJsZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldENvbXBhdGliaWxpdHkoKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3duZWRDb25maWc/LmNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIHRoaXMgb3duZWQgaW5zdGFuY2UgXHUyMDE0XG4gICAqIHdoZXRoZXIgdGhlIEVsZWN0cm9uIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBpcyBuZXcgZW5vdWdoIGZvciB0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiAocmVhZCBsaXZlIHBvc3QtYm9vdDsgc2VlIHtAbGluayBPYnNpZGlhblZlcnNpb25NZXRhZGF0YS5taW5SZWNvbW1lbmRlZEVsZWN0cm9uVmVyc2lvbn0pLlxuICAgKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3QgYW4gb3duZWQgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBoYXMgbm90XG4gICAqIGJvb3RlZCB5ZXQsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICh0aGUgbGl2ZSB2ZXJzaW9uIHdhc1xuICAgKiB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBubyByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHkoKTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgQ0RQIGVuZHBvaW50IG9mIHRoZSBvd25lZCwgbGF1bmNoZWQgaW5zdGFuY2Ugc28gdGhlIGdsb2JhbCBzZXR1cFxuICAgKiBjYW4gaGFuZCBpdCB0byB0ZXN0IHdvcmtlcnMgKHdoaWNoIHRoZW4gKiphdHRhY2gqKiB0byBpdCBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyB0aGVpciBvd24pLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyB0cmFuc3BvcnQgaXMgbm90IGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciBpdHMgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG93bmVkIGluc3RhbmNlJ3MgQ0RQIGhvc3QgYW5kIHBvcnQsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpOiBPd25lZEluc3RhbmNlRW5kcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZyB8fCAhdGhpcy5vd25lZEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4geyBob3N0OiB0aGlzLmNkcEhvc3QsIHBvcnQ6IHRoaXMuY2RwUG9ydCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIENEUCBlbmRwb2ludCBpcyByZWFjaGFibGUgYW5kIGhhcyBPYnNpZGlhbiB0YXJnZXRzLlxuICAgKlxuICAgKiBJZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgYXR0ZW1wdHMgdG8gYXV0by1zdGFydCBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCAodXNlZCBmb3IgdmF1bHQgcmVnaXN0cmF0aW9uIGNoZWNrKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwcmVmbGlnaHRDaGVjayh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnIHx8IHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgLy8gT3duZWQgaW5zdGFuY2UgKGxhdW5jaGVkIGhlcmUpIG9yIGEgd29ya2VyIGF0dGFjaGVkIHRvIG9uZTogcmVhZGluZXNzIGlzXG4gICAgICAvLyBHdWFyYW50ZWVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAncyByZWdpc3RlclZhdWx0LCBhbmQgdGhlIHZhdWx0IGxpdmVzIGluXG4gICAgICAvLyBUaGUgaXNvbGF0ZWQgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSBhZ2FpbnN0IHRoZSB1c2VyLXNjb3BlXG4gICAgICAvLyBSZWdpc3RyeS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyKCkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBhZ2UgdGFyZ2V0cycpO1xuICAgICAgfVxuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ0RQIHJlYWNoYWJsZSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCB2aWEgRWxlY3Ryb24gSVBDIGV2YWx1YXRlZCB0aHJvdWdoIENEUC5cbiAgICpcbiAgICogVXNlcyBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQgdG8gc2VuZCB0aGUgYHZhdWx0LW9wZW5gIElQQyBjb21tYW5kLFxuICAgKiB0aGVuIHBvbGxzIHVudGlsIHRoZSBuZXcgdmF1bHQncyB0YXJnZXQgYXBwZWFycy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyVmF1bHRJbk93bmVkSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9wZW5WYXVsdEluUnVubmluZ0luc3RhbmNlKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBieSBkZXN0cm95aW5nIGl0cyB3aW5kb3cgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZTsgbm8gcGVyLXZhdWx0XG4gICAgICAvLyBVbnJlZ2lzdGVyIGlzIG5lZWRlZCAoYW5kIHRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgaXNvbGF0ZWQgY29uZmlnKS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgd2luZG93RGVzdHJveUV4cHJlc3Npb24gPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdpbmRvdyBtYXkgYWxyZWFkeSBiZSBjbG9zZWQuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFRoZSBgdmF1bHQtcmVtb3ZlYCBJUEMgaXMgc2VudCB0aHJvdWdoIGEgc3RpbGwtb3BlbiB3aW5kb3cgKGB0YXJnZXRzWzBdYCkgXHUyMDE0XG4gICAgICAvLyBgdmF1bHRQYXRoYCdzIG93biB3aW5kb3cgd2FzIGp1c3QgZGVzdHJveWVkIGFib3ZlLCBzbyBib290c3RyYXAgdGhlIG5hbWVzcGFjZVxuICAgICAgLy8gT24gdGhlIGV4aXN0aW5nIHdpbmRvdydzIE9XTiBiYXNlIHBhdGgsIG5vdCBvbiBgdmF1bHRQYXRoYCAod2hpY2ggbm8gbG9uZ2VyIGhhc1xuICAgICAgLy8gQSBsaXZlIHRhcmdldCB0byBtYXRjaCkuXG4gICAgICBjb25zdCByZW1vdmFsVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgICBjb25zdCByZW1vdmFsQmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHJlbW92YWxUYXJnZXQpO1xuICAgICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChyZW1vdmFsVGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCByZW1vdmFsQmFzZVBhdGgpO1xuICAgICAgICBjb25zdCB2YXVsdFJlbW92ZUV4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1yZW1vdmUnLCBjaGFubmVsQXJndW1lbnRzOiBbdmF1bHRQYXRoXSB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbixcbiAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTm8gQ0RQIHRhcmdldHMgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCByZW1vdmluZyBkaXJlY3RseSBmcm9tIG9ic2lkaWFuLmpzb24uJyk7XG4gICAgICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW5kIHN0b3JlcyB0aGUgcnVudGltZS1FbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgKG9uXG4gICAqIHtAbGluayBnZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9KSBmcm9tIGFuIGFscmVhZHktcmVhZCB2ZXJzaW9uIHBhaXIsIHdhcm5pbmdcbiAgICogd2hlbiB0aGUgbGl2ZSBFbGVjdHJvbiBpcyBiZWxvdyB0aGUgYXBwJ3MgcmVjb21tZW5kZWQgbWluaW11bS4gTmV2ZXIgdGhyb3dzOyBhXG4gICAqIGJvb3Qgd2hvc2UgcnVubmluZyBhcHAgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSBpcyBza2lwcGVkIChub3RoaW5nIHRvIGp1ZGdlKS5cbiAgICpcbiAgICogQHBhcmFtIGFwcFZlcnNpb24gLSBUaGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqIEBwYXJhbSBhY3R1YWxFbGVjdHJvblZlcnNpb24gLSBUaGUgbGl2ZSBFbGVjdHJvbiB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0dWFsRWxlY3Ryb25WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHJlc29sdmVFbGVjdHJvbkNvbXBhdGliaWxpdHkoe1xuICAgICAgYWN0dWFsRWxlY3Ryb25WZXJzaW9uLFxuICAgICAgYXBwVmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgICB9KTtcbiAgICB0aGlzLmVsZWN0cm9uQ29tcGF0aWJpbGl0eSA9IHZlcmRpY3Q7XG4gICAgaWYgKHZlcmRpY3QudGllciA9PT0gJ25hZ2dlZCcgJiYgdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSAke2Vuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvaW50cyB0aGUgb3duZWQgaW5zdGFuY2UncyByZW5kZXJlciBhdCB0aGlzIHByb2Nlc3MncyBsaXZlbmVzcyBzb2NrZXQgc28gaXRcbiAgICogZGVzdHJveXMgaXRzZWxmIGlmIHdlIGRpZSB3aXRob3V0IHJ1bm5pbmcgdGVhcmRvd24gKHNlZSBgcGFyZW50LWxpdmVuZXNzLnRzYCkuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0IGJ5IGRlc2lnbi4gQSByZW5kZXJlciB3aXRob3V0IE5vZGUgYWNjZXNzIHJlcG9ydHMgYCd1bmF2YWlsYWJsZSdgXG4gICAqIGFuZCBhbiBldmFsdWF0aW9uIGZhaWx1cmUgaXMgbG9nZ2VkIGFuZCBzd2FsbG93ZWQ6IHRoZSB3YXRjaGRvZyBpcyBhIGJhY2tzdG9wXG4gICAqIGZvciBhbiBhbHJlYWR5LWFibm9ybWFsIGV4aXQsIG5ldmVyIGEgcmVhc29uIHRvIGZhaWwgYW4gb3RoZXJ3aXNlIGdvb2QgbGF1bmNoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqIEBwYXJhbSBwYXJlbnRMaXZlbmVzc1BvcnQgLSBUaGUgbG9vcGJhY2sgcG9ydCB0aGUgcmVuZGVyZXIgc2hvdWxkIGNvbm5lY3QgYmFjayB0by5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGg6IHN0cmluZywgcGFyZW50TGl2ZW5lc3NQb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShidWlsZFBhcmVudExpdmVuZXNzV2F0Y2hkb2dFeHByZXNzaW9uKHBhcmVudExpdmVuZXNzUG9ydCksIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgb24gcG9ydCAke1N0cmluZyhwYXJlbnRMaXZlbmVzc1BvcnQpfTogJHtyZXN1bHR9LmApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgYXJtIHRoZSBwYXJlbnQtbGl2ZW5lc3Mgd2F0Y2hkb2cgKGluc3RhbmNlIG1heSBvdXRsaXZlIGEga2lsbGVkIGhhcm5lc3MpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCAoYXNhcikgdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgc3RvcmluZyB0aGVcbiAgICogdmVyZGljdCBvbiB7QGxpbmsgZ2V0QXNhckZhbGxiYWNrfS4gT24gYSAqKnNpbGVudCBmYWxsYmFjayoqICh0aGUgaW5zdGFsbGVyIHJhblxuICAgKiBpdHMgb3duIGJ1bmRsZWQgYXNhciBpbnN0ZWFkIG9mIHRoZSBwaW4pIGl0IHRocm93cyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9XG4gICAqIHdoZW4gdGhlIHRocm93IGlzIGVuYWJsZWQsIG90aGVyd2lzZSB3YXJucyAod2hlbiB3YXJuaW5ncyBhcmUgb24pIGFuZCBsZXRzIHRoZVxuICAgKiBib290IHByb2NlZWQuIEEgYm9vdCB3aXRoIG5vIHN3YXBwZWQtaW4gYXNhciwgb3IgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb24sXG4gICAqIGlzIGAndW5rbm93bidgIFx1MjAxNCBub3RoaW5nIGlzIHRocm93biBvciB3YXJuZWQuIFRoaXMgaXMgdGhlIGhlYWx0aHktVUkgY29tcGFuaW9uIHRvXG4gICAqIHRoZSBibGFjay1zY3JlZW4ge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9IGRlYWQtYm9vdCBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBwYXJhbSBydW5uaW5nQXBpVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKHJ1bm5pbmdBcGlWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUFzYXJGYWxsYmFjayh7XG4gICAgICByZXF1ZXN0ZWRWZXJzaW9uOiB0aGlzLm93bmVkQ29uZmlnPy5hc2FyPy52ZXJzaW9uLFxuICAgICAgcnVubmluZ0FwaVZlcnNpb25cbiAgICB9KTtcbiAgICB0aGlzLmFzYXJGYWxsYmFjayA9IHZlcmRpY3Q7XG5cbiAgICBjb25zdCBhY3Rpb24gPSByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uKHtcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IHRoaXMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayxcbiAgICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICAgIHRpZXI6IHZlcmRpY3QudGllclxuICAgIH0pO1xuICAgIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICAgIHRocm93IG5ldyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcih7XG4gICAgICAgIHJlcXVlc3RlZFZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucmVxdWVzdGVkVmVyc2lvbiksXG4gICAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJ1bm5pbmdBcGlWZXJzaW9uKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChhY3Rpb24gPT09ICd3YXJuJykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRoZSBwb3N0LWJvb3QgcnVudGltZSBjb21wYXRpYmlsaXR5IGNoZWNrcyBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIG9uY2UgdGhlXG4gICAqIHZhdWx0IGlzIHJlYWR5LiBSZWFkcyB0aGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFuZCBFbGVjdHJvbiB2ZXJzaW9uICoqb25jZSoqXG4gICAqIGZyb20gdGhlIGJvb3RlZCByZW5kZXJlcidzIG1haW4gcHJvY2VzcywgdGhlbjogKDEpIHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcFxuICAgKiB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluIFx1MjAxNCB0aHJvd2luZyB7QGxpbmsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3J9IG9uXG4gICAqIGEgc2lsZW50IGZhbGxiYWNrICh3aGVuIGVuYWJsZWQpOyBhbmQgKDIpIHJ1bnMgdGhlIGJlc3QtZWZmb3J0IHJ1bnRpbWUtRWxlY3Ryb25cbiAgICogbmFnLiBPbmx5IHRoZSBhc2FyLWZhbGxiYWNrIGNoZWNrIGNhbiB0aHJvdywgc28gdGhpcyBtdXN0IHJ1biBvdXRzaWRlIHRoZVxuICAgKiByZWFkaW5lc3MgcG9sbCdzIHRyeS9jYXRjaCAoYSBzd2FsbG93ZWQgdGhyb3cgd291bGQgbG9vcCB1bnRpbCB0aW1lb3V0KS5cbiAgICpcbiAgICogQm90aCBhcmUgcmVhZCBhdCB0aGUgcmVuZGVyZXIgdG9wIGxldmVsOiBgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZlcnNpb24nKWAgKHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uLCB0cnV0aGZ1bCBldmVuIHVuZGVyIGEgc2lsZW50IGFzYXIgZmFsbGJhY2spIGFuZFxuICAgKiBgcHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbmAgKHRoZSBsaXZlIHNoZWxsIEVsZWN0cm9uKTsgbmVpdGhlciB1c2VzXG4gICAqIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggcmVzb2x2ZXMgb25seSBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBBIHJlYWRcbiAgICogZmFpbHVyZSBsZWF2ZXMgYm90aCB1bmtub3duIChsb2dnZWQsIG5vbi1mYXRhbCkgXHUyMDE0IGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uXG4gICAqIGNhbm5vdCBiZSBqdWRnZWQgYSBmYWxsYmFjaywgc28gdGhlIGJvb3QgaXMgbm90IGJyb2tlbiBieSBhIGZsYWt5IHJlYWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdBcHBWZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhcXCd2ZXJzaW9uXFwnKSknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgYXBwVmVyc2lvbiA9IHJhd0FwcFZlcnNpb24gPT09ICcnIHx8IHJhd0FwcFZlcnNpb24gPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogcmF3QXBwVmVyc2lvbjtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyhwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZWFkIHJ1bnRpbWUgdmVyc2lvbnMgKG5vbi1mYXRhbCk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGYWlscyBmYXN0ICh3aGVuIGVuYWJsZWQpIG9uIGEgc2lsZW50IGFzYXIgZmFsbGJhY2sgXHUyMDE0IE1VU1QgcnVuIGJlZm9yZSB0aGVcbiAgICAvLyBCZXN0LWVmZm9ydCBuYWcgYW5kIG91dHNpZGUgYW55IHRyeS9jYXRjaCBzbyB0aGUgdGhyb3cgZXNjYXBlcyB0aGUgcG9sbC5cbiAgICB0aGlzLmNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhhcHBWZXJzaW9uKTtcbiAgICB0aGlzLmFwcGx5RWxlY3Ryb25Db21wYXRpYmlsaXR5KGFwcFZlcnNpb24sIGFjdHVhbEVsZWN0cm9uVmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYSBDRFAgdGFyZ2V0J3MgV2ViU29ja2V0IGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gY29ubmVjdCB0by5cbiAgICogQHJldHVybnMgVGhlIG9wZW4gV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RUb1RhcmdldCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgdG8gQ0RQIHRhcmdldDogJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmx9YCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHdzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGRpc2Nvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgfVxuICAgIHRoaXMud3MgPSBudWxsO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQWN0cyBhcyBhIHNhZmV0eSBuZXQgd2hlbiBgZW5hYmxlLXBsdWdpbi08aWQ+YCBpcyB3cml0dGVuIGluIG9uZSByZW5kZXJlclxuICAgKiBidXQgbm90IHlldCB2aXNpYmxlIHRvIHRoZSBuZXdseS1vcGVuZWQgdmF1bHQncyByZW5kZXJlciAocmFjZSBvYnNlcnZlZFxuICAgKiBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHdzIC0gQW4gb3BlbiBXZWJTb2NrZXQgdG8gYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0LlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHdzOiBXZWJTb2NrZXQsIHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGV4cHJlc3Npb246IGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgke0pTT04uc3RyaW5naWZ5KGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gKX0sICd0cnVlJyk7YCxcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZXJlIGlzIGFuIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gICAqXG4gICAqIFJldXNlcyB0aGUgZXhpc3RpbmcgY29ubmVjdGlvbiBpZiBpdCB0YXJnZXRzIHRoZSByZXF1ZXN0ZWQgdmF1bHQuXG4gICAqIE90aGVyd2lzZSwgZmluZHMgdGhlIGNvcnJlY3QgdGFyZ2V0IGFuZCByZWNvbm5lY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdGFyZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4gJiYgdGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMud3M7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgIHRoaXMud3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRoaXMuYWN0aXZlVmF1bHRQYXRoID0gdmF1bHRQYXRoO1xuICAgIHJldHVybiB0aGlzLndzO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIHdpdGggYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIG5vdCByZWFjaGFibGUuIFN0YXJ0aW5nIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZy4uLicpO1xuXG4gICAgY29uc3QgbGF1bmNoQ29tbWFuZCA9IGF3YWl0IGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCh0aGlzLmNkcFBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGxhdW5jaENvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIENEUCBlbmRwb2ludCBhdCAke3RoaXMuY2RwVXJsfSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCByZWFkeSwgJHtTdHJpbmcodGFyZ2V0cy5sZW5ndGgpfSB0YXJnZXQocykgZm91bmQuYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ0RQIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgYWNjZXNzaWJsZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgQ0RQIHRhcmdldCB0aGF0IGhhcyB0aGUgZ2l2ZW4gdmF1bHQgb3Blbi5cbiAgICpcbiAgICogUHJvYmVzIGV2ZXJ5IHRhcmdldCBieSBldmFsdWF0aW5nIGBnZXRCYXNlUGF0aCgpYCBhbmQgcmV0dXJucyB0aGUgb25lIHdob3NlXG4gICAqIGJhc2UgcGF0aCBtYXRjaGVzIGB2YXVsdFBhdGhgICh2aWEge0BsaW5rIGFyZVZhdWx0UGF0aHNNYXRjaGluZ30sIHRvbGVyYW50IG9mXG4gICAqIHNlcGFyYXRvci9jYXNlIGRpZmZlcmVuY2VzKS4gQSBzaW5nbGUgdGFyZ2V0IGlzICoqbm90KiogcmV0dXJuZWQgYmxpbmRseTogd2l0aFxuICAgKiBtb3JlIHRoYW4gb25lIHZhdWx0IG9wZW4gKGF0dGFjaCBtb2RlJ3Mgc2hhcmVkIGluc3RhbmNlKSwgdGhlIHNvbGUtdGFyZ2V0XG4gICAqIHNob3J0Y3V0IHdvdWxkIHJldHVybiB3aGljaGV2ZXIgd2luZG93IGhhcHBlbnMgdG8gYmUgb3BlbiByZWdhcmRsZXNzIG9mIHdoaWNoXG4gICAqIHZhdWx0IHdhcyByZXF1ZXN0ZWQgXHUyMDE0IHRoZSBleGFjdCBtaXMtcm91dGluZyB0aGlzIG1ldGhvZCBtdXN0IGF2b2lkLiBBIHRhcmdldFxuICAgKiB3aG9zZSBwcm9iZSB0aHJvd3MgaXMgdHJlYXRlZCBhcyBub3QtcmVhZHkgYW5kIHNraXBwZWQgKHRoZSBjYWxsZXIncyByZWFkaW5lc3NcbiAgICogcG9sbCByZXRyaWVzKTsgYSB0YXJnZXQgd2hvc2UgcHJvYmUgc3VjY2VlZHMgYnV0IGRvZXMgbm90IG1hdGNoIGlzIG5ldmVyXG4gICAqIHJldHVybmVkLiBXaGVuIG5vdGhpbmcgbWF0Y2hlcywgdGhyb3cgc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gbWF0Y2guXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBDRFAgdGFyZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENkcFRhcmdldD4ge1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG5cbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgZm91bmQnKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgodGFyZ2V0KTtcbiAgICAgICAgaWYgKGFyZVZhdWx0UGF0aHNNYXRjaGluZyhiYXNlUGF0aCwgdmF1bHRQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBOb3QgYSB2YXVsdCB0YXJnZXQgb3Igbm90IHJlYWR5LlxuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ0RQIHRhcmdldCBmb3VuZCBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGxpc3Qgb2YgcGFnZS10eXBlIHRhcmdldHMgZnJvbSB0aGUgQ0RQIGAvanNvbmAgZW5kcG9pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIHBhZ2UgdGFyZ2V0cy5cbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbm8gQ0RQIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlVGFyZ2V0cygpOiBQcm9taXNlPENkcFRhcmdldFtdPiB7XG4gICAgaWYgKCF0aGlzLmNkcFVybCkge1xuICAgICAgLy8gQW4gb3duZWQgaW5zdGFuY2UgcGlja3MgaXRzIHBvcnQgYXQgbGF1bmNoLCBzbyBiZWZvcmUgYHJlZ2lzdGVyVmF1bHRgIHRoZXJlIGlzIG5vIGVuZHBvaW50IGFuZFxuICAgICAgLy8gYHRoaXMuY2RwVXJsYCBpcyBzdGlsbCBlbXB0eSAtLSB3aGljaCB1c2VkIHRvIG1ha2UgdGhpcyBhIGBmZXRjaCgnL2pzb24nKWAgYW5kIGZhaWwgd2l0aFxuICAgICAgLy8gYEZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAvanNvbmAsIGFuIGVycm9yIG5hbWluZyBuZWl0aGVyIHRoZSB0cmFuc3BvcnQgbm9yIHdoYXQgd2VudCB3cm9uZy5cbiAgICAgIC8vIEEgdHJhbnNwb3J0IGluIHRoaXMgc3RhdGUgaXMgYWx3YXlzIGEgc3ltcHRvbSBvZiBzb21ldGhpbmcgdXBzdHJlYW0gKGEgZmFpbGVkIGdsb2JhbCBzZXR1cCwgYVxuICAgICAgLy8gV29ya2VyIHdpdGggbm8gcmVnaXN0ZXJlZCByZXNvbHZlcnMgLS0gTDkpLCBzbyBzYXkgc28gcmF0aGVyIHRoYW4gcmVwb3J0IGEgbWFsZm9ybWVkIFVSTC5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIENEUCBlbmRwb2ludCBjb25maWd1cmVkOiB0aGUgb3duZWQgT2JzaWRpYW4gaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGxhdW5jaGVkIHlldCwgYW5kIG5vIGBwb3J0YCAnXG4gICAgICAgICAgKyAnd2FzIGdpdmVuIHRvIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lLiBBIHRlc3Qgd29ya2VyIGluIHRoaXMgc3RhdGUgdXN1YWxseSBtZWFucyBpdHMgZ2xvYmFsIHNldHVwICdcbiAgICAgICAgICArICdmYWlsZWQsIG9yIHRoZSBwcm9qZWN0IGlzIG1pc3NpbmcgdGhlIHBlci13b3JrZXIgc2V0dXAgZmlsZSBpbiBgc2V0dXBGaWxlc2AuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY2RwVXJsfS9qc29uYCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXTtcbiAgICByZXR1cm4gdGFyZ2V0cy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyB0aGUgY3VycmVudGx5LXJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgKGlmIGFueSkgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LFxuICAgKiBzbyB0aGUgbmV4dCBsYXVuY2ggZ2V0cyBhIHByaXN0aW5lIHNpbmdsZS13aW5kb3cgaW5zdGFuY2UuXG4gICAqXG4gICAqIFJlbGF1bmNoaW5nIG92ZXIgYSBsaXZlIGluc3RhbmNlIGlzIGZvcndhcmRlZCBieSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBhbmQgc3VyZmFjZXMgdGhlIHZhdWx0IHBpY2tlciwgYW5kIG9wZW5pbmcgYVxuICAgKiBzZWNvbmQgd2luZG93IHZpYSBJUEMgbGVhdmVzIHN0YWxlIHdpbmRvd3MgdGhhdCBicmVhayB2YXVsdC10YXJnZXQgcm91dGluZyBcdTIwMTRcbiAgICogaGVuY2UgYSBmdWxsIGtpbGwgKyB3YWl0LWZvci1leGl0IChyZWxlYXNpbmcgdGhlIGxvY2spIGJldHdlZW4gbGF1bmNoZXMuIEFcbiAgICogbm8tb3Agb24gdGhlIGZpcnN0IGF0dGVtcHQsIHdoZW4gbm8gaW5zdGFuY2UgaXMgcnVubmluZyB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGtpbGxSdW5uaW5nT3duZWRJbnN0YW5jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBLaWxsaW5nIHJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgYmVmb3JlIChyZSlsYXVuY2guJyk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgY29uc3QgcHJldmlvdXNDZHBVcmwgPSB0aGlzLmNkcFVybDtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2Uua2lsbCgpO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JJbnN0YW5jZUV4aXQocHJldmlvdXNDZHBVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHdpbmRvdyBvZmYtc2NyZWVuIHNvIGEgaGlkZGVuIHJ1biBuZXZlciBzdGVhbHNcbiAgICogZm9jdXMuIFVzZXMgRWxlY3Ryb24ncyByZW1vdGUgYnJpZGdlIChgd2luZG93LmVsZWN0cm9uLnJlbW90ZWApIFx1MjAxNCB0aGUgb25seVxuICAgKiBjcm9zcy1wbGF0Zm9ybSB3YXkgdG8gcmVwb3NpdGlvbiB0aGUgd2luZG93IFx1MjAxNCBwbGFjaW5nIGl0IGp1c3QgYmV5b25kIHRoZVxuICAgKiByaWdodCBlZGdlIG9mIGFsbCBkaXNwbGF5cy4gVGhlIHdpbmRvdyBzdGF5cyBcInZpc2libGVcIiB0byBDaHJvbWl1bSAoc29cbiAgICogdGltZXJzLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGtlZXAgd29ya2luZyksXG4gICAqIHVubGlrZSBtaW5pbWl6aW5nLCB3aGljaCB3b3VsZCBmcmVlemUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuXG4gICAqXG4gICAqIFRoZSByZW1vdGUgYnJpZGdlIGlzIG5vdCBhdmFpbGFibGUgdGhlIGluc3RhbnQgQ0RQIHN0YXJ0cyBzZXJ2aW5nLCBzbyB0aGlzXG4gICAqIHBvbGxzIHVudGlsIHRoZSBtb3ZlIHN1Y2NlZWRzLiBCZXN0LWVmZm9ydDogaWYgdGhlIHdpbmRvdyBjYW5ub3QgYmUgbW92ZWRcbiAgICogd2l0aGluIHRoZSB0aW1lb3V0LCB0aGUga2VlcC1hbGl2ZSBsYXVuY2ggZmxhZ3Mgc3RpbGwgYXBwbHkgYW5kIHRoZSBydW5cbiAgICogcHJvY2VlZHMgKHdvcnN0IGNhc2UgdGhlIHdpbmRvdyBpcyBicmllZmx5IHZpc2libGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgRWxlY3Ryb24gcmVtb3RlIGJyaWRnZSB0d28gd2F5cyBzbyBCT1RIIG1vZGVybiBhbmQgb2xkIE9ic2lkaWFuXG4gICAgLy8gQ2FuIGJlIG1vdmVkIG9mZi1zY3JlZW46IG1vZGVybiBpbmplY3RzIGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYDsgb2xkXG4gICAgLy8gVmVyc2lvbnMgKG5vIGB3aW5kb3cuZWxlY3Ryb25gKSBzdGlsbCBleHBvc2UgdGhlIGJ1aWx0LWluIGByZW1vdGVgIG1vZHVsZSB2aWFcbiAgICAvLyBgcmVxdWlyZSgnZWxlY3Ryb24nKWAgaW4gdGhlIG5vZGUtaW50ZWdyYXRlZCByZW5kZXJlciAocmVtb3ZlZCBmcm9tIEVsZWN0cm9uXG4gICAgLy8gMTQrLCBidXQgcHJlc2VudCBvbiB0aGUgRWxlY3Ryb24gOC0xMyBzaGVsbHMgb2xkIE9ic2lkaWFuIHNoaXBzKS4gUmV0dXJuaW5nXG4gICAgLy8gYG1vdmVkYCBvbiB0aGUgZmlyc3Qgc3VjY2VzcyBpcyBpbXBvcnRhbnQgb24gRWxlY3Ryb24gMTAtZXJhIGJ1aWxkczogcG9sbGluZ1xuICAgIC8vIE9uIHdpdGhvdXQgYSByZXNvbHZhYmxlIGJyaWRnZSBoYW1tZXJzIHRoZSByZW5kZXJlciB3aXRoIENEUCByb3VuZC10cmlwc1xuICAgIC8vIER1cmluZyBib290IGFuZCBpbnRlcm1pdHRlbnRseSBwcmV2ZW50cyB0aGUgd29ya3NwYWNlIGZyb20gaW5pdGlhbGl6aW5nLlxuICAgIGNvbnN0IG1vdmVFeHByZXNzaW9uID0gYCgoKSA9PiB7XG4gICAgICBsZXQgcmVtb3RlID0gKHdpbmRvdy5lbGVjdHJvbiAmJiB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlKSB8fCBudWxsO1xuICAgICAgaWYgKCFyZW1vdGUpIHtcbiAgICAgICAgdHJ5IHsgcmVtb3RlID0gcmVxdWlyZSgnZWxlY3Ryb24nKS5yZW1vdGUgfHwgbnVsbDsgfSBjYXRjaCAocmVxdWlyZUVycm9yKSB7IHJlbW90ZSA9IG51bGw7IH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVtb3RlIHx8IHR5cGVvZiByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cuYXBwID09PSAndW5kZWZpbmVkJykgPyAnbm90LXJlYWR5JyA6ICduby1icmlkZ2UnO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2luID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlzID0gcmVtb3RlLnNjcmVlbi5nZXRBbGxEaXNwbGF5cygpO1xuICAgICAgY29uc3QgbWF4UmlnaHQgPSBNYXRoLm1heCguLi5kaXNwbGF5cy5tYXAoKGRpc3BsYXkpID0+IGRpc3BsYXkuYm91bmRzLnggKyBkaXNwbGF5LmJvdW5kcy53aWR0aCkpO1xuICAgICAgd2luLnNldFBvc2l0aW9uKG1heFJpZ2h0ICsgJHtTdHJpbmcoT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTKX0sIDApO1xuICAgICAgcmV0dXJuICdtb3ZlZCc7XG4gICAgfSkoKWA7XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbW92ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBNb3ZlZCBvd25lZCBPYnNpZGlhbiB3aW5kb3cgb2ZmLXNjcmVlbiAoaGlkZGVuIG1vZGUpLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ0RQIGVuZHBvaW50IC8gdGFyZ2V0IC8gcmVtb3RlIGJyaWRnZSBub3QgcmVhZHkgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBtb3ZlIG93bmVkIHdpbmRvdyBvZmYtc2NyZWVuIHdpdGhpbiAke1N0cmluZyhPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbDsga2VlcC1hbGl2ZSBmbGFncyBzdGlsbCBhcHBsaWVkKS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIHZhdWx0IGluIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSB2aWEgdGhlIGB2YXVsdC1vcGVuYFxuICAgKiBFbGVjdHJvbiBJUEMgKGV2YWx1YXRlZCB0aHJvdWdoIENEUCBvbiBhbiBleGlzdGluZyB0YXJnZXQpLCB0aGVuIHBvbGxzIHVudGlsXG4gICAqIHRoZSBuZXcgdmF1bHQncyB3aW5kb3cgdGFyZ2V0IGFwcGVhcnMsIGlzIGxheW91dC1yZWFkeSwgYW5kIGl0cyB0cnVzdCBkaWFsb2dcbiAgICogKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBTaGFyZWQgYnkgdGhlIGF0dGFjaC1tb2RlIHtAbGluayByZWdpc3RlclZhdWx0fSBhbmQgdGhlIG93bmVkLW1vZGVcbiAgICogXCJpbnN0YW5jZSBhbHJlYWR5IGxhdW5jaGVkXCIgcGF0aCwgc28gb3BlbmluZyBhbiBhZGRpdGlvbmFsIHZhdWx0IG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHByb2Nlc3MgKHdoaWNoIHdvdWxkIHN1cmZhY2UgdGhlIHZhdWx0IHBpY2tlcikuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBPYnNpZGlhbiBDRFAgdGFyZ2V0cyBhdmFpbGFibGUuIElzIE9ic2lkaWFuIHJ1bm5pbmc/Jyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGB2YXVsdC1vcGVuYCBJUEMgaXMgc2VudCB0aHJvdWdoIGFuIEVYSVNUSU5HIHdpbmRvdyAoYHRhcmdldHNbMF1gKSwgc28gdGhlXG4gICAgLy8gSGVscGVyIG5hbWVzcGFjZSBtdXN0IGJlIGJvb3RzdHJhcHBlZCBvbiBUSEFUIHdpbmRvdyBcdTIwMTQgbm90IG9uIGB2YXVsdFBhdGhgLCB3aG9zZVxuICAgIC8vIFdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQuIEJvb3RzdHJhcHBpbmcgYWdhaW5zdCBgdmF1bHRQYXRoYCBoZXJlIHdvdWxkIHJvdXRlXG4gICAgLy8gVGhyb3VnaCBgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aClgIHdpdGggb25seSB0aGUgZXhpc3Rpbmcgd2luZG93IHByZXNlbnQgYW5kXG4gICAgLy8gUG9pc29uIHRoZSBjb25uZWN0aW9uIGNhY2hlIChsYWJlbCBgdmF1bHRQYXRoYCwgc29ja2V0IFx1MjE5MiB0aGUgZXhpc3Rpbmcgd2luZG93KSwgc29cbiAgICAvLyBFdmVyeSBsYXRlciBldmFsIGZvciBgdmF1bHRQYXRoYCB3b3VsZCBtaXMtcm91dGUgdG8gdGhlIGV4aXN0aW5nIHdpbmRvdy4gUHJvYmUgdGhlXG4gICAgLy8gRXhpc3Rpbmcgd2luZG93J3Mgb3duIGJhc2UgcGF0aCBhbmQgYm9vdHN0cmFwIGFnYWluc3QgdGhhdCBpbnN0ZWFkLlxuICAgIGNvbnN0IGV4aXN0aW5nVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdFBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKGV4aXN0aW5nVGFyZ2V0KTtcbiAgICBjb25zdCBpcGNXcyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KGV4aXN0aW5nVGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IGlwY0V4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1vcGVuJywgY2hhbm5lbEFyZ3VtZW50czogW3ZhdWx0UGF0aCwgZmFsc2VdIH0pfSlgO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChpcGNXcywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgZXhwcmVzc2lvbjogaXBjRXhwcmVzc2lvbixcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKGlwY1dzLCB2YXVsdFBhdGgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpcGNXcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHRhcmdldCAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFZhdWx0IHRhcmdldCBmb3VuZC4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IHRhcmdldCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGVzIHRoZSB2YXVsdCByZW5kZXJlcidzIGJvb3RzdHJhcCBzdGF0ZSBcdTIwMTQgd2hldGhlciB0aGUgZG9jdW1lbnQgaXNcbiAgICogYGNvbXBsZXRlYCwgd2hldGhlciBgd2luZG93LmFwcGAgZXhpc3RzLCBhbmQgdGhlIGA8Ym9keT5gIGNoaWxkIGNvdW50IFx1MjAxNCBmcm9tXG4gICAqIHRoZSBmaXJzdCBwYWdlIHRhcmdldCwgZm9yIGRlYWQtYm9vdCBkZXRlY3Rpb24uIFRoaXMgd29ya3MgZXZlbiB3aGVuIHRoZSBhcHBcbiAgICogbmV2ZXIgYm9vdHN0cmFwcGVkICh0aGUgcmVuZGVyZXIgcGFnZSB0YXJnZXQgc3RpbGwgZXhpc3RzKSwgd2hpY2ggaXMgZXhhY3RseVxuICAgKiB0aGUgc3RhdGUgaXQgbXVzdCBvYnNlcnZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2FtcGxlZCBvYnNlcnZhdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyB0YXJnZXQgaXMgcmVhY2hhYmxlXG4gICAqICAgb3IgdGhlIHByb2JlIGZhaWxlZCAoc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nIHJhdGhlciB0aGFuIGZhc3QtZmFpbGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlUmVuZGVyZXJCb290U3RhdGUoKTogUHJvbWlzZTxSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2JlRXhwcmVzc2lvbiA9IGBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYm9keUNoaWxkRWxlbWVudENvdW50OiBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5jaGlsZEVsZW1lbnRDb3VudCA6IDAsXG4gICAgICAgICAgaGFzV2luZG93QXBwOiB0eXBlb2Ygd2luZG93LmFwcCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgaXNEb2N1bWVudENvbXBsZXRlOiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnXG4gICAgICAgIH0pYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBleHByZXNzaW9uOiBwcm9iZUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgUmVuZGVyZXJCb290T2JzZXJ2YXRpb247XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIGEgdGFyZ2V0IHRvIGRpc2NvdmVyIHdoaWNoIHZhdWx0IHBhdGggaXQgaGFzIG9wZW4uXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgV2ViU29ja2V0IGNvbm5lY3Rpb24sIGV2YWx1YXRlcyBgZ2V0QmFzZVBhdGgoKWAsXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBwcm9iZS5cbiAgICogQHJldHVybnMgVGhlIHZhdWx0J3MgYmFzZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVZhdWx0UGF0aCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgICAgZXhwcmVzc2lvbjogJ2FwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoID8gYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IGFwcC52YXVsdC5hZGFwdGVyLmJhc2VQYXRoJyxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gU3RyaW5nKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIGFuZCBjb25uZWN0cyB0byBhIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciBhXG4gICAqIHZhdWx0OiBwcm92aXNpb25zIHRoZSBhc2FyIChpZiBhbnkpLCBwcmUtc2VlZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYFxuICAgKiBzbyB0aGUgdmF1bHQgb3BlbnMgZGlyZWN0bHksIGxhdW5jaGVzIHRoZSBpbnN0YW5jZSBvbiBhIGZyZWUgQ0RQIHBvcnQsIHRoZW5cbiAgICogd2FpdHMgdW50aWwgdGhlIHZhdWx0IHdpbmRvdyBpcyByZWFkeSBhbmQgZGlzbWlzc2VzIHRoZSB0cnVzdCBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclZhdWx0SW5Pd25lZEluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25lZENvbmZpZyk7XG5cbiAgICBta2RpclN5bmMoY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBpZiAoY29uZmlnLmFzYXIpIHtcbiAgICAgIGNvcHlBc2FySW50b1VzZXJEYXRhKGNvbmZpZy5hc2FyLnBhdGgsIGNvbmZpZy5hc2FyLnZlcnNpb24sIGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRJZCA9IHJhbmRvbUJ5dGVzKFZBVUxUX0lEX0JZVEVfTEVOR1RIKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgb2JzaWRpYW5Kc29uID0gYnVpbGRPd25lZE9ic2lkaWFuSnNvbih7IHRzOiBEYXRlLm5vdygpLCB2YXVsdElkLCB2YXVsdFBhdGggfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgJ29ic2lkaWFuLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkob2JzaWRpYW5Kc29uKSk7XG5cbiAgICAvLyBSZWxhdW5jaC1yZXRyeTogc29tZSBvbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gYnVpbGRzIGludGVybWl0dGVudGx5XG4gICAgLy8gQm9vdCB3aXRoIGB3aW5kb3cuYXBwYCBwcmVzZW50IGJ1dCB0aGUgd29ya3NwYWNlIG5ldmVyIGluaXRpYWxpemluZywgc28gdGhlXG4gICAgLy8gVmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhbiBpbmRlcGVuZGVudCBjaGFuY2UuIEFcbiAgICAvLyBEZXRlcm1pbmlzdGljIGZhaWx1cmUgKGRlYWQgYm9vdCwgc2lsZW50IGFzYXIgZmFsbGJhY2spIGlzIHJlLXRocm93biBhdCBvbmNlIFx1MjAxNFxuICAgIC8vIFJldHJ5aW5nIGl0IG9ubHkgd2FzdGVzIHRoZSByZWFkaW5lc3MgdGltZW91dC5cbiAgICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgYXdhaXQgdGhpcy5raWxsUnVubmluZ093bmVkSW5zdGFuY2UoKTtcbiAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICBhd2FpdCBkZWxheShPV05FRF9SRUxBVU5DSF9TRVRUTEVfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2Uoe1xuICAgICAgICBjZHBIb3N0OiB0aGlzLmNkcEhvc3QsXG4gICAgICAgIGV4ZVBhdGg6IGNvbmZpZy5leGVQYXRoLFxuICAgICAgICBleHRyYUFyZ3VtZW50czogW1xuICAgICAgICAgIC4uLnJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSxcbiAgICAgICAgICAuLi5yZXNvbHZlU2FuZGJveExhdW5jaEFyZ3VtZW50cyh0aGlzLnNob3VsZERpc2FibGVTYW5kYm94KVxuICAgICAgICBdLFxuXG4gICAgICAgIHVzZXJEYXRhRGlyZWN0b3J5OiBjb25maWcudXNlckRhdGFEaXJlY3RvcnlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICB0aGlzLmNkcFBvcnQgPSBpbnN0YW5jZS5wb3J0O1xuICAgICAgdGhpcy5jZHBVcmwgPSBpbnN0YW5jZS5jZHBVcmw7XG5cbiAgICAgIGlmIChzaG91bGRIaWRlT2JzaWRpYW5BcHAodGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGgsIGluc3RhbmNlLnBhcmVudExpdmVuZXNzUG9ydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB2YXVsdCBub3QgcmVhZHkgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMpfSk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbGFzdEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBsYXN0RXJyb3IgOiBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgQ0RQIGNvbW1hbmQgb3ZlciBXZWJTb2NrZXQgYW5kIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIFRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBDRFAgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgQ0RQIHJlc3BvbnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kQ29tbWFuZCh3czogV2ViU29ja2V0LCBtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8Q2RwUmVzcG9uc2U+IHtcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5tZXNzYWdlSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Q2RwUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDRFAgY29tbWFuZCB0aW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcodGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlcihldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5kYXRhKSkgYXMgQ2RwUmVzcG9uc2U7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBpZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB3cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBhIGtpbGxlZCBvd25lZCBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB1bnRpbCBpdCBzdG9wcyByZXNwb25kaW5nLFxuICAgKiBjb25maXJtaW5nIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBhIGZyZXNoIGluc3RhbmNlIGlzIGxhdW5jaGVkIGludG8gaXQuXG4gICAqXG4gICAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCBvZiB0aGUgaW5zdGFuY2UgdGhhdCB3YXMganVzdCBraWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbnN0YW5jZUV4aXQoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBwcmV2aW91cyBvd25lZCBpbnN0YW5jZSBhdCAke2NkcFVybH0gdG8gZXhpdC4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGVuZHBvaW50IGlzIGdvbmU6IHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIHRoZSBsb2NrLlxuICAgICAgICBhd2FpdCBkZWxheShJTlNUQU5DRV9FWElUX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFByZXZpb3VzIGluc3RhbmNlIHN0aWxsIHJlc3BvbmRlZCBiZWZvcmUgdGltZW91dDsgcmVsYXVuY2hpbmcgYW55d2F5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgdmF1bHQncyBgYXBwLndvcmtzcGFjZWAgdG8gcmVhY2ggbGF5b3V0LXJlYWR5IHN0YXRlLlxuICAgKlxuICAgKiBgZmluZFRhcmdldEZvclZhdWx0YCByZXR1cm5zIGFzIHNvb24gYXMgYGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKClgXG4gICAqIG1hdGNoZXMgXHUyMDE0IHdoaWNoIGlzIHRydWUgc2hvcnRseSBhZnRlciB0aGUgYEFwcGAgY29uc3RydWN0b3IgcnVucywgYmVmb3JlXG4gICAqIGBwbHVnaW5zLmluaXRpYWxpemUoKWAgKGFuZCBhbnkgdHJ1c3QgZGlhbG9nKSBoYXMgZXhlY3V0ZWQuIEJvb3RzdHJhcHBpbmdcbiAgICogdGhlIG5hbWVzcGFjZSBhbmQgY2FsbGluZyBgcG9sbFZhdWx0QmFzZVBhdGgoKWAgYXdhaXRzIGBsYXlvdXRSZWFkeWAsIHNvXG4gICAqIGJ5IHRoZSB0aW1lIHRoaXMgcmV0dXJucyB0aGUgZGlhbG9nIGhhcyBlaXRoZXIgcmVuZGVyZWQgb3IgaXMgbm90IGdvaW5nXG4gICAqIHRvIHJlbmRlci5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgb3duZWQgaW5zdGFuY2UgdW50aWwgdGhlIHZhdWx0IHRhcmdldCBleGlzdHMsIGxheW91dCBpcyByZWFkeSwgYW5kXG4gICAqIHRoZSB0cnVzdCBkaWFsb2cgKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBCZXR3ZWVuIHJlYWRpbmVzcyBhdHRlbXB0cyBpdCBhbHNvIGNoZWNrcyBmb3IgYSAqKmRlYWQgYm9vdCoqIFx1MjAxNCB0aGUgcmVuZGVyZXJcbiAgICogbG9hZGVkIChgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgKSBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWRcbiAgICogKGVtcHR5IGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3RcbiAgICogcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSB0aGF0IHN0YXRlIGhhcyBoZWxkIGZvciB0aGVcbiAgICogY29uZmlndXJlZCBncmFjZSB3aW5kb3cgaXQgdGhyb3dzIGEge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9XG4gICAqIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQuIEEgZ3JhY2Ugb2ZcbiAgICogYDBgIGRpc2FibGVzIHRoZSBmYXN0LWZhaWwuIFRoZSBncmFjZSBjbG9jayBzdGFydHMgd2hlbiB0aGUgcmVuZGVyZXIgZmlyc3RcbiAgICogcmVwb3J0cyBgY29tcGxldGVgLCBzbyBhIHNsb3cgbG9hZCBiZWZvcmUgdGhlbiBpcyBuZXZlciBjb3VudGVkIGFnYWluc3QgaXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igb3duZWQgdmF1bHQgdG8gYmVjb21lIHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGRvY3VtZW50Q29tcGxldGVTaW5jZTogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gICAgbGV0IGlzUmVhZHkgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICBpc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHZhdWx0IGlzIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGFsc28gZHJvcCB0aGUgY2FjaGVkIENEUCBjb25uZWN0aW9uIGJlZm9yZVxuICAgICAgICAvLyBSZXRyeWluZy4gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIHJlbG9hZHMgdGhlIG93bmVkIHdpbmRvdyBkdXJpbmdcbiAgICAgICAgLy8gQm9vdCwgd2hpY2ggY2FuIGxlYXZlIHRoZSBjYWNoZWQgV2ViU29ja2V0IHBpbm5lZCB0byBhIHN0YWxlIGV4ZWN1dGlvblxuICAgICAgICAvLyBDb250ZXh0OyByZWNvbm5lY3RpbmcgZWFjaCBhdHRlbXB0IHJlLWJpbmRzIHRvIHRoZSBsaXZlIGNvbnRleHQuXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmF0aW9uID0gYXdhaXQgdGhpcy5wcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZhdGlvbikge1xuICAgICAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0RvY3VtZW50Q29tcGxldGUgJiYgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkb2N1bWVudENvbXBsZXRlU2luY2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBoYXNHcmFjZUVsYXBzZWQgPSBkb2N1bWVudENvbXBsZXRlU2luY2UgIT09IG51bGxcbiAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBkb2N1bWVudENvbXBsZXRlU2luY2UgPj0gdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgaWYgKHJlc29sdmVSZW5kZXJlckJvb3RTdGF0ZSh7IC4uLm9ic2VydmF0aW9uLCBoYXNHcmFjZUVsYXBzZWQgfSkgPT09ICdkZWFkJykge1xuICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgcmVuZGVyZXIgZmFpbGVkIHRvIGluaXRpYWxpemUgKGRlYWQgYm9vdCk7IGZhaWxpbmcgZmFzdC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yKHZhdWx0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YXVsdCBpcyByZWFkeS4gUnVuIHRoZSBwb3N0LWJvb3QgY29tcGF0aWJpbGl0eSBjaGVja3MgaGVyZSBcdTIwMTQgT1VUU0lERSB0aGVcbiAgICAvLyBQb2xsJ3MgdHJ5L2NhdGNoIFx1MjAxNCBzbyBhIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIGZhaWxzIGZhc3QgaW5zdGVhZCBvZiBiZWluZ1xuICAgIC8vIFN3YWxsb3dlZCBhcyBcIm5vdCByZWFkeSB5ZXRcIiBhbmQgbG9vcGluZyB1bnRpbCB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgYXdhaXQgdGhpcy5jaGVja1J1bnRpbWVDb21wYXRpYmlsaXR5KHZhdWx0UGF0aCk7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgaXMgcmVhZHkuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byByZW1vdmUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHksIHJldHVybmluZyB3aGV0aGVyIGl0IHN1Y2NlZWRlZC5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiB0aGUgcmVtb3ZhbCB0aHJldyAoZS5nLiBoYW5kbGVzIGhlbGQpLlxuICovXG5mdW5jdGlvbiBkaWRSZW1vdmVEaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBybVN5bmMoZGlyZWN0b3J5LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gbGF1bmNoIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZyBlbmFibGVkLlxuICpcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgaW5zdGFsbGVkIE9ic2lkaWFuIGV4ZWN1dGFibGUgKGNvdmVyaW5nIGluc3RhbGxlci1iYXNlZFxuICogYW5kIGBQQVRIYC1iYXNlZCBpbnN0YWxscyBzdWNoIGFzIGBzY29vcGApIGFuZCB2ZXJpZmllcyBpdCBleGlzdHMgYmVmb3JlXG4gKiByZXR1cm5pbmcgYSBjb21tYW5kLiBUaHJvd3MgaWYgT2JzaWRpYW4gaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBDRFAgcG9ydCB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIE9ic2lkaWFuIGNhbm5vdCBiZSBsb2NhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgY29uc3QgZmxhZyA9IGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke1N0cmluZyhwb3J0KX1gO1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHtleGVQYXRofVwiICR7ZmxhZ31gO1xuICB9XG5cbiAgcmV0dXJuIGBcIiR7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
|
|
@@ -19,7 +19,16 @@ export declare function createTransportFromOptions(options?: ObsidianTransportOp
|
|
|
19
19
|
* The transport is cached per worker process so WebSocket/Appium sessions
|
|
20
20
|
* are reused across calls within the same test worker.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
22
|
+
* This is the single entry point every worker-side caller uses for the **ambient**
|
|
23
|
+
* transport, so it is also where a failed global setup is turned into a failing test.
|
|
24
|
+
* A failed setup publishes no transport options, and `undefined` options mean the owned
|
|
25
|
+
* **desktop** CDP default — so without this guard an Android project's suite would run
|
|
26
|
+
* on desktop and then die on an unrelated CDP error, hiding the real cause (**L9**).
|
|
27
|
+
* The setup path itself is unaffected: `coreSetup` builds its transport through
|
|
28
|
+
* {@link createTransportFromOptions} with explicit options.
|
|
29
|
+
*
|
|
30
|
+
* @param options - Transport configuration. Defaults to an owned desktop CDP transport.
|
|
23
31
|
* @returns The cached or newly created transport.
|
|
32
|
+
* @throws {IntegrationSetupFailedError} When this project's global setup failed.
|
|
24
33
|
*/
|
|
25
34
|
export declare function getOrCreateTransport(options?: ObsidianTransportOptions): Promise<ObsidianTransport>;
|