obsidian-integration-testing 10.0.0 → 10.2.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/README.md +26 -1092
- package/dist/lib/cjs/capture-obsidian-screenshot.cjs +60 -0
- package/dist/lib/cjs/capture-obsidian-screenshot.d.cts +53 -0
- package/dist/lib/cjs/capture-screenshot.cjs +82 -0
- package/dist/lib/cjs/capture-screenshot.d.cts +99 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +7 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +13 -0
- package/dist/lib/cjs/fit-screenshot.cjs +124 -0
- package/dist/lib/cjs/fit-screenshot.d.cts +117 -0
- package/dist/lib/cjs/index.cjs +18 -1
- package/dist/lib/cjs/index.d.cts +6 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian-metadata.cjs +28 -1
- package/dist/lib/cjs/transport-appium.cjs +23 -1
- package/dist/lib/cjs/transport-appium.d.cts +16 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +43 -1
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +15 -0
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +15 -0
- package/dist/lib/cjs/type-guards.cjs +6 -1
- package/dist/lib/cjs/type-guards.d.cts +7 -0
- package/dist/lib/esm/capture-obsidian-screenshot.d.mts +53 -0
- package/dist/lib/esm/capture-obsidian-screenshot.mjs +29 -0
- package/dist/lib/esm/capture-screenshot.d.mts +99 -0
- package/dist/lib/esm/capture-screenshot.mjs +55 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +13 -0
- package/dist/lib/esm/connect-to-cdp.mjs +7 -1
- package/dist/lib/esm/fit-screenshot.d.mts +117 -0
- package/dist/lib/esm/fit-screenshot.mjs +89 -0
- package/dist/lib/esm/index.d.mts +6 -0
- package/dist/lib/esm/index.mjs +19 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian-metadata.mjs +28 -1
- package/dist/lib/esm/transport-appium.d.mts +16 -0
- package/dist/lib/esm/transport-appium.mjs +26 -1
- package/dist/lib/esm/transport-desktop-cdp.d.mts +15 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +47 -1
- package/dist/lib/esm/transport.d.mts +15 -0
- package/dist/lib/esm/type-guards.d.mts +7 -0
- package/dist/lib/esm/type-guards.mjs +5 -1
- package/dist/obsidian-integration-testing-10.2.0.tgz +0 -0
- package/package.json +36 -14
- package/dist/obsidian-integration-testing-10.0.0.tgz +0 -0
|
@@ -36,6 +36,7 @@ var import_node_fs = require("node:fs");
|
|
|
36
36
|
var import_node_path = require("node:path");
|
|
37
37
|
var import_node_process = __toESM(require("node:process"), 1);
|
|
38
38
|
var import_asar_fallback_detection = require("./asar-fallback-detection.cjs");
|
|
39
|
+
var import_capture_screenshot = require("./capture-screenshot.cjs");
|
|
39
40
|
var import_compatibility_options = require("./compatibility-options.cjs");
|
|
40
41
|
var import_dismiss_trust_dialog = require("./dismiss-trust-dialog.cjs");
|
|
41
42
|
var import_electron_compatibility = require("./electron-compatibility.cjs");
|
|
@@ -123,6 +124,47 @@ class DesktopCdpTransport {
|
|
|
123
124
|
this.cdpPort = cdpPort ?? 0;
|
|
124
125
|
this.cdpUrl = cdpPort === void 0 ? "" : `http://${cdpHost}:${String(cdpPort)}`;
|
|
125
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Captures a PNG screenshot of the Obsidian window showing the given vault.
|
|
129
|
+
*
|
|
130
|
+
* When a size is requested the viewport is pinned to it with
|
|
131
|
+
* `Emulation.setDeviceMetricsOverride` for the duration of the capture, so the
|
|
132
|
+
* emitted PNG is exactly that size whatever size the window happens to be —
|
|
133
|
+
* and the override is always cleared afterwards, including when the capture
|
|
134
|
+
* throws, so a failed capture cannot leave the window stuck at the override.
|
|
135
|
+
*
|
|
136
|
+
* @param params - Which vault window to capture, and the exact size to capture it at.
|
|
137
|
+
* @returns The raw PNG bytes.
|
|
138
|
+
* @throws Error if CDP returns no image data, or data that is not a PNG.
|
|
139
|
+
*/
|
|
140
|
+
async captureScreenshot(params) {
|
|
141
|
+
const ws = await this.ensureConnection(params.cwd);
|
|
142
|
+
const deviceMetricsOverride = (0, import_capture_screenshot.buildDeviceMetricsOverride)(params);
|
|
143
|
+
if (deviceMetricsOverride) {
|
|
144
|
+
await this.sendCommand(ws, "Emulation.setDeviceMetricsOverride", deviceMetricsOverride);
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
const response = await this.sendCommand(ws, "Page.captureScreenshot", {
|
|
148
|
+
// The override already sizes the viewport, so capturing beyond it would
|
|
149
|
+
// Re-introduce the scroll height the override exists to pin down.
|
|
150
|
+
captureBeyondViewport: false,
|
|
151
|
+
format: "png"
|
|
152
|
+
});
|
|
153
|
+
const data = response.result?.data;
|
|
154
|
+
if (data === void 0) {
|
|
155
|
+
throw new Error("CDP screenshot error: Page.captureScreenshot returned no image data.");
|
|
156
|
+
}
|
|
157
|
+
const bytes = (0, import_capture_screenshot.decodeBase64Png)(data);
|
|
158
|
+
if (!(0, import_capture_screenshot.isPng)(bytes)) {
|
|
159
|
+
throw new Error("CDP screenshot error: Page.captureScreenshot returned data that is not a PNG.");
|
|
160
|
+
}
|
|
161
|
+
return bytes;
|
|
162
|
+
} finally {
|
|
163
|
+
if (deviceMetricsOverride) {
|
|
164
|
+
await this.sendCommand(ws, "Emulation.clearDeviceMetricsOverride", {});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
126
168
|
/**
|
|
127
169
|
* Disposes of the active WebSocket connection and, in owned-instance mode,
|
|
128
170
|
* kills the owned Obsidian process and removes its isolated user-data directory.
|
|
@@ -970,4 +1012,4 @@ async function getObsidianLaunchCommand(port) {
|
|
|
970
1012
|
0 && (module.exports = {
|
|
971
1013
|
DesktopCdpTransport
|
|
972
1014
|
});
|
|
973
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUgeyBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHsgT3duZWRPYnNpZGlhbkluc3RhbmNlIH0gZnJvbSAnLi9vYnNpZGlhbi1pbnN0YW5jZS5janMnO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB9IGZyb20gJy4vcmVuZGVyZXItYm9vdC1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LmNqcyc7XG5cbmltcG9ydCB7IHJlc29sdmVBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLmNqcyc7XG5pbXBvcnQge1xuICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcsXG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2guY2pzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24gfSBmcm9tICcuL293bmVkLXZhdWx0LXNlZWQuY2pzJztcbmltcG9ydCB7IGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24gfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5janMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICByZXNvbHZlUmVuZGVyZXJCb290U3RhdGVcbn0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IuY2pzJztcbmltcG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQgeyBhcmVWYXVsdFBhdGhzTWF0Y2hpbmcgfSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2guY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkuY2pzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gYDMwMDAwYC5cbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcG9zdC1ib290ICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiAodGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZGlmZmVyc1xuICAgKiBmcm9tIHRoZSBzd2FwcGVkLWluIHBpbikgZmFpbHMgZmFzdCB3aXRoIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0uIFRoZVxuICAgKiB2ZXJkaWN0IGlzIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEFzYXJGYWxsYmFja307IHRoaXMgZ2F0ZXMgb25seSB0aGUgdGhyb3cuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlIHJ1bm5pbmcgYSBzd2FwcGVkLWluIGFzYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGxhdW5jaGVzIGFuZCBvd25zIGl0cyBvd24gT2JzaWRpYW4gcHJvY2Vzc1xuICogYWdhaW5zdCBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYXR0YWNoaW5nIHRvIGEgcnVubmluZyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQ29uZmlnIHtcbiAgLyoqXG4gIE9wdGlvbmFsIGFzYXIgdG8gcHJvdmlzaW9uIGludG8ge0BsaW5rIHVzZXJEYXRhRGlyZWN0b3J5fSBiZWZvcmUgbGF1bmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuIENyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoZVxuICAgKiB0cmFuc3BvcnQsIGFuZCBkZWxldGVkIG9uIGRpc3Bvc2UuXG4gICAqL1xuXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25EZXRhaWxzIHtcbiAgZXhjZXB0aW9uPzogQ2RwRXhjZXB0aW9uT2JqZWN0O1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25PYmplY3Qge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlIHtcbiAgaWQ6IG51bWJlcjtcbiAgcmVzdWx0PzogQ2RwUmVzcG9uc2VSZXN1bHQ7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4Y2VwdGlvbkRldGFpbHM/OiBDZHBFeGNlcHRpb25EZXRhaWxzO1xuICByZWFkb25seSByZXN1bHQ/OiBDZHBWYWx1ZTtcbn1cblxuaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHdlYlNvY2tldERlYnVnZ2VyVXJsOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBWYWx1ZSB7XG4gIHR5cGU6IHN0cmluZztcbiAgdmFsdWU/OiB1bmtub3duO1xufVxuXG4vKipcbiAqIFRoZSBDRFAgZW5kcG9pbnQgb2YgYSBsYXVuY2hlZCwgaGFybmVzcy1vd25lZCBpbnN0YW5jZS5cbiAqL1xuaW50ZXJmYWNlIE93bmVkSW5zdGFuY2VFbmRwb2ludCB7XG4gIC8qKlxuICBDRFAgaG9zdCAoZS5nLiBgJ2xvY2FsaG9zdCdgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGZyZWUgQ0RQIHBvcnQgdGhlIG93bmVkIGluc3RhbmNlIHdhcyBsYXVuY2hlZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcbn1cblxuY29uc3QgQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IFZBVUxUX0lEX0JZVEVfTEVOR1RIID0gODtcbmNvbnN0IFVTRVJfREFUQV9STV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbmNvbnN0IFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIG9jY2FzaW9uYWxseSBib290cyB3aXRob3V0IHRoZSB3b3Jrc3BhY2UgZXZlclxuLy8gSW5pdGlhbGl6aW5nLCBzbyB0aGUgdmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhblxuLy8gSW5kZXBlbmRlbnQgY2hhbmNlOyByZWxhdW5jaCB1cCB0byB0aGlzIG1hbnkgdGltZXMgYmVmb3JlIGdpdmluZyB1cC5cbmNvbnN0IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMgPSAzO1xuLy8gQnJpZWYgc2V0dGxlIGJlZm9yZSBhIHJlbGF1bmNoIHNvIHRoZSBraWxsZWQgaW5zdGFuY2UncyBtZW1vcnkvaGFuZGxlcyBhcmVcbi8vIFJlY2xhaW1lZCBiZWZvcmUgdGhlIG5leHQgYm9vdCBcdTIwMTQgaW1wcm92ZXMgdGhlIG9kZHMgb24gYSBsb2FkZWQgbWFjaGluZS5cbmNvbnN0IE9XTkVEX1JFTEFVTkNIX1NFVFRMRV9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IElOU1RBTkNFX0VYSVRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyA9IDIwMDtcbmNvbnN0IE9XTkVEX1dJTkRPV19ISURFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyNTA7XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIENvbm5lY3RzIHRvIE9ic2lkaWFuJ3MgQ0RQIFdlYlNvY2tldCBlbmRwb2ludCwgc2VuZHMgYFJ1bnRpbWUuZXZhbHVhdGVgXG4gKiBjb21tYW5kcywgYW5kIHJvdXRlcyBleHByZXNzaW9ucyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2RwVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVWYXVsdFBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGFzYXJGYWxsYmFjazogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkcEhvc3Q6IHN0cmluZztcbiAgcHJpdmF0ZSBjZHBQb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgY2RwVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIGVsZWN0cm9uQ29tcGF0aWJpbGl0eTogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNPYnNpZGlhbkFwcFZpc2libGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWVzc2FnZUlkID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBvd25lZENvbmZpZzogT3duZWRJbnN0YW5jZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvd25lZEluc3RhbmNlOiBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiBib29sZWFuO1xuICBwcml2YXRlIHdzOiBudWxsIHwgV2ViU29ja2V0ID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBDRFAgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ0RQIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnKSB7XG4gICAgLy8gRGVzdHJ1Y3R1cmUgd2l0aCBwZXItZmllbGQgZGVmYXVsdHMgKGVhY2ggYXBwbGllcyB3aGVuIHRoZSBmaWVsZCBpcyBvbWl0dGVkLFxuICAgIC8vIEV4YWN0bHkgbGlrZSB0aGUgZm9ybWVyIGBjb25maWc/LnggPz8gZGVmYXVsdGApIHNvIHRoZSBjb25zdHJ1Y3RvciBzdGF5c1xuICAgIC8vIFVuZGVyIHRoZSBjeWNsb21hdGljLWNvbXBsZXhpdHkgbGltaXQgYXMgZmllbGRzIGFyZSBhZGRlZC5cbiAgICBjb25zdCB7XG4gICAgICBjZHBIb3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgICBjZHBQb3J0LFxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IENPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPSBERUZBVUxUX0RFQURfQk9PVF9HUkFDRV9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlID0gZmFsc2UsXG4gICAgICBpc09ic2lkaWFuQXBwVmlzaWJsZSA9IHRydWUsXG4gICAgICBvd25lZEluc3RhbmNlLFxuICAgICAgc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBmYWxzZSxcbiAgICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSB0cnVlLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHRydWVcbiAgICB9ID0gY29uZmlnID8/IHt9O1xuICAgIHRoaXMuY2RwSG9zdCA9IGNkcEhvc3Q7XG4gICAgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBpc0hhcm5lc3NPd25lZEluc3RhbmNlO1xuICAgIHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUgPSBpc09ic2lkaWFuQXBwVmlzaWJsZTtcbiAgICB0aGlzLm93bmVkQ29uZmlnID0gb3duZWRJbnN0YW5jZTtcbiAgICB0aGlzLnNob3VsZERpc2FibGVTYW5kYm94ID0gc2hvdWxkRGlzYWJsZVNhbmRib3g7XG4gICAgdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrID0gc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaztcbiAgICB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgPSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzO1xuICAgIC8vIE93bmVkIG1vZGUgcGlja3MgYSBmcmVlIHBvcnQgYXQgbGF1bmNoIChhc3NpZ25lZCBpbiByZWdpc3RlclZhdWx0KS5cbiAgICAvLyBBdHRhY2ggbW9kZSBjb25uZWN0cyB0byB0aGUgY29uZmlndXJlZCBwb3J0OyBubyBwb3J0IGlzIGhhcmRjb2RlZC5cbiAgICB0aGlzLmNkcFBvcnQgPSBjZHBQb3J0ID8/IDA7XG4gICAgdGhpcy5jZHBVcmwgPSBjZHBQb3J0ID09PSB1bmRlZmluZWQgPyAnJyA6IGBodHRwOi8vJHtjZHBIb3N0fToke1N0cmluZyhjZHBQb3J0KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIG9mIHRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gYW5kLCBpbiBvd25lZC1pbnN0YW5jZSBtb2RlLFxuICAgKiBraWxscyB0aGUgb3duZWQgT2JzaWRpYW4gcHJvY2VzcyBhbmQgcmVtb3ZlcyBpdHMgaXNvbGF0ZWQgdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAgICpcbiAgICogVGhlIHJlbW92YWwgaXMgcmV0cmllZCBiZWNhdXNlIFdpbmRvd3MgYnJpZWZseSBob2xkcyB0aGUganVzdC1raWxsZWRcbiAgICogcHJvY2VzcydzIGZpbGUgaGFuZGxlcywgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGZhaWwgYHJtU3luY2Agd2l0aCBgRVBFUk1gLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgY29uc3QgeyB1c2VyRGF0YURpcmVjdG9yeSB9ID0gdGhpcy5vd25lZENvbmZpZztcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgaWYgKGRpZFJlbW92ZURpcmVjdG9yeSh1c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGlmICghZGlkUmVtb3ZlRGlyZWN0b3J5KHVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IHJlbW92ZSBvd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5IHdpdGhpbiAke1N0cmluZyhVU0VSX0RBVEFfUk1fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWwpOiAke3VzZXJEYXRhRGlyZWN0b3J5fWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCBcdTIwMTQga2lsbHMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBtYWtlcyBhIGJlc3QtZWZmb3J0XG4gICAqIHJlbW92YWwgb2YgaXRzIHVzZXItZGF0YSBkaXJlY3RvcnkuIFNhZmUgdG8gY2FsbCBmcm9tIGEgcHJvY2VzcyBgZXhpdGAgaGFuZGxlclxuICAgKiAod2hlcmUgYXN5bmMgcmV0cmllcyBhcmUgaW1wb3NzaWJsZTsgYSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yeSBpcyBhY2NlcHRhYmxlKS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlPy5raWxsKCk7XG4gICAgICBpZiAoIWRpZFJlbW92ZURpcmVjdG9yeSh0aGlzLm93bmVkQ29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5KSkge1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5IG5vdCByZW1vdmVkIHN5bmNocm9ub3VzbHkgKHByb2Nlc3MgbWF5IHN0aWxsIGhvbGQgaGFuZGxlcyk6ICR7dGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcmVjdG9yeX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgQ0RQIGBSdW50aW1lLmV2YWx1YXRlYC5cbiAgICpcbiAgICogUm91dGVzIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCBiYXNlZCBvbiBgb3B0aW9ucy5jd2RgLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKG9wdGlvbnMuY3dkKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgZXhwcmVzc2lvbixcbiAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LmV4Y2VwdGlvbkRldGFpbHMpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy5leGNlcHRpb24/LmRlc2NyaXB0aW9uXG4gICAgICAgID8/IHJlc3BvbnNlLnJlc3VsdC5leGNlcHRpb25EZXRhaWxzLnRleHQ7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENEUCBldmFsdWF0aW9uIGVycm9yOiAke2Rlc2N9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0T2JqZWN0ID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHRPYmplY3QgfHwgcmVzdWx0T2JqZWN0LnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gTk9fT1VUUFVUO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcocmVzdWx0T2JqZWN0LnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciB0aGlzIG93bmVkIGluc3RhbmNlIFx1MjAxNCB3aGV0aGVyIHRoZVxuICAgKiBhcHAgdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBvciB0aGUgaW5zdGFsbGVyXG4gICAqIHNpbGVudGx5IHJldmVydGVkIHRvIGl0cyBvd24gYnVuZGxlZCBhc2FyIChyZWFkIGxpdmUgcG9zdC1ib290KS4gUmV0dXJuc1xuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90IGFuIG93bmVkIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaGFzIG5vdCBib290ZWRcbiAgICogeWV0LCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAobm8gYXNhciB3YXMgc3dhcHBlZCwgb3IgdGhlIGxpdmVcbiAgICogdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSkuIEEgYCdmYWxsYmFjaydgIHZlcmRpY3QgcmVhY2hlcyB0aGlzIHN1cmZhY2Ugb25seSB3aGVuXG4gICAqIHRoZSB0aHJvdyBpcyBkaXNhYmxlZCAoe0BsaW5rIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja31cbiAgICogYGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNpbGVudC1hc2FyLWZhbGxiYWNrIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldEFzYXJGYWxsYmFjaygpOiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFzYXJGYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkXG4gICAqIGluc3RhbmNlLCBzbyBjYWxsZXJzIGNhbiBhc3NlcnQgb24gaXQuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdFxuICAgKiBhbiBvd25lZCBpbnN0YW5jZSwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKGUuZy4gYW5cbiAgICogdW5kZXRlY3RhYmxlIHNoZWxsIHZlcnNpb24sIG9yIHRoZSBhcHAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGUgdGFibGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29tcGF0aWJpbGl0eSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRDb21wYXRpYmlsaXR5KCk6IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLm93bmVkQ29uZmlnPy5jb21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciB0aGlzIG93bmVkIGluc3RhbmNlIFx1MjAxNFxuICAgKiB3aGV0aGVyIHRoZSBFbGVjdHJvbiB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgaXMgbmV3IGVub3VnaCBmb3IgdGhlXG4gICAqIHJ1bm5pbmcgYXBwIHZlcnNpb24gKHJlYWQgbGl2ZSBwb3N0LWJvb3Q7IHNlZSB7QGxpbmsgT2JzaWRpYW5WZXJzaW9uTWV0YWRhdGEubWluUmVjb21tZW5kZWRFbGVjdHJvblZlcnNpb259KS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgaXMgbm90IGFuIG93bmVkIGluc3RhbmNlLCB0aGUgaW5zdGFuY2UgaGFzIG5vdFxuICAgKiBib290ZWQgeWV0LCBvciB0aGUgdmVyZGljdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAodGhlIGxpdmUgdmVyc2lvbiB3YXNcbiAgICogdW5yZWFkYWJsZSwgb3IgdGhlIGFwcCB2ZXJzaW9uIGNhcnJpZXMgbm8gcmVjb21tZW5kZWQgRWxlY3Ryb24gdmVyc2lvbikuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5KCk6IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIENEUCBlbmRwb2ludCBvZiB0aGUgb3duZWQsIGxhdW5jaGVkIGluc3RhbmNlIHNvIHRoZSBnbG9iYWwgc2V0dXBcbiAgICogY2FuIGhhbmQgaXQgdG8gdGVzdCB3b3JrZXJzICh3aGljaCB0aGVuICoqYXR0YWNoKiogdG8gaXQgaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgdGhlaXIgb3duKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoaXMgdHJhbnNwb3J0IGlzIG5vdCBhblxuICAgKiBvd25lZCBpbnN0YW5jZSwgb3IgaXRzIGluc3RhbmNlIGhhcyBub3QgYmVlbiBsYXVuY2hlZCB5ZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvd25lZCBpbnN0YW5jZSdzIENEUCBob3N0IGFuZCBwb3J0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTogT3duZWRJbnN0YW5jZUVuZHBvaW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMub3duZWRDb25maWcgfHwgIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdDogdGhpcy5jZHBIb3N0LCBwb3J0OiB0aGlzLmNkcFBvcnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSBDRFAgZW5kcG9pbnQgaXMgcmVhY2hhYmxlIGFuZCBoYXMgT2JzaWRpYW4gdGFyZ2V0cy5cbiAgICpcbiAgICogSWYgT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcsIGF0dGVtcHRzIHRvIGF1dG8tc3RhcnQgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcG9sbHMgdW50aWwgQ0RQIGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgZm9yIHZhdWx0IHJlZ2lzdHJhdGlvbiBjaGVjaykuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZyB8fCB0aGlzLmlzSGFybmVzc093bmVkSW5zdGFuY2UpIHtcbiAgICAgIC8vIE93bmVkIGluc3RhbmNlIChsYXVuY2hlZCBoZXJlKSBvciBhIHdvcmtlciBhdHRhY2hlZCB0byBvbmU6IHJlYWRpbmVzcyBpc1xuICAgICAgLy8gR3VhcmFudGVlZCBieSB0aGUgZ2xvYmFsIHNldHVwJ3MgcmVnaXN0ZXJWYXVsdCwgYW5kIHRoZSB2YXVsdCBsaXZlcyBpblxuICAgICAgLy8gVGhlIGlzb2xhdGVkIGNvbmZpZyBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkgYWdhaW5zdCB0aGUgdXNlci1zY29wZVxuICAgICAgLy8gUmVnaXN0cnkuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wb3JhcnlWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwYWdlIHRhcmdldHMnKTtcbiAgICAgIH1cbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENEUCByZWFjaGFibGUsICR7U3RyaW5nKHRhcmdldHMubGVuZ3RoKX0gdGFyZ2V0KHMpIGZvdW5kLmApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgdmlhIEVsZWN0cm9uIElQQyBldmFsdWF0ZWQgdGhyb3VnaCBDRFAuXG4gICAqXG4gICAqIFVzZXMgYW4gZXhpc3RpbmcgT2JzaWRpYW4gdGFyZ2V0IHRvIHNlbmQgdGhlIGB2YXVsdC1vcGVuYCBJUEMgY29tbWFuZCxcbiAgICogdGhlbiBwb2xscyB1bnRpbCB0aGUgbmV3IHZhdWx0J3MgdGFyZ2V0IGFwcGVhcnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vd25lZENvbmZpZykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclZhdWx0SW5Pd25lZEluc3RhbmNlKHZhdWx0UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgYnkgZGVzdHJveWluZyBpdHMgd2luZG93IGFuZCByZW1vdmluZyBpdCBmcm9tIHRoZSByZWdpc3RyeS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIC8vIFRoZSBvd25lZCBpbnN0YW5jZSBpcyBraWxsZWQgd2hvbGVzYWxlIG9uIGRpc3Bvc2U7IG5vIHBlci12YXVsdFxuICAgICAgLy8gVW5yZWdpc3RlciBpcyBuZWVkZWQgKGFuZCB0aGUgcmVnaXN0cnkgbGl2ZXMgaW4gdGhlIGlzb2xhdGVkIGNvbmZpZykuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd0Rlc3Ryb3lFeHByZXNzaW9uID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmRlc3Ryb3lDdXJyZW50V2luZG93KCknO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogd2luZG93RGVzdHJveUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBXaW5kb3cgbWF5IGFscmVhZHkgYmUgY2xvc2VkLlxuICAgIH1cblxuICAgIGlmICh0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgYHZhdWx0LXJlbW92ZWAgSVBDIGlzIHNlbnQgdGhyb3VnaCBhIHN0aWxsLW9wZW4gd2luZG93IChgdGFyZ2V0c1swXWApIFx1MjAxNFxuICAgICAgLy8gYHZhdWx0UGF0aGAncyBvd24gd2luZG93IHdhcyBqdXN0IGRlc3Ryb3llZCBhYm92ZSwgc28gYm9vdHN0cmFwIHRoZSBuYW1lc3BhY2VcbiAgICAgIC8vIE9uIHRoZSBleGlzdGluZyB3aW5kb3cncyBPV04gYmFzZSBwYXRoLCBub3Qgb24gYHZhdWx0UGF0aGAgKHdoaWNoIG5vIGxvbmdlciBoYXNcbiAgICAgIC8vIEEgbGl2ZSB0YXJnZXQgdG8gbWF0Y2gpLlxuICAgICAgY29uc3QgcmVtb3ZhbFRhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pO1xuICAgICAgY29uc3QgcmVtb3ZhbEJhc2VQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aChyZW1vdmFsVGFyZ2V0KTtcbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQocmVtb3ZhbFRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgcmVtb3ZhbEJhc2VQYXRoKTtcbiAgICAgICAgY29uc3QgdmF1bHRSZW1vdmVFeHByZXNzaW9uID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJywgY2hhbm5lbEFyZ3VtZW50czogW3ZhdWx0UGF0aF0gfSl9KWA7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgICBleHByZXNzaW9uOiB2YXVsdFJlbW92ZUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE5vIENEUCB0YXJnZXRzIGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgZGlkUmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIGFuZCBzdG9yZXMgdGhlIHJ1bnRpbWUtRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IChvblxuICAgKiB7QGxpbmsgZ2V0RWxlY3Ryb25Db21wYXRpYmlsaXR5fSkgZnJvbSBhbiBhbHJlYWR5LXJlYWQgdmVyc2lvbiBwYWlyLCB3YXJuaW5nXG4gICAqIHdoZW4gdGhlIGxpdmUgRWxlY3Ryb24gaXMgYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkIG1pbmltdW0uIE5ldmVyIHRocm93czsgYVxuICAgKiBib290IHdob3NlIHJ1bm5pbmcgYXBwIHZlcnNpb24gd2FzIHVucmVhZGFibGUgaXMgc2tpcHBlZCAobm90aGluZyB0byBqdWRnZSkuXG4gICAqXG4gICAqIEBwYXJhbSBhcHBWZXJzaW9uIC0gVGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKiBAcGFyYW0gYWN0dWFsRWxlY3Ryb25WZXJzaW9uIC0gVGhlIGxpdmUgRWxlY3Ryb24gdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUVsZWN0cm9uQ29tcGF0aWJpbGl0eShhcHBWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjdHVhbEVsZWN0cm9uVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcmRpY3QgPSByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5KHtcbiAgICAgIGFjdHVhbEVsZWN0cm9uVmVyc2lvbixcbiAgICAgIGFwcFZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogZ2V0VmVyc2lvbk1ldGFkYXRhKGFwcFZlcnNpb24pXG4gICAgfSk7XG4gICAgdGhpcy5lbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB2ZXJkaWN0O1xuICAgIGlmICh2ZXJkaWN0LnRpZXIgPT09ICduYWdnZWQnICYmIHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcykge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gJHtlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0Lm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQb2ludHMgdGhlIG93bmVkIGluc3RhbmNlJ3MgcmVuZGVyZXIgYXQgdGhpcyBwcm9jZXNzJ3MgbGl2ZW5lc3Mgc29ja2V0IHNvIGl0XG4gICAqIGRlc3Ryb3lzIGl0c2VsZiBpZiB3ZSBkaWUgd2l0aG91dCBydW5uaW5nIHRlYXJkb3duIChzZWUgYHBhcmVudC1saXZlbmVzcy50c2ApLlxuICAgKlxuICAgKiBCZXN0LWVmZm9ydCBieSBkZXNpZ24uIEEgcmVuZGVyZXIgd2l0aG91dCBOb2RlIGFjY2VzcyByZXBvcnRzIGAndW5hdmFpbGFibGUnYFxuICAgKiBhbmQgYW4gZXZhbHVhdGlvbiBmYWlsdXJlIGlzIGxvZ2dlZCBhbmQgc3dhbGxvd2VkOiB0aGUgd2F0Y2hkb2cgaXMgYSBiYWNrc3RvcFxuICAgKiBmb3IgYW4gYWxyZWFkeS1hYm5vcm1hbCBleGl0LCBuZXZlciBhIHJlYXNvbiB0byBmYWlsIGFuIG90aGVyd2lzZSBnb29kIGxhdW5jaC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKiBAcGFyYW0gcGFyZW50TGl2ZW5lc3NQb3J0IC0gVGhlIGxvb3BiYWNrIHBvcnQgdGhlIHJlbmRlcmVyIHNob3VsZCBjb25uZWN0IGJhY2sgdG8uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFybVBhcmVudExpdmVuZXNzV2F0Y2hkb2codmF1bHRQYXRoOiBzdHJpbmcsIHBhcmVudExpdmVuZXNzUG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoYnVpbGRQYXJlbnRMaXZlbmVzc1dhdGNoZG9nRXhwcmVzc2lvbihwYXJlbnRMaXZlbmVzc1BvcnQpLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nIG9uIHBvcnQgJHtTdHJpbmcocGFyZW50TGl2ZW5lc3NQb3J0KX06ICR7cmVzdWx0fS5gKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IGFybSB0aGUgcGFyZW50LWxpdmVuZXNzIHdhdGNoZG9nIChpbnN0YW5jZSBtYXkgb3V0bGl2ZSBhIGtpbGxlZCBoYXJuZXNzKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcnVubmluZyBhcHAgKGFzYXIpIHZlcnNpb24gbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIHN0b3JpbmcgdGhlXG4gICAqIHZlcmRpY3Qgb24ge0BsaW5rIGdldEFzYXJGYWxsYmFja30uIE9uIGEgKipzaWxlbnQgZmFsbGJhY2sqKiAodGhlIGluc3RhbGxlciByYW5cbiAgICogaXRzIG93biBidW5kbGVkIGFzYXIgaW5zdGVhZCBvZiB0aGUgcGluKSBpdCB0aHJvd3Mge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfVxuICAgKiB3aGVuIHRoZSB0aHJvdyBpcyBlbmFibGVkLCBvdGhlcndpc2Ugd2FybnMgKHdoZW4gd2FybmluZ3MgYXJlIG9uKSBhbmQgbGV0cyB0aGVcbiAgICogYm9vdCBwcm9jZWVkLiBBIGJvb3Qgd2l0aCBubyBzd2FwcGVkLWluIGFzYXIsIG9yIGFuIHVucmVhZGFibGUgcnVubmluZyB2ZXJzaW9uLFxuICAgKiBpcyBgJ3Vua25vd24nYCBcdTIwMTQgbm90aGluZyBpcyB0aHJvd24gb3Igd2FybmVkLiBUaGlzIGlzIHRoZSBoZWFsdGh5LVVJIGNvbXBhbmlvbiB0b1xuICAgKiB0aGUgYmxhY2stc2NyZWVuIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfSBkZWFkLWJvb3QgZmFzdC1mYWlsLlxuICAgKlxuICAgKiBAcGFyYW0gcnVubmluZ0FwaVZlcnNpb24gLSBUaGUgbGl2ZSBydW5uaW5nIGFwcCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVucmVhZGFibGUuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrUnVudGltZUFzYXJGYWxsYmFjayhydW5uaW5nQXBpVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHJlc29sdmVBc2FyRmFsbGJhY2soe1xuICAgICAgcmVxdWVzdGVkVmVyc2lvbjogdGhpcy5vd25lZENvbmZpZz8uYXNhcj8udmVyc2lvbixcbiAgICAgIHJ1bm5pbmdBcGlWZXJzaW9uXG4gICAgfSk7XG4gICAgdGhpcy5hc2FyRmFsbGJhY2sgPSB2ZXJkaWN0O1xuXG4gICAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUFzYXJGYWxsYmFja0FjdGlvbih7XG4gICAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiB0aGlzLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2ssXG4gICAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgICB0aWVyOiB2ZXJkaWN0LnRpZXJcbiAgICB9KTtcbiAgICBpZiAoYWN0aW9uID09PSAndGhyb3cnKSB7XG4gICAgICB0aHJvdyBuZXcgU2lsZW50QXNhckZhbGxiYWNrRXJyb3Ioe1xuICAgICAgICByZXF1ZXN0ZWRWZXJzaW9uOiBlbnN1cmVOb25OdWxsYWJsZSh2ZXJkaWN0LnJlcXVlc3RlZFZlcnNpb24pLFxuICAgICAgICBydW5uaW5nQXBpVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5ydW5uaW5nQXBpVmVyc2lvbilcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYWN0aW9uID09PSAnd2FybicpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyB0aGUgcG9zdC1ib290IHJ1bnRpbWUgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIGFuIG93bmVkIGluc3RhbmNlLCBvbmNlIHRoZVxuICAgKiB2YXVsdCBpcyByZWFkeS4gUmVhZHMgdGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiBhbmQgRWxlY3Ryb24gdmVyc2lvbiAqKm9uY2UqKlxuICAgKiBmcm9tIHRoZSBib290ZWQgcmVuZGVyZXIncyBtYWluIHByb2Nlc3MsIHRoZW46ICgxKSB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHBcbiAgICogdmVyc2lvbiBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiBcdTIwMTQgdGhyb3dpbmcge0BsaW5rIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yfSBvblxuICAgKiBhIHNpbGVudCBmYWxsYmFjayAod2hlbiBlbmFibGVkKTsgYW5kICgyKSBydW5zIHRoZSBiZXN0LWVmZm9ydCBydW50aW1lLUVsZWN0cm9uXG4gICAqIG5hZy4gT25seSB0aGUgYXNhci1mYWxsYmFjayBjaGVjayBjYW4gdGhyb3csIHNvIHRoaXMgbXVzdCBydW4gb3V0c2lkZSB0aGVcbiAgICogcmVhZGluZXNzIHBvbGwncyB0cnkvY2F0Y2ggKGEgc3dhbGxvd2VkIHRocm93IHdvdWxkIGxvb3AgdW50aWwgdGltZW91dCkuXG4gICAqXG4gICAqIEJvdGggYXJlIHJlYWQgYXQgdGhlIHJlbmRlcmVyIHRvcCBsZXZlbDogYGlwY1JlbmRlcmVyLnNlbmRTeW5jKCd2ZXJzaW9uJylgICh0aGVcbiAgICogcnVubmluZyBhcHAgdmVyc2lvbiwgdHJ1dGhmdWwgZXZlbiB1bmRlciBhIHNpbGVudCBhc2FyIGZhbGxiYWNrKSBhbmRcbiAgICogYHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb25gICh0aGUgbGl2ZSBzaGVsbCBFbGVjdHJvbik7IG5laXRoZXIgdXNlc1xuICAgKiBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIHJlc29sdmVzIG9ubHkgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gQSByZWFkXG4gICAqIGZhaWx1cmUgbGVhdmVzIGJvdGggdW5rbm93biAobG9nZ2VkLCBub24tZmF0YWwpIFx1MjAxNCBhbiB1bnJlYWRhYmxlIHJ1bm5pbmcgdmVyc2lvblxuICAgKiBjYW5ub3QgYmUganVkZ2VkIGEgZmFsbGJhY2ssIHNvIHRoZSBib290IGlzIG5vdCBicm9rZW4gYnkgYSBmbGFreSByZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrUnVudGltZUNvbXBhdGliaWxpdHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBhY3R1YWxFbGVjdHJvblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3QXBwVmVyc2lvbiA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoJ1N0cmluZyh3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoXFwndmVyc2lvblxcJykpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGFwcFZlcnNpb24gPSByYXdBcHBWZXJzaW9uID09PSAnJyB8fCByYXdBcHBWZXJzaW9uID09PSAndW5kZWZpbmVkJyA/IHVuZGVmaW5lZCA6IHJhd0FwcFZlcnNpb247XG4gICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24gPSBhd2FpdCB0aGlzLmV2YWx1YXRlKCdTdHJpbmcocHJvY2Vzcy52ZXJzaW9ucy5lbGVjdHJvbiknLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgcmVhZCBydW50aW1lIHZlcnNpb25zIChub24tZmF0YWwpOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gRmFpbHMgZmFzdCAod2hlbiBlbmFibGVkKSBvbiBhIHNpbGVudCBhc2FyIGZhbGxiYWNrIFx1MjAxNCBNVVNUIHJ1biBiZWZvcmUgdGhlXG4gICAgLy8gQmVzdC1lZmZvcnQgbmFnIGFuZCBvdXRzaWRlIGFueSB0cnkvY2F0Y2ggc28gdGhlIHRocm93IGVzY2FwZXMgdGhlIHBvbGwuXG4gICAgdGhpcy5jaGVja1J1bnRpbWVBc2FyRmFsbGJhY2soYXBwVmVyc2lvbik7XG4gICAgdGhpcy5hcHBseUVsZWN0cm9uQ29tcGF0aWJpbGl0eShhcHBWZXJzaW9uLCBhY3R1YWxFbGVjdHJvblZlcnNpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3RzIHRvIGEgQ0RQIHRhcmdldCdzIFdlYlNvY2tldCBlbmRwb2ludC5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBDRFAgdGFyZ2V0IHRvIGNvbm5lY3QgdG8uXG4gICAqIEByZXR1cm5zIFRoZSBvcGVuIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0VG9UYXJnZXQodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPFdlYlNvY2tldD4ge1xuICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBjb25uZWN0IHRvIENEUCB0YXJnZXQ6ICR7dGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsfWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiB3cztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb25uZWN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgdGhpcy53cy5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLndzID0gbnVsbDtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGlmIHByZXNlbnQuXG4gICAqXG4gICAqIEFjdHMgYXMgYSBzYWZldHkgbmV0IHdoZW4gYGVuYWJsZS1wbHVnaW4tPGlkPmAgaXMgd3JpdHRlbiBpbiBvbmUgcmVuZGVyZXJcbiAgICogYnV0IG5vdCB5ZXQgdmlzaWJsZSB0byB0aGUgbmV3bHktb3BlbmVkIHZhdWx0J3MgcmVuZGVyZXIgKHJhY2Ugb2JzZXJ2ZWRcbiAgICogaW4gT2JzaWRpYW4gMS4xMy4wKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIEFuIG9wZW4gV2ViU29ja2V0IHRvIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldC5cbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh3czogV2ViU29ja2V0LCB2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgaWYgKCF2YXVsdElkKSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgZmluZCB2YXVsdCBJRCBcdTIwMTQgc2tpcHBpbmcgbG9jYWxTdG9yYWdlIHRydXN0IGZsYWcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICBleHByZXNzaW9uOiBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2AsXG4gICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgfSk7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGVyZSBpcyBhbiBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIGNvcnJlY3QgdmF1bHQgdGFyZ2V0LlxuICAgKlxuICAgKiBSZXVzZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gaWYgaXQgdGFyZ2V0cyB0aGUgcmVxdWVzdGVkIHZhdWx0LlxuICAgKiBPdGhlcndpc2UsIGZpbmRzIHRoZSBjb3JyZWN0IHRhcmdldCBhbmQgcmVjb25uZWN0cy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHRhcmdldC5cbiAgICogQHJldHVybnMgVGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlQ29ubmVjdGlvbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8V2ViU29ja2V0PiB7XG4gICAgaWYgKHRoaXMud3M/LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOICYmIHRoaXMuYWN0aXZlVmF1bHRQYXRoID09PSB2YXVsdFBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLndzO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICB0aGlzLndzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9IHZhdWx0UGF0aDtcbiAgICByZXR1cm4gdGhpcy53cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiB3aXRoIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE9ic2lkaWFuIENEUCBub3QgcmVhY2hhYmxlLiBTdGFydGluZyBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcuLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQodGhpcy5jZHBQb3J0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBDRFAgZW5kcG9pbnQgYXQgJHt0aGlzLmNkcFVybH0gKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICAgIGlmICh0YXJnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPYnNpZGlhbiBDRFAgcmVhZHksICR7U3RyaW5nKHRhcmdldHMubGVuZ3RoKX0gdGFyZ2V0KHMpIGZvdW5kLmApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIENEUCBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGFjY2Vzc2libGUuYCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIENEUCB0YXJnZXQgdGhhdCBoYXMgdGhlIGdpdmVuIHZhdWx0IG9wZW4uXG4gICAqXG4gICAqIFByb2JlcyBldmVyeSB0YXJnZXQgYnkgZXZhbHVhdGluZyBgZ2V0QmFzZVBhdGgoKWAgYW5kIHJldHVybnMgdGhlIG9uZSB3aG9zZVxuICAgKiBiYXNlIHBhdGggbWF0Y2hlcyBgdmF1bHRQYXRoYCAodmlhIHtAbGluayBhcmVWYXVsdFBhdGhzTWF0Y2hpbmd9LCB0b2xlcmFudCBvZlxuICAgKiBzZXBhcmF0b3IvY2FzZSBkaWZmZXJlbmNlcykuIEEgc2luZ2xlIHRhcmdldCBpcyAqKm5vdCoqIHJldHVybmVkIGJsaW5kbHk6IHdpdGhcbiAgICogbW9yZSB0aGFuIG9uZSB2YXVsdCBvcGVuIChhdHRhY2ggbW9kZSdzIHNoYXJlZCBpbnN0YW5jZSksIHRoZSBzb2xlLXRhcmdldFxuICAgKiBzaG9ydGN1dCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHdpbmRvdyBoYXBwZW5zIHRvIGJlIG9wZW4gcmVnYXJkbGVzcyBvZiB3aGljaFxuICAgKiB2YXVsdCB3YXMgcmVxdWVzdGVkIFx1MjAxNCB0aGUgZXhhY3QgbWlzLXJvdXRpbmcgdGhpcyBtZXRob2QgbXVzdCBhdm9pZC4gQSB0YXJnZXRcbiAgICogd2hvc2UgcHJvYmUgdGhyb3dzIGlzIHRyZWF0ZWQgYXMgbm90LXJlYWR5IGFuZCBza2lwcGVkICh0aGUgY2FsbGVyJ3MgcmVhZGluZXNzXG4gICAqIHBvbGwgcmV0cmllcyk7IGEgdGFyZ2V0IHdob3NlIHByb2JlIHN1Y2NlZWRzIGJ1dCBkb2VzIG5vdCBtYXRjaCBpcyBuZXZlclxuICAgKiByZXR1cm5lZC4gV2hlbiBub3RoaW5nIG1hdGNoZXMsIHRocm93IHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIG1hdGNoLlxuICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgQ0RQIHRhcmdldC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTxDZHBUYXJnZXQ+IHtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuXG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIE9ic2lkaWFuIENEUCB0YXJnZXRzIGZvdW5kJyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKHRhcmdldCk7XG4gICAgICAgIGlmIChhcmVWYXVsdFBhdGhzTWF0Y2hpbmcoYmFzZVBhdGgsIHZhdWx0UGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGEgdmF1bHQgdGFyZ2V0IG9yIG5vdCByZWFkeS5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENEUCB0YXJnZXQgZm91bmQgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBsaXN0IG9mIHBhZ2UtdHlwZSB0YXJnZXRzIGZyb20gdGhlIENEUCBgL2pzb25gIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbGlzdCBvZiBwYWdlIHRhcmdldHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFBhZ2VUYXJnZXRzKCk6IFByb21pc2U8Q2RwVGFyZ2V0W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMuY2RwVXJsfS9qc29uYCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXTtcbiAgICByZXR1cm4gdGFyZ2V0cy5maWx0ZXIoKHQpID0+IHQudHlwZSA9PT0gJ3BhZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBLaWxscyB0aGUgY3VycmVudGx5LXJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgKGlmIGFueSkgYW5kIHdhaXRzIGZvciBpdCB0byBleGl0LFxuICAgKiBzbyB0aGUgbmV4dCBsYXVuY2ggZ2V0cyBhIHByaXN0aW5lIHNpbmdsZS13aW5kb3cgaW5zdGFuY2UuXG4gICAqXG4gICAqIFJlbGF1bmNoaW5nIG92ZXIgYSBsaXZlIGluc3RhbmNlIGlzIGZvcndhcmRlZCBieSBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBhbmQgc3VyZmFjZXMgdGhlIHZhdWx0IHBpY2tlciwgYW5kIG9wZW5pbmcgYVxuICAgKiBzZWNvbmQgd2luZG93IHZpYSBJUEMgbGVhdmVzIHN0YWxlIHdpbmRvd3MgdGhhdCBicmVhayB2YXVsdC10YXJnZXQgcm91dGluZyBcdTIwMTRcbiAgICogaGVuY2UgYSBmdWxsIGtpbGwgKyB3YWl0LWZvci1leGl0IChyZWxlYXNpbmcgdGhlIGxvY2spIGJldHdlZW4gbGF1bmNoZXMuIEFcbiAgICogbm8tb3Agb24gdGhlIGZpcnN0IGF0dGVtcHQsIHdoZW4gbm8gaW5zdGFuY2UgaXMgcnVubmluZyB5ZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGtpbGxSdW5uaW5nT3duZWRJbnN0YW5jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub3duZWRJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBLaWxsaW5nIHJ1bm5pbmcgb3duZWQgaW5zdGFuY2UgYmVmb3JlIChyZSlsYXVuY2guJyk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgY29uc3QgcHJldmlvdXNDZHBVcmwgPSB0aGlzLmNkcFVybDtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2Uua2lsbCgpO1xuICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JJbnN0YW5jZUV4aXQocHJldmlvdXNDZHBVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHdpbmRvdyBvZmYtc2NyZWVuIHNvIGEgaGlkZGVuIHJ1biBuZXZlciBzdGVhbHNcbiAgICogZm9jdXMuIFVzZXMgRWxlY3Ryb24ncyByZW1vdGUgYnJpZGdlIChgd2luZG93LmVsZWN0cm9uLnJlbW90ZWApIFx1MjAxNCB0aGUgb25seVxuICAgKiBjcm9zcy1wbGF0Zm9ybSB3YXkgdG8gcmVwb3NpdGlvbiB0aGUgd2luZG93IFx1MjAxNCBwbGFjaW5nIGl0IGp1c3QgYmV5b25kIHRoZVxuICAgKiByaWdodCBlZGdlIG9mIGFsbCBkaXNwbGF5cy4gVGhlIHdpbmRvdyBzdGF5cyBcInZpc2libGVcIiB0byBDaHJvbWl1bSAoc29cbiAgICogdGltZXJzLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGtlZXAgd29ya2luZyksXG4gICAqIHVubGlrZSBtaW5pbWl6aW5nLCB3aGljaCB3b3VsZCBmcmVlemUgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuXG4gICAqXG4gICAqIFRoZSByZW1vdGUgYnJpZGdlIGlzIG5vdCBhdmFpbGFibGUgdGhlIGluc3RhbnQgQ0RQIHN0YXJ0cyBzZXJ2aW5nLCBzbyB0aGlzXG4gICAqIHBvbGxzIHVudGlsIHRoZSBtb3ZlIHN1Y2NlZWRzLiBCZXN0LWVmZm9ydDogaWYgdGhlIHdpbmRvdyBjYW5ub3QgYmUgbW92ZWRcbiAgICogd2l0aGluIHRoZSB0aW1lb3V0LCB0aGUga2VlcC1hbGl2ZSBsYXVuY2ggZmxhZ3Mgc3RpbGwgYXBwbHkgYW5kIHRoZSBydW5cbiAgICogcHJvY2VlZHMgKHdvcnN0IGNhc2UgdGhlIHdpbmRvdyBpcyBicmllZmx5IHZpc2libGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUmVzb2x2ZSB0aGUgRWxlY3Ryb24gcmVtb3RlIGJyaWRnZSB0d28gd2F5cyBzbyBCT1RIIG1vZGVybiBhbmQgb2xkIE9ic2lkaWFuXG4gICAgLy8gQ2FuIGJlIG1vdmVkIG9mZi1zY3JlZW46IG1vZGVybiBpbmplY3RzIGB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlYDsgb2xkXG4gICAgLy8gVmVyc2lvbnMgKG5vIGB3aW5kb3cuZWxlY3Ryb25gKSBzdGlsbCBleHBvc2UgdGhlIGJ1aWx0LWluIGByZW1vdGVgIG1vZHVsZSB2aWFcbiAgICAvLyBgcmVxdWlyZSgnZWxlY3Ryb24nKWAgaW4gdGhlIG5vZGUtaW50ZWdyYXRlZCByZW5kZXJlciAocmVtb3ZlZCBmcm9tIEVsZWN0cm9uXG4gICAgLy8gMTQrLCBidXQgcHJlc2VudCBvbiB0aGUgRWxlY3Ryb24gOC0xMyBzaGVsbHMgb2xkIE9ic2lkaWFuIHNoaXBzKS4gUmV0dXJuaW5nXG4gICAgLy8gYG1vdmVkYCBvbiB0aGUgZmlyc3Qgc3VjY2VzcyBpcyBpbXBvcnRhbnQgb24gRWxlY3Ryb24gMTAtZXJhIGJ1aWxkczogcG9sbGluZ1xuICAgIC8vIE9uIHdpdGhvdXQgYSByZXNvbHZhYmxlIGJyaWRnZSBoYW1tZXJzIHRoZSByZW5kZXJlciB3aXRoIENEUCByb3VuZC10cmlwc1xuICAgIC8vIER1cmluZyBib290IGFuZCBpbnRlcm1pdHRlbnRseSBwcmV2ZW50cyB0aGUgd29ya3NwYWNlIGZyb20gaW5pdGlhbGl6aW5nLlxuICAgIGNvbnN0IG1vdmVFeHByZXNzaW9uID0gYCgoKSA9PiB7XG4gICAgICBsZXQgcmVtb3RlID0gKHdpbmRvdy5lbGVjdHJvbiAmJiB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlKSB8fCBudWxsO1xuICAgICAgaWYgKCFyZW1vdGUpIHtcbiAgICAgICAgdHJ5IHsgcmVtb3RlID0gcmVxdWlyZSgnZWxlY3Ryb24nKS5yZW1vdGUgfHwgbnVsbDsgfSBjYXRjaCAocmVxdWlyZUVycm9yKSB7IHJlbW90ZSA9IG51bGw7IH1cbiAgICAgIH1cbiAgICAgIGlmICghcmVtb3RlIHx8IHR5cGVvZiByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cuYXBwID09PSAndW5kZWZpbmVkJykgPyAnbm90LXJlYWR5JyA6ICduby1icmlkZ2UnO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2luID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlzID0gcmVtb3RlLnNjcmVlbi5nZXRBbGxEaXNwbGF5cygpO1xuICAgICAgY29uc3QgbWF4UmlnaHQgPSBNYXRoLm1heCguLi5kaXNwbGF5cy5tYXAoKGRpc3BsYXkpID0+IGRpc3BsYXkuYm91bmRzLnggKyBkaXNwbGF5LmJvdW5kcy53aWR0aCkpO1xuICAgICAgd2luLnNldFBvc2l0aW9uKG1heFJpZ2h0ICsgJHtTdHJpbmcoT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTKX0sIDApO1xuICAgICAgcmV0dXJuICdtb3ZlZCc7XG4gICAgfSkoKWA7XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICAgICAgZXhwcmVzc2lvbjogbW92ZUV4cHJlc3Npb24sXG4gICAgICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSA9PT0gJ21vdmVkJykge1xuICAgICAgICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBNb3ZlZCBvd25lZCBPYnNpZGlhbiB3aW5kb3cgb2ZmLXNjcmVlbiAoaGlkZGVuIG1vZGUpLicpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHdzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ0RQIGVuZHBvaW50IC8gdGFyZ2V0IC8gcmVtb3RlIGJyaWRnZSBub3QgcmVhZHkgeWV0IFx1MjAxNCBrZWVwIHBvbGxpbmcuXG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBtb3ZlIG93bmVkIHdpbmRvdyBvZmYtc2NyZWVuIHdpdGhpbiAke1N0cmluZyhPV05FRF9XSU5ET1dfSElERV9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMgKG5vbi1mYXRhbDsga2VlcC1hbGl2ZSBmbGFncyBzdGlsbCBhcHBsaWVkKS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyBhIHZhdWx0IGluIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZSB2aWEgdGhlIGB2YXVsdC1vcGVuYFxuICAgKiBFbGVjdHJvbiBJUEMgKGV2YWx1YXRlZCB0aHJvdWdoIENEUCBvbiBhbiBleGlzdGluZyB0YXJnZXQpLCB0aGVuIHBvbGxzIHVudGlsXG4gICAqIHRoZSBuZXcgdmF1bHQncyB3aW5kb3cgdGFyZ2V0IGFwcGVhcnMsIGlzIGxheW91dC1yZWFkeSwgYW5kIGl0cyB0cnVzdCBkaWFsb2dcbiAgICogKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBTaGFyZWQgYnkgdGhlIGF0dGFjaC1tb2RlIHtAbGluayByZWdpc3RlclZhdWx0fSBhbmQgdGhlIG93bmVkLW1vZGVcbiAgICogXCJpbnN0YW5jZSBhbHJlYWR5IGxhdW5jaGVkXCIgcGF0aCwgc28gb3BlbmluZyBhbiBhZGRpdGlvbmFsIHZhdWx0IG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHByb2Nlc3MgKHdoaWNoIHdvdWxkIHN1cmZhY2UgdGhlIHZhdWx0IHBpY2tlcikuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuVmF1bHRJblJ1bm5pbmdJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBPYnNpZGlhbiBDRFAgdGFyZ2V0cyBhdmFpbGFibGUuIElzIE9ic2lkaWFuIHJ1bm5pbmc/Jyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGB2YXVsdC1vcGVuYCBJUEMgaXMgc2VudCB0aHJvdWdoIGFuIEVYSVNUSU5HIHdpbmRvdyAoYHRhcmdldHNbMF1gKSwgc28gdGhlXG4gICAgLy8gSGVscGVyIG5hbWVzcGFjZSBtdXN0IGJlIGJvb3RzdHJhcHBlZCBvbiBUSEFUIHdpbmRvdyBcdTIwMTQgbm90IG9uIGB2YXVsdFBhdGhgLCB3aG9zZVxuICAgIC8vIFdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQuIEJvb3RzdHJhcHBpbmcgYWdhaW5zdCBgdmF1bHRQYXRoYCBoZXJlIHdvdWxkIHJvdXRlXG4gICAgLy8gVGhyb3VnaCBgZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aClgIHdpdGggb25seSB0aGUgZXhpc3Rpbmcgd2luZG93IHByZXNlbnQgYW5kXG4gICAgLy8gUG9pc29uIHRoZSBjb25uZWN0aW9uIGNhY2hlIChsYWJlbCBgdmF1bHRQYXRoYCwgc29ja2V0IFx1MjE5MiB0aGUgZXhpc3Rpbmcgd2luZG93KSwgc29cbiAgICAvLyBFdmVyeSBsYXRlciBldmFsIGZvciBgdmF1bHRQYXRoYCB3b3VsZCBtaXMtcm91dGUgdG8gdGhlIGV4aXN0aW5nIHdpbmRvdy4gUHJvYmUgdGhlXG4gICAgLy8gRXhpc3Rpbmcgd2luZG93J3Mgb3duIGJhc2UgcGF0aCBhbmQgYm9vdHN0cmFwIGFnYWluc3QgdGhhdCBpbnN0ZWFkLlxuICAgIGNvbnN0IGV4aXN0aW5nVGFyZ2V0ID0gZW5zdXJlTm9uTnVsbGFibGUodGFyZ2V0c1swXSk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdFBhdGggPSBhd2FpdCB0aGlzLnByb2JlVmF1bHRQYXRoKGV4aXN0aW5nVGFyZ2V0KTtcbiAgICBjb25zdCBpcGNXcyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KGV4aXN0aW5nVGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IGlwY0V4cHJlc3Npb24gPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGNoYW5uZWw6ICd2YXVsdC1vcGVuJywgY2hhbm5lbEFyZ3VtZW50czogW3ZhdWx0UGF0aCwgZmFsc2VdIH0pfSlgO1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChpcGNXcywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgICAgZXhwcmVzc2lvbjogaXBjRXhwcmVzc2lvbixcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKGlwY1dzLCB2YXVsdFBhdGgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpcGNXcy5jbG9zZSgpO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHRhcmdldCAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFZhdWx0IHRhcmdldCBmb3VuZC4nKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IHRhcmdldCBub3QgcmVhZHkgeWV0LlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYW1wbGVzIHRoZSB2YXVsdCByZW5kZXJlcidzIGJvb3RzdHJhcCBzdGF0ZSBcdTIwMTQgd2hldGhlciB0aGUgZG9jdW1lbnQgaXNcbiAgICogYGNvbXBsZXRlYCwgd2hldGhlciBgd2luZG93LmFwcGAgZXhpc3RzLCBhbmQgdGhlIGA8Ym9keT5gIGNoaWxkIGNvdW50IFx1MjAxNCBmcm9tXG4gICAqIHRoZSBmaXJzdCBwYWdlIHRhcmdldCwgZm9yIGRlYWQtYm9vdCBkZXRlY3Rpb24uIFRoaXMgd29ya3MgZXZlbiB3aGVuIHRoZSBhcHBcbiAgICogbmV2ZXIgYm9vdHN0cmFwcGVkICh0aGUgcmVuZGVyZXIgcGFnZSB0YXJnZXQgc3RpbGwgZXhpc3RzKSwgd2hpY2ggaXMgZXhhY3RseVxuICAgKiB0aGUgc3RhdGUgaXQgbXVzdCBvYnNlcnZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2FtcGxlZCBvYnNlcnZhdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBubyB0YXJnZXQgaXMgcmVhY2hhYmxlXG4gICAqICAgb3IgdGhlIHByb2JlIGZhaWxlZCAoc28gdGhlIGNhbGxlciBrZWVwcyBwb2xsaW5nIHJhdGhlciB0aGFuIGZhc3QtZmFpbGluZykuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2JlUmVuZGVyZXJCb290U3RhdGUoKTogUHJvbWlzZTxSZW5kZXJlckJvb3RPYnNlcnZhdGlvbiB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbdGFyZ2V0XSA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb2JlRXhwcmVzc2lvbiA9IGBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgYm9keUNoaWxkRWxlbWVudENvdW50OiBkb2N1bWVudC5ib2R5ID8gZG9jdW1lbnQuYm9keS5jaGlsZEVsZW1lbnRDb3VudCA6IDAsXG4gICAgICAgICAgaGFzV2luZG93QXBwOiB0eXBlb2Ygd2luZG93LmFwcCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgaXNEb2N1bWVudENvbXBsZXRlOiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnXG4gICAgICAgIH0pYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBleHByZXNzaW9uOiBwcm9iZUV4cHJlc3Npb24sXG4gICAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSkgYXMgUmVuZGVyZXJCb290T2JzZXJ2YXRpb247XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIGEgdGFyZ2V0IHRvIGRpc2NvdmVyIHdoaWNoIHZhdWx0IHBhdGggaXQgaGFzIG9wZW4uXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0ZW1wb3JhcnkgV2ViU29ja2V0IGNvbm5lY3Rpb24sIGV2YWx1YXRlcyBgZ2V0QmFzZVBhdGgoKWAsXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBwcm9iZS5cbiAgICogQHJldHVybnMgVGhlIHZhdWx0J3MgYmFzZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVZhdWx0UGF0aCh0YXJnZXQ6IENkcFRhcmdldCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldCh0YXJnZXQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgICAgZXhwcmVzc2lvbjogJ2FwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoID8gYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IGFwcC52YXVsdC5hZGFwdGVyLmJhc2VQYXRoJyxcbiAgICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gU3RyaW5nKHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0Py52YWx1ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHdzLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIGFuZCBjb25uZWN0cyB0byBhIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlIGZvciBhXG4gICAqIHZhdWx0OiBwcm92aXNpb25zIHRoZSBhc2FyIChpZiBhbnkpLCBwcmUtc2VlZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYFxuICAgKiBzbyB0aGUgdmF1bHQgb3BlbnMgZGlyZWN0bHksIGxhdW5jaGVzIHRoZSBpbnN0YW5jZSBvbiBhIGZyZWUgQ0RQIHBvcnQsIHRoZW5cbiAgICogd2FpdHMgdW50aWwgdGhlIHZhdWx0IHdpbmRvdyBpcyByZWFkeSBhbmQgZGlzbWlzc2VzIHRoZSB0cnVzdCBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlclZhdWx0SW5Pd25lZEluc3RhbmNlKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25lZENvbmZpZyk7XG5cbiAgICBta2RpclN5bmMoY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBpZiAoY29uZmlnLmFzYXIpIHtcbiAgICAgIGNvcHlBc2FySW50b1VzZXJEYXRhKGNvbmZpZy5hc2FyLnBhdGgsIGNvbmZpZy5hc2FyLnZlcnNpb24sIGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmF1bHRJZCA9IHJhbmRvbUJ5dGVzKFZBVUxUX0lEX0JZVEVfTEVOR1RIKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3Qgb2JzaWRpYW5Kc29uID0gYnVpbGRPd25lZE9ic2lkaWFuSnNvbih7IHRzOiBEYXRlLm5vdygpLCB2YXVsdElkLCB2YXVsdFBhdGggfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgJ29ic2lkaWFuLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkob2JzaWRpYW5Kc29uKSk7XG5cbiAgICAvLyBSZWxhdW5jaC1yZXRyeTogc29tZSBvbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gYnVpbGRzIGludGVybWl0dGVudGx5XG4gICAgLy8gQm9vdCB3aXRoIGB3aW5kb3cuYXBwYCBwcmVzZW50IGJ1dCB0aGUgd29ya3NwYWNlIG5ldmVyIGluaXRpYWxpemluZywgc28gdGhlXG4gICAgLy8gVmF1bHQgbmV2ZXIgYmVjb21lcyByZWFkeS4gQSBmcmVzaCBpbnN0YW5jZSBpcyBhbiBpbmRlcGVuZGVudCBjaGFuY2UuIEFcbiAgICAvLyBEZXRlcm1pbmlzdGljIGZhaWx1cmUgKGRlYWQgYm9vdCwgc2lsZW50IGFzYXIgZmFsbGJhY2spIGlzIHJlLXRocm93biBhdCBvbmNlIFx1MjAxNFxuICAgIC8vIFJldHJ5aW5nIGl0IG9ubHkgd2FzdGVzIHRoZSByZWFkaW5lc3MgdGltZW91dC5cbiAgICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgYXdhaXQgdGhpcy5raWxsUnVubmluZ093bmVkSW5zdGFuY2UoKTtcbiAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICBhd2FpdCBkZWxheShPV05FRF9SRUxBVU5DSF9TRVRUTEVfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdGFuY2UgPSBhd2FpdCBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2Uoe1xuICAgICAgICBjZHBIb3N0OiB0aGlzLmNkcEhvc3QsXG4gICAgICAgIGV4ZVBhdGg6IGNvbmZpZy5leGVQYXRoLFxuICAgICAgICBleHRyYUFyZ3VtZW50czogW1xuICAgICAgICAgIC4uLnJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyh0aGlzLmlzT2JzaWRpYW5BcHBWaXNpYmxlKSxcbiAgICAgICAgICAuLi5yZXNvbHZlU2FuZGJveExhdW5jaEFyZ3VtZW50cyh0aGlzLnNob3VsZERpc2FibGVTYW5kYm94KVxuICAgICAgICBdLFxuXG4gICAgICAgIHVzZXJEYXRhRGlyZWN0b3J5OiBjb25maWcudXNlckRhdGFEaXJlY3RvcnlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vd25lZEluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICB0aGlzLmNkcFBvcnQgPSBpbnN0YW5jZS5wb3J0O1xuICAgICAgdGhpcy5jZHBVcmwgPSBpbnN0YW5jZS5jZHBVcmw7XG5cbiAgICAgIGlmIChzaG91bGRIaWRlT2JzaWRpYW5BcHAodGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tb3ZlT3duZWRXaW5kb3dPZmZzY3JlZW4oKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXJtUGFyZW50TGl2ZW5lc3NXYXRjaGRvZyh2YXVsdFBhdGgsIGluc3RhbmNlLnBhcmVudExpdmVuZXNzUG9ydCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBPd25lZCB2YXVsdCBub3QgcmVhZHkgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKE9XTkVEX0xBVU5DSF9NQVhfQVRURU1QVFMpfSk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbGFzdEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBsYXN0RXJyb3IgOiBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgQ0RQIGNvbW1hbmQgb3ZlciBXZWJTb2NrZXQgYW5kIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UuXG4gICAqXG4gICAqIEBwYXJhbSB3cyAtIFRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBDRFAgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgQ0RQIHJlc3BvbnNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZW5kQ29tbWFuZCh3czogV2ViU29ja2V0LCBtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8Q2RwUmVzcG9uc2U+IHtcbiAgICBjb25zdCBpZCA9ICsrdGhpcy5tZXNzYWdlSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Q2RwUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDRFAgY29tbWFuZCB0aW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcodGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgdGhpcy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgZnVuY3Rpb24gaGFuZGxlcihldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5kYXRhKSkgYXMgQ2RwUmVzcG9uc2U7XG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBpZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICB3cy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBhIGtpbGxlZCBvd25lZCBpbnN0YW5jZSdzIENEUCBlbmRwb2ludCB1bnRpbCBpdCBzdG9wcyByZXNwb25kaW5nLFxuICAgKiBjb25maXJtaW5nIHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIEVsZWN0cm9uJ3Mgc2luZ2xlLWluc3RhbmNlXG4gICAqIGxvY2sgb24gdGhlIHNoYXJlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBhIGZyZXNoIGluc3RhbmNlIGlzIGxhdW5jaGVkIGludG8gaXQuXG4gICAqXG4gICAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCBvZiB0aGUgaW5zdGFuY2UgdGhhdCB3YXMganVzdCBraWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JJbnN0YW5jZUV4aXQoY2RwVXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBXYWl0aW5nIGZvciBwcmV2aW91cyBvd25lZCBpbnN0YW5jZSBhdCAke2NkcFVybH0gdG8gZXhpdC4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtjZHBVcmx9L2pzb25gKTtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIGVuZHBvaW50IGlzIGdvbmU6IHRoZSBwcm9jZXNzIGhhcyBleGl0ZWQgYW5kIHJlbGVhc2VkIHRoZSBsb2NrLlxuICAgICAgICBhd2FpdCBkZWxheShJTlNUQU5DRV9FWElUX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIFByZXZpb3VzIGluc3RhbmNlIHN0aWxsIHJlc3BvbmRlZCBiZWZvcmUgdGltZW91dDsgcmVsYXVuY2hpbmcgYW55d2F5LicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgdmF1bHQncyBgYXBwLndvcmtzcGFjZWAgdG8gcmVhY2ggbGF5b3V0LXJlYWR5IHN0YXRlLlxuICAgKlxuICAgKiBgZmluZFRhcmdldEZvclZhdWx0YCByZXR1cm5zIGFzIHNvb24gYXMgYGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKClgXG4gICAqIG1hdGNoZXMgXHUyMDE0IHdoaWNoIGlzIHRydWUgc2hvcnRseSBhZnRlciB0aGUgYEFwcGAgY29uc3RydWN0b3IgcnVucywgYmVmb3JlXG4gICAqIGBwbHVnaW5zLmluaXRpYWxpemUoKWAgKGFuZCBhbnkgdHJ1c3QgZGlhbG9nKSBoYXMgZXhlY3V0ZWQuIEJvb3RzdHJhcHBpbmdcbiAgICogdGhlIG5hbWVzcGFjZSBhbmQgY2FsbGluZyBgcG9sbFZhdWx0QmFzZVBhdGgoKWAgYXdhaXRzIGBsYXlvdXRSZWFkeWAsIHNvXG4gICAqIGJ5IHRoZSB0aW1lIHRoaXMgcmV0dXJucyB0aGUgZGlhbG9nIGhhcyBlaXRoZXIgcmVuZGVyZWQgb3IgaXMgbm90IGdvaW5nXG4gICAqIHRvIHJlbmRlci5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKCd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB0aGUgb3duZWQgaW5zdGFuY2UgdW50aWwgdGhlIHZhdWx0IHRhcmdldCBleGlzdHMsIGxheW91dCBpcyByZWFkeSwgYW5kXG4gICAqIHRoZSB0cnVzdCBkaWFsb2cgKGlmIGFueSkgaGFzIGJlZW4gZGlzbWlzc2VkLlxuICAgKlxuICAgKiBCZXR3ZWVuIHJlYWRpbmVzcyBhdHRlbXB0cyBpdCBhbHNvIGNoZWNrcyBmb3IgYSAqKmRlYWQgYm9vdCoqIFx1MjAxNCB0aGUgcmVuZGVyZXJcbiAgICogbG9hZGVkIChgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgKSBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWRcbiAgICogKGVtcHR5IGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3RcbiAgICogcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSB0aGF0IHN0YXRlIGhhcyBoZWxkIGZvciB0aGVcbiAgICogY29uZmlndXJlZCBncmFjZSB3aW5kb3cgaXQgdGhyb3dzIGEge0BsaW5rIFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3J9XG4gICAqIGltbWVkaWF0ZWx5IGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzIHRpbWVvdXQuIEEgZ3JhY2Ugb2ZcbiAgICogYDBgIGRpc2FibGVzIHRoZSBmYXN0LWZhaWwuIFRoZSBncmFjZSBjbG9jayBzdGFydHMgd2hlbiB0aGUgcmVuZGVyZXIgZmlyc3RcbiAgICogcmVwb3J0cyBgY29tcGxldGVgLCBzbyBhIHNsb3cgbG9hZCBiZWZvcmUgdGhlbiBpcyBuZXZlciBjb3VudGVkIGFnYWluc3QgaXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yT3duZWRWYXVsdFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igb3duZWQgdmF1bHQgdG8gYmVjb21lIHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGRvY3VtZW50Q29tcGxldGVTaW5jZTogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gICAgbGV0IGlzUmVhZHkgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgICBpc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHZhdWx0IGlzIG5vdCByZWFkeSB5ZXQgXHUyMDE0IGFsc28gZHJvcCB0aGUgY2FjaGVkIENEUCBjb25uZWN0aW9uIGJlZm9yZVxuICAgICAgICAvLyBSZXRyeWluZy4gT2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIHJlbG9hZHMgdGhlIG93bmVkIHdpbmRvdyBkdXJpbmdcbiAgICAgICAgLy8gQm9vdCwgd2hpY2ggY2FuIGxlYXZlIHRoZSBjYWNoZWQgV2ViU29ja2V0IHBpbm5lZCB0byBhIHN0YWxlIGV4ZWN1dGlvblxuICAgICAgICAvLyBDb250ZXh0OyByZWNvbm5lY3RpbmcgZWFjaCBhdHRlbXB0IHJlLWJpbmRzIHRvIHRoZSBsaXZlIGNvbnRleHQuXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgPiAwKSB7XG4gICAgICAgIGNvbnN0IG9ic2VydmF0aW9uID0gYXdhaXQgdGhpcy5wcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk7XG4gICAgICAgIGlmIChvYnNlcnZhdGlvbikge1xuICAgICAgICAgIGlmIChvYnNlcnZhdGlvbi5pc0RvY3VtZW50Q29tcGxldGUgJiYgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID09PSBudWxsKSB7XG4gICAgICAgICAgICBkb2N1bWVudENvbXBsZXRlU2luY2UgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBoYXNHcmFjZUVsYXBzZWQgPSBkb2N1bWVudENvbXBsZXRlU2luY2UgIT09IG51bGxcbiAgICAgICAgICAgICYmIERhdGUubm93KCkgLSBkb2N1bWVudENvbXBsZXRlU2luY2UgPj0gdGhpcy5kZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM7XG4gICAgICAgICAgaWYgKHJlc29sdmVSZW5kZXJlckJvb3RTdGF0ZSh7IC4uLm9ic2VydmF0aW9uLCBoYXNHcmFjZUVsYXBzZWQgfSkgPT09ICdkZWFkJykge1xuICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgcmVuZGVyZXIgZmFpbGVkIHRvIGluaXRpYWxpemUgKGRlYWQgYm9vdCk7IGZhaWxpbmcgZmFzdC4nKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yKHZhdWx0UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUmVhZHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3duZWQgdmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YXVsdCBpcyByZWFkeS4gUnVuIHRoZSBwb3N0LWJvb3QgY29tcGF0aWJpbGl0eSBjaGVja3MgaGVyZSBcdTIwMTQgT1VUU0lERSB0aGVcbiAgICAvLyBQb2xsJ3MgdHJ5L2NhdGNoIFx1MjAxNCBzbyBhIFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIGZhaWxzIGZhc3QgaW5zdGVhZCBvZiBiZWluZ1xuICAgIC8vIFN3YWxsb3dlZCBhcyBcIm5vdCByZWFkeSB5ZXRcIiBhbmQgbG9vcGluZyB1bnRpbCB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgYXdhaXQgdGhpcy5jaGVja1J1bnRpbWVDb21wYXRpYmlsaXR5KHZhdWx0UGF0aCk7XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgaXMgcmVhZHkuJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byByZW1vdmUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHksIHJldHVybmluZyB3aGV0aGVyIGl0IHN1Y2NlZWRlZC5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiB0aGUgcmVtb3ZhbCB0aHJldyAoZS5nLiBoYW5kbGVzIGhlbGQpLlxuICovXG5mdW5jdGlvbiBkaWRSZW1vdmVEaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBybVN5bmMoZGlyZWN0b3J5LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gbGF1bmNoIE9ic2lkaWFuIHdpdGggcmVtb3RlIGRlYnVnZ2luZyBlbmFibGVkLlxuICpcbiAqIFJlc29sdmVzIHRoZSBhY3R1YWwgaW5zdGFsbGVkIE9ic2lkaWFuIGV4ZWN1dGFibGUgKGNvdmVyaW5nIGluc3RhbGxlci1iYXNlZFxuICogYW5kIGBQQVRIYC1iYXNlZCBpbnN0YWxscyBzdWNoIGFzIGBzY29vcGApIGFuZCB2ZXJpZmllcyBpdCBleGlzdHMgYmVmb3JlXG4gKiByZXR1cm5pbmcgYSBjb21tYW5kLiBUaHJvd3MgaWYgT2JzaWRpYW4gaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBDRFAgcG9ydCB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIE9ic2lkaWFuIGNhbm5vdCBiZSBsb2NhdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgY29uc3QgZmxhZyA9IGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydD0ke1N0cmluZyhwb3J0KX1gO1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHtleGVQYXRofVwiICR7ZmxhZ31gO1xuICB9XG5cbiAgcmV0dXJuIGBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9ICZgO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxQkEseUJBQTRCO0FBQzVCLHFCQUlPO0FBQ1AsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQVlwQixxQ0FBb0M7QUFDcEMsbUNBQTBDO0FBQzFDLGtDQUEwQztBQUMxQyxvQ0FBNkM7QUFDN0Msa0JBQXFCO0FBQ3JCLGlCQUFvQjtBQUNwQixpQ0FBNEM7QUFDNUMsNkJBSU87QUFDUCxpQ0FBMEM7QUFDMUMsK0JBQTRDO0FBQzVDLCtCQUFtQztBQUNuQyxxQ0FBcUM7QUFDckMsOEJBQXVDO0FBQ3ZDLDZCQUFzRDtBQUN0RCxxQ0FHTztBQUNQLGlEQUFnRDtBQUNoRCx3Q0FBd0M7QUFDeEMseUJBQWtDO0FBQ2xDLDhCQUFzQztBQUN0Qyx3QkFJTztBQXlMUCxNQUFNLGtDQUFrQztBQUN4QyxNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHVDQUF1QztBQUM3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
|
|
1015
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0RQIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2xcbiAqIG92ZXIgV2ViU29ja2V0IGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICpcbiAqIFR3byBtb2RlczpcbiAqIC0gKipPd25lZCAoZGVmYXVsdCkqKjogdGhlIHRyYW5zcG9ydCBsYXVuY2hlcyBhbmQgb3ducyBhbiBpc29sYXRlZCBPYnNpZGlhblxuICogICBpbnN0YW5jZSBhZ2FpbnN0IGEgdGVtcG9yYXJ5IGAtLXVzZXItZGF0YS1kaXJlY3RvcnlgIG9uIGEgZnJlZSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgLFxuICogICBuZXZlciB0b3VjaGluZyB0aGUgdXNlcidzIE9ic2lkaWFuLiBTdXBwb3J0cyB2ZXJzaW9uIHBpbm5pbmcgdmlhIHRoZSB1c2VyLWRhdGEgYXNhci5cbiAqIC0gKipBdHRhY2gqKjogd2hlbiBhbiBleHBsaWNpdCBDRFAgcG9ydCBpcyBjb25maWd1cmVkLCB0aGUgdHJhbnNwb3J0IGNvbm5lY3RzXG4gKiAgIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQuXG4gKlxuICogSXQgY29ubmVjdHMgdG8gcGFnZSB0YXJnZXRzLCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWAgY29tbWFuZHMsIGFuZCByb3V0ZXMgdG9cbiAqIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldCB1c2luZyBgZ2V0QmFzZVBhdGgoKWAgcHJvYmluZy5cbiAqXG4gKiBSZXF1aXJlbWVudHM6IE5vZGUuanMgMjIrICh1c2VzIGJ1aWx0LWluIGBXZWJTb2NrZXRgIGFuZCBgZmV0Y2hgIGdsb2JhbHMpLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQXNhckZhbGxiYWNrIH0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgdHlwZSB7IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5janMnO1xuaW1wb3J0IHR5cGUgeyBPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uIH0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24uY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlTWV0cmljc092ZXJyaWRlLFxuICBkZWNvZGVCYXNlNjRQbmcsXG4gIGlzUG5nXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlQXNhckZhbGxiYWNrQWN0aW9uIH0gZnJvbSAnLi9jb21wYXRpYmlsaXR5LW9wdGlvbnMuY2pzJztcbmltcG9ydCB7IERJU01JU1NfVFJVU1RfRElBTE9HX0VYUFIgfSBmcm9tICcuL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5IH0gZnJvbSAnLi9lbGVjdHJvbi1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLmNqcyc7XG5pbXBvcnQge1xuICBkaWRSZW1vdmVWYXVsdEZyb21Db25maWcsXG4gIGdldFZhdWx0SWQsXG4gIGlzVmF1bHRSZWdpc3RlcmVkXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQgeyBsYXVuY2hPd25lZE9ic2lkaWFuSW5zdGFuY2UgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQgeyBjb3B5QXNhckludG9Vc2VyRGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi1zd2l0Y2guY2pzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24gfSBmcm9tICcuL293bmVkLXZhdWx0LXNlZWQuY2pzJztcbmltcG9ydCB7IGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24gfSBmcm9tICcuL3BhcmVudC1saXZlbmVzcy5janMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTLFxuICByZXNvbHZlUmVuZGVyZXJCb290U3RhdGVcbn0gZnJvbSAnLi9yZW5kZXJlci1ib290LWRldGVjdGlvbi5janMnO1xuaW1wb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IuY2pzJztcbmltcG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5pbXBvcnQgeyBhcmVWYXVsdFBhdGhzTWF0Y2hpbmcgfSBmcm9tICcuL3ZhdWx0LXBhdGgtbWF0Y2guY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVPd25lZEhpZGRlbkxhdW5jaEFyZ3VtZW50cyxcbiAgcmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHMsXG4gIHNob3VsZEhpZGVPYnNpZGlhbkFwcFxufSBmcm9tICcuL3Zpc2liaWxpdHkuY2pzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIENEUCBob3N0LiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgLlxuICAgKi9cbiAgY2RwSG9zdD86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgZm9yICoqYXR0YWNoKiogbW9kZSAodGhlIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgdGhlIHJ1bm5pbmdcbiAgICogT2JzaWRpYW4gd2FzIGxhdW5jaGVkIHdpdGgpLiBJbiBvd25lZC1pbnN0YW5jZSBtb2RlIHRoaXMgaXMgaWdub3JlZCBcdTIwMTQgYVxuICAgKiBmcmVlIHBvcnQgaXMgY2hvc2VuIGF0IGxhdW5jaC5cbiAgICovXG4gIGNkcFBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICogRGVmYXVsdHMgdG8gYDMwMDAwYC5cbiAgICovXG4gIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdyYWNlIHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgZm9yIGZhc3QtZmFpbGluZyBhIGRlYWQgYm9vdCBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UgKGVtcHR5IGA8Ym9keT5gIHdpdGggbm8gYHdpbmRvdy5hcHBgIGFmdGVyIHRoZSByZW5kZXJlciByZWFjaGVkXG4gICAqIGBkb2N1bWVudC5yZWFkeVN0YXRlYCBgJ2NvbXBsZXRlJ2ApLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9ERUFEX0JPT1RfR1JBQ0VfSU5fTUlMTElTRUNPTkRTfS4gYDBgIGRpc2FibGVzIGZhc3QtZmFpbC5cbiAgICovXG4gIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBhdHRhY2hpbmcgKGkuZS4ge0BsaW5rIGNkcFBvcnR9IGlzIHNldCksIG1hcmtzIHRoZSB0YXJnZXQgYXMgYVxuICAgKiAqKmhhcm5lc3Mtb3duZWQsIGFscmVhZHktcHJlcGFyZWQqKiBpbnN0YW5jZS4gU3VwcHJlc3NlcyB0aGUgdXNlci1zY29wZVxuICAgKiB2YXVsdC1yZWdpc3RyYXRpb24gcHJlZmxpZ2h0LCBzaW5jZSB0aGUgb3duZWQgaW5zdGFuY2UncyB2YXVsdCBsaXZlcyBpbiBhblxuICAgKiBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIHJhdGhlciB0aGFuIHRoZSB1c2VyLXNjb3BlIHJlZ2lzdHJ5LlxuICAgKi9cbiAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIFdoZW4gYGZhbHNlYCAodGhlXG4gICAqIGRlZmF1bHQpLCB0aGUgb3duZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgd2l0aCBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZFxuICAgKiBpdHMgd2luZG93IGlzIG1vdmVkIG9mZi1zY3JlZW4gYWZ0ZXIgbGF1bmNoLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTtcbiAgICogYXR0YWNoIG1vZGUgbmV2ZXIgdG91Y2hlcyB0aGUgKHVzZXIncykgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBzZXQsIHRoZSB0cmFuc3BvcnQgbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2VcbiAgICogaW5zdGVhZCBvZiBhdHRhY2hpbmcgdG8gYSBydW5uaW5nIG9uZS4gVGhpcyBpcyB0aGUgZGVmYXVsdCBkZXNrdG9wIG1vZGUuXG4gICAqL1xuICBvd25lZEluc3RhbmNlPzogT3duZWRJbnN0YW5jZUNvbmZpZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZFxuICAgKiBzZXR1aWQgYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSSBhcyBhXG4gICAqIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcG9zdC1ib290ICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiAodGhlIHJ1bm5pbmcgYXBwIHZlcnNpb24gZGlmZmVyc1xuICAgKiBmcm9tIHRoZSBzd2FwcGVkLWluIHBpbikgZmFpbHMgZmFzdCB3aXRoIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0uIFRoZVxuICAgKiB2ZXJkaWN0IGlzIGFsd2F5cyBjb21wdXRlZCBhbmQgc3VyZmFjZWQgdmlhXG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0LmdldEFzYXJGYWxsYmFja307IHRoaXMgZ2F0ZXMgb25seSB0aGUgdGhyb3cuIE9ubHlcbiAgICogbWVhbmluZ2Z1bCBpbiBvd25lZCBtb2RlIHJ1bm5pbmcgYSBzd2FwcGVkLWluIGFzYXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc3QtYm9vdCBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgbmFnIHdhcm5pbmcgaXMgZW1pdHRlZFxuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBUaGUgdmVyZGljdCBpc1xuICAgKiBhbHdheXMgY29tcHV0ZWQgYW5kIHN1cmZhY2VkIHZpYSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRFbGVjdHJvbkNvbXBhdGliaWxpdHl9O1xuICAgKiB0aGlzIG9ubHkgZ2F0ZXMgdGhlIGxvZy4gT25seSBtZWFuaW5nZnVsIGluIG93bmVkIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gYXNhciB0byBwcm92aXNpb24gaW50byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UncyB1c2VyLWRhdGEgZGlyZWN0b3J5IGJlZm9yZSBsYXVuY2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZWRJbnN0YW5jZUFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkL3NvdXJjZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBhc2FyJ3MgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKlxuICogV2hlbiBwcmVzZW50LCB0aGUgdHJhbnNwb3J0IGxhdW5jaGVzIGFuZCBvd25zIGl0cyBvd24gT2JzaWRpYW4gcHJvY2Vzc1xuICogYWdhaW5zdCBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGluc3RlYWQgb2YgYXR0YWNoaW5nIHRvIGEgcnVubmluZyBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlQ29uZmlnIHtcbiAgLyoqXG4gIE9wdGlvbmFsIGFzYXIgdG8gcHJvdmlzaW9uIGludG8ge0BsaW5rIHVzZXJEYXRhRGlyZWN0b3J5fSBiZWZvcmUgbGF1bmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNhcj86IE93bmVkSW5zdGFuY2VBc2FyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgd2hlbiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkXG4gICAqIChhbiBhc2FyLXN3YXAgb250byBhIGtub3duIHNoZWxsIHZlcnNpb24pLiBTdXJmYWNlZCBieVxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydC5nZXRDb21wYXRpYmlsaXR5fS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzXG4gICAqIHRoaXMgc3VyZmFjZSBvbmx5IHdoZW4gdGhlIHByb2FjdGl2ZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoYHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXI6IGZhbHNlYCk7IG90aGVyd2lzZSBpdCB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgYmVmb3JlIHRoZSBjb25maWcgaXMgYnVpbHQuXG4gICAqL1xuICByZWFkb25seSBjb21wYXRpYmlsaXR5PzogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gc2hlbGwgZXhlY3V0YWJsZSB0byBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBleGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuIENyZWF0ZWQgYW5kIG93bmVkIGJ5IHRoZVxuICAgKiB0cmFuc3BvcnQsIGFuZCBkZWxldGVkIG9uIGRpc3Bvc2UuXG4gICAqL1xuXG4gIHJlYWRvbmx5IHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25EZXRhaWxzIHtcbiAgZXhjZXB0aW9uPzogQ2RwRXhjZXB0aW9uT2JqZWN0O1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBDZHBFeGNlcHRpb25PYmplY3Qge1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcFJlc3BvbnNlIHtcbiAgaWQ6IG51bWJlcjtcbiAgcmVzdWx0PzogQ2RwUmVzcG9uc2VSZXN1bHQ7XG59XG5cbmludGVyZmFjZSBDZHBSZXNwb25zZVJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZTY0LWVuY29kZWQgaW1hZ2UgcmV0dXJuZWQgYnkgYFBhZ2UuY2FwdHVyZVNjcmVlbnNob3RgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YT86IHN0cmluZztcbiAgcmVhZG9ubHkgZXhjZXB0aW9uRGV0YWlscz86IENkcEV4Y2VwdGlvbkRldGFpbHM7XG4gIHJlYWRvbmx5IHJlc3VsdD86IENkcFZhbHVlO1xufVxuXG5pbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgaWQ6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgd2ViU29ja2V0RGVidWdnZXJVcmw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENkcFZhbHVlIHtcbiAgdHlwZTogc3RyaW5nO1xuICB2YWx1ZT86IHVua25vd247XG59XG5cbi8qKlxuICogVGhlIENEUCBlbmRwb2ludCBvZiBhIGxhdW5jaGVkLCBoYXJuZXNzLW93bmVkIGluc3RhbmNlLlxuICovXG5pbnRlcmZhY2UgT3duZWRJbnN0YW5jZUVuZHBvaW50IHtcbiAgLyoqXG4gIENEUCBob3N0IChlLmcuIGAnbG9jYWxob3N0J2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZnJlZSBDRFAgcG9ydCB0aGUgb3duZWQgaW5zdGFuY2Ugd2FzIGxhdW5jaGVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5jb25zdCBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuY29uc3QgVkFVTFRfSURfQllURV9MRU5HVEggPSA4O1xuY29uc3QgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgVVNFUl9EQVRBX1JNX1JFVFJZX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG4vLyBPbGQgKEVsZWN0cm9uIDEwLWVyYSkgT2JzaWRpYW4gb2NjYXNpb25hbGx5IGJvb3RzIHdpdGhvdXQgdGhlIHdvcmtzcGFjZSBldmVyXG4vLyBJbml0aWFsaXppbmcsIHNvIHRoZSB2YXVsdCBuZXZlciBiZWNvbWVzIHJlYWR5LiBBIGZyZXNoIGluc3RhbmNlIGlzIGFuXG4vLyBJbmRlcGVuZGVudCBjaGFuY2U7IHJlbGF1bmNoIHVwIHRvIHRoaXMgbWFueSB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLlxuY29uc3QgT1dORURfTEFVTkNIX01BWF9BVFRFTVBUUyA9IDM7XG4vLyBCcmllZiBzZXR0bGUgYmVmb3JlIGEgcmVsYXVuY2ggc28gdGhlIGtpbGxlZCBpbnN0YW5jZSdzIG1lbW9yeS9oYW5kbGVzIGFyZVxuLy8gUmVjbGFpbWVkIGJlZm9yZSB0aGUgbmV4dCBib290IFx1MjAxNCBpbXByb3ZlcyB0aGUgb2RkcyBvbiBhIGxvYWRlZCBtYWNoaW5lLlxuY29uc3QgT1dORURfUkVMQVVOQ0hfU0VUVExFX0lOX01JTExJU0VDT05EUyA9IDMwMDA7XG5jb25zdCBWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuY29uc3QgSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgT1dORURfV0lORE9XX09GRlNDUkVFTl9NQVJHSU5fSU5fUElYRUxTID0gMjAwO1xuY29uc3QgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAyMF8wMDA7XG5jb25zdCBPV05FRF9XSU5ET1dfSElERV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDI1MDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSBDaHJvbWUgRGV2VG9vbHMgUHJvdG9jb2wuXG4gKlxuICogQ29ubmVjdHMgdG8gT2JzaWRpYW4ncyBDRFAgV2ViU29ja2V0IGVuZHBvaW50LCBzZW5kcyBgUnVudGltZS5ldmFsdWF0ZWBcbiAqIGNvbW1hbmRzLCBhbmQgcm91dGVzIGV4cHJlc3Npb25zIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDZHBUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBmb3IgYSBtb2JpbGUgcGxhdGZvcm0uIEFsd2F5cyBgZmFsc2VgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IGZhbHNlO1xuICBwcml2YXRlIGFjdGl2ZVZhdWx0UGF0aDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgYXNhckZhbGxiYWNrOiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RwSG9zdDogc3RyaW5nO1xuICBwcml2YXRlIGNkcFBvcnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjZHBVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgZWxlY3Ryb25Db21wYXRpYmlsaXR5OiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IG93bmVkQ29uZmlnOiBPd25lZEluc3RhbmNlQ29uZmlnIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG93bmVkSW5zdGFuY2U6IE93bmVkT2JzaWRpYW5JbnN0YW5jZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveDogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgd3M6IG51bGwgfCBXZWJTb2NrZXQgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENEUCB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBDRFAgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcpIHtcbiAgICAvLyBEZXN0cnVjdHVyZSB3aXRoIHBlci1maWVsZCBkZWZhdWx0cyAoZWFjaCBhcHBsaWVzIHdoZW4gdGhlIGZpZWxkIGlzIG9taXR0ZWQsXG4gICAgLy8gRXhhY3RseSBsaWtlIHRoZSBmb3JtZXIgYGNvbmZpZz8ueCA/PyBkZWZhdWx0YCkgc28gdGhlIGNvbnN0cnVjdG9yIHN0YXlzXG4gICAgLy8gVW5kZXIgdGhlIGN5Y2xvbWF0aWMtY29tcGxleGl0eSBsaW1pdCBhcyBmaWVsZHMgYXJlIGFkZGVkLlxuICAgIGNvbnN0IHtcbiAgICAgIGNkcEhvc3QgPSAnbG9jYWxob3N0JyxcbiAgICAgIGNkcFBvcnQsXG4gICAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzID0gQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcyA9IERFRkFVTFRfREVBRF9CT09UX0dSQUNFX0lOX01JTExJU0VDT05EUyxcbiAgICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2UgPSBmYWxzZSxcbiAgICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlID0gdHJ1ZSxcbiAgICAgIG93bmVkSW5zdGFuY2UsXG4gICAgICBzaG91bGREaXNhYmxlU2FuZGJveCA9IGZhbHNlLFxuICAgICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayA9IHRydWUsXG4gICAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzID0gdHJ1ZVxuICAgIH0gPSBjb25maWcgPz8ge307XG4gICAgdGhpcy5jZHBIb3N0ID0gY2RwSG9zdDtcbiAgICB0aGlzLmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID0gZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgIHRoaXMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA9IGlzSGFybmVzc093bmVkSW5zdGFuY2U7XG4gICAgdGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSA9IGlzT2JzaWRpYW5BcHBWaXNpYmxlO1xuICAgIHRoaXMub3duZWRDb25maWcgPSBvd25lZEluc3RhbmNlO1xuICAgIHRoaXMuc2hvdWxkRGlzYWJsZVNhbmRib3ggPSBzaG91bGREaXNhYmxlU2FuZGJveDtcbiAgICB0aGlzLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2sgPSBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrO1xuICAgIHRoaXMuc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyA9IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM7XG4gICAgLy8gT3duZWQgbW9kZSBwaWNrcyBhIGZyZWUgcG9ydCBhdCBsYXVuY2ggKGFzc2lnbmVkIGluIHJlZ2lzdGVyVmF1bHQpLlxuICAgIC8vIEF0dGFjaCBtb2RlIGNvbm5lY3RzIHRvIHRoZSBjb25maWd1cmVkIHBvcnQ7IG5vIHBvcnQgaXMgaGFyZGNvZGVkLlxuICAgIHRoaXMuY2RwUG9ydCA9IGNkcFBvcnQgPz8gMDtcbiAgICB0aGlzLmNkcFVybCA9IGNkcFBvcnQgPT09IHVuZGVmaW5lZCA/ICcnIDogYGh0dHA6Ly8ke2NkcEhvc3R9OiR7U3RyaW5nKGNkcFBvcnQpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgT2JzaWRpYW4gd2luZG93IHNob3dpbmcgdGhlIGdpdmVuIHZhdWx0LlxuICAgKlxuICAgKiBXaGVuIGEgc2l6ZSBpcyByZXF1ZXN0ZWQgdGhlIHZpZXdwb3J0IGlzIHBpbm5lZCB0byBpdCB3aXRoXG4gICAqIGBFbXVsYXRpb24uc2V0RGV2aWNlTWV0cmljc092ZXJyaWRlYCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBjYXB0dXJlLCBzbyB0aGVcbiAgICogZW1pdHRlZCBQTkcgaXMgZXhhY3RseSB0aGF0IHNpemUgd2hhdGV2ZXIgc2l6ZSB0aGUgd2luZG93IGhhcHBlbnMgdG8gYmUgXHUyMDE0XG4gICAqIGFuZCB0aGUgb3ZlcnJpZGUgaXMgYWx3YXlzIGNsZWFyZWQgYWZ0ZXJ3YXJkcywgaW5jbHVkaW5nIHdoZW4gdGhlIGNhcHR1cmVcbiAgICogdGhyb3dzLCBzbyBhIGZhaWxlZCBjYXB0dXJlIGNhbm5vdCBsZWF2ZSB0aGUgd2luZG93IHN0dWNrIGF0IHRoZSBvdmVycmlkZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFdoaWNoIHZhdWx0IHdpbmRvdyB0byBjYXB0dXJlLCBhbmQgdGhlIGV4YWN0IHNpemUgdG8gY2FwdHVyZSBpdCBhdC5cbiAgICogQHJldHVybnMgVGhlIHJhdyBQTkcgYnl0ZXMuXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgQ0RQIHJldHVybnMgbm8gaW1hZ2UgZGF0YSwgb3IgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChwYXJhbXM6IENhcHR1cmVTY3JlZW5zaG90UGFyYW1zKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3Qgd3MgPSBhd2FpdCB0aGlzLmVuc3VyZUNvbm5lY3Rpb24ocGFyYW1zLmN3ZCk7XG4gICAgY29uc3QgZGV2aWNlTWV0cmljc092ZXJyaWRlID0gYnVpbGREZXZpY2VNZXRyaWNzT3ZlcnJpZGUocGFyYW1zKTtcbiAgICBpZiAoZGV2aWNlTWV0cmljc092ZXJyaWRlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLnNldERldmljZU1ldHJpY3NPdmVycmlkZScsIGRldmljZU1ldHJpY3NPdmVycmlkZSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1BhZ2UuY2FwdHVyZVNjcmVlbnNob3QnLCB7XG4gICAgICAgIC8vIFRoZSBvdmVycmlkZSBhbHJlYWR5IHNpemVzIHRoZSB2aWV3cG9ydCwgc28gY2FwdHVyaW5nIGJleW9uZCBpdCB3b3VsZFxuICAgICAgICAvLyBSZS1pbnRyb2R1Y2UgdGhlIHNjcm9sbCBoZWlnaHQgdGhlIG92ZXJyaWRlIGV4aXN0cyB0byBwaW4gZG93bi5cbiAgICAgICAgY2FwdHVyZUJleW9uZFZpZXdwb3J0OiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiAncG5nJ1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5yZXN1bHQ/LmRhdGE7XG4gICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ0RQIHNjcmVlbnNob3QgZXJyb3I6IFBhZ2UuY2FwdHVyZVNjcmVlbnNob3QgcmV0dXJuZWQgbm8gaW1hZ2UgZGF0YS4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnl0ZXMgPSBkZWNvZGVCYXNlNjRQbmcoZGF0YSk7XG4gICAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NEUCBzY3JlZW5zaG90IGVycm9yOiBQYWdlLmNhcHR1cmVTY3JlZW5zaG90IHJldHVybmVkIGRhdGEgdGhhdCBpcyBub3QgYSBQTkcuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRldmljZU1ldHJpY3NPdmVycmlkZSkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnRW11bGF0aW9uLmNsZWFyRGV2aWNlTWV0cmljc092ZXJyaWRlJywge30pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0aGUgYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIGFuZCwgaW4gb3duZWQtaW5zdGFuY2UgbW9kZSxcbiAgICoga2lsbHMgdGhlIG93bmVkIE9ic2lkaWFuIHByb2Nlc3MgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gICAqXG4gICAqIFRoZSByZW1vdmFsIGlzIHJldHJpZWQgYmVjYXVzZSBXaW5kb3dzIGJyaWVmbHkgaG9sZHMgdGhlIGp1c3Qta2lsbGVkXG4gICAqIHByb2Nlc3MncyBmaWxlIGhhbmRsZXMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmYWlsIGBybVN5bmNgIHdpdGggYEVQRVJNYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGlmICghdGhpcy5vd25lZENvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgIGNvbnN0IHsgdXNlckRhdGFEaXJlY3RvcnkgfSA9IHRoaXMub3duZWRDb25maWc7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGlmIChkaWRSZW1vdmVEaXJlY3RvcnkodXNlckRhdGFEaXJlY3RvcnkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFVTRVJfREFUQV9STV9SRVRSWV9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBpZiAoIWRpZFJlbW92ZURpcmVjdG9yeSh1c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCByZW1vdmUgb3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSB3aXRoaW4gJHtTdHJpbmcoVVNFUl9EQVRBX1JNX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcyAobm9uLWZhdGFsKTogJHt1c2VyRGF0YURpcmVjdG9yeX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwgXHUyMDE0IGtpbGxzIHRoZSBvd25lZCBpbnN0YW5jZSBhbmQgbWFrZXMgYSBiZXN0LWVmZm9ydFxuICAgKiByZW1vdmFsIG9mIGl0cyB1c2VyLWRhdGEgZGlyZWN0b3J5LiBTYWZlIHRvIGNhbGwgZnJvbSBhIHByb2Nlc3MgYGV4aXRgIGhhbmRsZXJcbiAgICogKHdoZXJlIGFzeW5jIHJldHJpZXMgYXJlIGltcG9zc2libGU7IGEgbGVmdG92ZXIgdGVtcCBkaXJlY3RvcnkgaXMgYWNjZXB0YWJsZSkuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZT8ua2lsbCgpO1xuICAgICAgaWYgKCFkaWRSZW1vdmVEaXJlY3RvcnkodGhpcy5vd25lZENvbmZpZy51c2VyRGF0YURpcmVjdG9yeSkpIHtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBub3QgcmVtb3ZlZCBzeW5jaHJvbm91c2x5IChwcm9jZXNzIG1heSBzdGlsbCBob2xkIGhhbmRsZXMpOiAke3RoaXMub3duZWRDb25maWcudXNlckRhdGFEaXJlY3Rvcnl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIENEUCBgUnVudGltZS5ldmFsdWF0ZWAuXG4gICAqXG4gICAqIFJvdXRlcyB0byB0aGUgY29ycmVjdCB2YXVsdCB0YXJnZXQgYmFzZWQgb24gYG9wdGlvbnMuY3dkYC5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubmVjdGlvbihvcHRpb25zLmN3ZCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgIGF3YWl0UHJvbWlzZTogdHJ1ZSxcbiAgICAgIGV4cHJlc3Npb24sXG4gICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2UucmVzdWx0Py5leGNlcHRpb25EZXRhaWxzKSB7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2UucmVzdWx0LmV4Y2VwdGlvbkRldGFpbHMuZXhjZXB0aW9uPy5kZXNjcmlwdGlvblxuICAgICAgICA/PyByZXNwb25zZS5yZXN1bHQuZXhjZXB0aW9uRGV0YWlscy50ZXh0O1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDRFAgZXZhbHVhdGlvbiBlcnJvcjogJHtkZXNjfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdE9iamVjdCA9IHJlc3BvbnNlLnJlc3VsdD8ucmVzdWx0O1xuICAgIGlmICghcmVzdWx0T2JqZWN0IHx8IHJlc3VsdE9iamVjdC50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHJlc3VsdE9iamVjdC52YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgdGhpcyBvd25lZCBpbnN0YW5jZSBcdTIwMTQgd2hldGhlciB0aGVcbiAgICogYXBwIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBtYXRjaGVzIHRoZSBzd2FwcGVkLWluIHBpbiwgb3IgdGhlIGluc3RhbGxlclxuICAgKiBzaWxlbnRseSByZXZlcnRlZCB0byBpdHMgb3duIGJ1bmRsZWQgYXNhciAocmVhZCBsaXZlIHBvc3QtYm9vdCkuIFJldHVybnNcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdCBhbiBvd25lZCBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGhhcyBub3QgYm9vdGVkXG4gICAqIHlldCwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHRoZSBsaXZlXG4gICAqIHZlcnNpb24gd2FzIHVucmVhZGFibGUpLiBBIGAnZmFsbGJhY2snYCB2ZXJkaWN0IHJlYWNoZXMgdGhpcyBzdXJmYWNlIG9ubHkgd2hlblxuICAgKiB0aGUgdGhyb3cgaXMgZGlzYWJsZWQgKHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2t9XG4gICAqIGBmYWxzZWApOyBvdGhlcndpc2UgaXQgdGhyb3dzIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyBnZXRBc2FyRmFsbGJhY2soKTogQXNhckZhbGxiYWNrIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hc2FyRmFsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyXHUyMTk0YXBwIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgdGhpcyBvd25lZFxuICAgKiBpbnN0YW5jZSwgc28gY2FsbGVycyBjYW4gYXNzZXJ0IG9uIGl0LiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpcyBub3RcbiAgICogYW4gb3duZWQgaW5zdGFuY2UsIG9yIHRoZSB2ZXJkaWN0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIChlLmcuIGFuXG4gICAqIHVuZGV0ZWN0YWJsZSBzaGVsbCB2ZXJzaW9uLCBvciB0aGUgYXBwIHZlcnNpb24gaXMgYWJzZW50IGZyb20gdGhlIHRhYmxlKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbXBhdGliaWxpdHkgdmVyZGljdCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29tcGF0aWJpbGl0eSgpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vd25lZENvbmZpZz8uY29tcGF0aWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIEVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCBmb3IgdGhpcyBvd25lZCBpbnN0YW5jZSBcdTIwMTRcbiAgICogd2hldGhlciB0aGUgRWxlY3Ryb24gdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIGlzIG5ldyBlbm91Z2ggZm9yIHRoZVxuICAgKiBydW5uaW5nIGFwcCB2ZXJzaW9uIChyZWFkIGxpdmUgcG9zdC1ib290OyBzZWUge0BsaW5rIE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhLm1pblJlY29tbWVuZGVkRWxlY3Ryb25WZXJzaW9ufSkuXG4gICAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlzIG5vdCBhbiBvd25lZCBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGhhcyBub3RcbiAgICogYm9vdGVkIHlldCwgb3IgdGhlIHZlcmRpY3QgY291bGQgbm90IGJlIGRldGVybWluZWQgKHRoZSBsaXZlIHZlcnNpb24gd2FzXG4gICAqIHVucmVhZGFibGUsIG9yIHRoZSBhcHAgdmVyc2lvbiBjYXJyaWVzIG5vIHJlY29tbWVuZGVkIEVsZWN0cm9uIHZlcnNpb24pLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHVibGljIGdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpOiBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVsZWN0cm9uQ29tcGF0aWJpbGl0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBDRFAgZW5kcG9pbnQgb2YgdGhlIG93bmVkLCBsYXVuY2hlZCBpbnN0YW5jZSBzbyB0aGUgZ2xvYmFsIHNldHVwXG4gICAqIGNhbiBoYW5kIGl0IHRvIHRlc3Qgd29ya2VycyAod2hpY2ggdGhlbiAqKmF0dGFjaCoqIHRvIGl0IGluc3RlYWQgb2ZcbiAgICogbGF1bmNoaW5nIHRoZWlyIG93bikuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHRyYW5zcG9ydCBpcyBub3QgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIGl0cyBpbnN0YW5jZSBoYXMgbm90IGJlZW4gbGF1bmNoZWQgeWV0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgb3duZWQgaW5zdGFuY2UncyBDRFAgaG9zdCBhbmQgcG9ydCwgb3IgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk6IE93bmVkSW5zdGFuY2VFbmRwb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLm93bmVkQ29uZmlnIHx8ICF0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3Q6IHRoaXMuY2RwSG9zdCwgcG9ydDogdGhpcy5jZHBQb3J0IH07XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgQ0RQIGVuZHBvaW50IGlzIHJlYWNoYWJsZSBhbmQgaGFzIE9ic2lkaWFuIHRhcmdldHMuXG4gICAqXG4gICAqIElmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBhdHRlbXB0cyB0byBhdXRvLXN0YXJ0IGl0IHZpYSBVUkkgcHJvdG9jb2xcbiAgICogYW5kIHBvbGxzIHVudGlsIENEUCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGZvciB2YXVsdCByZWdpc3RyYXRpb24gY2hlY2spLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcgfHwgdGhpcy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICAvLyBPd25lZCBpbnN0YW5jZSAobGF1bmNoZWQgaGVyZSkgb3IgYSB3b3JrZXIgYXR0YWNoZWQgdG8gb25lOiByZWFkaW5lc3MgaXNcbiAgICAgIC8vIEd1YXJhbnRlZWQgYnkgdGhlIGdsb2JhbCBzZXR1cCdzIHJlZ2lzdGVyVmF1bHQsIGFuZCB0aGUgdmF1bHQgbGl2ZXMgaW5cbiAgICAgIC8vIFRoZSBpc29sYXRlZCBjb25maWcgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gdmVyaWZ5IGFnYWluc3QgdGhlIHVzZXItc2NvcGVcbiAgICAgIC8vIFJlZ2lzdHJ5LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgaWYgKCFpc1ZhdWx0UmVnaXN0ZXJlZCh2YXVsdFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWYXVsdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbjogJHt2YXVsdFBhdGh9LiBSZWdpc3RlciB0aGUgdmF1bHQgZmlyc3Qgd2l0aCByZWdpc3RlclZhdWx0KCkgb3IgVGVtcG9yYXJ5VmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcGFnZSB0YXJnZXRzJyk7XG4gICAgICB9XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDRFAgcmVhY2hhYmxlLCAke1N0cmluZyh0YXJnZXRzLmxlbmd0aCl9IHRhcmdldChzKSBmb3VuZC5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IHZpYSBFbGVjdHJvbiBJUEMgZXZhbHVhdGVkIHRocm91Z2ggQ0RQLlxuICAgKlxuICAgKiBVc2VzIGFuIGV4aXN0aW5nIE9ic2lkaWFuIHRhcmdldCB0byBzZW5kIHRoZSBgdmF1bHQtb3BlbmAgSVBDIGNvbW1hbmQsXG4gICAqIHRoZW4gcG9sbHMgdW50aWwgdGhlIG5ldyB2YXVsdCdzIHRhcmdldCBhcHBlYXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMub3duZWRDb25maWcpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMub3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGJ5IGRlc3Ryb3lpbmcgaXRzIHdpbmRvdyBhbmQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm93bmVkQ29uZmlnKSB7XG4gICAgICAvLyBUaGUgb3duZWQgaW5zdGFuY2UgaXMga2lsbGVkIHdob2xlc2FsZSBvbiBkaXNwb3NlOyBubyBwZXItdmF1bHRcbiAgICAgIC8vIFVucmVnaXN0ZXIgaXMgbmVlZGVkIChhbmQgdGhlIHJlZ2lzdHJ5IGxpdmVzIGluIHRoZSBpc29sYXRlZCBjb25maWcpLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB3aW5kb3dEZXN0cm95RXhwcmVzc2lvbiA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5kZXN0cm95Q3VycmVudFdpbmRvdygpJztcbiAgICAgICAgYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgYXdhaXRQcm9taXNlOiB0cnVlLFxuICAgICAgICAgIGV4cHJlc3Npb246IHdpbmRvd0Rlc3Ryb3lFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2luZG93IG1heSBhbHJlYWR5IGJlIGNsb3NlZC5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hY3RpdmVWYXVsdFBhdGggPT09IHZhdWx0UGF0aCkge1xuICAgICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIGB2YXVsdC1yZW1vdmVgIElQQyBpcyBzZW50IHRocm91Z2ggYSBzdGlsbC1vcGVuIHdpbmRvdyAoYHRhcmdldHNbMF1gKSBcdTIwMTRcbiAgICAgIC8vIGB2YXVsdFBhdGhgJ3Mgb3duIHdpbmRvdyB3YXMganVzdCBkZXN0cm95ZWQgYWJvdmUsIHNvIGJvb3RzdHJhcCB0aGUgbmFtZXNwYWNlXG4gICAgICAvLyBPbiB0aGUgZXhpc3Rpbmcgd2luZG93J3MgT1dOIGJhc2UgcGF0aCwgbm90IG9uIGB2YXVsdFBhdGhgICh3aGljaCBubyBsb25nZXIgaGFzXG4gICAgICAvLyBBIGxpdmUgdGFyZ2V0IHRvIG1hdGNoKS5cbiAgICAgIGNvbnN0IHJlbW92YWxUYXJnZXQgPSBlbnN1cmVOb25OdWxsYWJsZSh0YXJnZXRzWzBdKTtcbiAgICAgIGNvbnN0IHJlbW92YWxCYXNlUGF0aCA9IGF3YWl0IHRoaXMucHJvYmVWYXVsdFBhdGgocmVtb3ZhbFRhcmdldCk7XG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHJlbW92YWxUYXJnZXQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHJlbW92YWxCYXNlUGF0aCk7XG4gICAgICAgIGNvbnN0IHZhdWx0UmVtb3ZlRXhwcmVzc2lvbiA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgY2hhbm5lbDogJ3ZhdWx0LXJlbW92ZScsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGhdIH0pfSlgO1xuICAgICAgICBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgICAgZXhwcmVzc2lvbjogdmF1bHRSZW1vdmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBObyBDRFAgdGFyZ2V0cyBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgIGRpZFJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbmQgc3RvcmVzIHRoZSBydW50aW1lLUVsZWN0cm9uIGNvbXBhdGliaWxpdHkgdmVyZGljdCAob25cbiAgICoge0BsaW5rIGdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eX0pIGZyb20gYW4gYWxyZWFkeS1yZWFkIHZlcnNpb24gcGFpciwgd2FybmluZ1xuICAgKiB3aGVuIHRoZSBsaXZlIEVsZWN0cm9uIGlzIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZCBtaW5pbXVtLiBOZXZlciB0aHJvd3M7IGFcbiAgICogYm9vdCB3aG9zZSBydW5uaW5nIGFwcCB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlIGlzIHNraXBwZWQgKG5vdGhpbmcgdG8ganVkZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwVmVyc2lvbiAtIFRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICogQHBhcmFtIGFjdHVhbEVsZWN0cm9uVmVyc2lvbiAtIFRoZSBsaXZlIEVsZWN0cm9uIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5yZWFkYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlFbGVjdHJvbkNvbXBhdGliaWxpdHkoYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLCBhY3R1YWxFbGVjdHJvblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChhcHBWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSh7XG4gICAgICBhY3R1YWxFbGVjdHJvblZlcnNpb24sXG4gICAgICBhcHBWZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IGdldFZlcnNpb25NZXRhZGF0YShhcHBWZXJzaW9uKVxuICAgIH0pO1xuICAgIHRoaXMuZWxlY3Ryb25Db21wYXRpYmlsaXR5ID0gdmVyZGljdDtcbiAgICBpZiAodmVyZGljdC50aWVyID09PSAnbmFnZ2VkJyAmJiB0aGlzLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdICR7ZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5tZXNzYWdlKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9pbnRzIHRoZSBvd25lZCBpbnN0YW5jZSdzIHJlbmRlcmVyIGF0IHRoaXMgcHJvY2VzcydzIGxpdmVuZXNzIHNvY2tldCBzbyBpdFxuICAgKiBkZXN0cm95cyBpdHNlbGYgaWYgd2UgZGllIHdpdGhvdXQgcnVubmluZyB0ZWFyZG93biAoc2VlIGBwYXJlbnQtbGl2ZW5lc3MudHNgKS5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQgYnkgZGVzaWduLiBBIHJlbmRlcmVyIHdpdGhvdXQgTm9kZSBhY2Nlc3MgcmVwb3J0cyBgJ3VuYXZhaWxhYmxlJ2BcbiAgICogYW5kIGFuIGV2YWx1YXRpb24gZmFpbHVyZSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZDogdGhlIHdhdGNoZG9nIGlzIGEgYmFja3N0b3BcbiAgICogZm9yIGFuIGFscmVhZHktYWJub3JtYWwgZXhpdCwgbmV2ZXIgYSByZWFzb24gdG8gZmFpbCBhbiBvdGhlcndpc2UgZ29vZCBsYXVuY2guXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICogQHBhcmFtIHBhcmVudExpdmVuZXNzUG9ydCAtIFRoZSBsb29wYmFjayBwb3J0IHRoZSByZW5kZXJlciBzaG91bGQgY29ubmVjdCBiYWNrIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcm1QYXJlbnRMaXZlbmVzc1dhdGNoZG9nKHZhdWx0UGF0aDogc3RyaW5nLCBwYXJlbnRMaXZlbmVzc1BvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGJ1aWxkUGFyZW50TGl2ZW5lc3NXYXRjaGRvZ0V4cHJlc3Npb24ocGFyZW50TGl2ZW5lc3NQb3J0KSwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyBvbiBwb3J0ICR7U3RyaW5nKHBhcmVudExpdmVuZXNzUG9ydCl9OiAke3Jlc3VsdH0uYCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIENvdWxkIG5vdCBhcm0gdGhlIHBhcmVudC1saXZlbmVzcyB3YXRjaGRvZyAoaW5zdGFuY2UgbWF5IG91dGxpdmUgYSBraWxsZWQgaGFybmVzcyk6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIHJ1bm5pbmcgYXBwIChhc2FyKSB2ZXJzaW9uIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBzdG9yaW5nIHRoZVxuICAgKiB2ZXJkaWN0IG9uIHtAbGluayBnZXRBc2FyRmFsbGJhY2t9LiBPbiBhICoqc2lsZW50IGZhbGxiYWNrKiogKHRoZSBpbnN0YWxsZXIgcmFuXG4gICAqIGl0cyBvd24gYnVuZGxlZCBhc2FyIGluc3RlYWQgb2YgdGhlIHBpbikgaXQgdGhyb3dzIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn1cbiAgICogd2hlbiB0aGUgdGhyb3cgaXMgZW5hYmxlZCwgb3RoZXJ3aXNlIHdhcm5zICh3aGVuIHdhcm5pbmdzIGFyZSBvbikgYW5kIGxldHMgdGhlXG4gICAqIGJvb3QgcHJvY2VlZC4gQSBib290IHdpdGggbm8gc3dhcHBlZC1pbiBhc2FyLCBvciBhbiB1bnJlYWRhYmxlIHJ1bm5pbmcgdmVyc2lvbixcbiAgICogaXMgYCd1bmtub3duJ2AgXHUyMDE0IG5vdGhpbmcgaXMgdGhyb3duIG9yIHdhcm5lZC4gVGhpcyBpcyB0aGUgaGVhbHRoeS1VSSBjb21wYW5pb24gdG9cbiAgICogdGhlIGJsYWNrLXNjcmVlbiB7QGxpbmsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcn0gZGVhZC1ib290IGZhc3QtZmFpbC5cbiAgICpcbiAgICogQHBhcmFtIHJ1bm5pbmdBcGlWZXJzaW9uIC0gVGhlIGxpdmUgcnVubmluZyBhcHAgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnJlYWRhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1J1bnRpbWVBc2FyRmFsbGJhY2socnVubmluZ0FwaVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHZlcmRpY3QgPSByZXNvbHZlQXNhckZhbGxiYWNrKHtcbiAgICAgIHJlcXVlc3RlZFZlcnNpb246IHRoaXMub3duZWRDb25maWc/LmFzYXI/LnZlcnNpb24sXG4gICAgICBydW5uaW5nQXBpVmVyc2lvblxuICAgIH0pO1xuICAgIHRoaXMuYXNhckZhbGxiYWNrID0gdmVyZGljdDtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc29sdmVBc2FyRmFsbGJhY2tBY3Rpb24oe1xuICAgICAgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjazogdGhpcy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogdGhpcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzLFxuICAgICAgdGllcjogdmVyZGljdC50aWVyXG4gICAgfSk7XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgICAgdGhyb3cgbmV3IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yKHtcbiAgICAgICAgcmVxdWVzdGVkVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUodmVyZGljdC5yZXF1ZXN0ZWRWZXJzaW9uKSxcbiAgICAgICAgcnVubmluZ0FwaVZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QucnVubmluZ0FwaVZlcnNpb24pXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGFjdGlvbiA9PT0gJ3dhcm4nKSB7XG4gICAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSAke2Vuc3VyZU5vbk51bGxhYmxlKHZlcmRpY3QubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHBvc3QtYm9vdCBydW50aW1lIGNvbXBhdGliaWxpdHkgY2hlY2tzIGZvciBhbiBvd25lZCBpbnN0YW5jZSwgb25jZSB0aGVcbiAgICogdmF1bHQgaXMgcmVhZHkuIFJlYWRzIHRoZSBsaXZlIHJ1bm5pbmcgYXBwIHZlcnNpb24gYW5kIEVsZWN0cm9uIHZlcnNpb24gKipvbmNlKipcbiAgICogZnJvbSB0aGUgYm9vdGVkIHJlbmRlcmVyJ3MgbWFpbiBwcm9jZXNzLCB0aGVuOiAoMSkgdmVyaWZpZXMgdGhlIHJ1bm5pbmcgYXBwXG4gICAqIHZlcnNpb24gbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4gXHUyMDE0IHRocm93aW5nIHtAbGluayBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcn0gb25cbiAgICogYSBzaWxlbnQgZmFsbGJhY2sgKHdoZW4gZW5hYmxlZCk7IGFuZCAoMikgcnVucyB0aGUgYmVzdC1lZmZvcnQgcnVudGltZS1FbGVjdHJvblxuICAgKiBuYWcuIE9ubHkgdGhlIGFzYXItZmFsbGJhY2sgY2hlY2sgY2FuIHRocm93LCBzbyB0aGlzIG11c3QgcnVuIG91dHNpZGUgdGhlXG4gICAqIHJlYWRpbmVzcyBwb2xsJ3MgdHJ5L2NhdGNoIChhIHN3YWxsb3dlZCB0aHJvdyB3b3VsZCBsb29wIHVudGlsIHRpbWVvdXQpLlxuICAgKlxuICAgKiBCb3RoIGFyZSByZWFkIGF0IHRoZSByZW5kZXJlciB0b3AgbGV2ZWw6IGBpcGNSZW5kZXJlci5zZW5kU3luYygndmVyc2lvbicpYCAodGhlXG4gICAqIHJ1bm5pbmcgYXBwIHZlcnNpb24sIHRydXRoZnVsIGV2ZW4gdW5kZXIgYSBzaWxlbnQgYXNhciBmYWxsYmFjaykgYW5kXG4gICAqIGBwcm9jZXNzLnZlcnNpb25zLmVsZWN0cm9uYCAodGhlIGxpdmUgc2hlbGwgRWxlY3Ryb24pOyBuZWl0aGVyIHVzZXNcbiAgICogYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCByZXNvbHZlcyBvbmx5IGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEEgcmVhZFxuICAgKiBmYWlsdXJlIGxlYXZlcyBib3RoIHVua25vd24gKGxvZ2dlZCwgbm9uLWZhdGFsKSBcdTIwMTQgYW4gdW5yZWFkYWJsZSBydW5uaW5nIHZlcnNpb25cbiAgICogY2Fubm90IGJlIGp1ZGdlZCBhIGZhbGxiYWNrLCBzbyB0aGUgYm9vdCBpcyBub3QgYnJva2VuIGJ5IGEgZmxha3kgcmVhZC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIGV2YWx1YXRlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1J1bnRpbWVDb21wYXRpYmlsaXR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGFwcFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYWN0dWFsRWxlY3Ryb25WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0FwcFZlcnNpb24gPSBhd2FpdCB0aGlzLmV2YWx1YXRlKCdTdHJpbmcod2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKFxcJ3ZlcnNpb25cXCcpKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICBhcHBWZXJzaW9uID0gcmF3QXBwVmVyc2lvbiA9PT0gJycgfHwgcmF3QXBwVmVyc2lvbiA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiByYXdBcHBWZXJzaW9uO1xuICAgICAgYWN0dWFsRWxlY3Ryb25WZXJzaW9uID0gYXdhaXQgdGhpcy5ldmFsdWF0ZSgnU3RyaW5nKHByb2Nlc3MudmVyc2lvbnMuZWxlY3Ryb24pJywgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IHJlYWQgcnVudGltZSB2ZXJzaW9ucyAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cblxuICAgIC8vIEZhaWxzIGZhc3QgKHdoZW4gZW5hYmxlZCkgb24gYSBzaWxlbnQgYXNhciBmYWxsYmFjayBcdTIwMTQgTVVTVCBydW4gYmVmb3JlIHRoZVxuICAgIC8vIEJlc3QtZWZmb3J0IG5hZyBhbmQgb3V0c2lkZSBhbnkgdHJ5L2NhdGNoIHNvIHRoZSB0aHJvdyBlc2NhcGVzIHRoZSBwb2xsLlxuICAgIHRoaXMuY2hlY2tSdW50aW1lQXNhckZhbGxiYWNrKGFwcFZlcnNpb24pO1xuICAgIHRoaXMuYXBwbHlFbGVjdHJvbkNvbXBhdGliaWxpdHkoYXBwVmVyc2lvbiwgYWN0dWFsRWxlY3Ryb25WZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0cyB0byBhIENEUCB0YXJnZXQncyBXZWJTb2NrZXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgQ0RQIHRhcmdldCB0byBjb25uZWN0IHRvLlxuICAgKiBAcmV0dXJucyBUaGUgb3BlbiBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvVGFyZ2V0KHRhcmdldDogQ2RwVGFyZ2V0KTogUHJvbWlzZTxXZWJTb2NrZXQ+IHtcbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQodGFyZ2V0LndlYlNvY2tldERlYnVnZ2VyVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB3cy5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCB0byBDRFAgdGFyZ2V0OiAke3RhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybH1gKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gd3M7XG4gIH1cblxuICAvKipcbiAgICogRGlzY29ubmVjdHMgdGhlIGFjdGl2ZSBXZWJTb2NrZXQgY29ubmVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53cz8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhpcy53cyA9IG51bGw7XG4gICAgdGhpcy5hY3RpdmVWYXVsdFBhdGggPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBBY3RzIGFzIGEgc2FmZXR5IG5ldCB3aGVuIGBlbmFibGUtcGx1Z2luLTxpZD5gIGlzIHdyaXR0ZW4gaW4gb25lIHJlbmRlcmVyXG4gICAqIGJ1dCBub3QgeWV0IHZpc2libGUgdG8gdGhlIG5ld2x5LW9wZW5lZCB2YXVsdCdzIHJlbmRlcmVyIChyYWNlIG9ic2VydmVkXG4gICAqIGluIE9ic2lkaWFuIDEuMTMuMCkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIGlmIChyZXN1bHQgPT09ICd0cnVlJykge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gRGlzbWlzc2VkIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIiBkaWFsb2cuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYGVuYWJsZS1wbHVnaW4tPHZhdWx0SWQ+YCBpbiBPYnNpZGlhbidzIGxvY2FsU3RvcmFnZSB0byBwcmV2ZW50XG4gICAqIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGZyb20gYXBwZWFyaW5nXG4gICAqIHdoZW4gYSB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDIChzbyB0aGUgdmF1bHQgSUQgZXhpc3RzIGluXG4gICAqIGBvYnNpZGlhbi5qc29uYCkgYW5kIGJlZm9yZSB0aGUgbmV3IHZhdWx0IHdpbmRvdyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBBbiBvcGVuIFdlYlNvY2tldCB0byBhbiBleGlzdGluZyBPYnNpZGlhbiB0YXJnZXQuXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2Uod3M6IFdlYlNvY2tldCwgdmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQod3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgZXhwcmVzc2lvbjogYGxvY2FsU3RvcmFnZS5zZXRJdGVtKCR7SlNPTi5zdHJpbmdpZnkoYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWApfSwgJ3RydWUnKTtgLFxuICAgICAgcmV0dXJuQnlWYWx1ZTogdHJ1ZVxuICAgIH0pO1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFNldCBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH0gaW4gbG9jYWxTdG9yYWdlLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlcmUgaXMgYW4gYWN0aXZlIFdlYlNvY2tldCBjb25uZWN0aW9uIHRvIHRoZSBjb3JyZWN0IHZhdWx0IHRhcmdldC5cbiAgICpcbiAgICogUmV1c2VzIHRoZSBleGlzdGluZyBjb25uZWN0aW9uIGlmIGl0IHRhcmdldHMgdGhlIHJlcXVlc3RlZCB2YXVsdC5cbiAgICogT3RoZXJ3aXNlLCBmaW5kcyB0aGUgY29ycmVjdCB0YXJnZXQgYW5kIHJlY29ubmVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byB0YXJnZXQuXG4gICAqIEByZXR1cm5zIFRoZSBhY3RpdmUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUNvbm5lY3Rpb24odmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFdlYlNvY2tldD4ge1xuICAgIGlmICh0aGlzLndzPy5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTiAmJiB0aGlzLmFjdGl2ZVZhdWx0UGF0aCA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICByZXR1cm4gdGhpcy53cztcbiAgICB9XG5cbiAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcblxuICAgIGNvbnN0IHRhcmdldCA9IGF3YWl0IHRoaXMuZmluZFRhcmdldEZvclZhdWx0KHZhdWx0UGF0aCk7XG4gICAgdGhpcy53cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgdGhpcy5hY3RpdmVWYXVsdFBhdGggPSB2YXVsdFBhdGg7XG4gICAgcmV0dXJuIHRoaXMud3M7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gd2l0aCBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnRgIGFuZCBwb2xscyB1bnRpbCBDRFAgYmVjb21lcyBhdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZU9ic2lkaWFuUnVubmluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBPYnNpZGlhbiBDRFAgbm90IHJlYWNoYWJsZS4gU3RhcnRpbmcgT2JzaWRpYW4gd2l0aCByZW1vdGUgZGVidWdnaW5nLi4uJyk7XG5cbiAgICBjb25zdCBsYXVuY2hDb21tYW5kID0gYXdhaXQgZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHRoaXMuY2RwUG9ydCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMobGF1bmNoQ29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgQ0RQIGVuZHBvaW50IGF0ICR7dGhpcy5jZHBVcmx9ICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gYXdhaXQgdGhpcy5nZXRQYWdlVGFyZ2V0cygpO1xuICAgICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0RQIHJlYWR5LCAke1N0cmluZyh0YXJnZXRzLmxlbmd0aCl9IHRhcmdldChzKSBmb3VuZC5gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBDRFAgbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBFbnN1cmUgT2JzaWRpYW4gaXMgaW5zdGFsbGVkIGFuZCBhY2Nlc3NpYmxlLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBDRFAgdGFyZ2V0IHRoYXQgaGFzIHRoZSBnaXZlbiB2YXVsdCBvcGVuLlxuICAgKlxuICAgKiBQcm9iZXMgZXZlcnkgdGFyZ2V0IGJ5IGV2YWx1YXRpbmcgYGdldEJhc2VQYXRoKClgIGFuZCByZXR1cm5zIHRoZSBvbmUgd2hvc2VcbiAgICogYmFzZSBwYXRoIG1hdGNoZXMgYHZhdWx0UGF0aGAgKHZpYSB7QGxpbmsgYXJlVmF1bHRQYXRoc01hdGNoaW5nfSwgdG9sZXJhbnQgb2ZcbiAgICogc2VwYXJhdG9yL2Nhc2UgZGlmZmVyZW5jZXMpLiBBIHNpbmdsZSB0YXJnZXQgaXMgKipub3QqKiByZXR1cm5lZCBibGluZGx5OiB3aXRoXG4gICAqIG1vcmUgdGhhbiBvbmUgdmF1bHQgb3BlbiAoYXR0YWNoIG1vZGUncyBzaGFyZWQgaW5zdGFuY2UpLCB0aGUgc29sZS10YXJnZXRcbiAgICogc2hvcnRjdXQgd291bGQgcmV0dXJuIHdoaWNoZXZlciB3aW5kb3cgaGFwcGVucyB0byBiZSBvcGVuIHJlZ2FyZGxlc3Mgb2Ygd2hpY2hcbiAgICogdmF1bHQgd2FzIHJlcXVlc3RlZCBcdTIwMTQgdGhlIGV4YWN0IG1pcy1yb3V0aW5nIHRoaXMgbWV0aG9kIG11c3QgYXZvaWQuIEEgdGFyZ2V0XG4gICAqIHdob3NlIHByb2JlIHRocm93cyBpcyB0cmVhdGVkIGFzIG5vdC1yZWFkeSBhbmQgc2tpcHBlZCAodGhlIGNhbGxlcidzIHJlYWRpbmVzc1xuICAgKiBwb2xsIHJldHJpZXMpOyBhIHRhcmdldCB3aG9zZSBwcm9iZSBzdWNjZWVkcyBidXQgZG9lcyBub3QgbWF0Y2ggaXMgbmV2ZXJcbiAgICogcmV0dXJuZWQuIFdoZW4gbm90aGluZyBtYXRjaGVzLCB0aHJvdyBzbyB0aGUgY2FsbGVyIGtlZXBzIHBvbGxpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBtYXRjaC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIENEUCB0YXJnZXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8Q2RwVGFyZ2V0PiB7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcblxuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBPYnNpZGlhbiBDRFAgdGFyZ2V0cyBmb3VuZCcpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aCh0YXJnZXQpO1xuICAgICAgICBpZiAoYXJlVmF1bHRQYXRoc01hdGNoaW5nKGJhc2VQYXRoLCB2YXVsdFBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE5vdCBhIHZhdWx0IHRhcmdldCBvciBub3QgcmVhZHkuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBDRFAgdGFyZ2V0IGZvdW5kIGZvciB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgbGlzdCBvZiBwYWdlLXR5cGUgdGFyZ2V0cyBmcm9tIHRoZSBDRFAgYC9qc29uYCBlbmRwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxpc3Qgb2YgcGFnZSB0YXJnZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlVGFyZ2V0cygpOiBQcm9taXNlPENkcFRhcmdldFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmNkcFVybH0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldHMgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgQ2RwVGFyZ2V0W107XG4gICAgcmV0dXJuIHRhcmdldHMuZmlsdGVyKCh0KSA9PiB0LnR5cGUgPT09ICdwYWdlJyk7XG4gIH1cblxuICAvKipcbiAgICogS2lsbHMgdGhlIGN1cnJlbnRseS1ydW5uaW5nIG93bmVkIGluc3RhbmNlIChpZiBhbnkpIGFuZCB3YWl0cyBmb3IgaXQgdG8gZXhpdCxcbiAgICogc28gdGhlIG5leHQgbGF1bmNoIGdldHMgYSBwcmlzdGluZSBzaW5nbGUtd2luZG93IGluc3RhbmNlLlxuICAgKlxuICAgKiBSZWxhdW5jaGluZyBvdmVyIGEgbGl2ZSBpbnN0YW5jZSBpcyBmb3J3YXJkZWQgYnkgRWxlY3Ryb24ncyBzaW5nbGUtaW5zdGFuY2VcbiAgICogbG9jayBvbiB0aGUgc2hhcmVkIHVzZXItZGF0YSBkaXJlY3RvcnkgYW5kIHN1cmZhY2VzIHRoZSB2YXVsdCBwaWNrZXIsIGFuZCBvcGVuaW5nIGFcbiAgICogc2Vjb25kIHdpbmRvdyB2aWEgSVBDIGxlYXZlcyBzdGFsZSB3aW5kb3dzIHRoYXQgYnJlYWsgdmF1bHQtdGFyZ2V0IHJvdXRpbmcgXHUyMDE0XG4gICAqIGhlbmNlIGEgZnVsbCBraWxsICsgd2FpdC1mb3ItZXhpdCAocmVsZWFzaW5nIHRoZSBsb2NrKSBiZXR3ZWVuIGxhdW5jaGVzLiBBXG4gICAqIG5vLW9wIG9uIHRoZSBmaXJzdCBhdHRlbXB0LCB3aGVuIG5vIGluc3RhbmNlIGlzIHJ1bm5pbmcgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBraWxsUnVubmluZ093bmVkSW5zdGFuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm93bmVkSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gS2lsbGluZyBydW5uaW5nIG93bmVkIGluc3RhbmNlIGJlZm9yZSAocmUpbGF1bmNoLicpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIGNvbnN0IHByZXZpb3VzQ2RwVXJsID0gdGhpcy5jZHBVcmw7XG4gICAgdGhpcy5vd25lZEluc3RhbmNlLmtpbGwoKTtcbiAgICB0aGlzLm93bmVkSW5zdGFuY2UgPSB1bmRlZmluZWQ7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5zdGFuY2VFeGl0KHByZXZpb3VzQ2RwVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgb3duZWQgaW5zdGFuY2UncyB3aW5kb3cgb2ZmLXNjcmVlbiBzbyBhIGhpZGRlbiBydW4gbmV2ZXIgc3RlYWxzXG4gICAqIGZvY3VzLiBVc2VzIEVsZWN0cm9uJ3MgcmVtb3RlIGJyaWRnZSAoYHdpbmRvdy5lbGVjdHJvbi5yZW1vdGVgKSBcdTIwMTQgdGhlIG9ubHlcbiAgICogY3Jvc3MtcGxhdGZvcm0gd2F5IHRvIHJlcG9zaXRpb24gdGhlIHdpbmRvdyBcdTIwMTQgcGxhY2luZyBpdCBqdXN0IGJleW9uZCB0aGVcbiAgICogcmlnaHQgZWRnZSBvZiBhbGwgZGlzcGxheXMuIFRoZSB3aW5kb3cgc3RheXMgXCJ2aXNpYmxlXCIgdG8gQ2hyb21pdW0gKHNvXG4gICAqIHRpbWVycywgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsIGA6aG92ZXJgLCBhbmQgdHJ1c3RlZCBpbnB1dCBrZWVwIHdvcmtpbmcpLFxuICAgKiB1bmxpa2UgbWluaW1pemluZywgd2hpY2ggd291bGQgZnJlZXplIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLlxuICAgKlxuICAgKiBUaGUgcmVtb3RlIGJyaWRnZSBpcyBub3QgYXZhaWxhYmxlIHRoZSBpbnN0YW50IENEUCBzdGFydHMgc2VydmluZywgc28gdGhpc1xuICAgKiBwb2xscyB1bnRpbCB0aGUgbW92ZSBzdWNjZWVkcy4gQmVzdC1lZmZvcnQ6IGlmIHRoZSB3aW5kb3cgY2Fubm90IGJlIG1vdmVkXG4gICAqIHdpdGhpbiB0aGUgdGltZW91dCwgdGhlIGtlZXAtYWxpdmUgbGF1bmNoIGZsYWdzIHN0aWxsIGFwcGx5IGFuZCB0aGUgcnVuXG4gICAqIHByb2NlZWRzICh3b3JzdCBjYXNlIHRoZSB3aW5kb3cgaXMgYnJpZWZseSB2aXNpYmxlKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmUgdGhlIEVsZWN0cm9uIHJlbW90ZSBicmlkZ2UgdHdvIHdheXMgc28gQk9USCBtb2Rlcm4gYW5kIG9sZCBPYnNpZGlhblxuICAgIC8vIENhbiBiZSBtb3ZlZCBvZmYtc2NyZWVuOiBtb2Rlcm4gaW5qZWN0cyBgd2luZG93LmVsZWN0cm9uLnJlbW90ZWA7IG9sZFxuICAgIC8vIFZlcnNpb25zIChubyBgd2luZG93LmVsZWN0cm9uYCkgc3RpbGwgZXhwb3NlIHRoZSBidWlsdC1pbiBgcmVtb3RlYCBtb2R1bGUgdmlhXG4gICAgLy8gYHJlcXVpcmUoJ2VsZWN0cm9uJylgIGluIHRoZSBub2RlLWludGVncmF0ZWQgcmVuZGVyZXIgKHJlbW92ZWQgZnJvbSBFbGVjdHJvblxuICAgIC8vIDE0KywgYnV0IHByZXNlbnQgb24gdGhlIEVsZWN0cm9uIDgtMTMgc2hlbGxzIG9sZCBPYnNpZGlhbiBzaGlwcykuIFJldHVybmluZ1xuICAgIC8vIGBtb3ZlZGAgb24gdGhlIGZpcnN0IHN1Y2Nlc3MgaXMgaW1wb3J0YW50IG9uIEVsZWN0cm9uIDEwLWVyYSBidWlsZHM6IHBvbGxpbmdcbiAgICAvLyBPbiB3aXRob3V0IGEgcmVzb2x2YWJsZSBicmlkZ2UgaGFtbWVycyB0aGUgcmVuZGVyZXIgd2l0aCBDRFAgcm91bmQtdHJpcHNcbiAgICAvLyBEdXJpbmcgYm9vdCBhbmQgaW50ZXJtaXR0ZW50bHkgcHJldmVudHMgdGhlIHdvcmtzcGFjZSBmcm9tIGluaXRpYWxpemluZy5cbiAgICBjb25zdCBtb3ZlRXhwcmVzc2lvbiA9IGAoKCkgPT4ge1xuICAgICAgbGV0IHJlbW90ZSA9ICh3aW5kb3cuZWxlY3Ryb24gJiYgd2luZG93LmVsZWN0cm9uLnJlbW90ZSkgfHwgbnVsbDtcbiAgICAgIGlmICghcmVtb3RlKSB7XG4gICAgICAgIHRyeSB7IHJlbW90ZSA9IHJlcXVpcmUoJ2VsZWN0cm9uJykucmVtb3RlIHx8IG51bGw7IH0gY2F0Y2ggKHJlcXVpcmVFcnJvcikgeyByZW1vdGUgPSBudWxsOyB9XG4gICAgICB9XG4gICAgICBpZiAoIXJlbW90ZSB8fCB0eXBlb2YgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3cgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuICh0eXBlb2Ygd2luZG93LmFwcCA9PT0gJ3VuZGVmaW5lZCcpID8gJ25vdC1yZWFkeScgOiAnbm8tYnJpZGdlJztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpbiA9IHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCk7XG4gICAgICBjb25zdCBkaXNwbGF5cyA9IHJlbW90ZS5zY3JlZW4uZ2V0QWxsRGlzcGxheXMoKTtcbiAgICAgIGNvbnN0IG1heFJpZ2h0ID0gTWF0aC5tYXgoLi4uZGlzcGxheXMubWFwKChkaXNwbGF5KSA9PiBkaXNwbGF5LmJvdW5kcy54ICsgZGlzcGxheS5ib3VuZHMud2lkdGgpKTtcbiAgICAgIHdpbi5zZXRQb3NpdGlvbihtYXhSaWdodCArICR7U3RyaW5nKE9XTkVEX1dJTkRPV19PRkZTQ1JFRU5fTUFSR0lOX0lOX1BJWEVMUyl9LCAwKTtcbiAgICAgIHJldHVybiAnbW92ZWQnO1xuICAgIH0pKClgO1xuXG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW3RhcmdldF0gPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgICAgIGV4cHJlc3Npb246IG1vdmVFeHByZXNzaW9uLFxuICAgICAgICAgICAgICByZXR1cm5CeVZhbHVlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUgPT09ICdtb3ZlZCcpIHtcbiAgICAgICAgICAgICAgbG9nKCdbY2RwLXRyYW5zcG9ydF0gTW92ZWQgb3duZWQgT2JzaWRpYW4gd2luZG93IG9mZi1zY3JlZW4gKGhpZGRlbiBtb2RlKS4nKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB3cy5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIENEUCBlbmRwb2ludCAvIHRhcmdldCAvIHJlbW90ZSBicmlkZ2Ugbm90IHJlYWR5IHlldCBcdTIwMTQga2VlcCBwb2xsaW5nLlxuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoT1dORURfV0lORE9XX0hJREVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBDb3VsZCBub3QgbW92ZSBvd25lZCB3aW5kb3cgb2ZmLXNjcmVlbiB3aXRoaW4gJHtTdHJpbmcoT1dORURfV0lORE9XX0hJREVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zIChub24tZmF0YWw7IGtlZXAtYWxpdmUgZmxhZ3Mgc3RpbGwgYXBwbGllZCkuYCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYSB2YXVsdCBpbiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIHRoZSBgdmF1bHQtb3BlbmBcbiAgICogRWxlY3Ryb24gSVBDIChldmFsdWF0ZWQgdGhyb3VnaCBDRFAgb24gYW4gZXhpc3RpbmcgdGFyZ2V0KSwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgbmV3IHZhdWx0J3Mgd2luZG93IHRhcmdldCBhcHBlYXJzLCBpcyBsYXlvdXQtcmVhZHksIGFuZCBpdHMgdHJ1c3QgZGlhbG9nXG4gICAqIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogU2hhcmVkIGJ5IHRoZSBhdHRhY2gtbW9kZSB7QGxpbmsgcmVnaXN0ZXJWYXVsdH0gYW5kIHRoZSBvd25lZC1tb2RlXG4gICAqIFwiaW5zdGFuY2UgYWxyZWFkeSBsYXVuY2hlZFwiIHBhdGgsIHNvIG9wZW5pbmcgYW4gYWRkaXRpb25hbCB2YXVsdCBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSBwcm9jZXNzICh3aGljaCB3b3VsZCBzdXJmYWNlIHRoZSB2YXVsdCBwaWNrZXIpLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgb3BlblZhdWx0SW5SdW5uaW5nSW5zdGFuY2UodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgdGFyZ2V0cyA9IGF3YWl0IHRoaXMuZ2V0UGFnZVRhcmdldHMoKTtcbiAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gT2JzaWRpYW4gQ0RQIHRhcmdldHMgYXZhaWxhYmxlLiBJcyBPYnNpZGlhbiBydW5uaW5nPycpO1xuICAgIH1cblxuICAgIC8vIFRoZSBgdmF1bHQtb3BlbmAgSVBDIGlzIHNlbnQgdGhyb3VnaCBhbiBFWElTVElORyB3aW5kb3cgKGB0YXJnZXRzWzBdYCksIHNvIHRoZVxuICAgIC8vIEhlbHBlciBuYW1lc3BhY2UgbXVzdCBiZSBib290c3RyYXBwZWQgb24gVEhBVCB3aW5kb3cgXHUyMDE0IG5vdCBvbiBgdmF1bHRQYXRoYCwgd2hvc2VcbiAgICAvLyBXaW5kb3cgZG9lcyBub3QgZXhpc3QgeWV0LiBCb290c3RyYXBwaW5nIGFnYWluc3QgYHZhdWx0UGF0aGAgaGVyZSB3b3VsZCByb3V0ZVxuICAgIC8vIFRocm91Z2ggYGZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpYCB3aXRoIG9ubHkgdGhlIGV4aXN0aW5nIHdpbmRvdyBwcmVzZW50IGFuZFxuICAgIC8vIFBvaXNvbiB0aGUgY29ubmVjdGlvbiBjYWNoZSAobGFiZWwgYHZhdWx0UGF0aGAsIHNvY2tldCBcdTIxOTIgdGhlIGV4aXN0aW5nIHdpbmRvdyksIHNvXG4gICAgLy8gRXZlcnkgbGF0ZXIgZXZhbCBmb3IgYHZhdWx0UGF0aGAgd291bGQgbWlzLXJvdXRlIHRvIHRoZSBleGlzdGluZyB3aW5kb3cuIFByb2JlIHRoZVxuICAgIC8vIEV4aXN0aW5nIHdpbmRvdydzIG93biBiYXNlIHBhdGggYW5kIGJvb3RzdHJhcCBhZ2FpbnN0IHRoYXQgaW5zdGVhZC5cbiAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHRhcmdldHNbMF0pO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gYXdhaXQgdGhpcy5wcm9iZVZhdWx0UGF0aChleGlzdGluZ1RhcmdldCk7XG4gICAgY29uc3QgaXBjV3MgPSBhd2FpdCB0aGlzLmNvbm5lY3RUb1RhcmdldChleGlzdGluZ1RhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG4gICAgICBjb25zdCBpcGNFeHByZXNzaW9uID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBjaGFubmVsOiAndmF1bHQtb3BlbicsIGNoYW5uZWxBcmd1bWVudHM6IFt2YXVsdFBhdGgsIGZhbHNlXSB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoaXBjV3MsICdSdW50aW1lLmV2YWx1YXRlJywge1xuICAgICAgICBhd2FpdFByb21pc2U6IHRydWUsXG4gICAgICAgIGV4cHJlc3Npb246IGlwY0V4cHJlc3Npb24sXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZShpcGNXcywgdmF1bHRQYXRoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXBjV3MuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBsb2coYFtjZHAtdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCB0YXJnZXQgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRUYXJnZXRGb3JWYXVsdCh2YXVsdFBhdGgpO1xuICAgICAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBWYXVsdCB0YXJnZXQgZm91bmQuJyk7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCB0YXJnZXQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogU2FtcGxlcyB0aGUgdmF1bHQgcmVuZGVyZXIncyBib290c3RyYXAgc3RhdGUgXHUyMDE0IHdoZXRoZXIgdGhlIGRvY3VtZW50IGlzXG4gICAqIGBjb21wbGV0ZWAsIHdoZXRoZXIgYHdpbmRvdy5hcHBgIGV4aXN0cywgYW5kIHRoZSBgPGJvZHk+YCBjaGlsZCBjb3VudCBcdTIwMTQgZnJvbVxuICAgKiB0aGUgZmlyc3QgcGFnZSB0YXJnZXQsIGZvciBkZWFkLWJvb3QgZGV0ZWN0aW9uLiBUaGlzIHdvcmtzIGV2ZW4gd2hlbiB0aGUgYXBwXG4gICAqIG5ldmVyIGJvb3RzdHJhcHBlZCAodGhlIHJlbmRlcmVyIHBhZ2UgdGFyZ2V0IHN0aWxsIGV4aXN0cyksIHdoaWNoIGlzIGV4YWN0bHlcbiAgICogdGhlIHN0YXRlIGl0IG11c3Qgb2JzZXJ2ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNhbXBsZWQgb2JzZXJ2YXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gbm8gdGFyZ2V0IGlzIHJlYWNoYWJsZVxuICAgKiAgIG9yIHRoZSBwcm9iZSBmYWlsZWQgKHNvIHRoZSBjYWxsZXIga2VlcHMgcG9sbGluZyByYXRoZXIgdGhhbiBmYXN0LWZhaWxpbmcpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZVJlbmRlcmVyQm9vdFN0YXRlKCk6IFByb21pc2U8UmVuZGVyZXJCb290T2JzZXJ2YXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW3RhcmdldF0gPSBhd2FpdCB0aGlzLmdldFBhZ2VUYXJnZXRzKCk7XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3cyA9IGF3YWl0IHRoaXMuY29ubmVjdFRvVGFyZ2V0KHRhcmdldCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm9iZUV4cHJlc3Npb24gPSBgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGJvZHlDaGlsZEVsZW1lbnRDb3VudDogZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuY2hpbGRFbGVtZW50Q291bnQgOiAwLFxuICAgICAgICAgIGhhc1dpbmRvd0FwcDogdHlwZW9mIHdpbmRvdy5hcHAgIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgIGlzRG9jdW1lbnRDb21wbGV0ZTogZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJ1xuICAgICAgICB9KWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZCh3cywgJ1J1bnRpbWUuZXZhbHVhdGUnLCB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogcHJvYmVFeHByZXNzaW9uLFxuICAgICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2UucmVzdWx0Py5yZXN1bHQ/LnZhbHVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIFJlbmRlcmVyQm9vdE9ic2VydmF0aW9uO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3MuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2JlcyBhIHRhcmdldCB0byBkaXNjb3ZlciB3aGljaCB2YXVsdCBwYXRoIGl0IGhhcyBvcGVuLlxuICAgKlxuICAgKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IFdlYlNvY2tldCBjb25uZWN0aW9uLCBldmFsdWF0ZXMgYGdldEJhc2VQYXRoKClgLFxuICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIENEUCB0YXJnZXQgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFRoZSB2YXVsdCdzIGJhc2UgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVWYXVsdFBhdGgodGFyZ2V0OiBDZHBUYXJnZXQpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHdzID0gYXdhaXQgdGhpcy5jb25uZWN0VG9UYXJnZXQodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlbmRDb21tYW5kKHdzLCAnUnVudGltZS5ldmFsdWF0ZScsIHtcbiAgICAgICAgLy8gT2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBwcmVkYXRlIHRoZSBgZ2V0QmFzZVBhdGgoKWAgbWV0aG9kIGJ1dFxuICAgICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICAgIGV4cHJlc3Npb246ICdhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFwcC52YXVsdC5hZGFwdGVyLmdldEJhc2VQYXRoKCkgOiBhcHAudmF1bHQuYWRhcHRlci5iYXNlUGF0aCcsXG4gICAgICAgIHJldHVybkJ5VmFsdWU6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFN0cmluZyhyZXNwb25zZS5yZXN1bHQ/LnJlc3VsdD8udmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB3cy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBhbmQgY29ubmVjdHMgdG8gYSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZSBmb3IgYVxuICAgKiB2YXVsdDogcHJvdmlzaW9ucyB0aGUgYXNhciAoaWYgYW55KSwgcHJlLXNlZWRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmBcbiAgICogc28gdGhlIHZhdWx0IG9wZW5zIGRpcmVjdGx5LCBsYXVuY2hlcyB0aGUgaW5zdGFuY2Ugb24gYSBmcmVlIENEUCBwb3J0LCB0aGVuXG4gICAqIHdhaXRzIHVudGlsIHRoZSB2YXVsdCB3aW5kb3cgaXMgcmVhZHkgYW5kIGRpc21pc3NlcyB0aGUgdHJ1c3QgZGlhbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJWYXVsdEluT3duZWRJbnN0YW5jZSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGVuc3VyZU5vbk51bGxhYmxlKHRoaXMub3duZWRDb25maWcpO1xuXG4gICAgbWtkaXJTeW5jKGNvbmZpZy51c2VyRGF0YURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgaWYgKGNvbmZpZy5hc2FyKSB7XG4gICAgICBjb3B5QXNhckludG9Vc2VyRGF0YShjb25maWcuYXNhci5wYXRoLCBjb25maWcuYXNhci52ZXJzaW9uLCBjb25maWcudXNlckRhdGFEaXJlY3RvcnkpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhdWx0SWQgPSByYW5kb21CeXRlcyhWQVVMVF9JRF9CWVRFX0xFTkdUSCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG9ic2lkaWFuSnNvbiA9IGJ1aWxkT3duZWRPYnNpZGlhbkpzb24oeyB0czogRGF0ZS5ub3coKSwgdmF1bHRJZCwgdmF1bHRQYXRoIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihjb25maWcudXNlckRhdGFEaXJlY3RvcnksICdvYnNpZGlhbi5qc29uJyksIEpTT04uc3RyaW5naWZ5KG9ic2lkaWFuSnNvbikpO1xuXG4gICAgLy8gUmVsYXVuY2gtcmV0cnk6IHNvbWUgb2xkIChFbGVjdHJvbiAxMC1lcmEpIE9ic2lkaWFuIGJ1aWxkcyBpbnRlcm1pdHRlbnRseVxuICAgIC8vIEJvb3Qgd2l0aCBgd2luZG93LmFwcGAgcHJlc2VudCBidXQgdGhlIHdvcmtzcGFjZSBuZXZlciBpbml0aWFsaXppbmcsIHNvIHRoZVxuICAgIC8vIFZhdWx0IG5ldmVyIGJlY29tZXMgcmVhZHkuIEEgZnJlc2ggaW5zdGFuY2UgaXMgYW4gaW5kZXBlbmRlbnQgY2hhbmNlLiBBXG4gICAgLy8gRGV0ZXJtaW5pc3RpYyBmYWlsdXJlIChkZWFkIGJvb3QsIHNpbGVudCBhc2FyIGZhbGxiYWNrKSBpcyByZS10aHJvd24gYXQgb25jZSBcdTIwMTRcbiAgICAvLyBSZXRyeWluZyBpdCBvbmx5IHdhc3RlcyB0aGUgcmVhZGluZXNzIHRpbWVvdXQuXG4gICAgbGV0IGxhc3RFcnJvcjogdW5rbm93bjtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICAgIGF3YWl0IHRoaXMua2lsbFJ1bm5pbmdPd25lZEluc3RhbmNlKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgYXdhaXQgZGVsYXkoT1dORURfUkVMQVVOQ0hfU0VUVExFX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc3RhbmNlID0gYXdhaXQgbGF1bmNoT3duZWRPYnNpZGlhbkluc3RhbmNlKHtcbiAgICAgICAgY2RwSG9zdDogdGhpcy5jZHBIb3N0LFxuICAgICAgICBleGVQYXRoOiBjb25maWcuZXhlUGF0aCxcbiAgICAgICAgZXh0cmFBcmd1bWVudHM6IFtcbiAgICAgICAgICAuLi5yZXNvbHZlT3duZWRIaWRkZW5MYXVuY2hBcmd1bWVudHModGhpcy5pc09ic2lkaWFuQXBwVmlzaWJsZSksXG4gICAgICAgICAgLi4ucmVzb2x2ZVNhbmRib3hMYXVuY2hBcmd1bWVudHModGhpcy5zaG91bGREaXNhYmxlU2FuZGJveClcbiAgICAgICAgXSxcblxuICAgICAgICB1c2VyRGF0YURpcmVjdG9yeTogY29uZmlnLnVzZXJEYXRhRGlyZWN0b3J5XG4gICAgICB9KTtcbiAgICAgIHRoaXMub3duZWRJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgdGhpcy5jZHBQb3J0ID0gaW5zdGFuY2UucG9ydDtcbiAgICAgIHRoaXMuY2RwVXJsID0gaW5zdGFuY2UuY2RwVXJsO1xuXG4gICAgICBpZiAoc2hvdWxkSGlkZU9ic2lkaWFuQXBwKHRoaXMuaXNPYnNpZGlhbkFwcFZpc2libGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubW92ZU93bmVkV2luZG93T2Zmc2NyZWVuKCk7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgICBhd2FpdCB0aGlzLmFybVBhcmVudExpdmVuZXNzV2F0Y2hkb2codmF1bHRQYXRoLCBpbnN0YW5jZS5wYXJlbnRMaXZlbmVzc1BvcnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvcjtcbiAgICAgICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gT3duZWQgdmF1bHQgbm90IHJlYWR5IChhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhPV05FRF9MQVVOQ0hfTUFYX0FUVEVNUFRTKX0pOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IGxhc3RFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbGFzdEVycm9yIDogbmV3IEVycm9yKGBPd25lZCB2YXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHlgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIG92ZXIgV2ViU29ja2V0IGFuZCB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gd3MgLSBUaGUgV2ViU29ja2V0IGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIG1ldGhvZCBuYW1lLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIENEUCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2VuZENvbW1hbmQod3M6IFdlYlNvY2tldCwgbWV0aG9kOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPENkcFJlc3BvbnNlPiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPENkcFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHdzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXM6ICR7bWV0aG9kfWApKTtcbiAgICAgIH0sIHRoaXMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IE1lc3NhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcFJlc3BvbnNlO1xuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gaWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgYSBraWxsZWQgb3duZWQgaW5zdGFuY2UncyBDRFAgZW5kcG9pbnQgdW50aWwgaXQgc3RvcHMgcmVzcG9uZGluZyxcbiAgICogY29uZmlybWluZyB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCBFbGVjdHJvbidzIHNpbmdsZS1pbnN0YW5jZVxuICAgKiBsb2NrIG9uIHRoZSBzaGFyZWQgdXNlci1kYXRhIGRpcmVjdG9yeSBiZWZvcmUgYSBmcmVzaCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBpbnRvIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY2RwVXJsIC0gVGhlIENEUCBVUkwgb2YgdGhlIGluc3RhbmNlIHRoYXQgd2FzIGp1c3Qga2lsbGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5zdGFuY2VFeGl0KGNkcFVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2RwLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgcHJldmlvdXMgb3duZWQgaW5zdGFuY2UgYXQgJHtjZHBVcmx9IHRvIGV4aXQuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uYCk7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBlbmRwb2ludCBpcyBnb25lOiB0aGUgcHJvY2VzcyBoYXMgZXhpdGVkIGFuZCByZWxlYXNlZCB0aGUgbG9jay5cbiAgICAgICAgYXdhaXQgZGVsYXkoSU5TVEFOQ0VfRVhJVF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICBsb2coJ1tjZHAtdHJhbnNwb3J0XSBQcmV2aW91cyBpbnN0YW5jZSBzdGlsbCByZXNwb25kZWQgYmVmb3JlIHRpbWVvdXQ7IHJlbGF1bmNoaW5nIGFueXdheS4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIHZhdWx0J3MgYGFwcC53b3Jrc3BhY2VgIHRvIHJlYWNoIGxheW91dC1yZWFkeSBzdGF0ZS5cbiAgICpcbiAgICogYGZpbmRUYXJnZXRGb3JWYXVsdGAgcmV0dXJucyBhcyBzb29uIGFzIGBhcHAudmF1bHQuYWRhcHRlci5nZXRCYXNlUGF0aCgpYFxuICAgKiBtYXRjaGVzIFx1MjAxNCB3aGljaCBpcyB0cnVlIHNob3J0bHkgYWZ0ZXIgdGhlIGBBcHBgIGNvbnN0cnVjdG9yIHJ1bnMsIGJlZm9yZVxuICAgKiBgcGx1Z2lucy5pbml0aWFsaXplKClgIChhbmQgYW55IHRydXN0IGRpYWxvZykgaGFzIGV4ZWN1dGVkLiBCb290c3RyYXBwaW5nXG4gICAqIHRoZSBuYW1lc3BhY2UgYW5kIGNhbGxpbmcgYHBvbGxWYXVsdEJhc2VQYXRoKClgIGF3YWl0cyBgbGF5b3V0UmVhZHlgLCBzb1xuICAgKiBieSB0aGUgdGltZSB0aGlzIHJldHVybnMgdGhlIGRpYWxvZyBoYXMgZWl0aGVyIHJlbmRlcmVkIG9yIGlzIG5vdCBnb2luZ1xuICAgKiB0byByZW5kZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZSgnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKScsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIG93bmVkIGluc3RhbmNlIHVudGlsIHRoZSB2YXVsdCB0YXJnZXQgZXhpc3RzLCBsYXlvdXQgaXMgcmVhZHksIGFuZFxuICAgKiB0aGUgdHJ1c3QgZGlhbG9nIChpZiBhbnkpIGhhcyBiZWVuIGRpc21pc3NlZC5cbiAgICpcbiAgICogQmV0d2VlbiByZWFkaW5lc3MgYXR0ZW1wdHMgaXQgYWxzbyBjaGVja3MgZm9yIGEgKipkZWFkIGJvb3QqKiBcdTIwMTQgdGhlIHJlbmRlcmVyXG4gICAqIGxvYWRlZCAoYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCkgYnV0IHRoZSBhcHAgbmV2ZXIgYm9vdHN0cmFwcGVkXG4gICAqIChlbXB0eSBgPGJvZHk+YCwgbm8gYHdpbmRvdy5hcHBgKSwgdGhlIHRlcm1pbmFsIHN0YXRlIHdoZW4gdGhlIGFzYXIgY2Fubm90XG4gICAqIHJ1biBvbiB0aGUgbGF1bmNoZWQgRWxlY3Ryb24gc2hlbGwuIE9uY2UgdGhhdCBzdGF0ZSBoYXMgaGVsZCBmb3IgdGhlXG4gICAqIGNvbmZpZ3VyZWQgZ3JhY2Ugd2luZG93IGl0IHRocm93cyBhIHtAbGluayBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yfVxuICAgKiBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzcyB0aW1lb3V0LiBBIGdyYWNlIG9mXG4gICAqIGAwYCBkaXNhYmxlcyB0aGUgZmFzdC1mYWlsLiBUaGUgZ3JhY2UgY2xvY2sgc3RhcnRzIHdoZW4gdGhlIHJlbmRlcmVyIGZpcnN0XG4gICAqIHJlcG9ydHMgYGNvbXBsZXRlYCwgc28gYSBzbG93IGxvYWQgYmVmb3JlIHRoZW4gaXMgbmV2ZXIgY291bnRlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvck93bmVkVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NkcC10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIG93bmVkIHZhdWx0IHRvIGJlY29tZSByZWFkeSAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBkb2N1bWVudENvbXBsZXRlU2luY2U6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICAgIGxldCBpc1JlYWR5ID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kVGFyZ2V0Rm9yVmF1bHQodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkodmF1bHRQYXRoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgICAgaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSB2YXVsdCBpcyBub3QgcmVhZHkgeWV0IFx1MjAxNCBhbHNvIGRyb3AgdGhlIGNhY2hlZCBDRFAgY29ubmVjdGlvbiBiZWZvcmVcbiAgICAgICAgLy8gUmV0cnlpbmcuIE9sZCAoRWxlY3Ryb24gMTAtZXJhKSBPYnNpZGlhbiByZWxvYWRzIHRoZSBvd25lZCB3aW5kb3cgZHVyaW5nXG4gICAgICAgIC8vIEJvb3QsIHdoaWNoIGNhbiBsZWF2ZSB0aGUgY2FjaGVkIFdlYlNvY2tldCBwaW5uZWQgdG8gYSBzdGFsZSBleGVjdXRpb25cbiAgICAgICAgLy8gQ29udGV4dDsgcmVjb25uZWN0aW5nIGVhY2ggYXR0ZW1wdCByZS1iaW5kcyB0byB0aGUgbGl2ZSBjb250ZXh0LlxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzID4gMCkge1xuICAgICAgICBjb25zdCBvYnNlcnZhdGlvbiA9IGF3YWl0IHRoaXMucHJvYmVSZW5kZXJlckJvb3RTdGF0ZSgpO1xuICAgICAgICBpZiAob2JzZXJ2YXRpb24pIHtcbiAgICAgICAgICBpZiAob2JzZXJ2YXRpb24uaXNEb2N1bWVudENvbXBsZXRlICYmIGRvY3VtZW50Q29tcGxldGVTaW5jZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZG9jdW1lbnRDb21wbGV0ZVNpbmNlID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaGFzR3JhY2VFbGFwc2VkID0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlICE9PSBudWxsXG4gICAgICAgICAgICAmJiBEYXRlLm5vdygpIC0gZG9jdW1lbnRDb21wbGV0ZVNpbmNlID49IHRoaXMuZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzO1xuICAgICAgICAgIGlmIChyZXNvbHZlUmVuZGVyZXJCb290U3RhdGUoeyAuLi5vYnNlcnZhdGlvbiwgaGFzR3JhY2VFbGFwc2VkIH0pID09PSAnZGVhZCcpIHtcbiAgICAgICAgICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHJlbmRlcmVyIGZhaWxlZCB0byBpbml0aWFsaXplIChkZWFkIGJvb3QpOyBmYWlsaW5nIGZhc3QuJyk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcih2YXVsdFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE93bmVkIHZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgdmF1bHQgaXMgcmVhZHkuIFJ1biB0aGUgcG9zdC1ib290IGNvbXBhdGliaWxpdHkgY2hlY2tzIGhlcmUgXHUyMDE0IE9VVFNJREUgdGhlXG4gICAgLy8gUG9sbCdzIHRyeS9jYXRjaCBcdTIwMTQgc28gYSBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciBmYWlscyBmYXN0IGluc3RlYWQgb2YgYmVpbmdcbiAgICAvLyBTd2FsbG93ZWQgYXMgXCJub3QgcmVhZHkgeWV0XCIgYW5kIGxvb3BpbmcgdW50aWwgdGhlIHJlYWRpbmVzcyB0aW1lb3V0LlxuICAgIGF3YWl0IHRoaXMuY2hlY2tSdW50aW1lQ29tcGF0aWJpbGl0eSh2YXVsdFBhdGgpO1xuICAgIGxvZygnW2NkcC10cmFuc3BvcnRdIE93bmVkIHZhdWx0IGlzIHJlYWR5LicpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQXR0ZW1wdHMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LCByZXR1cm5pbmcgd2hldGhlciBpdCBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGRpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgdGhlIHJlbW92YWwgdGhyZXcgKGUuZy4gaGFuZGxlcyBoZWxkKS5cbiAqL1xuZnVuY3Rpb24gZGlkUmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcm1TeW5jKGRpcmVjdG9yeSwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCBPYnNpZGlhbiB3aXRoIHJlbW90ZSBkZWJ1Z2dpbmcgZW5hYmxlZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgYWN0dWFsIGluc3RhbGxlZCBPYnNpZGlhbiBleGVjdXRhYmxlIChjb3ZlcmluZyBpbnN0YWxsZXItYmFzZWRcbiAqIGFuZCBgUEFUSGAtYmFzZWQgaW5zdGFsbHMgc3VjaCBhcyBgc2Nvb3BgKSBhbmQgdmVyaWZpZXMgaXQgZXhpc3RzIGJlZm9yZVxuICogcmV0dXJuaW5nIGEgY29tbWFuZC4gVGhyb3dzIGlmIE9ic2lkaWFuIGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQgdG8gdXNlLlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiBPYnNpZGlhbiBjYW5ub3QgYmUgbG9jYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gIGNvbnN0IGZsYWcgPSBgLS1yZW1vdGUtZGVidWdnaW5nLXBvcnQ9JHtTdHJpbmcocG9ydCl9YDtcblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7ZXhlUGF0aH1cIiAke2ZsYWd9YDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJHtmbGFnfSAmYDtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBw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QUksSUFBSTtBQUM5QixRQUFJLHdCQUF1QztBQUMzQyxRQUFJLFVBQVU7QUFDZCxXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBSTtBQUNGLGNBQU0sS0FBSyxtQkFBbUIsU0FBUztBQUN2QyxjQUFNLEtBQUssbUJBQW1CLFNBQVM7QUFDdkMsY0FBTSxLQUFLLG1CQUFtQixTQUFTO0FBQ3ZDLGtCQUFVO0FBQ1Y7QUFBQSxNQUNGLFFBQVE7QUFLTixhQUFLLFdBQVc7QUFBQSxNQUNsQjtBQUVBLFVBQUksS0FBSyw4QkFBOEIsR0FBRztBQUN4QyxjQUFNLGNBQWMsTUFBTSxLQUFLLHVCQUF1QjtBQUN0RCxZQUFJLGFBQWE7QUFDZixjQUFJLFlBQVksc0JBQXNCLDBCQUEwQixNQUFNO0FBQ3BFLG9DQUF3QixLQUFLLElBQUk7QUFBQSxVQUNuQztBQUNBLGdCQUFNLGtCQUFrQiwwQkFBMEIsUUFDN0MsS0FBSyxJQUFJLElBQUkseUJBQXlCLEtBQUs7QUFDaEQsa0JBQUkseURBQXlCLEVBQUUsR0FBRyxhQUFhLGdCQUFnQixDQUFDLE1BQU0sUUFBUTtBQUM1RSxnQ0FBSSxnRkFBZ0Y7QUFDcEYsa0JBQU0sSUFBSSwyRUFBZ0MsU0FBUztBQUFBLFVBQ3JEO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLE1BQU0sbUNBQW1DO0FBQUEsSUFDakQ7QUFFQSxRQUFJLENBQUMsU0FBUztBQUNaLFlBQU0sSUFBSSxNQUFNLGtCQUFrQixTQUFTLGdDQUFnQyxPQUFPLGtDQUFrQyxDQUFDLElBQUk7QUFBQSxJQUMzSDtBQUtBLFVBQU0sS0FBSywwQkFBMEIsU0FBUztBQUM5Qyx3QkFBSSx1Q0FBdUM7QUFBQSxFQUM3QztBQUNGO0FBUUEsU0FBUyxNQUFNLElBQTJCO0FBQ3hDLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixlQUFXLFNBQVMsRUFBRTtBQUFBLEVBQ3hCLENBQUM7QUFDSDtBQVFBLFNBQVMsbUJBQW1CLFdBQTRCO0FBQ3RELE1BQUk7QUFDRiwrQkFBTyxXQUFXLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQ2xELFdBQU87QUFBQSxFQUNULFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBYUEsZUFBZSx5QkFBeUIsTUFBK0I7QUFDckUsUUFBTSxVQUFVLFVBQU0sc0RBQTBCO0FBQ2hELFFBQU0sT0FBTywyQkFBMkIsT0FBTyxJQUFJLENBQUM7QUFFcEQsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTyxhQUFhLE9BQU8sS0FBSyxJQUFJO0FBQUEsRUFDdEM7QUFFQSxTQUFPLElBQUksT0FBTyxLQUFLLElBQUk7QUFDN0I7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiXQp9Cg==
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* Requirements: Node.js 22+ (uses built-in `WebSocket` and `fetch` globals).
|
|
18
18
|
*/
|
|
19
19
|
import type { AsarFallback } from './asar-fallback-detection.cjs';
|
|
20
|
+
import type { CaptureScreenshotParams } from './capture-screenshot.cjs';
|
|
20
21
|
import type { ElectronCompatibility } from './electron-compatibility.cjs';
|
|
21
22
|
import type { InstallerCompatibility } from './installer-compatibility.cjs';
|
|
22
23
|
import type { ObsidianTransport, TransportEvalOptions } from './transport.cjs';
|
|
@@ -186,6 +187,20 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
|
|
|
186
187
|
* @param config - CDP connection configuration.
|
|
187
188
|
*/
|
|
188
189
|
constructor(config?: DesktopCdpTransportConfig);
|
|
190
|
+
/**
|
|
191
|
+
* Captures a PNG screenshot of the Obsidian window showing the given vault.
|
|
192
|
+
*
|
|
193
|
+
* When a size is requested the viewport is pinned to it with
|
|
194
|
+
* `Emulation.setDeviceMetricsOverride` for the duration of the capture, so the
|
|
195
|
+
* emitted PNG is exactly that size whatever size the window happens to be —
|
|
196
|
+
* and the override is always cleared afterwards, including when the capture
|
|
197
|
+
* throws, so a failed capture cannot leave the window stuck at the override.
|
|
198
|
+
*
|
|
199
|
+
* @param params - Which vault window to capture, and the exact size to capture it at.
|
|
200
|
+
* @returns The raw PNG bytes.
|
|
201
|
+
* @throws Error if CDP returns no image data, or data that is not a PNG.
|
|
202
|
+
*/
|
|
203
|
+
captureScreenshot(params: CaptureScreenshotParams): Promise<Uint8Array>;
|
|
189
204
|
/**
|
|
190
205
|
* Disposes of the active WebSocket connection and, in owned-instance mode,
|
|
191
206
|
* kills the owned Obsidian process and removes its isolated user-data directory.
|
|
@@ -14,4 +14,4 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
14
14
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
15
|
var transport_exports = {};
|
|
16
16
|
module.exports = __toCommonJS(transport_exports);
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlZmluZXMgdGhlIHRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90LmNqcyc7XG5cbi8qKlxuICogQW4gb3BhcXVlIGhhbmRsZSBpZGVudGlmeWluZyBhIGNvbnNvbGUtY2FwdHVyZSB3aW5kb3cgb3BlbmVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZX0gYW5kIGNvbnN1bWVkIGJ5XG4gKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNvbGVDYXB0dXJlSGFuZGxlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIG1hcmtlciB3cml0dGVuIGludG8gdGhlIHRhcmdldCdzIGxvZyBzdHJlYW0gYXQgY2FwdHVyZSBzdGFydCxcbiAgICogdXNlZCB0byBzbGljZSBvdXQgZXZlcnl0aGluZyBsb2dnZWQgYWZ0ZXIgdGhpcyBwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcGx1Z2dhYmxlIHRyYW5zcG9ydCB0aGF0IGV2YWx1YXRlcyBKYXZhU2NyaXB0IGV4cHJlc3Npb25zIGluc2lkZSBhIHJ1bm5pbmdcbiAqIE9ic2lkaWFuIGluc3RhbmNlIGFuZCBtYW5hZ2VzIHZhdWx0IGxpZmVjeWNsZS5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgaGFuZGxlIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBkZXRhaWxzOlxuICogLSB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gXHUyMDE0IERlc2t0b3AgT2JzaWRpYW4gdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbFxuICogICAoYSBoYXJuZXNzLW93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGJ5IGRlZmF1bHQsIG9yIGF0dGFjaCB0byBhIHJ1bm5pbmcgb25lKVxuICogLSB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0fSBcdTIwMTQgTW9iaWxlIE9ic2lkaWFuIHZpYSBBcHBpdW0gV2ViVmlldyBKUyBpbmplY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBCZWdpbnMgY2FwdHVyaW5nIHRoZSB0YXJnZXQncyBuYXRpdmUgY29uc29sZS9lcnJvciBzdHJlYW0gc28gYSBsYXRlclxuICAgKiB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiByZXR1cm4gZXZlcnl0aGluZ1xuICAgKiBsb2dnZWQgc2luY2UgdGhpcyBjYWxsLlxuICAgKlxuICAgKiBVc2VkIHRvIHN1cmZhY2UgdGhlICpyZWFsKiBwbHVnaW4tbG9hZCBlcnJvciB3aGVuIE9ic2lkaWFuIHN3YWxsb3dzIGl0XG4gICAqIGJlZm9yZSB0aGUgaGFybmVzcydzIGBsb2FkUGx1Z2luYCBtb25rZXktcGF0Y2ggc2VlcyBpdCAodGhlIGVycm9yIHRoZW5cbiAgICogb25seSBleGlzdHMgaW4gdGhlIHJlbmRlcmVyL1dlYlZpZXcgY29uc29sZSkuIE9wdGlvbmFsIGFuZCBwbGF0Zm9ybS1zcGVjaWZpYzpcbiAgICogaW1wbGVtZW50ZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydH0gKHRhaWxzIGBhZGIgbG9nY2F0YCk7IGFic2VudCBvblxuICAgKiB7QGxpbmsgRGVza3RvcENkcFRyYW5zcG9ydH0gKGRlc2t0b3AgZXJyb3JzIGFyZSBzdXJmYWNlZCBpbi1yZW5kZXJlciwgYW5kIGFcbiAgICogZGV2ZWxvcGVyIGNhbiBvcGVuIERldlRvb2xzIGRpcmVjdGx5KS5cbiAgICpcbiAgICogQHJldHVybnMgQW4gb3BhcXVlIGhhbmRsZSB0byBwYXNzIHRvIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZX0sIG9yIGB1bmRlZmluZWRgIHdoZW4gdW5zdXBwb3J0ZWQuXG4gICAqL1xuICBiZWdpbkNvbnNvbGVDYXB0dXJlPygpOiBQcm9taXNlPENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogQ2FwdHVyZXMgYSBQTkcgc2NyZWVuc2hvdCBvZiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZS5cbiAgICpcbiAgICogT3B0aW9uYWwgYW5kIHBsYXRmb3JtLXNwZWNpZmljLCBsaWtlIHRoZSBvdGhlciBtZW1iZXJzIGhlcmUuIEltcGxlbWVudGVkIGJ5XG4gICAqIHtAbGluayBEZXNrdG9wQ2RwVHJhbnNwb3J0fSAoQ0RQIGBQYWdlLmNhcHR1cmVTY3JlZW5zaG90YCwgb3B0aW9uYWxseSB3aXRoXG4gICAqIHRoZSB2aWV3cG9ydCBwaW5uZWQgdG8gYW4gZXhhY3Qgc2l6ZSkgYW5kIGJ5IHtAbGluayBBcHBpdW1UcmFuc3BvcnR9XG4gICAqIChgdGFrZVNjcmVlbnNob3RgLCBhbHdheXMgdGhlIGRldmljZSdzIG5hdGl2ZSBmcmFtZWJ1ZmZlciBcdTIwMTQgdGhlIHNpemUga25vYnNcbiAgICogYXJlIGlnbm9yZWQsIHNvIGEgbW9iaWxlIGNhcHR1cmUgaXMgc2l6ZWQgYnkgY2hvb3NpbmcgYW4gQVZEIHdpdGggdGhlIHdhbnRlZFxuICAgKiBzY3JlZW4gZ2VvbWV0cnkpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggd2luZG93IHRvIGNhcHR1cmUsIGFuZCB0aGUgZXhhY3Qgc2l6ZSB0byBjYXB0dXJlIGl0IGF0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICAgKi9cbiAgY2FwdHVyZVNjcmVlbnNob3Q/KHBhcmFtczogQ2FwdHVyZVNjcmVlbnNob3RQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBvZiB0cmFuc3BvcnQgcmVzb3VyY2VzIChlLmcuIFdlYlNvY2tldCBjb25uZWN0aW9ucywgQXBwaXVtIHNlc3Npb25zKS5cbiAgICovXG4gIGRpc3Bvc2U/KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzIGRpc3Bvc2FsIGZvciB1c2UgaW4gYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMgd2hlcmVcbiAgICogYXN5bmMgd29yayBpcyBub3QgcG9zc2libGUuXG4gICAqXG4gICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgcGVyZm9ybSBvbmx5IHN5bmNocm9ub3VzIGNsZWFudXAgaGVyZSAoZS5nLiBraWxsaW5nXG4gICAqIGNoaWxkIHByb2Nlc3NlcykuIEFzeW5jIG9wZXJhdGlvbnMgbGlrZSB1bnJlZ2lzdGVyaW5nIHZhdWx0cyBhcmUgc2tpcHBlZC5cbiAgICovXG4gIGRpc3Bvc2VTeW5jPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gc3RyaW5nIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogcmF3IHN0cmluZyByZXN1bHQuXG4gICAqXG4gICAqIFRoZSB0cmFuc3BvcnQgbm9ybWFsaXplcyB0aGUgb3V0cHV0IFx1MjAxNCBzdHJpcHBpbmcgdHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzXG4gICAqIGFuZCBoYW5kbGluZyB0cmFuc3BvcnQtc3BlY2lmaWMgZXJyb3JzIFx1MjAxNCBzbyBjYWxsZXJzIHJlY2VpdmUgYSBjbGVhbiByZXN1bHRcbiAgICogc3RyaW5nIChlLmcuIGEgSlNPTiBzdHJpbmcsIG9yIGAobm8gb3V0cHV0KWApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uICh0eXBpY2FsbHkgYW4gYXN5bmMgSUlGRSkuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zIGluY2x1ZGluZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIFRoZSByYXcgcmVzdWx0IHN0cmluZyBmcm9tIE9ic2lkaWFuLlxuICAgKi9cbiAgZXZhbHVhdGUoZXhwcmVzc2lvbjogc3RyaW5nLCBvcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCB0YXJnZXRzIGEgbW9iaWxlIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCwgZGVza3RvcC1vbmx5IHBsdWdpbnMgKHdpdGggYGlzRGVza3RvcE9ubHk6IHRydWVgIGluIG1hbmlmZXN0KVxuICAgKiB3aWxsIHJlZnVzZSB0byBydW4gaW50ZWdyYXRpb24gdGVzdHMuXG4gICAqL1xuICBpc01vYmlsZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUnVucyB0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZmxpZ2h0IGNoZWNrcyBiZWZvcmUgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIHRoZSBDTEkgdHJhbnNwb3J0IHZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsXG4gICAqIHRoZSBDTEkgaXMgZW5hYmxlZCwgYW5kIHRoZSBDTEkgYmluYXJ5IGlzIGluIFBBVEguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgZmlsZXMgaW50byBhIHZhdWx0IGRpcmVjdG9yeSBvbiB0aGUgdGFyZ2V0IGRldmljZS5cbiAgICpcbiAgICogT24gZGVza3RvcCB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZSBsb2NhbCBmaWxlc3lzdGVtIGRpcmVjdGx5KS5cbiAgICogT24gbW9iaWxlIHRoaXMgdXNlcyB0aGUgZGV2aWNlJ3MgZmlsZSB0cmFuc2ZlciBtZWNoYW5pc20gKGUuZy4gQXBwaXVtIGBwdXNoRmlsZWApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzLlxuICAgKi9cbiAgcHVzaEZpbGVzPyh2YXVsdFBhdGg6IHN0cmluZywgZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmVhZHMgdGhlIG5hdGl2ZSBjb25zb2xlL2Vycm9yIG91dHB1dCBjYXB0dXJlZCBzaW5jZSB0aGUgbWF0Y2hpbmdcbiAgICoge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IGNhbGwuXG4gICAqXG4gICAqIEEgYm91bmRlZCwgcG9zdC1ob2MsIGZhaWx1cmUtcGF0aC1vbmx5IGR1bXAgXHUyMDE0IG5vdCBhIGxpdmUgbW9uaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZSAtIFRoZSBoYW5kbGUgcmV0dXJuZWQgYnkge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmV9IChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgd2FzIHVuc3VwcG9ydGVkKS5cbiAgICogQHJldHVybnMgVGhlIGNhcHR1cmVkIGNvbnNvbGUvZXJyb3IgdGV4dCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB1bnN1cHBvcnRlZCBvciBub3RoaW5nIHJlbGV2YW50IHdhcyBsb2dnZWQuXG4gICAqL1xuICByZWFkQ29uc29sZUNhcHR1cmVTaW5jZT8oaGFuZGxlOiBDb25zb2xlQ2FwdHVyZUhhbmRsZSB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgcGF0aCBzbyBPYnNpZGlhbiBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBPbiBkZXNrdG9wOiB1c2VzIEVsZWN0cm9uIElQQyB0byBvcGVuIHRoZSB2YXVsdCBhbmQgcG9sbHMgZm9yIHJlYWRpbmVzcy5cbiAgICogT24gbW9iaWxlOiBwdXNoZXMgdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSBhbmQgcmVzdGFydHMgdGhlIGFwcC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBwYXRoIGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIE9uIGRlc2t0b3A6IGNsb3NlcyB0aGUgdmF1bHQgd2luZG93IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHJlZ2lzdHJ5LlxuICAgKiBPbiBtb2JpbGU6IHJlbW92ZXMgdmF1bHQgZmlsZXMgZnJvbSB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmV2YWx1YXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRFdmFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpIGZvciB0aGUgZXZhbHVhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGV2YWx1YXRpb24gY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Defines the transport interface for communicating with a running Obsidian instance.
|
|
5
5
|
*/
|
|
6
|
+
import type { CaptureScreenshotParams } from './capture-screenshot.cjs';
|
|
6
7
|
/**
|
|
7
8
|
* An opaque handle identifying a console-capture window opened by
|
|
8
9
|
* {@link ObsidianTransport.beginConsoleCapture} and consumed by
|
|
@@ -40,6 +41,20 @@ export interface ObsidianTransport {
|
|
|
40
41
|
* @returns An opaque handle to pass to {@link ObsidianTransport.readConsoleCaptureSince}, or `undefined` when unsupported.
|
|
41
42
|
*/
|
|
42
43
|
beginConsoleCapture?(): Promise<ConsoleCaptureHandle | undefined>;
|
|
44
|
+
/**
|
|
45
|
+
* Captures a PNG screenshot of the running Obsidian instance.
|
|
46
|
+
*
|
|
47
|
+
* Optional and platform-specific, like the other members here. Implemented by
|
|
48
|
+
* {@link DesktopCdpTransport} (CDP `Page.captureScreenshot`, optionally with
|
|
49
|
+
* the viewport pinned to an exact size) and by {@link AppiumTransport}
|
|
50
|
+
* (`takeScreenshot`, always the device's native framebuffer — the size knobs
|
|
51
|
+
* are ignored, so a mobile capture is sized by choosing an AVD with the wanted
|
|
52
|
+
* screen geometry).
|
|
53
|
+
*
|
|
54
|
+
* @param params - Which window to capture, and the exact size to capture it at.
|
|
55
|
+
* @returns A {@link Promise} that resolves to the raw PNG bytes.
|
|
56
|
+
*/
|
|
57
|
+
captureScreenshot?(params: CaptureScreenshotParams): Promise<Uint8Array>;
|
|
43
58
|
/**
|
|
44
59
|
* Disposes of transport resources (e.g. WebSocket connections, Appium sessions).
|
|
45
60
|
*/
|