obsidian-integration-testing 12.1.2 → 12.3.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 +1 -5
- package/dist/lib/cjs/app-config.cjs +137 -0
- package/dist/lib/cjs/app-config.d.cts +190 -0
- package/dist/lib/cjs/appium-session-config.cjs +7 -1
- package/dist/lib/cjs/appium-session-config.d.cts +20 -0
- package/dist/lib/cjs/cdp-command-timeout-error.cjs +50 -0
- package/dist/lib/cjs/cdp-command-timeout-error.d.cts +48 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/emulator-arguments.cjs +19 -3
- package/dist/lib/cjs/emulator-arguments.d.cts +44 -0
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/emulator-marker.cjs +169 -0
- package/dist/lib/cjs/emulator-marker.d.cts +224 -0
- package/dist/lib/cjs/emulator-reaper.cjs +248 -0
- package/dist/lib/cjs/emulator-reaper.d.cts +225 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +312 -0
- package/dist/lib/cjs/emulator-reclaim.d.cts +179 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.cjs +61 -0
- package/dist/lib/cjs/eval-cap-exceeded-error.d.cts +92 -0
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/global-setup-core.cjs +2 -3
- package/dist/lib/cjs/index.cjs +21 -1
- package/dist/lib/cjs/index.d.cts +7 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +7 -2
- package/dist/lib/cjs/setup-lock.cjs +56 -8
- package/dist/lib/cjs/setup-lock.d.cts +53 -0
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/transport-appium.cjs +70 -5
- package/dist/lib/cjs/transport-appium.d.cts +35 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +98 -19
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-factory.cjs +297 -190
- package/dist/lib/cjs/transport-factory.d.cts +15 -0
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +38 -1
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/app-config.d.mts +190 -0
- package/dist/lib/esm/app-config.mjs +110 -0
- package/dist/lib/esm/appium-session-config.d.mts +20 -0
- package/dist/lib/esm/appium-session-config.mjs +6 -1
- package/dist/lib/esm/cdp-command-timeout-error.d.mts +48 -0
- package/dist/lib/esm/cdp-command-timeout-error.mjs +26 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/emulator-arguments.d.mts +44 -0
- package/dist/lib/esm/emulator-arguments.mjs +16 -2
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/emulator-marker.d.mts +224 -0
- package/dist/lib/esm/emulator-marker.mjs +134 -0
- package/dist/lib/esm/emulator-reaper.d.mts +225 -0
- package/dist/lib/esm/emulator-reaper.mjs +211 -0
- package/dist/lib/esm/emulator-reclaim.d.mts +179 -0
- package/dist/lib/esm/emulator-reclaim.mjs +291 -0
- package/dist/lib/esm/eval-cap-exceeded-error.d.mts +92 -0
- package/dist/lib/esm/eval-cap-exceeded-error.mjs +36 -0
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/global-setup-core.mjs +6 -4
- package/dist/lib/esm/index.d.mts +7 -0
- package/dist/lib/esm/index.mjs +21 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +7 -2
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/setup-lock.d.mts +53 -0
- package/dist/lib/esm/setup-lock.mjs +52 -7
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/transport-appium.d.mts +35 -0
- package/dist/lib/esm/transport-appium.mjs +73 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +98 -19
- package/dist/lib/esm/transport-factory.d.mts +15 -0
- package/dist/lib/esm/transport-factory.mjs +305 -184
- package/dist/lib/esm/transport-options.d.mts +38 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +4 -4
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const SCRIPT_TIMEOUT_PATTERN = /script\s*timeout/i;
|
|
2
|
+
class EvalCapExceededError extends Error {
|
|
3
|
+
/**
|
|
4
|
+
The per-eval cap the closure outran, in milliseconds.
|
|
5
|
+
*/
|
|
6
|
+
capInMilliseconds;
|
|
7
|
+
/**
|
|
8
|
+
How the transport that enforced the cap was named in the message.
|
|
9
|
+
*/
|
|
10
|
+
transportName;
|
|
11
|
+
/**
|
|
12
|
+
* Creates the error from the cap, the transport, and the raw error it replaces.
|
|
13
|
+
*
|
|
14
|
+
* @param params - The cap, the transport, the option that sets the cap, and the underlying error.
|
|
15
|
+
*/
|
|
16
|
+
constructor(params) {
|
|
17
|
+
super(buildMessage(params), { cause: params.cause });
|
|
18
|
+
this.name = "EvalCapExceededError";
|
|
19
|
+
this.capInMilliseconds = params.capInMilliseconds;
|
|
20
|
+
this.transportName = params.transportName;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function isScriptTimeoutError(error) {
|
|
24
|
+
if (!(error instanceof Error)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return SCRIPT_TIMEOUT_PATTERN.test(error.message) || SCRIPT_TIMEOUT_PATTERN.test(error.name);
|
|
28
|
+
}
|
|
29
|
+
function buildMessage(params) {
|
|
30
|
+
return `A single evalInObsidian closure ran longer than the ${params.transportName} per-eval cap of ${String(params.capInMilliseconds)}ms, so it was killed mid-flight. This is a property of the closure, not of the device or the app: everything awaited inside one closure shares that one budget, including every \`lib.waitUntil\` timeout and every settle \`sleep\`. Do the waiting from Node instead \u2014 \`pollInObsidian\` runs a short \`poll\` closure repeatedly until a Node-side \`until\` accepts, so no single eval is ever long. Raise \`${params.optionName}\` only for a closure that genuinely cannot be split.`;
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
EvalCapExceededError,
|
|
34
|
+
isScriptTimeoutError
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtY2FwLWV4Y2VlZGVkLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIG9uZSBlcnJvciBib3RoIHRyYW5zcG9ydHMgcmFpc2Ugd2hlbiBhIHNpbmdsZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmVcbiAqIG91dHJ1bnMgdGhlIHBlci1ldmFsIGNhcCwgYW5kIHRoZSBwcmVkaWNhdGUgdGhhdCByZWNvZ25pemVzIHRoZSByYXcgdHJhbnNwb3J0XG4gKiBlcnJvciBpdCByZXBsYWNlcy5cbiAqXG4gKiBUaGUgY2FwIGl0c2VsZiBpcyBub3QgdGhlIHByb2JsZW0gdGhpcyBtb2R1bGUgc29sdmVzIFx1MjAxNCB0aGUgZGlhZ25vc2lzIGlzLlxuICogRGVza3RvcCBzdXJmYWNlcyB0aGUgb3ZlcnJ1biBhcyBhIGdlbmVyaWNcbiAqIGBDRFAgY29tbWFuZCB0aW1lZCBvdXQgLi4uIDogUnVudGltZS5ldmFsdWF0ZWAsIHdoaWNoIG5ldmVyIG5hbWVzIHRoZSB0ZXN0J3NcbiAqIG93biB3YWl0IGFuZCBzbyByZWFkcyBhcyBhIGJyb2tlbiBkZXZpY2Ugb3IgYSB3ZWRnZWQgYXBwIFx1MjAxNCBhIHBsdWdpbiByZWxlYXNlIHdhc1xuICogb25jZSBoZWxkIGZvciB0d28gZGF5cyBieSB0aGF0IHJlYWRpbmcsIHdpdGggYSBoZWFsdGh5IGVtdWxhdG9yIGJsYW1lZCBmb3JcbiAqIGhhdmluZyBubyBuZXR3b3JrLlxuICpcbiAqIEFuZHJvaWQgaXMgd29yc2UsIGJlY2F1c2UgaXQgc3VyZmFjZXMgTk9USElORy4gT24gYSBsaXZlIGVtdWxhdG9yIHRoZSBjbG9zdXJlXG4gKiB3YXMgbWVhc3VyZWQgY29tcGxldGluZyBpbiB0aGUgZ3Vlc3Qgb24gc2NoZWR1bGUgXHUyMDE0IHRpbWVycyBhcm1lZCBhdCAzMHMgYW5kIDQwcyBmaXJlZCB3aXRoaW5cbiAqIH4xM21zIG9mIG5vbWluYWwgb24gYSB2aXNpYmxlLCBmb2N1c2VkIHBhZ2UgXHUyMDE0IHdoaWxlIGl0cyBFeGVjdXRlIFNjcmlwdCByZXNwb25zZVxuICogbmV2ZXIgcmVhY2hlZCB0aGUgY2xpZW50LCBzbyB0aGUgY2FsbCBodW5nIHVudGlsIHdoaWNoZXZlciBvdXRlciBidWRnZXQgZ2F2ZSB1cFxuICogZmlyc3QuIEEgaGFuZyBuYW1lcyBub3RoaW5nIGF0IGFsbCwgd2hpY2ggaXMgd2h5IHRoZSBBbmRyb2lkIGNhcCBpcyBlbmZvcmNlZCBieVxuICogdGhlIHRyYW5zcG9ydCBvbiB0aGUgTm9kZSBzaWRlIHJhdGhlciB0aGFuIGJ5IHRoZSBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5XG4gKiBpdCBhbHNvIGRlY2xhcmVzIGFuZCB0aGF0IG5vdGhpbmcgYWN0cyBvbi5cbiAqXG4gKiBCb3RoIHRyYW5zcG9ydHMgdGhlcmVmb3JlIGZ1bm5lbCBpbnRvIHRoZSBtZXNzYWdlIGJlbG93LCB3aGljaCBzYXlzIHdoYXQgdGhlIGNhcFxuICogaXMsIHdoaWNoIHRyYW5zcG9ydCBlbmZvcmNlZCBpdCwgYW5kIHdoYXQgdG8gZG8gaW5zdGVhZC5cbiAqXG4gKiBBIGNsb3N1cmUgdGhhdCBuZWVkcyB0byB3YWl0IGxvbmdlciB0aGFuIHRoZSBjYXAgc2hvdWxkIG5vdCBiZSB3YWl0aW5nIGluc2lkZVxuICogT2JzaWRpYW4gYXQgYWxsLiBgcG9sbEluT2JzaWRpYW5gIGlzIHRoZSBzYW5jdGlvbmVkIHNoYXBlOiBzaG9ydCBjbG9zdXJlcywgYW5kXG4gKiB0aGUgd2FpdGluZyBkb25lIGZyb20gTm9kZS5cbiAqL1xuXG4vKlxuICogVGhlIFczQyBlcnJvciBjb2RlIGlzIHRoZSBzcGFjZWQgYHNjcmlwdCB0aW1lb3V0YCwgd2hpbGUgYSBjbGllbnQgdGhhdCB0dXJucyBpdCBpbnRvIGEgdHlwZSBzcGVsbHMgdGhlXG4gKiBTYW1lIHRoaW5nIGFzIGBTY3JpcHRUaW1lb3V0RXJyb3JgIFx1MjAxNCBoZW5jZSB0aGUgb3B0aW9uYWwgd2hpdGVzcGFjZSwgd2hpY2ggbGV0cyBvbmUgcGF0dGVybiByZWFkIGJvdGguXG4gKi9cbmNvbnN0IFNDUklQVF9USU1FT1VUX1BBVFRFUk4gPSAvc2NyaXB0XFxzKnRpbWVvdXQvaTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgRXZhbENhcEV4Y2VlZGVkRXJyb3J9J3MgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbENhcEV4Y2VlZGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgcGVyLWV2YWwgY2FwIHRoZSBjbG9zdXJlIG91dHJhbiwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGVycm9yLCBrZXB0IGFzIHRoZSBgY2F1c2VgIHNvIHRoZSByYXcgZGlhZ25vc2lzIGlzIG5vdCBsb3N0LlxuICAgKi9cbiAgcmVhZG9ubHkgY2F1c2U6IHVua25vd247XG5cbiAgLyoqXG4gIFRoZSBuYW1lIG9mIHRoZSBvcHRpb24gdGhhdCBzZXRzIHRoZSBjYXAgb24gdGhpcyB0cmFuc3BvcnQsIHNvIHRoZSBtZXNzYWdlIGNhbiBuYW1lIHRoZSByZWFsIGtub2IuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEhvdyB0byByZWZlciB0byB0aGUgdHJhbnNwb3J0IHRoYXQgZW5mb3JjZWQgdGhlIGNhcCwgZS5nLiBgJ0FuZHJvaWQgKEFwcGl1bSknYC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBvbmUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlIHJhbiBsb25nZXIgdGhhbiB0aGUgdHJhbnNwb3J0J3NcbiAqIHBlci1ldmFsIGNhcC5cbiAqXG4gKiBDYXJyaWVzIHRoZSBjYXAgYW5kIHRoZSB0cmFuc3BvcnQgc28gYSBjYWxsZXIgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaCwgYW5kIHRoZVxuICogb3JpZ2luYWwgdHJhbnNwb3J0IGVycm9yIGFzIGBjYXVzZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmFsQ2FwRXhjZWVkZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFRoZSBwZXItZXZhbCBjYXAgdGhlIGNsb3N1cmUgb3V0cmFuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2FwSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgSG93IHRoZSB0cmFuc3BvcnQgdGhhdCBlbmZvcmNlZCB0aGUgY2FwIHdhcyBuYW1lZCBpbiB0aGUgbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFuc3BvcnROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGVycm9yIGZyb20gdGhlIGNhcCwgdGhlIHRyYW5zcG9ydCwgYW5kIHRoZSByYXcgZXJyb3IgaXQgcmVwbGFjZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY2FwLCB0aGUgdHJhbnNwb3J0LCB0aGUgb3B0aW9uIHRoYXQgc2V0cyB0aGUgY2FwLCBhbmQgdGhlIHVuZGVybHlpbmcgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBFdmFsQ2FwRXhjZWVkZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoYnVpbGRNZXNzYWdlKHBhcmFtcyksIHsgY2F1c2U6IHBhcmFtcy5jYXVzZSB9KTtcbiAgICB0aGlzLm5hbWUgPSAnRXZhbENhcEV4Y2VlZGVkRXJyb3InO1xuICAgIHRoaXMuY2FwSW5NaWxsaXNlY29uZHMgPSBwYXJhbXMuY2FwSW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy50cmFuc3BvcnROYW1lID0gcGFyYW1zLnRyYW5zcG9ydE5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGVycm9yIGlzIGEgV2ViRHJpdmVyIHNjcmlwdCB0aW1lb3V0IFx1MjAxNCB0aGUgVzNDIGVycm9yIGEgZHJpdmVyIHdvdWxkXG4gKiByYWlzZSBpZiBpdCBlbmZvcmNlZCBgdGltZW91dHMuc2NyaXB0YC5cbiAqXG4gKiBNYXRjaGVkIG9uIHRoZSBtZXNzYWdlIHJhdGhlciB0aGFuIG9uIGEgdHlwZSwgYmVjYXVzZSB0aGUgZXJyb3IgYXJyaXZlcyBhcyBhXG4gKiBnZW5lcmljIGBXZWJEcml2ZXJFcnJvcmAgd2hvc2Ugb25seSBkaXN0aW5ndWlzaGluZyBtYXJrIGlzIHRoZSBXM0MgZXJyb3IgY29kZVxuICogaW4gaXRzIHRleHQuXG4gKlxuICogKipUaGlzIGRyaXZlciBuZXZlciByYWlzZXMgaXQuKiogVWlBdXRvbWF0b3IyIHdhcyBtZWFzdXJlZCBhY2NlcHRpbmcgdGhlXG4gKiBjYXBhYmlsaXR5LCByZXBvcnRpbmcgaXQgYmFjaywgYW5kIGVuZm9yY2luZyBub3RoaW5nLiBUaGUgcHJlZGljYXRlIGlzIGtlcHRcbiAqIGJlY2F1c2UgaXQgY29zdHMgbm90aGluZywgaXQgaXMgdGhlIHJpZ2h0IHRyYW5zbGF0aW9uIGlmIGEgZnV0dXJlIGRyaXZlciBkb2VzXG4gKiBlbmZvcmNlIHRoZSBjYXBhYmlsaXR5LCBhbmQgaXQga2VlcHMgb25lIGVycm9yIGNvdmVyaW5nIG9uZSBjb25kaXRpb24gb24gYm90aFxuICogdHJhbnNwb3J0cyBcdTIwMTQgYnV0IHRoZSBBbmRyb2lkIGNhcCBpcyBlbmZvcmNlZCBOb2RlLXNpZGUsIGFuZCB0aGlzIGlzIG5vdCB3aGF0XG4gKiBlbmZvcmNlcyBpdC5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgZXJyb3IgdGhyb3duIGJ5IHRoZSB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZXJyb3IgaXMgYSBzY3JpcHQgdGltZW91dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2NyaXB0VGltZW91dEVycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIFNDUklQVF9USU1FT1VUX1BBVFRFUk4udGVzdChlcnJvci5tZXNzYWdlKSB8fCBTQ1JJUFRfVElNRU9VVF9QQVRURVJOLnRlc3QoZXJyb3IubmFtZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzaGFyZWQgbWVzc2FnZSBib3RoIHRyYW5zcG9ydHMgcmVwb3J0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY2FwLCB0aGUgdHJhbnNwb3J0LCBhbmQgdGhlIG9wdGlvbiB0aGF0IHNldHMgdGhlIGNhcC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBidWlsZE1lc3NhZ2UocGFyYW1zOiBFdmFsQ2FwRXhjZWVkZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBBIHNpbmdsZSBldmFsSW5PYnNpZGlhbiBjbG9zdXJlIHJhbiBsb25nZXIgdGhhbiB0aGUgJHtwYXJhbXMudHJhbnNwb3J0TmFtZX0gcGVyLWV2YWwgY2FwIG9mICR7U3RyaW5nKHBhcmFtcy5jYXBJbk1pbGxpc2Vjb25kcyl9bXMsIHNvIGl0IHdhcyBraWxsZWQgbWlkLWZsaWdodC4gVGhpcyBpcyBhIHByb3BlcnR5IG9mIHRoZSBjbG9zdXJlLCBub3Qgb2YgdGhlIGRldmljZSBvciB0aGUgYXBwOiBgXG4gICAgKyAnZXZlcnl0aGluZyBhd2FpdGVkIGluc2lkZSBvbmUgY2xvc3VyZSBzaGFyZXMgdGhhdCBvbmUgYnVkZ2V0LCBpbmNsdWRpbmcgZXZlcnkgYGxpYi53YWl0VW50aWxgIHRpbWVvdXQgJ1xuICAgICsgJ2FuZCBldmVyeSBzZXR0bGUgYHNsZWVwYC4gRG8gdGhlIHdhaXRpbmcgZnJvbSBOb2RlIGluc3RlYWQgXHUyMDE0IGBwb2xsSW5PYnNpZGlhbmAgcnVucyBhIHNob3J0IGBwb2xsYCAnXG4gICAgKyAnY2xvc3VyZSByZXBlYXRlZGx5IHVudGlsIGEgTm9kZS1zaWRlIGB1bnRpbGAgYWNjZXB0cywgc28gbm8gc2luZ2xlIGV2YWwgaXMgZXZlciBsb25nLiBSYWlzZSAnXG4gICAgKyBgXFxgJHtwYXJhbXMub3B0aW9uTmFtZX1cXGAgb25seSBmb3IgYSBjbG9zdXJlIHRoYXQgZ2VudWluZWx5IGNhbm5vdCBiZSBzcGxpdC5gO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBa0NBLE1BQU0seUJBQXlCO0FBa0N4QixNQUFNLDZCQUE2QixNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxRQUErQztBQUNoRSxVQUFNLGFBQWEsTUFBTSxHQUFHLEVBQUUsT0FBTyxPQUFPLE1BQU0sQ0FBQztBQUNuRCxTQUFLLE9BQU87QUFDWixTQUFLLG9CQUFvQixPQUFPO0FBQ2hDLFNBQUssZ0JBQWdCLE9BQU87QUFBQSxFQUM5QjtBQUNGO0FBb0JPLFNBQVMscUJBQXFCLE9BQXlCO0FBQzVELE1BQUksRUFBRSxpQkFBaUIsUUFBUTtBQUM3QixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sdUJBQXVCLEtBQUssTUFBTSxPQUFPLEtBQUssdUJBQXVCLEtBQUssTUFBTSxJQUFJO0FBQzdGO0FBUUEsU0FBUyxhQUFhLFFBQXVEO0FBQzNFLFNBQU8sdURBQXVELE9BQU8sYUFBYSxvQkFBb0IsT0FBTyxPQUFPLGlCQUFpQixDQUFDLDBaQUk3SCxPQUFPLFVBQVU7QUFDNUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* The per-eval cap: how long a single `evalInObsidian` closure may run before
|
|
5
|
+
* the transport carrying it gives up.
|
|
6
|
+
*
|
|
7
|
+
* It lives in its own module, and is re-exported from the package root, because
|
|
8
|
+
* it is the single most load-bearing number a test author has to respect — and
|
|
9
|
+
* until this module existed there was nothing to import. Both transports held
|
|
10
|
+
* the same 30s privately, so every consumer that needed to size a closure
|
|
11
|
+
* restated it as a literal with a comment saying where the number came from.
|
|
12
|
+
* That is a mirror nothing maintains: raise a cap here and every restatement is
|
|
13
|
+
* silently wrong in the direction that produces the unreadable failure, because
|
|
14
|
+
* the consumer goes on believing it has headroom it no longer has.
|
|
15
|
+
*
|
|
16
|
+
* **The two transports share this ONE constant rather than agreeing by
|
|
17
|
+
* coincidence.** They enforce it through different knobs — desktop bounds the
|
|
18
|
+
* `Runtime.evaluate` CDP command (`commandTimeoutInMilliseconds`), Android
|
|
19
|
+
* bounds the Execute Script call Node-side (`scriptTimeoutInMilliseconds`) —
|
|
20
|
+
* but the knobs are two implementations of one policy, not two policies that
|
|
21
|
+
* happen to agree. A reader of either default now sees which it is.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* The default per-eval cap, in milliseconds: the budget one `evalInObsidian`
|
|
25
|
+
* closure has to fit inside.
|
|
26
|
+
*
|
|
27
|
+
* Everything awaited inside a single closure shares this one budget — every
|
|
28
|
+
* `lib.waitUntil` timeout and every settle `sleep` — so a closure's declared
|
|
29
|
+
* waits have to sum to less than this, not merely be individually shorter.
|
|
30
|
+
*
|
|
31
|
+
* An overrun is reported as `EvalCapExceededError`, which names the cap, the
|
|
32
|
+
* transport that enforced it, and the option that sets it. Raising that option
|
|
33
|
+
* is almost never the right answer: a closure that needs to wait longer than
|
|
34
|
+
* this should not be waiting inside Obsidian at all. `pollInObsidian` is the
|
|
35
|
+
* sanctioned shape — short closures, with the waiting done from Node — and it
|
|
36
|
+
* exists precisely so no single eval is ever long.
|
|
37
|
+
*
|
|
38
|
+
* Both transports default to this value: it is what
|
|
39
|
+
* `ObsidianCdpTransportOptions.commandTimeoutInMilliseconds` and
|
|
40
|
+
* `ObsidianAndroidAppiumTransportOptions.scriptTimeoutInMilliseconds` fall back
|
|
41
|
+
* to when they are omitted.
|
|
42
|
+
*/
|
|
43
|
+
export declare const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 30000;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 3e4;
|
|
2
|
+
export {
|
|
3
|
+
DEFAULT_EVAL_CAP_IN_MILLISECONDS
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtY2FwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1ldmFsIGNhcDogaG93IGxvbmcgYSBzaW5nbGUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlIG1heSBydW4gYmVmb3JlXG4gKiB0aGUgdHJhbnNwb3J0IGNhcnJ5aW5nIGl0IGdpdmVzIHVwLlxuICpcbiAqIEl0IGxpdmVzIGluIGl0cyBvd24gbW9kdWxlLCBhbmQgaXMgcmUtZXhwb3J0ZWQgZnJvbSB0aGUgcGFja2FnZSByb290LCBiZWNhdXNlXG4gKiBpdCBpcyB0aGUgc2luZ2xlIG1vc3QgbG9hZC1iZWFyaW5nIG51bWJlciBhIHRlc3QgYXV0aG9yIGhhcyB0byByZXNwZWN0IFx1MjAxNCBhbmRcbiAqIHVudGlsIHRoaXMgbW9kdWxlIGV4aXN0ZWQgdGhlcmUgd2FzIG5vdGhpbmcgdG8gaW1wb3J0LiBCb3RoIHRyYW5zcG9ydHMgaGVsZFxuICogdGhlIHNhbWUgMzBzIHByaXZhdGVseSwgc28gZXZlcnkgY29uc3VtZXIgdGhhdCBuZWVkZWQgdG8gc2l6ZSBhIGNsb3N1cmVcbiAqIHJlc3RhdGVkIGl0IGFzIGEgbGl0ZXJhbCB3aXRoIGEgY29tbWVudCBzYXlpbmcgd2hlcmUgdGhlIG51bWJlciBjYW1lIGZyb20uXG4gKiBUaGF0IGlzIGEgbWlycm9yIG5vdGhpbmcgbWFpbnRhaW5zOiByYWlzZSBhIGNhcCBoZXJlIGFuZCBldmVyeSByZXN0YXRlbWVudCBpc1xuICogc2lsZW50bHkgd3JvbmcgaW4gdGhlIGRpcmVjdGlvbiB0aGF0IHByb2R1Y2VzIHRoZSB1bnJlYWRhYmxlIGZhaWx1cmUsIGJlY2F1c2VcbiAqIHRoZSBjb25zdW1lciBnb2VzIG9uIGJlbGlldmluZyBpdCBoYXMgaGVhZHJvb20gaXQgbm8gbG9uZ2VyIGhhcy5cbiAqXG4gKiAqKlRoZSB0d28gdHJhbnNwb3J0cyBzaGFyZSB0aGlzIE9ORSBjb25zdGFudCByYXRoZXIgdGhhbiBhZ3JlZWluZyBieVxuICogY29pbmNpZGVuY2UuKiogVGhleSBlbmZvcmNlIGl0IHRocm91Z2ggZGlmZmVyZW50IGtub2JzIFx1MjAxNCBkZXNrdG9wIGJvdW5kcyB0aGVcbiAqIGBSdW50aW1lLmV2YWx1YXRlYCBDRFAgY29tbWFuZCAoYGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHNgKSwgQW5kcm9pZFxuICogYm91bmRzIHRoZSBFeGVjdXRlIFNjcmlwdCBjYWxsIE5vZGUtc2lkZSAoYHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kc2ApIFx1MjAxNFxuICogYnV0IHRoZSBrbm9icyBhcmUgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBvbmUgcG9saWN5LCBub3QgdHdvIHBvbGljaWVzIHRoYXRcbiAqIGhhcHBlbiB0byBhZ3JlZS4gQSByZWFkZXIgb2YgZWl0aGVyIGRlZmF1bHQgbm93IHNlZXMgd2hpY2ggaXQgaXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBwZXItZXZhbCBjYXAsIGluIG1pbGxpc2Vjb25kczogdGhlIGJ1ZGdldCBvbmUgYGV2YWxJbk9ic2lkaWFuYFxuICogY2xvc3VyZSBoYXMgdG8gZml0IGluc2lkZS5cbiAqXG4gKiBFdmVyeXRoaW5nIGF3YWl0ZWQgaW5zaWRlIGEgc2luZ2xlIGNsb3N1cmUgc2hhcmVzIHRoaXMgb25lIGJ1ZGdldCBcdTIwMTQgZXZlcnlcbiAqIGBsaWIud2FpdFVudGlsYCB0aW1lb3V0IGFuZCBldmVyeSBzZXR0bGUgYHNsZWVwYCBcdTIwMTQgc28gYSBjbG9zdXJlJ3MgZGVjbGFyZWRcbiAqIHdhaXRzIGhhdmUgdG8gc3VtIHRvIGxlc3MgdGhhbiB0aGlzLCBub3QgbWVyZWx5IGJlIGluZGl2aWR1YWxseSBzaG9ydGVyLlxuICpcbiAqIEFuIG92ZXJydW4gaXMgcmVwb3J0ZWQgYXMgYEV2YWxDYXBFeGNlZWRlZEVycm9yYCwgd2hpY2ggbmFtZXMgdGhlIGNhcCwgdGhlXG4gKiB0cmFuc3BvcnQgdGhhdCBlbmZvcmNlZCBpdCwgYW5kIHRoZSBvcHRpb24gdGhhdCBzZXRzIGl0LiBSYWlzaW5nIHRoYXQgb3B0aW9uXG4gKiBpcyBhbG1vc3QgbmV2ZXIgdGhlIHJpZ2h0IGFuc3dlcjogYSBjbG9zdXJlIHRoYXQgbmVlZHMgdG8gd2FpdCBsb25nZXIgdGhhblxuICogdGhpcyBzaG91bGQgbm90IGJlIHdhaXRpbmcgaW5zaWRlIE9ic2lkaWFuIGF0IGFsbC4gYHBvbGxJbk9ic2lkaWFuYCBpcyB0aGVcbiAqIHNhbmN0aW9uZWQgc2hhcGUgXHUyMDE0IHNob3J0IGNsb3N1cmVzLCB3aXRoIHRoZSB3YWl0aW5nIGRvbmUgZnJvbSBOb2RlIFx1MjAxNCBhbmQgaXRcbiAqIGV4aXN0cyBwcmVjaXNlbHkgc28gbm8gc2luZ2xlIGV2YWwgaXMgZXZlciBsb25nLlxuICpcbiAqIEJvdGggdHJhbnNwb3J0cyBkZWZhdWx0IHRvIHRoaXMgdmFsdWU6IGl0IGlzIHdoYXRcbiAqIGBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kc2AgYW5kXG4gKiBgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHNgIGZhbGwgYmFja1xuICogdG8gd2hlbiB0aGV5IGFyZSBvbWl0dGVkLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQ08sTUFBTSxtQ0FBbUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -33,7 +33,10 @@ import {
|
|
|
33
33
|
resolvePluginEnableRetryDelayInMilliseconds,
|
|
34
34
|
shouldRetryPluginEnable
|
|
35
35
|
} from "./plugin-enable-retry.mjs";
|
|
36
|
-
import {
|
|
36
|
+
import {
|
|
37
|
+
acquireSetupLock,
|
|
38
|
+
ANDROID_SETUP_LOCK_SCOPE
|
|
39
|
+
} from "./setup-lock.mjs";
|
|
37
40
|
import { TemporaryVault } from "./temporary-vault.mjs";
|
|
38
41
|
import { AppiumTransport } from "./transport-appium.mjs";
|
|
39
42
|
import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
|
|
@@ -51,7 +54,6 @@ const activeSetups = /* @__PURE__ */ new Set();
|
|
|
51
54
|
const disposedResults = /* @__PURE__ */ new WeakSet();
|
|
52
55
|
let isCleanupHandlerRegistered = false;
|
|
53
56
|
const setupLocks = /* @__PURE__ */ new Map();
|
|
54
|
-
const ANDROID_LOCK_SCOPE = "android";
|
|
55
57
|
async function coreSetup(params) {
|
|
56
58
|
const projectRoot = findProjectRoot();
|
|
57
59
|
const envFilePath = join(projectRoot, ".env");
|
|
@@ -288,7 +290,7 @@ function findProjectRoot() {
|
|
|
288
290
|
}
|
|
289
291
|
}
|
|
290
292
|
function getLockScope(transportOptions) {
|
|
291
|
-
return transportOptions?.type === "obsidian-android-appium" ?
|
|
293
|
+
return transportOptions?.type === "obsidian-android-appium" ? ANDROID_SETUP_LOCK_SCOPE : void 0;
|
|
292
294
|
}
|
|
293
295
|
function registerProcessCleanupHandler() {
|
|
294
296
|
if (isCleanupHandlerRegistered) {
|
|
@@ -420,4 +422,4 @@ export {
|
|
|
420
422
|
remapConfigDirectoryKeys,
|
|
421
423
|
resolveIntegrationTransportOptions
|
|
422
424
|
};
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgc3RhdFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBqb2luXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcywgeyBsb2FkRW52RmlsZSB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEVuYWJsZVBsdWdpblJlc3VsdCB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcbmltcG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IubWpzJztcbmltcG9ydCB7XG4gIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gIGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2Vcbn0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLm1qcyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi9lcnJvci10by1zdHJpbmcubWpzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnIH0gZnJvbSAnLi9oZWFkbGVzcy12YXVsdC1jb25maWcubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzLFxuICBzd2VlcEhvc3RMZWZ0b3ZlcnMsXG4gIHdpbGxTd2VlcExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQge1xuICBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50LFxuICByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzLFxuICBzaG91bGRSZXRyeVBsdWdpbkVuYWJsZVxufSBmcm9tICcuL3BsdWdpbi1lbmFibGUtcmV0cnkubWpzJztcbmltcG9ydCB7IGFjcXVpcmVTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQsXG4gIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeVxufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgeyBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0IH0gZnJvbSAnLi92YXVsdC1wbHVnaW4taW5zdGFsbC5tanMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG5jb25zdCBBTkRST0lEX0xPQ0tfU0NPUEUgPSAnYW5kcm9pZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIENvbW11bml0eS1wbHVnaW4gaWRzIHRvIGVuYWJsZSBpbiB0aGUgdmF1bHQgKippbiBhZGRpdGlvbiB0byoqIHRoZVxuICAgKiBwbHVnaW4tdW5kZXItdGVzdCwgYWZ0ZXIgaXQgaXMgZW5hYmxlZC4gRWFjaCBpZCdzIGJ1aWx0IGZpbGVzIG11c3QgYWxyZWFkeSBiZVxuICAgKiBwcmVzZW50IHVuZGVyIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgXHUyMDE0IHNlZWQgdGhlbSB2aWEge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX1cbiAgICogKGUuZy4gd2l0aCBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWApLiBFbmFibGluZyBnb2VzIHRocm91Z2ggdGhlIHNhbWVcbiAgICogcmV0cnkvbG9hZC12ZXJpZnkgcGF0aCBhcyB0aGUgcGx1Z2luLXVuZGVyLXRlc3QuIENvbXBvc2VzIHdpdGhcbiAgICogYGluc3RhbGxQbHVnaW46IGZhbHNlYCAoZW5hYmxlIGV4dHJhcyBpbnRvIGFuIG90aGVyd2lzZSBwbHVnaW4tbGVzcyB2YXVsdCkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDb21tdW5pdHlQbHVnaW5zPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBidWlsdCBwbHVnaW4gaW4gdGhlIHRlbXAgdmF1bHQuIERlZmF1bHRzXG4gICAqIHRvIGB0cnVlYC4gU2V0IHRvIGBmYWxzZWAgZm9yIGEgKipub24tcGx1Z2luKiogY29uc3VtZXIgKGUuZy4gYSB0eXBpbmdzXG4gICAqIGNyYXdsZXIpIHRoYXQgb25seSBuZWVkcyBhIHJlZ2lzdGVyZWQsIGVtcHR5IHZhdWx0IHRvIGBldmFsSW5PYnNpZGlhbmBcbiAgICogYWdhaW5zdDogdGhlIHBsdWdpbiBgZGlzdGAvYG1hbmlmZXN0Lmpzb25gIHJlYWQsIHRoZSBjb3B5IGludG8gdGhlIGNvbmZpZ1xuICAgKiBmb2xkZXIncyBgcGx1Z2lucy9gLCB0aGUgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHdyaXRlLCBhbmQgdGhlIGVuYWJsZSBzdGVwXG4gICAqIGFyZSBhbGwgc2tpcHBlZCwgd2hpbGUgdGhlIHRyYW5zcG9ydCwgdGVtcCB2YXVsdCwgcmVnaXN0cmF0aW9uLCBhbmRcbiAgICogd29ya2VyLWZhY2luZyBlbmRwb2ludCBwcm92aXNpb25pbmcgc3RpbGwgcnVuIHVuY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaWxlcyBhbmQgZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCAqKmJlZm9yZSoqIE9ic2lkaWFuIG9wZW5zIGl0LCBzb1xuICAgKiBpdHMgc3RhcnR1cCBzY2FuIGluZGV4ZXMgdGhlbSBpbiBvbmUgcGFzcyAoc2VlIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0pLlxuICAgKiBVc2UgdGhpcyBmb3IgbGFyZ2UgZml4dHVyZXMgXHUyMDE0IHdyaXRpbmcgdGhvdXNhbmRzIG9mIG5vdGVzIGFmdGVyIG9wZW4gYW5kXG4gICAqIGZvcmNpbmcgYSByZS1zY2FuIGlzIGZhciBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuXG4gICAqXG4gICAqIEtleXMgbmFtaW5nIHRoZSBjb25maWcgZm9sZGVyIGFyZSB3cml0dGVuIGFzIGAub2JzaWRpYW4vXHUyMDI2YDsgdW5kZXIgYVxuICAgKiBgY29uZmlnRGlyZWN0b3J5YCBvdmVycmlkZSB7QGxpbmsgcmVtYXBDb25maWdEaXJlY3RvcnlLZXlzfSByZWRpcmVjdHMgdGhlbSB0b1xuICAgKiB0aGUgZm9sZGVyIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IHJlYWQsIHNvIGEgbWFwIGRvZXMgbm90IGhhdmUgdG8gY2FycnkgYVxuICAgKiBzZWNvbmQgY29weSBvZiB0aGUgb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBwb3B1bGF0ZT86IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRyYW5zcG9ydCBvcHRpb25zLiBXaGVuIG9taXR0ZWQsIHVzZXMgYW4gb2ZmLXNjcmVlbiBvd25lZCBkZXNrdG9wIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKlxuICBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcG9yYXJ5VmF1bHQ6IFRlbXBvcmFyeVZhdWx0O1xuXG4gIC8qKlxuICBUaGUgdHJhbnNwb3J0IGluc3RhbmNlIHVzZWQgZHVyaW5nIHNldHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcyAoZS5nLiBgXCJvYnNpZGlhbi1jZHBcImApLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVBsdWdpbkludG9WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBDb3B5UGx1Z2luSW50b1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBjb25maWcgZm9sZGVyIHRoZSB2YXVsdCB3aWxsIHJlYWQsIHdoZW4gb3ZlcnJpZGRlbiBhd2F5IGZyb20gYC5vYnNpZGlhbmAgXHUyMDE0IHRoZSByZXNvbHZlZFxuICB7QGxpbmsgcmVzb2x2ZU93bmVkQ29uZmlnRGlyZWN0b3J5fSB2YWx1ZSwgd2hpY2ggaXMgYHVuZGVmaW5lZGAgZm9yIE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBjb25maWdEaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9qZWN0IHJvb3QgdG8gcmVzb2x2ZSB0aGUgYnVpbHQgcGx1Z2luIGZyb20uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgdGVtcCB2YXVsdCB0byBjb3B5IHRoZSBwbHVnaW4gaW50by5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdDtcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCAodXNlZCBmb3IgdGhlIG1vYmlsZS9kZXNrdG9wLW9ubHkgY29tcGF0aWJpbGl0eSBjaGVjaykuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnN9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zIHtcbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaWRzIG9mIHRoZSBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyB0byBlbmFibGUgKHRoZWlyIGJpbmFyaWVzIG11c3QgYWxyZWFkeSBiZSBpbiB0aGUgdmF1bHQpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbnMgd2VyZSBzZWVkZWQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdDtcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zIChzb3VyY2Ugb2YgdGhlIHBsdWdpbi1lbmFibGUgcmV0cnkga25vYnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luSW5WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBFbmFibGVQbHVnaW5JblZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0byBlbmFibGUuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgdGVtcCB2YXVsdCB0aGUgcGx1Z2luIHdhcyBjb3BpZWQgaW50by5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdDtcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zIChzb3VyY2Ugb2YgdGhlIHBsdWdpbi1lbmFibGUgcmV0cnkga25vYnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2tpcElmRGVza3RvcE9ubHl9LlxuICovXG5pbnRlcmZhY2UgU2tpcElmRGVza3RvcE9ubHlQYXJhbXMge1xuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9qZWN0IHJvb3QgdG8gcmVzb2x2ZSB0aGUgYnVpbHQgcGx1Z2luJ3MgbWFuaWZlc3QgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RSb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZXRoZXIgYSBwbHVnaW4gaXMgYmVpbmcgaW5zdGFsbGVkIGF0IGFsbCAtLSB0aGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrIHdoZW4gdGhlIHZhdWx0IHN0YXlzIGVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5zdGFsbFBsdWdpbjogYm9vbGVhbjtcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLCB3aG9zZSBkaXNjcmltaW5hbnQgc2F5cyB3aGV0aGVyIHRoaXMgcnVuIGlzIG1vYmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3dlZXBMZWZ0b3ZlcnN9LlxuICovXG5pbnRlcmZhY2UgU3dlZXBMZWZ0b3ZlcnNQYXJhbXMge1xuICAvKipcbiAgRGlyZWN0b3J5IG5hbWVzIHRvIGtlZXAgcmVnYXJkbGVzcyBvZiBhZ2UgKGUuZy4gYSBjb25jdXJyZW50IHNldHVwJ3MgdmF1bHQpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgV2hpY2ggZW5kIG9mIHRoZSBydW4gaXMgc3dlZXBpbmcsIGZvciB0aGUgbG9nIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IHBoYXNlOiAnc2V0dXAnIHwgJ3RlYXJkb3duJztcblxuICAvKipcbiAgVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zIChzb3VyY2Ugb2YgdGhlIHN3ZWVwIGtub2JzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNyZWF0ZXMgYW5kIHJlZ2lzdGVyc1xuICogYSB0ZW1wb3JhcnkgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kIFx1MjAxNCB1bmxlc3Mge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5pbnN0YWxsUGx1Z2lufVxuICogaXMgYGZhbHNlYCBcdTIwMTQgY29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byB0aGUgdmF1bHQgYW5kIGVuYWJsZXMgaXQuIFRoZVxuICogcGx1Z2luLWxlc3MgbW9kZSBzdGlsbCBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIHB1Ymxpc2hlcyBpdHNcbiAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQsIHNvIGEgbm9uLXBsdWdpbiBjb25zdW1lciByZXVzZXMgdGhlIHNhbWUgYXR0YWNoIHdpcmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucy50eXBlO1xuICBjb25zdCBzaG91bGRJbnN0YWxsUGx1Z2luID0gcGFyYW1zPy5pbnN0YWxsUGx1Z2luICE9PSBmYWxzZTtcblxuICAvLyBCZWZvcmUgdGhlIGxvY2ssIHRoZSBzd2VlcCBhbmQgYWJvdmUgYWxsIHRoZSB0cmFuc3BvcnQ6IGNyZWF0aW5nIGEgbW9iaWxlIHRyYW5zcG9ydCBib290cyB0aGUgQVZEIGFuZFxuICAvLyBBdXRvLXN0YXJ0cyBBcHBpdW0gKH43MCBzKSBvbmx5IHRvIHJlYWNoIHRoZSBzYW1lIGNvbmNsdXNpb24gZnJvbSBgdHJhbnNwb3J0LmlzTW9iaWxlYCBmdXJ0aGVyIGRvd24uXG4gIC8vIE5laXRoZXIgaW5wdXQgbmVlZHMgYSBkZXZpY2UgLS0gdGhlIG1hbmlmZXN0IGlzIG9uIGRpc2sgYW5kIHRoZSBkaXNjcmltaW5hbnQgYWxyZWFkeSBzYXlzIG1vYmlsZS5cbiAgYXdhaXQgc2tpcElmRGVza3RvcE9ubHkoeyBsYWJlbCwgcHJvamVjdFJvb3QsIHNob3VsZEluc3RhbGxQbHVnaW4sIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG5cbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBhd2FpdCBzd2VlcExlZnRvdmVycyh7IGxhYmVsLCBwaGFzZTogJ3NldHVwJywgdHJhbnNwb3J0T3B0aW9ucyB9KTtcblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGluZyB0cmFuc3BvcnQuLi5gKTtcbiAgICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUHJvamVjdCByb290OiAke3Byb2plY3RSb290fWApO1xuXG4gICAgdGVtcG9yYXJ5VmF1bHQgPSBuZXcgVGVtcG9yYXJ5VmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBvcmFyeVZhdWx0LnBhdGh9YCk7XG5cbiAgICAvKlxuICAgICAqIFdoaWNoIGZvbGRlciB0aGlzIHZhdWx0IHdpbGwgYWN0dWFsbHkgcmVhZCwgcmVzb2x2ZWQgb25jZSBhbmQgaGFuZGVkIHRvIGV2ZXJ5IHdyaXRlciBiZWxvdy5cbiAgICAgKiBFdmVyeSBwcmUtb3BlbiB3cml0ZSBoYXMgdG8gYWdyZWUgb24gaXQ6IG9uZSB0aGF0IGhhcmRjb2RlcyBgLm9ic2lkaWFuYCB1bmRlciBhbiBvdmVycmlkZSB3cml0ZXNcbiAgICAgKiBzb21ld2hlcmUgbm90aGluZyBsb29rcywgYW5kIG5vdGhpbmcgdGhyb3dzIHRvIHNheSBzby5cbiAgICAgKi9cbiAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSByZXNvbHZlT3duZWRDb25maWdEaXJlY3RvcnkodHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgICBsZXQgcGx1Z2luSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChzaG91bGRJbnN0YWxsUGx1Z2luKSB7XG4gICAgICBwbHVnaW5JZCA9IGF3YWl0IGNvcHlQbHVnaW5JbnRvVmF1bHQoeyBjb25maWdEaXJlY3RvcnksIGxhYmVsLCBwcm9qZWN0Um9vdCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNraXBwaW5nIHBsdWdpbiBpbnN0YWxsIChpbnN0YWxsUGx1Z2luOiBmYWxzZSkgXHUyMDE0IHJlZ2lzdGVyaW5nIGFuIGVtcHR5IHZhdWx0LmApO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/LnBvcHVsYXRlKSB7XG4gICAgICBjb25zdCBwb3B1bGF0ZSA9IHJlbWFwQ29uZmlnRGlyZWN0b3J5S2V5cyhwYXJhbXMucG9wdWxhdGUsIGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICBjb25zdCBlbnRyeUNvdW50ID0gT2JqZWN0LmtleXMocG9wdWxhdGUpLmxlbmd0aDtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQb3B1bGF0aW5nIHZhdWx0IHdpdGggJHtTdHJpbmcoZW50cnlDb3VudCl9IGVudHJpZXMgYmVmb3JlIG9wZW4uLi5gKTtcbiAgICAgIHRlbXBvcmFyeVZhdWx0LnBvcHVsYXRlKHBvcHVsYXRlKTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnKHtcbiAgICAgIGNvbmZpZ0RpcmVjdG9yeSxcbiAgICAgIGxhYmVsLFxuICAgICAgdmF1bHRQYXRoOiB0ZW1wb3JhcnlWYXVsdC5wYXRoXG4gICAgfSk7XG5cbiAgICAvLyBgcmVnaXN0ZXJgIHB1c2hlcyB0aGUgZGlyZWN0b3J5IHRvIHRoZSBkZXZpY2UgYmVmb3JlIHJlZ2lzdGVyaW5nIGl0LCBzbyBldmVyeSB3cml0ZSBhYm92ZSBcdTIwMTRcbiAgICAvLyBUaGUgcGx1Z2luIGNvcHksIHRoZSBwb3B1bGF0ZSBtYXAsIGFuZCB0aGUgaGVhZGxlc3MgY29uZmlnIGp1c3Qgd3JpdHRlbiBcdTIwMTQgcmVhY2hlcyB0aGUgYXBwLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBSZWdpc3RlcmluZyB2YXVsdC4uLmApO1xuICAgIGF3YWl0IHRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICBpZiAocGx1Z2luSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZW5hYmxlUGx1Z2luSW5WYXVsdCh7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMoe1xuICAgICAgbGFiZWwsXG4gICAgICBwbHVnaW5JZHM6IHBhcmFtcz8uZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyA/PyBbXSxcbiAgICAgIHRlbXBvcmFyeVZhdWx0LFxuICAgICAgdHJhbnNwb3J0LFxuICAgICAgdHJhbnNwb3J0T3B0aW9uc1xuICAgIH0pO1xuXG4gICAgY29uc3QgYXVnbWVudGVkT3B0aW9ucyA9IGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMsIHRyYW5zcG9ydCk7XG4gICAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wb3JhcnlWYXVsdCAmJiB0cmFuc3BvcnQpIHtcbiAgICAgICAgYXdhaXQgdGVtcG9yYXJ5VmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdHJhbnNwb3J0Py5kaXNwb3NlPy4oKTtcbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyBhIHdhaXRpbmcgcnVuIGNhbiBwcm9jZWVkIGV2ZW4gdGhvdWdoIHRoaXMgcnVuIGZhaWxlZC5cbiAgICBsb2NrPy5yZWxlYXNlKCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS5gKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQgfHwgZGlzcG9zZWRSZXN1bHRzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc3Bvc2VkUmVzdWx0cy5hZGQocmVzdWx0KTtcblxuICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRlYXJpbmcgZG93bi4uLmApO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVhcmRvd25Bc3luYyhyZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gQ2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmVTZXR1cHMuZGVsZXRlKHJlc3VsdCk7XG4gICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICB9XG5cbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnMoe1xuICAgIGV4Y2x1ZGVkTmFtZXM6IFsuLi5hY3RpdmVTZXR1cHNdLm1hcCgoYWN0aXZlU2V0dXApID0+IGJhc2VuYW1lKGFjdGl2ZVNldHVwLnRlbXBvcmFyeVZhdWx0LnBhdGgpKSxcbiAgICBsYWJlbDogcmVzdWx0LnRyYW5zcG9ydExhYmVsLFxuICAgIHBoYXNlOiAndGVhcmRvd24nLFxuICAgIHRyYW5zcG9ydE9wdGlvbnM6IHJlc3VsdC50cmFuc3BvcnRPcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZGlyZWN0cyBhIHBvcHVsYXRlIG1hcCdzIGNvbmZpZy1mb2xkZXIgZW50cmllcyB0byB0aGUgZm9sZGVyIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IHJlYWQuXG4gKlxuICogQSBwb3B1bGF0ZSBtYXAgbmFtZXMgaXRzIGRlc3RpbmF0aW9ucyB2YXVsdC1yZWxhdGl2ZSwgYW5kIGV2ZXJ5dGhpbmcgdGhhdCBidWlsZHMgb25lIFx1MjAxNCBpbmNsdWRpbmdcbiAqIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCwgd2hpY2ggc2VlZHMgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMgYW5kIGluamVjdGVkIGNvbW11bml0eSBwbHVnaW5zJ1xuICogYmluYXJpZXMgXHUyMDE0IHdyaXRlcyB0aGVtIHVuZGVyIGEgbGl0ZXJhbCBgLm9ic2lkaWFuL2AsIGJlY2F1c2UgdGhhdCBpcyB0aGUgZm9sZGVyIE9ic2lkaWFuIHVzZXMgd2hlbiBub3RoaW5nXG4gKiBvdmVycmlkZXMgaXQuIFVuZGVyIGEgYGNvbmZpZ0RpcmVjdG9yeWAgb3ZlcnJpZGUgdGhvc2UgZW50cmllcyBsYW5kIGluIGEgZm9sZGVyIHRoZSB2YXVsdCBuZXZlciBvcGVucywgYW5kXG4gKiB0aGUgcGx1Z2lucyBzZWVkZWQgdGhhdCB3YXkgY29tZSBiYWNrIGFzIHRoZSBnZW5lcmljIFwiZW5hYmxlZCBidXQgbm90IGxvYWRlZFwiIHdpdGggbm90aGluZyBuYW1pbmcgYSBjb25maWdcbiAqIGZvbGRlci4gUmV3cml0aW5nIHRoZSBrZXkgaGVyZSBmaXhlcyBldmVyeSBjb25zdW1lciBhdCBvbmNlIFx1MjAxNCBhIGhhbmQtd3JpdHRlbiBtYXAgYXMgbXVjaCBhcyBhIGRlbW8gdmF1bHQnc1xuICogXHUyMDE0IGFuZCBuZWVkcyBubyBzZWNvbmQgY29weSBvZiB0aGUgb3ZlcnJpZGUgZm9yIGEgY2FsbGVyIHRvIGtlZXAgaW4gc3luYyB3aXRoIHRoZWlyIHRyYW5zcG9ydCBvcHRpb25zLlxuICpcbiAqIFNhZmUgcmF0aGVyIHRoYW4gbWFnaWM6IHRoZSB2YXVsdCBpcyBvbmUgdGhlIGhhcm5lc3MgbWFkZSBmb3IgdGhpcyBydW4gYW5kIGhhcyBleGFjdGx5IG9uZSBjb25maWcgZm9sZGVyLFxuICogc28gdW5kZXIgYW4gb3ZlcnJpZGUgYSBgLm9ic2lkaWFuL2AgZW50cnkgaXMgZGVhZCB3ZWlnaHQgbm90aGluZyByZWFkcy4gT25seSBhIGxlYWRpbmcgYC5vYnNpZGlhbmAgcGF0aFxuICogU0VHTUVOVCBtb3ZlczsgYSBub3RlIHdob3NlIG5hbWUgbWVyZWx5IGNvbnRhaW5zIHRoZSBzdHJpbmcgZG9lcyBub3QuXG4gKlxuICogQHBhcmFtIHBvcHVsYXRlIC0gVGhlIGNvbnN1bWVyJ3MgcG9wdWxhdGUgbWFwLlxuICogQHBhcmFtIGNvbmZpZ0RpcmVjdG9yeSAtIFRoZSByZXNvbHZlZCBvdmVycmlkZSwgb3IgYHVuZGVmaW5lZGAgZm9yIE9ic2lkaWFuJ3MgZGVmYXVsdCAoYSBuby1vcCkuXG4gKiBAcmV0dXJucyBUaGUgbWFwIHdpdGggaXRzIGNvbmZpZy1mb2xkZXIga2V5cyByZWRpcmVjdGVkLCBvciB0aGUgb3JpZ2luYWwgbWFwIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBtb3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtYXBDb25maWdEaXJlY3RvcnlLZXlzKHBvcHVsYXRlOiBQb3B1bGF0ZUZpbGVzUGFyYW1zLCBjb25maWdEaXJlY3Rvcnk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBpZiAoY29uZmlnRGlyZWN0b3J5ID09PSB1bmRlZmluZWQgfHwgY29uZmlnRGlyZWN0b3J5ID09PSBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkpIHtcbiAgICByZXR1cm4gcG9wdWxhdGU7XG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBgJHtERUZBVUxUX0NPTkZJR19ESVJFQ1RPUll9L2A7XG4gIGNvbnN0IHJlbWFwcGVkOiBQb3B1bGF0ZUZpbGVzUGFyYW1zID0ge307XG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHBvcHVsYXRlKSkge1xuICAgIHJlbWFwcGVkW3BhdGguc3RhcnRzV2l0aChwcmVmaXgpID8gYCR7Y29uZmlnRGlyZWN0b3J5fS8ke3BhdGguc2xpY2UocHJlZml4Lmxlbmd0aCl9YCA6IHBhdGhdID0gY29udGVudDtcbiAgfVxuXG4gIHJldHVybiByZW1hcHBlZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCB0aGVuIGhhbmRzIHRoZSB3cml0ZSBpdHNlbGYgdG9cbiAqIHtAbGluayBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0fSBcdTIwMTQgd2hpY2ggcHV0cyB0aGUgYnVpbGQgaW5cbiAqIGA8Y29uZmlnRGlyZWN0b3J5Pi9wbHVnaW5zLzxpZD5gIGFuZCB3cml0ZXNcbiAqIGA8Y29uZmlnRGlyZWN0b3J5Pi9jb21tdW5pdHktcGx1Z2lucy5qc29uYCwgaG9ub3VyaW5nIGEgYGNvbmZpZ0RpcmVjdG9yeWBcbiAqIG92ZXJyaWRlIHNvIHRoZSBwbHVnaW4gbGFuZHMgd2hlcmUgdGhlIHZhdWx0IHdpbGwgYWN0dWFsbHkgbG9vayBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb3B5IHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcGx1Z2luIGlkIHJlYWQgZnJvbSB0aGUgbWFuaWZlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlQbHVnaW5JbnRvVmF1bHQocGFyYW1zOiBDb3B5UGx1Z2luSW50b1ZhdWx0UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBjb25maWdEaXJlY3RvcnksIGxhYmVsLCBwcm9qZWN0Um9vdCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICAvLyBUaGUgc2FtZSByZWZ1c2FsIHtAbGluayBza2lwSWZEZXNrdG9wT25seX0gYWxyZWFkeSBtYWRlIGJlZm9yZSB0aGUgdHJhbnNwb3J0IGV4aXN0ZWQuIEtlcHQgYXMgdGhlXG4gIC8vIEJhY2tzdG9wIGZvciBhbnkgY2FsbGVyIHRoYXQgcmVhY2hlcyBoZXJlIGFub3RoZXIgd2F5LCBhbmQgdGhyb3dpbmcgdGhlIHNhbWUgdHlwZSBzbyBib3RoIHBhdGhzIHJlYWRcbiAgLy8gSWRlbnRpY2FsbHkgaW4gdGhlIGxvZy5cbiAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgIHRocm93IG5ldyBEZXNrdG9wT25seVBsdWdpblNraXBFcnJvcihwbHVnaW5JZCk7XG4gIH1cblxuICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgYXdhaXQgaW5zdGFsbFBsdWdpbkludG9WYXVsdCh7IGNvbmZpZ0RpcmVjdG9yeSwgZGlzdFBhdGgsIHBsdWdpbklkLCB2YXVsdFBhdGg6IHRlbXBvcmFyeVZhdWx0LnBhdGggfSk7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBJbnN0YWxsZWQgXCIke3BsdWdpbklkfVwiIGludG8gJHtjb25maWdEaXJlY3RvcnkgPz8gREVGQVVMVF9DT05GSUdfRElSRUNUT1JZfS9wbHVnaW5zIChhbmQgZW5hYmxlZCBpdCB0aGVyZSkuYCk7XG5cbiAgcmV0dXJuIHBsdWdpbklkO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgKGJleW9uZCB0aGUgcGx1Z2luLXVuZGVyLXRlc3QpIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0LCBlYWNoIHRocm91Z2ggdGhlXG4gKiBzYW1lIHtAbGluayBlbmFibGVQbHVnaW5JblZhdWx0fSBwYXRoLiBFYWNoIHBsdWdpbidzIGJ1aWx0IGZpbGVzIG11c3QgYWxyZWFkeSBiZSBwcmVzZW50IGluIHRoZSB2YXVsdCAoc2VlZFxuICogdGhlbSB2aWEge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX0pLiBBIG5vLW9wIHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHBhcmFtczogRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHBsdWdpbklkcywgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbmFibGVzIHRoZSBwbHVnaW4gaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQgYW5kIHZlcmlmaWVzIGl0IGxvYWRlZC5cbiAqXG4gKiBPYnNpZGlhbidzIGBlbmFibGVQbHVnaW4oKWAgd3JhcHMgYGxvYWRQbHVnaW4oKWAgaW4gYSB0cnktY2F0Y2ggdGhhdCBzd2FsbG93c1xuICogZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLCBzbyB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0gbW9ua2V5LXBhdGNoZXNcbiAqIGBsb2FkUGx1Z2luKClgIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5JblZhdWx0KHBhcmFtczogRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcG9yYXJ5VmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxpbmcgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuXG4gIC8qXG4gICAqIE9wZW4gYSBuYXRpdmUgY29uc29sZS1jYXB0dXJlIHdpbmRvdyAoTGF5ZXIgMiwgQW5kcm9pZCBvbmx5KSBhcm91bmQgdGhlXG4gICAqIGVuYWJsZSBzbyB0aGF0IGlmIE9ic2lkaWFuIHN3YWxsb3dzIHRoZSBsb2FkIGVycm9yIGJlZm9yZSB0aGUgbW9ua2V5LXBhdGNoXG4gICAqIGFuZCB0aGUgcmVuZGVyZXIgY29uc29sZSAoTGF5ZXIgMSkgY2FtZSB1cCBlbXB0eSwgd2UgY2FuIHN0aWxsIHJlY292ZXIgdGhlXG4gICAqIHJlYWwgY2F1c2UgZnJvbSBgYWRiIGxvZ2NhdGAuIE5vLW9wICh1bmRlZmluZWQpIG9uIHRyYW5zcG9ydHMgdGhhdCBkb24ndFxuICAgKiBpbXBsZW1lbnQgaXQgKGUuZy4gZGVza3RvcCkuXG4gICAqL1xuICBjb25zdCBjYXB0dXJlSGFuZGxlID0gYXdhaXQgdHJhbnNwb3J0LmJlZ2luQ29uc29sZUNhcHR1cmU/LigpO1xuXG4gIC8qXG4gICAqIE9uIGEgZnJlc2hseSBjb2xkLWJvb3RlZCBlbXVsYXRvciB0aGUgcGx1Z2luIHN1YnN5c3RlbSBjYW4gc3RpbGwgYmUgc2V0dGxpbmdcbiAgICogd2hlbiB3ZSBlbmFibGUgdGhlIHBsdWdpbiwgc28gYSBzaW5nbGUtc2hvdCBlbmFibGUgcmFjZXMgdGhlIGxvYWQgYW5kIGxvc2VzXG4gICAqICh0aGUgcGx1Z2luIGxhbmRzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbmV2ZXIgbG9hZHMpLiBSZXRyeSB0aGUgZW5hYmxlICtcbiAgICogbG9hZC12ZXJpZmljYXRpb24gYSBmZXcgdGltZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmLCB3aGljaCByZWNvdmVycyB0aGVcbiAgICogdHJhbnNpZW50IHJhY2UuIEEgY2FwdHVyZWQgbG9hZCBlcnJvciAoYHJlYWxFcnJvcmApIGlzIGEgZGV0ZXJtaW5pc3RpYyBidWcgXHUyMDE0XG4gICAqIHJldHJ5aW5nIGNhbm5vdCBmaXggaXQsIHNvIHdlIGZhaWwgZmFzdC4gTm9uLUFuZHJvaWQgdHJhbnNwb3J0cyByZXNvbHZlIHRvXG4gICAqIHRoZSBzYW1lIGRlZmF1bHRzIGJ1dCBuZXZlciBlbnRlciB0aGUgcmV0cnkgcGF0aDogdGhlaXIgbG9hZCBlaXRoZXIgc3VjY2VlZHNcbiAgICogb24gdGhlIGZpcnN0IGF0dGVtcHQgb3IgdGhyb3dzIGEgY2FwdHVyZWQgZXJyb3IuXG4gICAqL1xuICBjb25zdCBtYXhBdHRlbXB0cyA9IDEgKyByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlDb3VudCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3QgYmFzZURlbGF5SW5NaWxsaXNlY29uZHMgPSByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzdWx0OiBFbmFibGVQbHVnaW5SZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgICAgY2FsbGJhY2s6IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgICAgIGlucHV0OiB7IHBsdWdpbklkIH0sXG4gICAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICAgIHRyYW5zcG9ydCxcbiAgICAgICAgdmF1bHRQYXRoOiB0ZW1wb3JhcnlWYXVsdC5wYXRoXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLypcbiAgICAgICAqIFRoZSBldmFsIGl0c2VsZiB0aHJldyAoZS5nLiB0aGUgV2ViVmlldyBjb250ZXh0IHdhcyBsb3N0IG1pZC1leGVjdXRpb24gb25cbiAgICAgICAqIGEgY2h1cm5pbmcgZ3Vlc3QpIFx1MjAxNCBhIHRyYW5zcG9ydC1sZXZlbCB0cmFuc2llbnQuIFJldHJ5IGlmIGF0dGVtcHRzIHJlbWFpbi5cbiAgICAgICAqL1xuICAgICAgaWYgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICBjb25zdCBkZWxheUluTWlsbGlzZWNvbmRzID0gY29tcHV0ZUJhY2tvZmZEZWxheUluTWlsbGlzZWNvbmRzKGJhc2VEZWxheUluTWlsbGlzZWNvbmRzLCBhdHRlbXB0IC0gMSk7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICBgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGUgYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSB0aHJldyBgXG4gICAgICAgICAgICArIGAoJHtlcnJvclRvU3RyaW5nKGVycm9yKX0pOyByZXRyeWluZyBpbiAke1N0cmluZyhkZWxheUluTWlsbGlzZWNvbmRzKX1tcy4uLmBcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoZGVsYXlJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBgZXJyb3JNZXNzYWdlYCBpcyB0aGUgcmVhbCB0aHJvdyBzZWVuIGJ5IHRoZSBtb25rZXktcGF0Y2g7XG4gICAgICogYHJlbmRlcmVyQ29uc29sZUVycm9yc2AgKExheWVyIDEpIGlzIHRoZSByZWFsIGNhdXNlIGNvbnNvbGUtbG9nZ2VkIGluIHRoZSByZW5kZXJlci5cbiAgICAgKi9cbiAgICBjb25zdCByZWFsRXJyb3IgPSByZXN1bHQuZXJyb3JNZXNzYWdlID8/IHJlc3VsdC5yZW5kZXJlckNvbnNvbGVFcnJvcnM7XG5cbiAgICBpZiAocmVzdWx0LmlzTG9hZGVkICYmICFyZWFsRXJyb3IpIHtcbiAgICAgIGNvbnN0IGF0dGVtcHRTdWZmaXggPSBhdHRlbXB0ID4gMSA/IGAgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKG1heEF0dGVtcHRzKX0pYCA6ICcnO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkke2F0dGVtcHRTdWZmaXh9LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEEgY2FwdHVyZWQgbG9hZCBlcnJvciBpcyBkZXRlcm1pbmlzdGljIFx1MjAxNCBmYWlsIGZhc3QgcmF0aGVyIHRoYW4gcmV0cnkuXG4gICAgaWYgKCFzaG91bGRSZXRyeVBsdWdpbkVuYWJsZShyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7cmVhbEVycm9yID8/IGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2UocGx1Z2luSWQpfWApO1xuICAgIH1cblxuICAgIC8vIFRyYW5zaWVudCBjb2xkLWJvb3QgcmFjZSAoZW5hYmxlZCBidXQgbm90IGxvYWRlZCwgbm8gY2F1c2UgY2FwdHVyZWQpOiByZXRyeS5cbiAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICBjb25zdCBkZWxheUluTWlsbGlzZWNvbmRzID0gY29tcHV0ZUJhY2tvZmZEZWxheUluTWlsbGlzZWNvbmRzKGJhc2VEZWxheUluTWlsbGlzZWNvbmRzLCBhdHRlbXB0IC0gMSk7XG4gICAgICBsb2coXG4gICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBgXG4gICAgICAgICAgKyBgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKG1heEF0dGVtcHRzKX0pOyByZXRyeWluZyBpbiAke1N0cmluZyhkZWxheUluTWlsbGlzZWNvbmRzKX1tcy4uLmBcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBFeGhhdXN0ZWQgZXZlcnkgYXR0ZW1wdCBvbiB0aGUgdHJhbnNpZW50IHNpZ25hdHVyZTogY29tcG9zZSB0aGUgbW9zdFxuICAgKiBzcGVjaWZpYyBkZXRhaWwgYXZhaWxhYmxlIChgYWRiIGxvZ2NhdGAgdGFpbCBvbiBBbmRyb2lkLCBlbHNlIHRoZSBnZW5lcmljXG4gICAqIG1lc3NhZ2UpIFx1MjAxNCB1bmNoYW5nZWQgZnJvbSB0aGUgcHJlLXJldHJ5IHNpbmdsZS1zaG90IGZhaWx1cmUuXG4gICAqL1xuICBjb25zdCBsb2djYXRUYWlsID0gYXdhaXQgdHJhbnNwb3J0LnJlYWRDb25zb2xlQ2FwdHVyZVNpbmNlPy4oY2FwdHVyZUhhbmRsZSk7XG4gIGNvbnN0IGRldGFpbCA9IGxvZ2NhdFRhaWwgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCk7XG4gIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtkZXRhaWx9YCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyZWN0b3J5ID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyZWN0b3J5LCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyZWN0b3J5O1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpcmVjdG9yeSwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyZWN0b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyZWN0b3J5ID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNyb3NzLXByb2Nlc3MgbG9jayBzY29wZSBmb3IgYSB0cmFuc3BvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9cbiAqIGxvY2sgaXMgbmVlZGVkLlxuICpcbiAqIERlc2t0b3AgcnVucyB1c2UgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgaW5zdGFuY2VzICh0aGVpciBvd24gdXNlci1kYXRhIGRpclxuICogYW5kIENEUCBwb3J0KSwgc28gdGhleSBubyBsb25nZXIgY29udGVuZCBhbmQgbmVlZCBubyBsb2NrLiBPbmx5IHRoZSBBbmRyb2lkXG4gKiB0cmFuc3BvcnQsIHdoaWNoIHNoYXJlcyB0aGUgc2luZ2xlIGVtdWxhdG9yIGFuZCBBcHBpdW0gc2VydmVyLCBtdXN0IHNlcmlhbGl6ZS5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBsb2NrIHNjb3BlIHN0cmluZywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gbG9jayBpcyBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyA/IEFORFJPSURfTE9DS19TQ09QRSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgY2xlYW51cCBoYW5kbGVycyBmb3Igb3JwaGFuZWQgc2V0dXBzIHRoYXQgd2VyZSBuZXZlciBleHBsaWNpdGx5XG4gKiB0b3JuIGRvd24uXG4gKlxuICogVHdvIGhhbmRsZXJzIGNvdmVyIGRpZmZlcmVudCBleGl0IHNjZW5hcmlvczpcbiAqXG4gKiAtIGBiZWZvcmVFeGl0YCBcdTIwMTQgZmlyZXMgd2hlbiB0aGUgZXZlbnQgbG9vcCBkcmFpbnMgbmF0dXJhbGx5LiBBbGxvd3MgZnVsbFxuICogICBhc3luYyB0ZWFyZG93biAodW5yZWdpc3RlciB2YXVsdHMsIGRpc3Bvc2UgdHJhbnNwb3J0cykuIERvZXMgTk9UIGZpcmVcbiAqICAgd2hlbiBgcHJvY2Vzcy5leGl0KClgIGlzIGNhbGxlZCBkaXJlY3RseS5cbiAqXG4gKiAtIGB1bmhhbmRsZWRSZWplY3Rpb25gIFx1MjAxNCBjYXRjaGVzIGFzeW5jIGVycm9ycyB0aGF0IGJ5cGFzcyBgY29yZVNldHVwYCdzXG4gKiAgIGNhdGNoIGJsb2NrLiBQZXJmb3JtcyBmdWxsIGFzeW5jIHRlYXJkb3duIHdoaWxlIHdlIHN0aWxsIGNhbi5cbiAqXG4gKiAtIGBleGl0YCBcdTIwMTQgZmlyZXMgb24gZXZlcnkgZXhpdCwgaW5jbHVkaW5nIGBwcm9jZXNzLmV4aXQoKWAuIE9ubHkgc3luY2hyb25vdXNcbiAqICAgd29yayBpcyBwb3NzaWJsZSwgc28gdGhpcyBoYW5kbGVyIGRvZXMgYmVzdC1lZmZvcnQgY2xlYW51cDoga2lsbHMgY2hpbGRcbiAqICAgcHJvY2Vzc2VzIHZpYSBgZGlzcG9zZVN5bmMoKWAgYW5kIHJlbW92ZXMgdGVtcCB2YXVsdCBkaXJlY3RvcmllcyB3aXRoXG4gKiAgIGBybVN5bmNgLiBVbnJlZ2lzdGVyaW5nIHZhdWx0cyAod2hpY2ggcmVxdWlyZXMgSVBDIHdpdGggT2JzaWRpYW4pIGlzXG4gKiAgIHNraXBwZWQgXHUyMDE0IGEgc3RhbGUgdmF1bHQgZW50cnkgaXMgYW4gYWNjZXB0YWJsZSB0cmFkZS1vZmYgdnMuIGxlYWtlZFxuICogICBwcm9jZXNzZXMgYW5kIHRlbXAgZGlyZWN0b3JpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk6IHZvaWQge1xuICBpZiAoaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFByb2Nlc3MgZXhpdGluZyB3aXRoICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gc2V0dXAocykgbm90IHRvcm4gZG93bi4gQ2xlYW5pbmcgdXAuLi5gKTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGFjdGl2ZVNldHVwcykge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFVuaGFuZGxlZCByZWplY3Rpb24gZGV0ZWN0ZWQuIFRlYXJpbmcgZG93biAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IGFjdGl2ZSBzZXR1cChzKS4uLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGFjdGl2ZVNldHVwcykge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFN5bmMgY2xlYW51cDogJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBvcnBoYW5lZCBzZXR1cChzKS5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhY3RpdmVTZXR1cHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcm1TeW5jKHJlc3VsdC50ZW1wb3JhcnlWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIGFuZCBmb3JnZXRzIHRoZSBzZXR1cCBsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIHJlc3VsdCwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHdob3NlIGxvY2sgc2hvdWxkIGJlIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogdm9pZCB7XG4gIGNvbnN0IGxvY2sgPSBzZXR1cExvY2tzLmdldChyZXN1bHQpO1xuICBpZiAobG9jaykge1xuICAgIGxvY2sucmVsZWFzZSgpO1xuICAgIHNldHVwTG9ja3MuZGVsZXRlKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUmVmdXNlcyBhIG1vYmlsZSBydW4gZm9yIGEgZGVza3RvcC1vbmx5IHBsdWdpbiwgYmVmb3JlIGFueXRoaW5nIGNvc3RseSBoYXMgaGFwcGVuZWQuXG4gKlxuICogQSBuby1vcCB1bmxlc3MgYSBwbHVnaW4gaXMgYmVpbmcgaW5zdGFsbGVkIG9udG8gYSBtb2JpbGUgdHJhbnNwb3J0LiBPdGhlcndpc2UgcmVhZHMgYG1hbmlmZXN0Lmpzb25gXG4gKiBvdXQgb2YgdGhlIG5ld2VyIGRpc3QgZm9sZGVyIFx1MjAxNCBubyBkZXZpY2UsIG5vIGxvY2ssIG5vIHN3ZWVwLiBXaGVuIHRoZXJlIGlzIG5vIHJlYWRhYmxlIGJ1aWxkIHRoZSBjaGVja1xuICogc2ltcGx5IGRvZXMgbm90IGZpcmU6IGEgbWlzc2luZyBvciBtYWxmb3JtZWQgYnVpbGQgaXMgYSBkaWZmZXJlbnQgcHJvYmxlbSwgYW5kIHtAbGluayByZXNvbHZlRGlzdFBhdGh9XG4gKiBkb3duc3RyZWFtIGFscmVhZHkgcmVwb3J0cyBpdCBpbiBpdHMgb3duIHdvcmRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdHJhbnNwb3J0IGxhYmVsLCBwcm9qZWN0IHJvb3QsIHRyYW5zcG9ydCBvcHRpb25zIGFuZCB3aGV0aGVyIGEgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAqIEB0aHJvd3Mge0Rlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yfSBXaGVuIHRoZSBtYW5pZmVzdCBzYXlzIGBpc0Rlc2t0b3BPbmx5OiB0cnVlYC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpcElmRGVza3RvcE9ubHkocGFyYW1zOiBTa2lwSWZEZXNrdG9wT25seVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwcm9qZWN0Um9vdCwgc2hvdWxkSW5zdGFsbFBsdWdpbiwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuXG4gIGlmICghc2hvdWxkSW5zdGFsbFBsdWdpbiB8fCAhY2hlY2tJc01vYmlsZVRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBtYW5pZmVzdEpzb246IFBsdWdpbk1hbmlmZXN0O1xuICB0cnkge1xuICAgIGNvbnN0IGRpc3RQYXRoID0gYXdhaXQgcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290KTtcbiAgICBtYW5pZmVzdEpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlzdFBhdGgsICdtYW5pZmVzdC5qc29uJyksICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZyhcbiAgICBgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTS0lQUEVEOiBcIiR7bWFuaWZlc3RKc29uLmlkfVwiIGlzIGRlc2t0b3Atb25seSAoaXNEZXNrdG9wT25seTogdHJ1ZSksIGBcbiAgICAgICsgJ3NvIGl0IGhhcyBubyBtb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgdG8gcnVuLiBObyBlbXVsYXRvciB3YXMgYm9vdGVkIGFuZCBubyBBcHBpdW0gc2VydmVyIHdhcyBzdGFydGVkLidcbiAgKTtcbiAgdGhyb3cgbmV3IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yKG1hbmlmZXN0SnNvbi5pZCk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgaG9zdC1zaWRlIHRlbXAgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZC5cbiAqXG4gKiBSdW5zIGF0IGJvdGggZW5kcyBvZiBhIHJ1bjogYXQgc2V0dXAgaXQgaGFwcGVucyAqKmJlZm9yZSoqIHRoZSB0cmFuc3BvcnQgaXNcbiAqIGNyZWF0ZWQsIHNvIGl0IGRvZXMgbm90IGRlcGVuZCBvbiBhIGhlYWx0aHkgT2JzaWRpYW4vV2ViVmlldyBcdTIwMTQgd2hpY2ggaXNcbiAqIGV4YWN0bHkgd2hhdCBhIGZhaWxlZCBydW4gbm8gbG9uZ2VyIGhhcywgYW5kIHdoeSBhIGZhaWxlZCBydW4gY2Fubm90IGNsZWFuIHVwXG4gKiBhZnRlciBpdHNlbGYuIEFnZS1nYXRlZCAoc2VlIGBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzYCkgYmVjYXVzZSBkZXNrdG9wXG4gKiBydW5zIGFyZSBub3Qgc2VyaWFsaXplZCBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXMgb25lIHRlbXBcbiAqIGRpcmVjdG9yeS4gQmVzdC1lZmZvcnQ6IGEgc3dlZXAgbmV2ZXIgZmFpbHMgdGhlIHJ1biBpdCBpcyBjbGVhbmluZyB1cCBmb3IuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzd2VlcCBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzd2VlcExlZnRvdmVycyhwYXJhbXM6IFN3ZWVwTGVmdG92ZXJzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHBoYXNlLCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGlmICghd2lsbFN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzd2VlcEhvc3RMZWZ0b3ZlcnMoe1xuICAgICAgZXhjbHVkZWROYW1lczogcGFyYW1zLmV4Y2x1ZGVkTmFtZXMsXG4gICAgICBtYXhBZ2VJbk1pbGxpc2Vjb25kczogcmVzb2x2ZUxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucylcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnJlbW92ZWRDb3VudCA+IDAgfHwgcmVzdWx0LmZhaWxlZENvdW50ID4gMCkge1xuICAgICAgbG9nKFxuICAgICAgICBgW2ludGVncmF0aW9uLSR7cGhhc2V9OiR7bGFiZWx9XSBTd2VwdCAke1N0cmluZyhyZXN1bHQucmVtb3ZlZENvdW50KX0gbGVmdG92ZXIgdGVtcCBkaXJlY3RvcihpZXMpIGBcbiAgICAgICAgICArIGBmcm9tIGVhcmxpZXIgcnVucyAoJHtTdHJpbmcocmVzdWx0LmZhaWxlZENvdW50KX0gc3RpbGwgaW4gdXNlKS5gXG4gICAgICApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi0ke3BoYXNlfToke2xhYmVsfV0gTGVmdG92ZXIgc3dlZXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgYXN5bmMgdGVhcmRvd24gd29yayAodmF1bHQgZGlzcG9zYWwgKyB0cmFuc3BvcnQgZGlzcG9zYWwpLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHRvIHRlYXIgZG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGVhcmRvd25Bc3luYyhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50ZW1wb3JhcnlWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3Mi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
|
|
425
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgc3RhdFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBqb2luXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcywgeyBsb2FkRW52RmlsZSB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQgeyBzZXRUaW1lb3V0IGFzIHNsZWVwIH0gZnJvbSAnbm9kZTp0aW1lcnMvcHJvbWlzZXMnO1xuXG5pbXBvcnQgdHlwZSB7IEVuYWJsZVBsdWdpblJlc3VsdCB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcbmltcG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IubWpzJztcbmltcG9ydCB7XG4gIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gIGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2Vcbn0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLm1qcyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi9lcnJvci10by1zdHJpbmcubWpzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnIH0gZnJvbSAnLi9oZWFkbGVzcy12YXVsdC1jb25maWcubWpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzLFxuICBzd2VlcEhvc3RMZWZ0b3ZlcnMsXG4gIHdpbGxTd2VlcExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQge1xuICBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50LFxuICByZXNvbHZlUGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzLFxuICBzaG91bGRSZXRyeVBsdWdpbkVuYWJsZVxufSBmcm9tICcuL3BsdWdpbi1lbmFibGUtcmV0cnkubWpzJztcbmltcG9ydCB7XG4gIGFjcXVpcmVTZXR1cExvY2ssXG4gIEFORFJPSURfU0VUVVBfTE9DS19TQ09QRVxufSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQsXG4gIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeVxufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgeyBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0IH0gZnJvbSAnLi92YXVsdC1wbHVnaW4taW5zdGFsbC5tanMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb3JlU2V0dXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFBhcmFtcyB7XG4gIC8qKlxuICAgKiBDb21tdW5pdHktcGx1Z2luIGlkcyB0byBlbmFibGUgaW4gdGhlIHZhdWx0ICoqaW4gYWRkaXRpb24gdG8qKiB0aGVcbiAgICogcGx1Z2luLXVuZGVyLXRlc3QsIGFmdGVyIGl0IGlzIGVuYWJsZWQuIEVhY2ggaWQncyBidWlsdCBmaWxlcyBtdXN0IGFscmVhZHkgYmVcbiAgICogcHJlc2VudCB1bmRlciBgLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gIFx1MjAxNCBzZWVkIHRoZW0gdmlhIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9XG4gICAqIChlLmcuIHdpdGggYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgKS4gRW5hYmxpbmcgZ29lcyB0aHJvdWdoIHRoZSBzYW1lXG4gICAqIHJldHJ5L2xvYWQtdmVyaWZ5IHBhdGggYXMgdGhlIHBsdWdpbi11bmRlci10ZXN0LiBDb21wb3NlcyB3aXRoXG4gICAqIGBpbnN0YWxsUGx1Z2luOiBmYWxzZWAgKGVuYWJsZSBleHRyYXMgaW50byBhbiBvdGhlcndpc2UgcGx1Z2luLWxlc3MgdmF1bHQpLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc3RhbGwgYW5kIGVuYWJsZSB0aGUgYnVpbHQgcGx1Z2luIGluIHRoZSB0ZW1wIHZhdWx0LiBEZWZhdWx0c1xuICAgKiB0byBgdHJ1ZWAuIFNldCB0byBgZmFsc2VgIGZvciBhICoqbm9uLXBsdWdpbioqIGNvbnN1bWVyIChlLmcuIGEgdHlwaW5nc1xuICAgKiBjcmF3bGVyKSB0aGF0IG9ubHkgbmVlZHMgYSByZWdpc3RlcmVkLCBlbXB0eSB2YXVsdCB0byBgZXZhbEluT2JzaWRpYW5gXG4gICAqIGFnYWluc3Q6IHRoZSBwbHVnaW4gYGRpc3RgL2BtYW5pZmVzdC5qc29uYCByZWFkLCB0aGUgY29weSBpbnRvIHRoZSBjb25maWdcbiAgICogZm9sZGVyJ3MgYHBsdWdpbnMvYCwgdGhlIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCB3cml0ZSwgYW5kIHRoZSBlbmFibGUgc3RlcFxuICAgKiBhcmUgYWxsIHNraXBwZWQsIHdoaWxlIHRoZSB0cmFuc3BvcnQsIHRlbXAgdmF1bHQsIHJlZ2lzdHJhdGlvbiwgYW5kXG4gICAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQgcHJvdmlzaW9uaW5nIHN0aWxsIHJ1biB1bmNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsUGx1Z2luPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9KS5cbiAgICogVXNlIHRoaXMgZm9yIGxhcmdlIGZpeHR1cmVzIFx1MjAxNCB3cml0aW5nIHRob3VzYW5kcyBvZiBub3RlcyBhZnRlciBvcGVuIGFuZFxuICAgKiBmb3JjaW5nIGEgcmUtc2NhbiBpcyBmYXIgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLlxuICAgKlxuICAgKiBLZXlzIG5hbWluZyB0aGUgY29uZmlnIGZvbGRlciBhcmUgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL1x1MjAyNmA7IHVuZGVyIGFcbiAgICogYGNvbmZpZ0RpcmVjdG9yeWAgb3ZlcnJpZGUge0BsaW5rIHJlbWFwQ29uZmlnRGlyZWN0b3J5S2V5c30gcmVkaXJlY3RzIHRoZW0gdG9cbiAgICogdGhlIGZvbGRlciB0aGUgdmF1bHQgd2lsbCBhY3R1YWxseSByZWFkLCBzbyBhIG1hcCBkb2VzIG5vdCBoYXZlIHRvIGNhcnJ5IGFcbiAgICogc2Vjb25kIGNvcHkgb2YgdGhlIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9wdWxhdGU/OiBQb3B1bGF0ZUZpbGVzUGFyYW1zIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCB1c2VzIGFuIG9mZi1zY3JlZW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKipcbiAgVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBvcmFyeVZhdWx0OiBUZW1wb3JhcnlWYXVsdDtcblxuICAvKipcbiAgVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2RwXCJgKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0aGF0IHdlcmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlQbHVnaW5JbnRvVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgY29uZmlnIGZvbGRlciB0aGUgdmF1bHQgd2lsbCByZWFkLCB3aGVuIG92ZXJyaWRkZW4gYXdheSBmcm9tIGAub2JzaWRpYW5gIFx1MjAxNCB0aGUgcmVzb2x2ZWRcbiAge0BsaW5rIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeX0gdmFsdWUsIHdoaWNoIGlzIGB1bmRlZmluZWRgIGZvciBPYnNpZGlhbidzIG93biBkZWZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbiBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdFJvb3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRlbXAgdmF1bHQgdG8gY29weSB0aGUgcGx1Z2luIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgKHVzZWQgZm9yIHRoZSBtb2JpbGUvZGVza3RvcC1vbmx5IGNvbXBhdGliaWxpdHkgY2hlY2spLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zfS5cbiAqL1xuaW50ZXJmYWNlIEVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGlkcyBvZiB0aGUgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdG8gZW5hYmxlICh0aGVpciBiaW5hcmllcyBtdXN0IGFscmVhZHkgYmUgaW4gdGhlIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW5zIHdlcmUgc2VlZGVkIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgdG8gZXZhbHVhdGUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGlkIG9mIHRoZSBwbHVnaW4gdG8gZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbiB3YXMgY29waWVkIGludG8uXG4gICAqL1xuICByZWFkb25seSB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQ7XG5cbiAgLyoqXG4gIFRoZSB0cmFuc3BvcnQgdG8gZXZhbHVhdGUgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNraXBJZkRlc2t0b3BPbmx5fS5cbiAqL1xuaW50ZXJmYWNlIFNraXBJZkRlc2t0b3BPbmx5UGFyYW1zIHtcbiAgLyoqXG4gIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbidzIG1hbmlmZXN0IGZyb20uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGV0aGVyIGEgcGx1Z2luIGlzIGJlaW5nIGluc3RhbGxlZCBhdCBhbGwgLS0gdGhlcmUgaXMgbm90aGluZyB0byBjaGVjayB3aGVuIHRoZSB2YXVsdCBzdGF5cyBlbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluc3RhbGxQbHVnaW46IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucywgd2hvc2UgZGlzY3JpbWluYW50IHNheXMgd2hldGhlciB0aGlzIHJ1biBpcyBtb2JpbGUuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHN3ZWVwTGVmdG92ZXJzfS5cbiAqL1xuaW50ZXJmYWNlIFN3ZWVwTGVmdG92ZXJzUGFyYW1zIHtcbiAgLyoqXG4gIERpcmVjdG9yeSBuYW1lcyB0byBrZWVwIHJlZ2FyZGxlc3Mgb2YgYWdlIChlLmcuIGEgY29uY3VycmVudCBzZXR1cCdzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoaWNoIGVuZCBvZiB0aGUgcnVuIGlzIHN3ZWVwaW5nLCBmb3IgdGhlIGxvZyBwcmVmaXguXG4gICAqL1xuICByZWFkb25seSBwaGFzZTogJ3NldHVwJyB8ICd0ZWFyZG93bic7XG5cbiAgLyoqXG4gIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjcmVhdGVzIGFuZCByZWdpc3RlcnNcbiAqIGEgdGVtcG9yYXJ5IHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZCBcdTIwMTQgdW5sZXNzIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn1cbiAqIGlzIGBmYWxzZWAgXHUyMDE0IGNvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gdGhlIHZhdWx0IGFuZCBlbmFibGVzIGl0LiBUaGVcbiAqIHBsdWdpbi1sZXNzIG1vZGUgc3RpbGwgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBwdWJsaXNoZXMgaXRzXG4gKiB3b3JrZXItZmFjaW5nIGVuZHBvaW50LCBzbyBhIG5vbi1wbHVnaW4gY29uc3VtZXIgcmV1c2VzIHRoZSBzYW1lIGF0dGFjaCB3aXJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnMudHlwZTtcbiAgY29uc3Qgc2hvdWxkSW5zdGFsbFBsdWdpbiA9IHBhcmFtcz8uaW5zdGFsbFBsdWdpbiAhPT0gZmFsc2U7XG5cbiAgLy8gQmVmb3JlIHRoZSBsb2NrLCB0aGUgc3dlZXAgYW5kIGFib3ZlIGFsbCB0aGUgdHJhbnNwb3J0OiBjcmVhdGluZyBhIG1vYmlsZSB0cmFuc3BvcnQgYm9vdHMgdGhlIEFWRCBhbmRcbiAgLy8gQXV0by1zdGFydHMgQXBwaXVtICh+NzAgcykgb25seSB0byByZWFjaCB0aGUgc2FtZSBjb25jbHVzaW9uIGZyb20gYHRyYW5zcG9ydC5pc01vYmlsZWAgZnVydGhlciBkb3duLlxuICAvLyBOZWl0aGVyIGlucHV0IG5lZWRzIGEgZGV2aWNlIC0tIHRoZSBtYW5pZmVzdCBpcyBvbiBkaXNrIGFuZCB0aGUgZGlzY3JpbWluYW50IGFscmVhZHkgc2F5cyBtb2JpbGUuXG4gIGF3YWl0IHNraXBJZkRlc2t0b3BPbmx5KHsgbGFiZWwsIHByb2plY3RSb290LCBzaG91bGRJbnN0YWxsUGx1Z2luLCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuXG4gIGNvbnN0IGxvY2tTY29wZSA9IGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zKTtcblxuICBsZXQgbG9jazogU2V0dXBMb2NrIHwgdW5kZWZpbmVkO1xuICBpZiAobG9ja1Njb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQWNxdWlyaW5nICcke2xvY2tTY29wZX0nIHNldHVwIGxvY2sgKHNlcmlhbGl6ZXMgYWdhaW5zdCBhbnkgY29uY3VycmVudCBpbnRlZ3JhdGlvbi10ZXN0IHJ1bikuLi5gKTtcbiAgICBsb2NrID0gYXdhaXQgYWNxdWlyZVNldHVwTG9jayh7IGxhYmVsLCBzY29wZTogbG9ja1Njb3BlIH0pO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBsb2NrIGFjcXVpcmVkLmApO1xuICB9XG5cbiAgYXdhaXQgc3dlZXBMZWZ0b3ZlcnMoeyBsYWJlbCwgcGhhc2U6ICdzZXR1cCcsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG5cbiAgbGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG4gIGxldCB0ZW1wb3JhcnlWYXVsdDogVGVtcG9yYXJ5VmF1bHQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gICAgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcblxuICAgIHRlbXBvcmFyeVZhdWx0ID0gbmV3IFRlbXBvcmFyeVZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wb3JhcnlWYXVsdC5wYXRofWApO1xuXG4gICAgLypcbiAgICAgKiBXaGljaCBmb2xkZXIgdGhpcyB2YXVsdCB3aWxsIGFjdHVhbGx5IHJlYWQsIHJlc29sdmVkIG9uY2UgYW5kIGhhbmRlZCB0byBldmVyeSB3cml0ZXIgYmVsb3cuXG4gICAgICogRXZlcnkgcHJlLW9wZW4gd3JpdGUgaGFzIHRvIGFncmVlIG9uIGl0OiBvbmUgdGhhdCBoYXJkY29kZXMgYC5vYnNpZGlhbmAgdW5kZXIgYW4gb3ZlcnJpZGUgd3JpdGVzXG4gICAgICogc29tZXdoZXJlIG5vdGhpbmcgbG9va3MsIGFuZCBub3RoaW5nIHRocm93cyB0byBzYXkgc28uXG4gICAgICovXG4gICAgY29uc3QgY29uZmlnRGlyZWN0b3J5ID0gcmVzb2x2ZU93bmVkQ29uZmlnRGlyZWN0b3J5KHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gICAgbGV0IHBsdWdpbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc2hvdWxkSW5zdGFsbFBsdWdpbikge1xuICAgICAgcGx1Z2luSWQgPSBhd2FpdCBjb3B5UGx1Z2luSW50b1ZhdWx0KHsgY29uZmlnRGlyZWN0b3J5LCBsYWJlbCwgcHJvamVjdFJvb3QsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTa2lwcGluZyBwbHVnaW4gaW5zdGFsbCAoaW5zdGFsbFBsdWdpbjogZmFsc2UpIFx1MjAxNCByZWdpc3RlcmluZyBhbiBlbXB0eSB2YXVsdC5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgcG9wdWxhdGUgPSByZW1hcENvbmZpZ0RpcmVjdG9yeUtleXMocGFyYW1zLnBvcHVsYXRlLCBjb25maWdEaXJlY3RvcnkpO1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBvcHVsYXRlKS5sZW5ndGg7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUG9wdWxhdGluZyB2YXVsdCB3aXRoICR7U3RyaW5nKGVudHJ5Q291bnQpfSBlbnRyaWVzIGJlZm9yZSBvcGVuLi4uYCk7XG4gICAgICB0ZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZShwb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZyh7XG4gICAgICBjb25maWdEaXJlY3RvcnksXG4gICAgICBsYWJlbCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcG9yYXJ5VmF1bHQucGF0aFxuICAgIH0pO1xuXG4gICAgLy8gYHJlZ2lzdGVyYCBwdXNoZXMgdGhlIGRpcmVjdG9yeSB0byB0aGUgZGV2aWNlIGJlZm9yZSByZWdpc3RlcmluZyBpdCwgc28gZXZlcnkgd3JpdGUgYWJvdmUgXHUyMDE0XG4gICAgLy8gVGhlIHBsdWdpbiBjb3B5LCB0aGUgcG9wdWxhdGUgbWFwLCBhbmQgdGhlIGhlYWRsZXNzIGNvbmZpZyBqdXN0IHdyaXR0ZW4gXHUyMDE0IHJlYWNoZXMgdGhlIGFwcC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUmVnaXN0ZXJpbmcgdmF1bHQuLi5gKTtcbiAgICBhd2FpdCB0ZW1wb3JhcnlWYXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCByZWdpc3RlcmVkLmApO1xuXG4gICAgaWYgKHBsdWdpbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcGx1Z2luSWRzOiBwYXJhbXM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMgPz8gW10sXG4gICAgICB0ZW1wb3JhcnlWYXVsdCxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHRyYW5zcG9ydE9wdGlvbnNcbiAgICB9KTtcblxuICAgIGNvbnN0IGF1Z21lbnRlZE9wdGlvbnMgPSBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zLCB0cmFuc3BvcnQpO1xuICAgIGNvbnN0IHJlc3VsdDogQ29yZVNldHVwUmVzdWx0ID0geyB0ZW1wb3JhcnlWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnM6IGF1Z21lbnRlZE9wdGlvbnMgfTtcbiAgICBhY3RpdmVTZXR1cHMuYWRkKHJlc3VsdCk7XG4gICAgaWYgKGxvY2spIHtcbiAgICAgIHNldHVwTG9ja3Muc2V0KHJlc3VsdCwgbG9jayk7XG4gICAgfVxuICAgIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgZmFpbGVkLCBjbGVhbmluZyB1cC4uLmApO1xuICAgIHRyeSB7XG4gICAgICBpZiAodGVtcG9yYXJ5VmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBvcmFyeVZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRyYW5zcG9ydD8uZGlzcG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhjbGVhbnVwRXJyb3IpfWApO1xuICAgIH1cblxuICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sgc28gYSB3YWl0aW5nIHJ1biBjYW4gcHJvY2VlZCBldmVuIHRob3VnaCB0aGlzIHJ1biBmYWlsZWQuXG4gICAgbG9jaz8ucmVsZWFzZSgpO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIE5PVEU6IElmIHRoZSB0ZXN0IHJ1bm5lciByZXBvcnRzIFwiTm8gdGVzdCBmaWxlcyBmb3VuZFwiLCBpZ25vcmUgaXQgXHUyMDE0IGl0IGlzIGEgc2lkZSBlZmZlY3Qgb2YgdGhlIHNldHVwIGZhaWx1cmUgYWJvdmUuYCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHRlYXJkb3duIGxvZ2ljLlxuICpcbiAqIERpc3Bvc2VzIG9mIHRoZSB0ZW1wb3JhcnkgdmF1bHQgYW5kIHRyYW5zcG9ydCBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJlc3VsdCBmcm9tIHtAbGluayBjb3JlU2V0dXB9LiBXaGVuIGB1bmRlZmluZWRgLCBkb2VzIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlVGVhcmRvd24ocmVzdWx0PzogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcmVzdWx0IHx8IGRpc3Bvc2VkUmVzdWx0cy5oYXMocmVzdWx0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBkaXNwb3NlZFJlc3VsdHMuYWRkKHJlc3VsdCk7XG5cbiAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUZWFyaW5nIGRvd24uLi5gKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHRlYXJkb3duQXN5bmMocmVzdWx0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIENsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU2V0dXBzLmRlbGV0ZShyZXN1bHQpO1xuICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgfVxuXG4gIGF3YWl0IHN3ZWVwTGVmdG92ZXJzKHtcbiAgICBleGNsdWRlZE5hbWVzOiBbLi4uYWN0aXZlU2V0dXBzXS5tYXAoKGFjdGl2ZVNldHVwKSA9PiBiYXNlbmFtZShhY3RpdmVTZXR1cC50ZW1wb3JhcnlWYXVsdC5wYXRoKSksXG4gICAgbGFiZWw6IHJlc3VsdC50cmFuc3BvcnRMYWJlbCxcbiAgICBwaGFzZTogJ3RlYXJkb3duJyxcbiAgICB0cmFuc3BvcnRPcHRpb25zOiByZXN1bHQudHJhbnNwb3J0T3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWRpcmVjdHMgYSBwb3B1bGF0ZSBtYXAncyBjb25maWctZm9sZGVyIGVudHJpZXMgdG8gdGhlIGZvbGRlciB0aGUgdmF1bHQgd2lsbCBhY3R1YWxseSByZWFkLlxuICpcbiAqIEEgcG9wdWxhdGUgbWFwIG5hbWVzIGl0cyBkZXN0aW5hdGlvbnMgdmF1bHQtcmVsYXRpdmUsIGFuZCBldmVyeXRoaW5nIHRoYXQgYnVpbGRzIG9uZSBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAsIHdoaWNoIHNlZWRzIGAub2JzaWRpYW4vKmAgY29uZmlnIGZpbGVzIGFuZCBpbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucydcbiAqIGJpbmFyaWVzIFx1MjAxNCB3cml0ZXMgdGhlbSB1bmRlciBhIGxpdGVyYWwgYC5vYnNpZGlhbi9gLCBiZWNhdXNlIHRoYXQgaXMgdGhlIGZvbGRlciBPYnNpZGlhbiB1c2VzIHdoZW4gbm90aGluZ1xuICogb3ZlcnJpZGVzIGl0LiBVbmRlciBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlIHRob3NlIGVudHJpZXMgbGFuZCBpbiBhIGZvbGRlciB0aGUgdmF1bHQgbmV2ZXIgb3BlbnMsIGFuZFxuICogdGhlIHBsdWdpbnMgc2VlZGVkIHRoYXQgd2F5IGNvbWUgYmFjayBhcyB0aGUgZ2VuZXJpYyBcImVuYWJsZWQgYnV0IG5vdCBsb2FkZWRcIiB3aXRoIG5vdGhpbmcgbmFtaW5nIGEgY29uZmlnXG4gKiBmb2xkZXIuIFJld3JpdGluZyB0aGUga2V5IGhlcmUgZml4ZXMgZXZlcnkgY29uc3VtZXIgYXQgb25jZSBcdTIwMTQgYSBoYW5kLXdyaXR0ZW4gbWFwIGFzIG11Y2ggYXMgYSBkZW1vIHZhdWx0J3NcbiAqIFx1MjAxNCBhbmQgbmVlZHMgbm8gc2Vjb25kIGNvcHkgb2YgdGhlIG92ZXJyaWRlIGZvciBhIGNhbGxlciB0byBrZWVwIGluIHN5bmMgd2l0aCB0aGVpciB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqXG4gKiBTYWZlIHJhdGhlciB0aGFuIG1hZ2ljOiB0aGUgdmF1bHQgaXMgb25lIHRoZSBoYXJuZXNzIG1hZGUgZm9yIHRoaXMgcnVuIGFuZCBoYXMgZXhhY3RseSBvbmUgY29uZmlnIGZvbGRlcixcbiAqIHNvIHVuZGVyIGFuIG92ZXJyaWRlIGEgYC5vYnNpZGlhbi9gIGVudHJ5IGlzIGRlYWQgd2VpZ2h0IG5vdGhpbmcgcmVhZHMuIE9ubHkgYSBsZWFkaW5nIGAub2JzaWRpYW5gIHBhdGhcbiAqIFNFR01FTlQgbW92ZXM7IGEgbm90ZSB3aG9zZSBuYW1lIG1lcmVseSBjb250YWlucyB0aGUgc3RyaW5nIGRvZXMgbm90LlxuICpcbiAqIEBwYXJhbSBwb3B1bGF0ZSAtIFRoZSBjb25zdW1lcidzIHBvcHVsYXRlIG1hcC5cbiAqIEBwYXJhbSBjb25maWdEaXJlY3RvcnkgLSBUaGUgcmVzb2x2ZWQgb3ZlcnJpZGUsIG9yIGB1bmRlZmluZWRgIGZvciBPYnNpZGlhbidzIGRlZmF1bHQgKGEgbm8tb3ApLlxuICogQHJldHVybnMgVGhlIG1hcCB3aXRoIGl0cyBjb25maWctZm9sZGVyIGtleXMgcmVkaXJlY3RlZCwgb3IgdGhlIG9yaWdpbmFsIG1hcCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gbW92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbWFwQ29uZmlnRGlyZWN0b3J5S2V5cyhwb3B1bGF0ZTogUG9wdWxhdGVGaWxlc1BhcmFtcywgY29uZmlnRGlyZWN0b3J5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQb3B1bGF0ZUZpbGVzUGFyYW1zIHtcbiAgaWYgKGNvbmZpZ0RpcmVjdG9yeSA9PT0gdW5kZWZpbmVkIHx8IGNvbmZpZ0RpcmVjdG9yeSA9PT0gREVGQVVMVF9DT05GSUdfRElSRUNUT1JZKSB7XG4gICAgcmV0dXJuIHBvcHVsYXRlO1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gYCR7REVGQVVMVF9DT05GSUdfRElSRUNUT1JZfS9gO1xuICBjb25zdCByZW1hcHBlZDogUG9wdWxhdGVGaWxlc1BhcmFtcyA9IHt9O1xuICBmb3IgKGNvbnN0IFtwYXRoLCBjb250ZW50XSBvZiBPYmplY3QuZW50cmllcyhwb3B1bGF0ZSkpIHtcbiAgICByZW1hcHBlZFtwYXRoLnN0YXJ0c1dpdGgocHJlZml4KSA/IGAke2NvbmZpZ0RpcmVjdG9yeX0vJHtwYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpfWAgOiBwYXRoXSA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gcmVtYXBwZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdHJhbnNwb3J0IG9wdGlvbnMgZm9yIGFuIGludGVncmF0aW9uIHJ1bi5cbiAqXG4gKiBEZXNrdG9wIGxhdW5jaGVzIGFyZSBub3JtYWxseSB2aXNpYmxlLCBidXQgdGVzdCBzZXR1cCBleHBsaWNpdGx5IGtlZXBzIGl0c1xuICogb3duZWQgaW5zdGFuY2Ugb2ZmLXNjcmVlbiBzbyBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIGRldmVsb3Blci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbnN1bWVyLXByb3ZpZGVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgT3B0aW9ucyB3aXRoIHRoZSBkZXNrdG9wIGludGVncmF0aW9uIHZpc2liaWxpdHkgZGVmYXVsdCBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhvcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHtcbiAgaWYgKG9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBpc09ic2lkaWFuQXBwVmlzaWJsZTogb3B0aW9ucz8uaXNPYnNpZGlhbkFwcFZpc2libGUgPz8gZmFsc2UsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfTtcbn1cblxuLyoqXG4gKiBBdWdtZW50cyB0cmFuc3BvcnQgb3B0aW9ucyB3aXRoIHJldXNlIGluZm8gc28gdGVzdCB3b3JrZXJzIGNhbiByZWF0dGFjaCB0byB0aGVcbiAqIGluc3RhbmNlIHRoZSBnbG9iYWwgc2V0dXAgYWxyZWFkeSBsYXVuY2hlZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIHRoZWlyIG93bjpcbiAqXG4gKiAtICoqQXBwaXVtKiogXHUyMDE0IGluamVjdHMgdGhlIGVzdGFibGlzaGVkIGBzZXNzaW9uSWRgL2BkZXZpY2VJZGAuXG4gKiAtICoqT3duZWQgZGVza3RvcCBDRFAqKiBcdTIwMTQgaW5qZWN0cyB0aGUgb3duZWQgaW5zdGFuY2UncyBgaG9zdGAvYHBvcnRgIChjaG9zZW5cbiAqICAgYXQgbGF1bmNoKSBwbHVzIHRoZSBpbnRlcm5hbCBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgZmxhZywgc28gZWFjaCB3b3JrZXJcbiAqICAgKiphdHRhY2hlcyoqIHRvIHRoYXQgaW5zdGFuY2Ugb3ZlciBDRFAgcmF0aGVyIHRoYW4gbGF1bmNoaW5nIChhbmQgbmV2ZXJcbiAqICAgcmVnaXN0ZXJpbmcpIGl0cyBvd24gXHUyMDE0IHRoZSBidWcgdGhhdCBvdGhlcndpc2UgbGVhdmVzIGEgd29ya2VyJ3MgdHJhbnNwb3J0XG4gKiAgIHdpdGggbm8gQ0RQIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9yaWdpbmFsIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKiBAcmV0dXJucyBUaGUgYXVnbWVudGVkIG9wdGlvbnMsIG9yIHRoZSBvcmlnaW5hbCBvcHRpb25zIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyhcbiAgb3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0XG4pOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBBcHBpdW1UcmFuc3BvcnQpIHtcbiAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mbygpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7b3B0aW9ucy50eXBlfV0gU2Vzc2lvbiByZXVzZSBpbmZvOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSW5mby5zZXNzaW9uSWR9LCBkZXZpY2VJZD0ke3Nlc3Npb25JbmZvLmRldmljZUlkfWApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGV2aWNlSWQ6IHNlc3Npb25JbmZvLmRldmljZUlkLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSW5mby5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgaWYgKChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCkge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtERUZBVUxUX1RSQU5TUE9SVF9UWVBFfV0gT3duZWQgaW5zdGFuY2UgcmV1c2UgaW5mbzogaG9zdD0ke2VuZHBvaW50Lmhvc3R9LCBwb3J0PSR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaG9zdDogZW5kcG9pbnQuaG9zdCxcbiAgICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZSxcbiAgICAgICAgcG9ydDogZW5kcG9pbnQucG9ydCxcbiAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byB0aGUgdGVtcCB2YXVsdCBhbmQgbWFya3MgaXQgYXMgYSBjb21tdW5pdHkgcGx1Z2luLlxuICpcbiAqIFJlYWRzIGBtYW5pZmVzdC5qc29uYCBmcm9tIHRoZSBuZXdlciBvZiBgZGlzdC9kZXZgL2BkaXN0L2J1aWxkYCwgcmVqZWN0cyBhXG4gKiBkZXNrdG9wLW9ubHkgcGx1Z2luIG9uIGEgbW9iaWxlIHRyYW5zcG9ydCwgdGhlbiBoYW5kcyB0aGUgd3JpdGUgaXRzZWxmIHRvXG4gKiB7QGxpbmsgaW5zdGFsbFBsdWdpbkludG9WYXVsdH0gXHUyMDE0IHdoaWNoIHB1dHMgdGhlIGJ1aWxkIGluXG4gKiBgPGNvbmZpZ0RpcmVjdG9yeT4vcGx1Z2lucy88aWQ+YCBhbmQgd3JpdGVzXG4gKiBgPGNvbmZpZ0RpcmVjdG9yeT4vY29tbXVuaXR5LXBsdWdpbnMuanNvbmAsIGhvbm91cmluZyBhIGBjb25maWdEaXJlY3RvcnlgXG4gKiBvdmVycmlkZSBzbyB0aGUgcGx1Z2luIGxhbmRzIHdoZXJlIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IGxvb2sgZm9yIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgY29uZmlnRGlyZWN0b3J5LCBsYWJlbCwgcHJvamVjdFJvb3QsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQgfSA9IHBhcmFtcztcbiAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlzdFBhdGgsICdtYW5pZmVzdC5qc29uJyksICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcbiAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgLy8gVGhlIHNhbWUgcmVmdXNhbCB7QGxpbmsgc2tpcElmRGVza3RvcE9ubHl9IGFscmVhZHkgbWFkZSBiZWZvcmUgdGhlIHRyYW5zcG9ydCBleGlzdGVkLiBLZXB0IGFzIHRoZVxuICAvLyBCYWNrc3RvcCBmb3IgYW55IGNhbGxlciB0aGF0IHJlYWNoZXMgaGVyZSBhbm90aGVyIHdheSwgYW5kIHRocm93aW5nIHRoZSBzYW1lIHR5cGUgc28gYm90aCBwYXRocyByZWFkXG4gIC8vIElkZW50aWNhbGx5IGluIHRoZSBsb2cuXG4gIGlmICh0cmFuc3BvcnQuaXNNb2JpbGUgJiYgbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICB0aHJvdyBuZXcgRGVza3RvcE9ubHlQbHVnaW5Ta2lwRXJyb3IocGx1Z2luSWQpO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGF3YWl0IGluc3RhbGxQbHVnaW5JbnRvVmF1bHQoeyBjb25maWdEaXJlY3RvcnksIGRpc3RQYXRoLCBwbHVnaW5JZCwgdmF1bHRQYXRoOiB0ZW1wb3JhcnlWYXVsdC5wYXRoIH0pO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gSW5zdGFsbGVkIFwiJHtwbHVnaW5JZH1cIiBpbnRvICR7Y29uZmlnRGlyZWN0b3J5ID8/IERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWX0vcGx1Z2lucyAoYW5kIGVuYWJsZWQgaXQgdGhlcmUpLmApO1xuXG4gIHJldHVybiBwbHVnaW5JZDtcbn1cblxuLyoqXG4gKiBFbmFibGVzIGV4dHJhIGNvbW11bml0eSBwbHVnaW5zIChiZXlvbmQgdGhlIHBsdWdpbi11bmRlci10ZXN0KSBpbiB0aGUgcmVnaXN0ZXJlZCB2YXVsdCwgZWFjaCB0aHJvdWdoIHRoZVxuICogc2FtZSB7QGxpbmsgZW5hYmxlUGx1Z2luSW5WYXVsdH0gcGF0aC4gRWFjaCBwbHVnaW4ncyBidWlsdCBmaWxlcyBtdXN0IGFscmVhZHkgYmUgcHJlc2VudCBpbiB0aGUgdmF1bHQgKHNlZWRcbiAqIHRoZW0gdmlhIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9KS4gQSBuby1vcCB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW5hYmxlIHBhcmFtZXRlcnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2lucyhwYXJhbXM6IEVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2luc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwbHVnaW5JZHMsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSA9IHBhcmFtcztcbiAgZm9yIChjb25zdCBwbHVnaW5JZCBvZiBwbHVnaW5JZHMpIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxpbmcgZXh0cmEgY29tbXVuaXR5IHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcbiAgICBhd2FpdCBlbmFibGVQbHVnaW5JblZhdWx0KHsgbGFiZWwsIHBsdWdpbklkLCB0ZW1wb3JhcnlWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBvcmFyeVZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSA9IHBhcmFtcztcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsaW5nIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcblxuICAvKlxuICAgKiBPcGVuIGEgbmF0aXZlIGNvbnNvbGUtY2FwdHVyZSB3aW5kb3cgKExheWVyIDIsIEFuZHJvaWQgb25seSkgYXJvdW5kIHRoZVxuICAgKiBlbmFibGUgc28gdGhhdCBpZiBPYnNpZGlhbiBzd2FsbG93cyB0aGUgbG9hZCBlcnJvciBiZWZvcmUgdGhlIG1vbmtleS1wYXRjaFxuICAgKiBhbmQgdGhlIHJlbmRlcmVyIGNvbnNvbGUgKExheWVyIDEpIGNhbWUgdXAgZW1wdHksIHdlIGNhbiBzdGlsbCByZWNvdmVyIHRoZVxuICAgKiByZWFsIGNhdXNlIGZyb20gYGFkYiBsb2djYXRgLiBOby1vcCAodW5kZWZpbmVkKSBvbiB0cmFuc3BvcnRzIHRoYXQgZG9uJ3RcbiAgICogaW1wbGVtZW50IGl0IChlLmcuIGRlc2t0b3ApLlxuICAgKi9cbiAgY29uc3QgY2FwdHVyZUhhbmRsZSA9IGF3YWl0IHRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlPy4oKTtcblxuICAvKlxuICAgKiBPbiBhIGZyZXNobHkgY29sZC1ib290ZWQgZW11bGF0b3IgdGhlIHBsdWdpbiBzdWJzeXN0ZW0gY2FuIHN0aWxsIGJlIHNldHRsaW5nXG4gICAqIHdoZW4gd2UgZW5hYmxlIHRoZSBwbHVnaW4sIHNvIGEgc2luZ2xlLXNob3QgZW5hYmxlIHJhY2VzIHRoZSBsb2FkIGFuZCBsb3Nlc1xuICAgKiAodGhlIHBsdWdpbiBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXQgYnV0IG5ldmVyIGxvYWRzKS4gUmV0cnkgdGhlIGVuYWJsZSArXG4gICAqIGxvYWQtdmVyaWZpY2F0aW9uIGEgZmV3IHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiwgd2hpY2ggcmVjb3ZlcnMgdGhlXG4gICAqIHRyYW5zaWVudCByYWNlLiBBIGNhcHR1cmVkIGxvYWQgZXJyb3IgKGByZWFsRXJyb3JgKSBpcyBhIGRldGVybWluaXN0aWMgYnVnIFx1MjAxNFxuICAgKiByZXRyeWluZyBjYW5ub3QgZml4IGl0LCBzbyB3ZSBmYWlsIGZhc3QuIE5vbi1BbmRyb2lkIHRyYW5zcG9ydHMgcmVzb2x2ZSB0b1xuICAgKiB0aGUgc2FtZSBkZWZhdWx0cyBidXQgbmV2ZXIgZW50ZXIgdGhlIHJldHJ5IHBhdGg6IHRoZWlyIGxvYWQgZWl0aGVyIHN1Y2NlZWRzXG4gICAqIG9uIHRoZSBmaXJzdCBhdHRlbXB0IG9yIHRocm93cyBhIGNhcHR1cmVkIGVycm9yLlxuICAgKi9cbiAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxICsgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5Q291bnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IGJhc2VEZWxheUluTWlsbGlzZWNvbmRzID0gcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBtYXhBdHRlbXB0czsgYXR0ZW1wdCsrKSB7XG4gICAgbGV0IHJlc3VsdDogRW5hYmxlUGx1Z2luUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgICAgIGNhbGxiYWNrOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBpbnB1dDogeyBwbHVnaW5JZCB9LFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcG9yYXJ5VmF1bHQucGF0aFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUaGUgZXZhbCBpdHNlbGYgdGhyZXcgKGUuZy4gdGhlIFdlYlZpZXcgY29udGV4dCB3YXMgbG9zdCBtaWQtZXhlY3V0aW9uIG9uXG4gICAgICAgKiBhIGNodXJuaW5nIGd1ZXN0KSBcdTIwMTQgYSB0cmFuc3BvcnQtbGV2ZWwgdHJhbnNpZW50LiBSZXRyeSBpZiBhdHRlbXB0cyByZW1haW4uXG4gICAgICAgKi9cbiAgICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgY29uc3QgZGVsYXlJbk1pbGxpc2Vjb25kcyA9IGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyhiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcywgYXR0ZW1wdCAtIDEpO1xuICAgICAgICBsb2coXG4gICAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxlIGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9LyR7U3RyaW5nKG1heEF0dGVtcHRzKX0gdGhyZXcgYFxuICAgICAgICAgICAgKyBgKCR7ZXJyb3JUb1N0cmluZyhlcnJvcil9KTsgcmV0cnlpbmcgaW4gJHtTdHJpbmcoZGVsYXlJbk1pbGxpc2Vjb25kcyl9bXMuLi5gXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogYGVycm9yTWVzc2FnZWAgaXMgdGhlIHJlYWwgdGhyb3cgc2VlbiBieSB0aGUgbW9ua2V5LXBhdGNoO1xuICAgICAqIGByZW5kZXJlckNvbnNvbGVFcnJvcnNgIChMYXllciAxKSBpcyB0aGUgcmVhbCBjYXVzZSBjb25zb2xlLWxvZ2dlZCBpbiB0aGUgcmVuZGVyZXIuXG4gICAgICovXG4gICAgY29uc3QgcmVhbEVycm9yID0gcmVzdWx0LmVycm9yTWVzc2FnZSA/PyByZXN1bHQucmVuZGVyZXJDb25zb2xlRXJyb3JzO1xuXG4gICAgaWYgKHJlc3VsdC5pc0xvYWRlZCAmJiAhcmVhbEVycm9yKSB7XG4gICAgICBjb25zdCBhdHRlbXB0U3VmZml4ID0gYXR0ZW1wdCA+IDEgPyBgIChhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9KWAgOiAnJztcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5JHthdHRlbXB0U3VmZml4fS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGNhcHR1cmVkIGxvYWQgZXJyb3IgaXMgZGV0ZXJtaW5pc3RpYyBcdTIwMTQgZmFpbCBmYXN0IHJhdGhlciB0aGFuIHJldHJ5LlxuICAgIGlmICghc2hvdWxkUmV0cnlQbHVnaW5FbmFibGUocmVzdWx0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke3JlYWxFcnJvciA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKX1gKTtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2llbnQgY29sZC1ib290IHJhY2UgKGVuYWJsZWQgYnV0IG5vdCBsb2FkZWQsIG5vIGNhdXNlIGNhcHR1cmVkKTogcmV0cnkuXG4gICAgaWYgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xuICAgICAgY29uc3QgZGVsYXlJbk1pbGxpc2Vjb25kcyA9IGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyhiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcywgYXR0ZW1wdCAtIDEpO1xuICAgICAgbG9nKFxuICAgICAgICBgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgYnV0IG5vdCBsb2FkZWQgYFxuICAgICAgICAgICsgYChhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9KTsgcmV0cnlpbmcgaW4gJHtTdHJpbmcoZGVsYXlJbk1pbGxpc2Vjb25kcyl9bXMuLi5gXG4gICAgICApO1xuICAgICAgYXdhaXQgc2xlZXAoZGVsYXlJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogRXhoYXVzdGVkIGV2ZXJ5IGF0dGVtcHQgb24gdGhlIHRyYW5zaWVudCBzaWduYXR1cmU6IGNvbXBvc2UgdGhlIG1vc3RcbiAgICogc3BlY2lmaWMgZGV0YWlsIGF2YWlsYWJsZSAoYGFkYiBsb2djYXRgIHRhaWwgb24gQW5kcm9pZCwgZWxzZSB0aGUgZ2VuZXJpY1xuICAgKiBtZXNzYWdlKSBcdTIwMTQgdW5jaGFuZ2VkIGZyb20gdGhlIHByZS1yZXRyeSBzaW5nbGUtc2hvdCBmYWlsdXJlLlxuICAgKi9cbiAgY29uc3QgbG9nY2F0VGFpbCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkQ29uc29sZUNhcHR1cmVTaW5jZT8uKGNhcHR1cmVIYW5kbGUpO1xuICBjb25zdCBkZXRhaWwgPSBsb2djYXRUYWlsID8/IGdldEdlbmVyaWNQbHVnaW5Mb2FkRmFpbHVyZU1lc3NhZ2UocGx1Z2luSWQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7ZGV0YWlsfWApO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpcmVjdG9yeSA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpcmVjdG9yeSwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcmVjdG9yeTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXJlY3RvcnksICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcmVjdG9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpcmVjdG9yeSA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgc2NvcGUgZm9yIGEgdHJhbnNwb3J0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBsb2NrIGlzIG5lZWRlZC5cbiAqXG4gKiBEZXNrdG9wIHJ1bnMgdXNlIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlcyAodGhlaXIgb3duIHVzZXItZGF0YSBkaXJcbiAqIGFuZCBDRFAgcG9ydCksIHNvIHRoZXkgbm8gbG9uZ2VyIGNvbnRlbmQgYW5kIG5lZWQgbm8gbG9jay4gT25seSB0aGUgQW5kcm9pZFxuICogdHJhbnNwb3J0LCB3aGljaCBzaGFyZXMgdGhlIHNpbmdsZSBlbXVsYXRvciBhbmQgQXBwaXVtIHNlcnZlciwgbXVzdCBzZXJpYWxpemUuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydE9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbG9jayBzY29wZSBzdHJpbmcsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGxvY2sgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX1NFVFVQX0xPQ0tfU0NPUEUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhY3RpdmVTZXR1cHMpIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBhY3RpdmVTZXR1cHMpIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBTeW5jIGNsZWFudXA6ICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gb3JwaGFuZWQgc2V0dXAocykuYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgYWN0aXZlU2V0dXBzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcG9yYXJ5VmF1bHQucGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhbmQgZm9yZ2V0cyB0aGUgc2V0dXAgbG9jayBhc3NvY2lhdGVkIHdpdGggYSByZXN1bHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB3aG9zZSBsb2NrIHNob3VsZCBiZSByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVNldHVwTG9jayhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IHZvaWQge1xuICBjb25zdCBsb2NrID0gc2V0dXBMb2Nrcy5nZXQocmVzdWx0KTtcbiAgaWYgKGxvY2spIHtcbiAgICBsb2NrLnJlbGVhc2UoKTtcbiAgICBzZXR1cExvY2tzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuXG4vKipcbiAqIFJlZnVzZXMgYSBtb2JpbGUgcnVuIGZvciBhIGRlc2t0b3Atb25seSBwbHVnaW4sIGJlZm9yZSBhbnl0aGluZyBjb3N0bHkgaGFzIGhhcHBlbmVkLlxuICpcbiAqIEEgbm8tb3AgdW5sZXNzIGEgcGx1Z2luIGlzIGJlaW5nIGluc3RhbGxlZCBvbnRvIGEgbW9iaWxlIHRyYW5zcG9ydC4gT3RoZXJ3aXNlIHJlYWRzIGBtYW5pZmVzdC5qc29uYFxuICogb3V0IG9mIHRoZSBuZXdlciBkaXN0IGZvbGRlciBcdTIwMTQgbm8gZGV2aWNlLCBubyBsb2NrLCBubyBzd2VlcC4gV2hlbiB0aGVyZSBpcyBubyByZWFkYWJsZSBidWlsZCB0aGUgY2hlY2tcbiAqIHNpbXBseSBkb2VzIG5vdCBmaXJlOiBhIG1pc3Npbmcgb3IgbWFsZm9ybWVkIGJ1aWxkIGlzIGEgZGlmZmVyZW50IHByb2JsZW0sIGFuZCB7QGxpbmsgcmVzb2x2ZURpc3RQYXRofVxuICogZG93bnN0cmVhbSBhbHJlYWR5IHJlcG9ydHMgaXQgaW4gaXRzIG93biB3b3Jkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHRyYW5zcG9ydCBsYWJlbCwgcHJvamVjdCByb290LCB0cmFuc3BvcnQgb3B0aW9ucyBhbmQgd2hldGhlciBhIHBsdWdpbiBpcyBpbnN0YWxsZWQuXG4gKiBAdGhyb3dzIHtEZXNrdG9wT25seVBsdWdpblNraXBFcnJvcn0gV2hlbiB0aGUgbWFuaWZlc3Qgc2F5cyBgaXNEZXNrdG9wT25seTogdHJ1ZWAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraXBJZkRlc2t0b3BPbmx5KHBhcmFtczogU2tpcElmRGVza3RvcE9ubHlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcHJvamVjdFJvb3QsIHNob3VsZEluc3RhbGxQbHVnaW4sIHRyYW5zcG9ydE9wdGlvbnMgfSA9IHBhcmFtcztcblxuICBpZiAoIXNob3VsZEluc3RhbGxQbHVnaW4gfHwgIWNoZWNrSXNNb2JpbGVUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgbWFuaWZlc3RKc29uOiBQbHVnaW5NYW5pZmVzdDtcbiAgdHJ5IHtcbiAgICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gICAgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2coXG4gICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU0tJUFBFRDogXCIke21hbmlmZXN0SnNvbi5pZH1cIiBpcyBkZXNrdG9wLW9ubHkgKGlzRGVza3RvcE9ubHk6IHRydWUpLCBgXG4gICAgICArICdzbyBpdCBoYXMgbm8gbW9iaWxlIGludGVncmF0aW9uIHRlc3RzIHRvIHJ1bi4gTm8gZW11bGF0b3Igd2FzIGJvb3RlZCBhbmQgbm8gQXBwaXVtIHNlcnZlciB3YXMgc3RhcnRlZC4nXG4gICk7XG4gIHRocm93IG5ldyBEZXNrdG9wT25seVBsdWdpblNraXBFcnJvcihtYW5pZmVzdEpzb24uaWQpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQuXG4gKlxuICogUnVucyBhdCBib3RoIGVuZHMgb2YgYSBydW46IGF0IHNldHVwIGl0IGhhcHBlbnMgKipiZWZvcmUqKiB0aGUgdHJhbnNwb3J0IGlzXG4gKiBjcmVhdGVkLCBzbyBpdCBkb2VzIG5vdCBkZXBlbmQgb24gYSBoZWFsdGh5IE9ic2lkaWFuL1dlYlZpZXcgXHUyMDE0IHdoaWNoIGlzXG4gKiBleGFjdGx5IHdoYXQgYSBmYWlsZWQgcnVuIG5vIGxvbmdlciBoYXMsIGFuZCB3aHkgYSBmYWlsZWQgcnVuIGNhbm5vdCBjbGVhbiB1cFxuICogYWZ0ZXIgaXRzZWxmLiBBZ2UtZ2F0ZWQgKHNlZSBgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc2ApIGJlY2F1c2UgZGVza3RvcFxuICogcnVucyBhcmUgbm90IHNlcmlhbGl6ZWQgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzIG9uZSB0ZW1wXG4gKiBkaXJlY3RvcnkuIEJlc3QtZWZmb3J0OiBhIHN3ZWVwIG5ldmVyIGZhaWxzIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3dlZXAgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3dlZXBMZWZ0b3ZlcnMocGFyYW1zOiBTd2VlcExlZnRvdmVyc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGxhYmVsLCBwaGFzZSwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBpZiAoIXdpbGxTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIGV4Y2x1ZGVkTmFtZXM6IHBhcmFtcy5leGNsdWRlZE5hbWVzLFxuICAgICAgbWF4QWdlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzKHRyYW5zcG9ydE9wdGlvbnMpXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5yZW1vdmVkQ291bnQgPiAwIHx8IHJlc3VsdC5mYWlsZWRDb3VudCA+IDApIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi0ke3BoYXNlfToke2xhYmVsfV0gU3dlcHQgJHtTdHJpbmcocmVzdWx0LnJlbW92ZWRDb3VudCl9IGxlZnRvdmVyIHRlbXAgZGlyZWN0b3IoaWVzKSBgXG4gICAgICAgICAgKyBgZnJvbSBlYXJsaWVyIHJ1bnMgKCR7U3RyaW5nKHJlc3VsdC5mYWlsZWRDb3VudCl9IHN0aWxsIGluIHVzZSkuYFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tJHtwaGFzZX06JHtsYWJlbH1dIExlZnRvdmVyIHN3ZWVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcG9yYXJ5VmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjog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
|
package/dist/lib/esm/index.d.mts
CHANGED
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export type { RunAdbParams } from './adb.mjs';
|
|
7
7
|
export { runAdbBinary, runAdbText, runAdbTextWithoutDevice } from './adb.mjs';
|
|
8
|
+
export type { AppConfigParams, AppConfigRestore, SetAppConfigParams, WithAppConfigParams } from './app-config.mjs';
|
|
9
|
+
export { getAppConfig, restoreAppConfig, setAppConfig, withAppConfig } from './app-config.mjs';
|
|
8
10
|
export type { AsarFallback, AsarFallbackTier, ResolveAsarFallbackParams } from './asar-fallback-detection.mjs';
|
|
9
11
|
export { resolveAsarFallback } from './asar-fallback-detection.mjs';
|
|
10
12
|
export type { CaptureObsidianScreenshotOptions } from './capture-obsidian-screenshot.mjs';
|
|
11
13
|
export { captureObsidianScreenshot } from './capture-obsidian-screenshot.mjs';
|
|
12
14
|
export type { CaptureScreenshotParams, PngDimensions } from './capture-screenshot.mjs';
|
|
13
15
|
export { buildDeviceMetricsOverride, decodeBase64Png, isPng, readPngDimensions } from './capture-screenshot.mjs';
|
|
16
|
+
export type { CdpCommandTimeoutErrorConstructorParams } from './cdp-command-timeout-error.mjs';
|
|
17
|
+
export { CdpCommandTimeoutError } from './cdp-command-timeout-error.mjs';
|
|
14
18
|
export type { ConfigDirectoryFallbackErrorConstructorParams } from './config-directory-fallback-error.mjs';
|
|
15
19
|
export { ConfigDirectoryFallbackError } from './config-directory-fallback-error.mjs';
|
|
16
20
|
export { assertValidConfigDirectory, DEFAULT_CONFIG_DIRECTORY } from './config-directory.mjs';
|
|
@@ -39,6 +43,9 @@ export type { ElectronCompatibility, ElectronCompatibilityTier, ResolveElectronC
|
|
|
39
43
|
export { resolveElectronCompatibility } from './electron-compatibility.mjs';
|
|
40
44
|
export type { EmulatorDeviceCandidate, SelectEmulatorDeviceIdParams } from './emulator-device-id.mjs';
|
|
41
45
|
export { selectEmulatorDeviceId } from './emulator-device-id.mjs';
|
|
46
|
+
export type { EvalCapExceededErrorConstructorParams } from './eval-cap-exceeded-error.mjs';
|
|
47
|
+
export { EvalCapExceededError, isScriptTimeoutError } from './eval-cap-exceeded-error.mjs';
|
|
48
|
+
export { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from './eval-cap.mjs';
|
|
42
49
|
export type { ClickElementParams, ClickMouseParams, CommonArguments, CreateNoteParams, EvalInObsidianParams, GenericObject, HoverElementParams, Lib, MouseButton, MoveMouseParams, OpenSettingsTabParams, PressKeyParams, TypeIntoEditorParams, UnhoverElementParams, WaitUntilParams } from './eval-in-obsidian.mjs';
|
|
43
50
|
export { evalInObsidian } from './eval-in-obsidian.mjs';
|
|
44
51
|
export type { ComputeFitToCanvasParams, FitScreenshotToCanvasOptions, FitToCanvasGeometry } from './fit-screenshot.mjs';
|
package/dist/lib/esm/index.mjs
CHANGED
|
@@ -3,6 +3,12 @@ import {
|
|
|
3
3
|
runAdbText,
|
|
4
4
|
runAdbTextWithoutDevice
|
|
5
5
|
} from "./adb.mjs";
|
|
6
|
+
import {
|
|
7
|
+
getAppConfig,
|
|
8
|
+
restoreAppConfig,
|
|
9
|
+
setAppConfig,
|
|
10
|
+
withAppConfig
|
|
11
|
+
} from "./app-config.mjs";
|
|
6
12
|
import { resolveAsarFallback } from "./asar-fallback-detection.mjs";
|
|
7
13
|
import { captureObsidianScreenshot } from "./capture-obsidian-screenshot.mjs";
|
|
8
14
|
import {
|
|
@@ -11,6 +17,7 @@ import {
|
|
|
11
17
|
isPng,
|
|
12
18
|
readPngDimensions
|
|
13
19
|
} from "./capture-screenshot.mjs";
|
|
20
|
+
import { CdpCommandTimeoutError } from "./cdp-command-timeout-error.mjs";
|
|
14
21
|
import { ConfigDirectoryFallbackError } from "./config-directory-fallback-error.mjs";
|
|
15
22
|
import {
|
|
16
23
|
assertValidConfigDirectory,
|
|
@@ -51,6 +58,11 @@ import {
|
|
|
51
58
|
} from "./device-settings.mjs";
|
|
52
59
|
import { resolveElectronCompatibility } from "./electron-compatibility.mjs";
|
|
53
60
|
import { selectEmulatorDeviceId } from "./emulator-device-id.mjs";
|
|
61
|
+
import {
|
|
62
|
+
EvalCapExceededError,
|
|
63
|
+
isScriptTimeoutError
|
|
64
|
+
} from "./eval-cap-exceeded-error.mjs";
|
|
65
|
+
import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "./eval-cap.mjs";
|
|
54
66
|
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
55
67
|
import {
|
|
56
68
|
computeFitToCanvas,
|
|
@@ -102,9 +114,11 @@ import { DEFAULT_OBSIDIAN_VERSION_SPECS } from "./version-matrix.mjs";
|
|
|
102
114
|
export {
|
|
103
115
|
AppiumTransport,
|
|
104
116
|
CATALYST_LATEST,
|
|
117
|
+
CdpCommandTimeoutError,
|
|
105
118
|
ConfigDirectoryFallbackError,
|
|
106
119
|
ContextId,
|
|
107
120
|
DEFAULT_CONFIG_DIRECTORY,
|
|
121
|
+
DEFAULT_EVAL_CAP_IN_MILLISECONDS,
|
|
108
122
|
DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
|
|
109
123
|
DEFAULT_OBSIDIAN_VERSION_SPECS,
|
|
110
124
|
DesktopCdpTransport,
|
|
@@ -112,6 +126,7 @@ export {
|
|
|
112
126
|
DeviceSettingNamespace,
|
|
113
127
|
DeviceSettingRestoreKind,
|
|
114
128
|
DeviceSettingVerb,
|
|
129
|
+
EvalCapExceededError,
|
|
115
130
|
IncompatibleInstallerVersionError,
|
|
116
131
|
IntegrationSetupFailedError,
|
|
117
132
|
OwnedInstanceExitedError,
|
|
@@ -140,8 +155,10 @@ export {
|
|
|
140
155
|
escapeSvgText,
|
|
141
156
|
evalInObsidian,
|
|
142
157
|
fitScreenshotToCanvas,
|
|
158
|
+
getAppConfig,
|
|
143
159
|
getVersionMetadata,
|
|
144
160
|
isPng,
|
|
161
|
+
isScriptTimeoutError,
|
|
145
162
|
labelScreenshot,
|
|
146
163
|
openObsidianSettingsTab,
|
|
147
164
|
parseInputMethodState,
|
|
@@ -159,17 +176,20 @@ export {
|
|
|
159
176
|
resolveInstallerCompatibility,
|
|
160
177
|
resolveMissingInjectedPlugins,
|
|
161
178
|
resolveSoftKeyboardTapPoints,
|
|
179
|
+
restoreAppConfig,
|
|
162
180
|
runAdbBinary,
|
|
163
181
|
runAdbText,
|
|
164
182
|
runAdbTextWithoutDevice,
|
|
165
183
|
runObsidianVersionMatrix,
|
|
166
184
|
selectEmulatorDeviceId,
|
|
185
|
+
setAppConfig,
|
|
167
186
|
setSetupErrorResolver,
|
|
168
187
|
setTransportOptionsResolver,
|
|
169
188
|
setVaultPathResolver,
|
|
170
189
|
tapDevice,
|
|
171
190
|
unregisterVault,
|
|
191
|
+
withAppConfig,
|
|
172
192
|
withSoftKeyboardEnabled,
|
|
173
193
|
writeDeviceSetting
|
|
174
194
|
};
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBSdW5BZGJQYXJhbXMgfSBmcm9tICcuL2FkYi5tanMnO1xuZXhwb3J0IHtcbiAgcnVuQWRiQmluYXJ5LFxuICBydW5BZGJUZXh0LFxuICBydW5BZGJUZXh0V2l0aG91dERldmljZVxufSBmcm9tICcuL2FkYi5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQgeyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQge1xuICBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeSxcbiAgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZXG59IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dE9mXG59IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNldHVwRXJyb3JSZXNvbHZlcixcbiAgVHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB7XG4gIHNldFNldHVwRXJyb3JSZXNvbHZlcixcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyxcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCxcbiAgSW5zdGFsbGVkUGx1Z2luSW5mb1xufSBmcm9tICcuL2RlbW8tdmF1bHQtYm9vdHN0cmFwLm1qcyc7XG5leHBvcnQge1xuICBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zLFxuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXMsXG4gIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLm1qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUubWpzJztcbmV4cG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUubWpzJztcbmV4cG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZURldmljZVNjcmVlbnNob3RQYXJhbXMgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgeyBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCB9IGZyb20gJy4vZGV2aWNlLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGV2aWNlU2V0dGluZ1Jlc3RvcmUsXG4gIERldmljZVNldHRpbmdSZXN0b3JlRGVsZXRlLFxuICBEZXZpY2VTZXR0aW5nUmVzdG9yZVdyaXRlXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmctcmVzdG9yZS5tanMnO1xuZXhwb3J0IHtcbiAgRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLFxuICByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmVcbn0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZy1yZXN0b3JlLm1qcyc7XG5leHBvcnQgdHlwZSB7IEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zIH0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MtY29tbWFuZC5tanMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZXZpY2VTZXR0aW5nc0NvbW1hbmRBcmd1bWVudHMsXG4gIERldmljZVNldHRpbmdOYW1lc3BhY2UsXG4gIERldmljZVNldHRpbmdWZXJiXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLWNvbW1hbmQubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGV2aWNlU2V0dGluZ1BhcmFtcyxcbiAgV2l0aFNvZnRLZXlib2FyZEVuYWJsZWRQYXJhbXMsXG4gIFdyaXRlRGV2aWNlU2V0dGluZ1BhcmFtc1xufSBmcm9tICcuL2RldmljZS1zZXR0aW5ncy5tanMnO1xuZXhwb3J0IHtcbiAgZGVsZXRlRGV2aWNlU2V0dGluZyxcbiAgcmVhZERldmljZVNldHRpbmcsXG4gIHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkLFxuICB3cml0ZURldmljZVNldHRpbmdcbn0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5LFxuICBFbGVjdHJvbkNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSxcbiAgU2VsZWN0RW11bGF0b3JEZXZpY2VJZFBhcmFtc1xufSBmcm9tICcuL2VtdWxhdG9yLWRldmljZS1pZC5tanMnO1xuZXhwb3J0IHsgc2VsZWN0RW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vZW11bGF0b3ItZGV2aWNlLWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENsaWNrRWxlbWVudFBhcmFtcyxcbiAgQ2xpY2tNb3VzZVBhcmFtcyxcbiAgQ29tbW9uQXJndW1lbnRzLFxuICBDcmVhdGVOb3RlUGFyYW1zLFxuICBFdmFsSW5PYnNpZGlhblBhcmFtcyxcbiAgR2VuZXJpY09iamVjdCxcbiAgSG92ZXJFbGVtZW50UGFyYW1zLFxuICBMaWIsXG4gIE1vdXNlQnV0dG9uLFxuICBNb3ZlTW91c2VQYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcHV0ZUZpdFRvQ2FudmFzUGFyYW1zLFxuICBGaXRTY3JlZW5zaG90VG9DYW52YXNPcHRpb25zLFxuICBGaXRUb0NhbnZhc0dlb21ldHJ5XG59IGZyb20gJy4vZml0LXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB7XG4gIGNvbXB1dGVGaXRUb0NhbnZhcyxcbiAgZml0U2NyZWVuc2hvdFRvQ2FudmFzXG59IGZyb20gJy4vZml0LXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5tanMnO1xuZXhwb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSxcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVRpZXIsXG4gIFJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB7IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHR5cGUgeyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vaW50ZWdyYXRpb24tc2V0dXAtZmFpbGVkLWVycm9yLm1qcyc7XG5leHBvcnQgeyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3IgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDb21wdXRlTGFiZWxCYW5kUGFyYW1zLFxuICBMYWJlbEJhbmRHZW9tZXRyeSxcbiAgTGFiZWxTY3JlZW5zaG90T3B0aW9uc1xufSBmcm9tICcuL2xhYmVsLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkTGFiZWxTdmcsXG4gIGNvbXB1dGVMYWJlbEJhbmQsXG4gIGVzY2FwZVN2Z1RleHQsXG4gIGxhYmVsU2NyZWVuc2hvdFxufSBmcm9tICcuL2xhYmVsLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuZXhwb3J0IHsgcmVnaXN0ZXJMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUnVudGltZVZlcnNpb25zLFxuICBPYnNpZGlhblZlcnNpb25DaGFuZ2Vsb2dVcmxzLFxuICBPYnNpZGlhblZlcnNpb25Eb3dubG9hZHMsXG4gIE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhXG59IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEubWpzJztcbmV4cG9ydCB7IGdldFZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEubWpzJztcbmV4cG9ydCB7XG4gIENBVEFMWVNUX0xBVEVTVCxcbiAgUFVCTElDX0xBVEVTVFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmV4cG9ydCB0eXBlIHsgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIH0gZnJvbSAnLi9vcGVuLW9ic2lkaWFuLXNldHRpbmdzLXRhYi5tanMnO1xuZXhwb3J0IHsgb3Blbk9ic2lkaWFuU2V0dGluZ3NUYWIgfSBmcm9tICcuL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLm1qcyc7XG5leHBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0ZWQtZXJyb3IubWpzJztcbmV4cG9ydCB7IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7IFBvbGxJbk9ic2lkaWFuUGFyYW1zIH0gZnJvbSAnLi9wb2xsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgeyBwb2xsSW5PYnNpZGlhbiB9IGZyb20gJy4vcG9sbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvciB9IGZyb20gJy4vcmVuZGVyZXItZmFpbGVkLXRvLWluaXRpYWxpemUtZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHsgUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMgfSBmcm9tICcuL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLm1qcyc7XG5leHBvcnQgeyByZXNvbHZlRW11bGF0b3JEZXZpY2VJZCB9IGZyb20gJy4vcmVzb2x2ZS1lbXVsYXRvci1kZXZpY2UtaWQubWpzJztcbmV4cG9ydCB0eXBlIHsgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIH0gZnJvbSAnLi9ydW4tdmVyc2lvbi1tYXRyaXgubWpzJztcbmV4cG9ydCB7IHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeCB9IGZyb20gJy4vcnVuLXZlcnNpb24tbWF0cml4Lm1qcyc7XG5leHBvcnQgdHlwZSB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvciB9IGZyb20gJy4vc2lsZW50LWFzYXItZmFsbGJhY2stZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZVBhcmFtcyxcbiAgQ2hlY2tJc1NvZnRLZXlib2FyZFVwUGFyYW1zLFxuICBFbGVtZW50UmVjdCxcbiAgUmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1BhcmFtcyxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlLFxuICBjaGVja0lzU29mdEtleWJvYXJkVXAsXG4gIERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBUYXBEZXZpY2VQYXJhbXNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLm1qcyc7XG5leHBvcnQge1xuICByYWlzZVNvZnRLZXlib2FyZCxcbiAgdGFwRGV2aWNlXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBQb3B1bGF0ZUZpbGVDb250ZW50LFxuICBQb3B1bGF0ZUZpbGVzUGFyYW1zLFxuICBUZW1wb3JhcnlWYXVsdE9wdGlvbnNcbn0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmV4cG9ydCB7IFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXBwaXVtU2Vzc2lvbkluZm8sXG4gIEFwcGl1bVRyYW5zcG9ydENvbmZpZ1xufSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmV4cG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLFxuICBPd25lZEluc3RhbmNlQXNhcixcbiAgT3duZWRJbnN0YW5jZUNvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUVuZHBvaW50XG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5leHBvcnQgeyBjaGVja0lzTW9iaWxlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5leHBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuZXhwb3J0IHR5cGUgeyBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeSB9IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcbmV4cG9ydCB7IERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDUyB9IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcbiJdLAogICJtYXBwaW5ncyI6ICJBQU9BO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU1QLFNBQVMsMkJBQTJCO0FBRXBDLFNBQVMsaUNBQWlDO0FBSzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLG9DQUFvQztBQUM3QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtQLFNBQVMsb0JBQW9CO0FBSzdCLFNBQVMsaUJBQWlCO0FBTTFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU1QO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGtDQUFrQztBQUUzQyxTQUFTLCtCQUErQjtBQU14QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU1QO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFNUCxTQUFTLG9DQUFvQztBQUs3QyxTQUFTLDhCQUE4QjtBQWtCdkMsU0FBUyxzQkFBc0I7QUFNL0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlDQUF5QztBQU1sRCxTQUFTLHFDQUFxQztBQUU5QyxTQUFTLG1DQUFtQztBQU01QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUywyQkFBMkI7QUFPcEMsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLCtCQUErQjtBQUV4QyxTQUFTLGdDQUFnQztBQUV6QyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHVDQUF1QztBQUVoRCxTQUFTLCtCQUErQjtBQUV4QyxTQUFTLGdDQUFnQztBQUV6QyxTQUFTLCtCQUErQjtBQVN4QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsU0FBUyxzQkFBc0I7QUFLL0IsU0FBUyx1QkFBdUI7QUFPaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxrQ0FBa0M7QUFNM0MsU0FBUyw4QkFBOEI7QUFNdkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHNDQUFzQzsiLAogICJuYW1lcyI6IFtdCn0K
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBSdW5BZGJQYXJhbXMgfSBmcm9tICcuL2FkYi5tanMnO1xuZXhwb3J0IHtcbiAgcnVuQWRiQmluYXJ5LFxuICBydW5BZGJUZXh0LFxuICBydW5BZGJUZXh0V2l0aG91dERldmljZVxufSBmcm9tICcuL2FkYi5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBDb25maWdQYXJhbXMsXG4gIEFwcENvbmZpZ1Jlc3RvcmUsXG4gIFNldEFwcENvbmZpZ1BhcmFtcyxcbiAgV2l0aEFwcENvbmZpZ1BhcmFtc1xufSBmcm9tICcuL2FwcC1jb25maWcubWpzJztcbmV4cG9ydCB7XG4gIGdldEFwcENvbmZpZyxcbiAgcmVzdG9yZUFwcENvbmZpZyxcbiAgc2V0QXBwQ29uZmlnLFxuICB3aXRoQXBwQ29uZmlnXG59IGZyb20gJy4vYXBwLWNvbmZpZy5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2RwQ29tbWFuZFRpbWVvdXRFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9jZHAtY29tbWFuZC10aW1lb3V0LWVycm9yLm1qcyc7XG5leHBvcnQgeyBDZHBDb21tYW5kVGltZW91dEVycm9yIH0gZnJvbSAnLi9jZHAtY29tbWFuZC10aW1lb3V0LWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7IENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS1mYWxsYmFjay1lcnJvci5tanMnO1xuZXhwb3J0IHsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvciB9IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS1mYWxsYmFjay1lcnJvci5tanMnO1xuZXhwb3J0IHtcbiAgYXNzZXJ0VmFsaWRDb25maWdEaXJlY3RvcnksXG4gIERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWVxufSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2RwQ29ubmVjdGlvbixcbiAgQ29ubmVjdFRvQ2RwT3B0aW9uc1xufSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLm1qcyc7XG5leHBvcnQgeyBjb25uZWN0VG9DZHAgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbnRleHRBcmd1bWVudHMsXG4gIENvbnRleHRPZlxufSBmcm9tICcuL2NvbnRleHQtaWQubWpzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBTZXR1cEVycm9yUmVzb2x2ZXIsXG4gIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgVmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQge1xuICBzZXRTZXR1cEVycm9yUmVzb2x2ZXIsXG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMsXG4gIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNSZXN1bHQsXG4gIEluc3RhbGxlZFBsdWdpbkluZm9cbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5tanMnO1xuZXhwb3J0IHtcbiAgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyxcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jXG59IGZyb20gJy4vZGVtby12YXVsdC1ib290c3RyYXAubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyxcbiAgSW5qZWN0UGx1Z2luUGFyYW1zLFxuICBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtc1xufSBmcm9tICcuL2RlbW8tdmF1bHQtcG9wdWxhdGUubWpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUsXG4gIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuZXhwb3J0IHR5cGUgeyBSZWFkRGVtb1ZhdWx0VHJlZVBhcmFtcyB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5leHBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wT25seVBsdWdpblNraXBFcnJvciB9IGZyb20gJy4vZGVza3RvcC1vbmx5LXBsdWdpbi1za2lwLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7IENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zIH0gZnJvbSAnLi9kZXZpY2Utc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIERldmljZVNldHRpbmdSZXN0b3JlLFxuICBEZXZpY2VTZXR0aW5nUmVzdG9yZURlbGV0ZSxcbiAgRGV2aWNlU2V0dGluZ1Jlc3RvcmVXcml0ZVxufSBmcm9tICcuL2RldmljZS1zZXR0aW5nLXJlc3RvcmUubWpzJztcbmV4cG9ydCB7XG4gIERldmljZVNldHRpbmdSZXN0b3JlS2luZCxcbiAgcmVzb2x2ZURldmljZVNldHRpbmdSZXN0b3JlXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmctcmVzdG9yZS5tanMnO1xuZXhwb3J0IHR5cGUgeyBCdWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50c1BhcmFtcyB9IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLWNvbW1hbmQubWpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzLFxuICBEZXZpY2VTZXR0aW5nTmFtZXNwYWNlLFxuICBEZXZpY2VTZXR0aW5nVmVyYlxufSBmcm9tICcuL2RldmljZS1zZXR0aW5ncy1jb21tYW5kLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIERldmljZVNldHRpbmdQYXJhbXMsXG4gIFdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkUGFyYW1zLFxuICBXcml0ZURldmljZVNldHRpbmdQYXJhbXNcbn0gZnJvbSAnLi9kZXZpY2Utc2V0dGluZ3MubWpzJztcbmV4cG9ydCB7XG4gIGRlbGV0ZURldmljZVNldHRpbmcsXG4gIHJlYWREZXZpY2VTZXR0aW5nLFxuICB3aXRoU29mdEtleWJvYXJkRW5hYmxlZCxcbiAgd3JpdGVEZXZpY2VTZXR0aW5nXG59IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEVsZWN0cm9uQ29tcGF0aWJpbGl0eSxcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5VGllcixcbiAgUmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eVBhcmFtc1xufSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRW11bGF0b3JEZXZpY2VDYW5kaWRhdGUsXG4gIFNlbGVjdEVtdWxhdG9yRGV2aWNlSWRQYXJhbXNcbn0gZnJvbSAnLi9lbXVsYXRvci1kZXZpY2UtaWQubWpzJztcbmV4cG9ydCB7IHNlbGVjdEVtdWxhdG9yRGV2aWNlSWQgfSBmcm9tICcuL2VtdWxhdG9yLWRldmljZS1pZC5tanMnO1xuZXhwb3J0IHR5cGUgeyBFdmFsQ2FwRXhjZWVkZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9ldmFsLWNhcC1leGNlZWRlZC1lcnJvci5tanMnO1xuZXhwb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmV4cG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENvbW1vbkFyZ3VtZW50cyxcbiAgQ3JlYXRlTm90ZVBhcmFtcyxcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3QsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTGliLFxuICBNb3VzZUJ1dHRvbixcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbXB1dGVGaXRUb0NhbnZhc1BhcmFtcyxcbiAgRml0U2NyZWVuc2hvdFRvQ2FudmFzT3B0aW9ucyxcbiAgRml0VG9DYW52YXNHZW9tZXRyeVxufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBjb21wdXRlRml0VG9DYW52YXMsXG4gIGZpdFNjcmVlbnNob3RUb0NhbnZhc1xufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmV4cG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHksXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVBhcmFtc1xufSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5leHBvcnQgeyByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB0eXBlIHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5tanMnO1xuZXhwb3J0IHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcHV0ZUxhYmVsQmFuZFBhcmFtcyxcbiAgTGFiZWxCYW5kR2VvbWV0cnksXG4gIExhYmVsU2NyZWVuc2hvdE9wdGlvbnNcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZExhYmVsU3ZnLFxuICBjb21wdXRlTGFiZWxCYW5kLFxuICBlc2NhcGVTdmdUZXh0LFxuICBsYWJlbFNjcmVlbnNob3Rcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmV4cG9ydCB7IHJlZ2lzdGVyTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhblJ1bnRpbWVWZXJzaW9ucyxcbiAgT2JzaWRpYW5WZXJzaW9uQ2hhbmdlbG9nVXJscyxcbiAgT2JzaWRpYW5WZXJzaW9uRG93bmxvYWRzLFxuICBPYnNpZGlhblZlcnNpb25NZXRhZGF0YVxufSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQge1xuICBDQVRBTFlTVF9MQVRFU1QsXG4gIFBVQkxJQ19MQVRFU1Rcbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5leHBvcnQgdHlwZSB7IE9wZW5PYnNpZGlhblNldHRpbmdzVGFiT3B0aW9ucyB9IGZyb20gJy4vb3Blbi1vYnNpZGlhbi1zZXR0aW5ncy10YWIubWpzJztcbmV4cG9ydCB7IG9wZW5PYnNpZGlhblNldHRpbmdzVGFiIH0gZnJvbSAnLi9vcGVuLW9ic2lkaWFuLXNldHRpbmdzLXRhYi5tanMnO1xuZXhwb3J0IHR5cGUgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5leHBvcnQgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IgfSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUgeyBQb2xsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vcG9sbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgcG9sbEluT2JzaWRpYW4gfSBmcm9tICcuL3BvbGwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7IFJlc29sdmVFbXVsYXRvckRldmljZUlkUGFyYW1zIH0gZnJvbSAnLi9yZXNvbHZlLWVtdWxhdG9yLWRldmljZS1pZC5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWQgfSBmcm9tICcuL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7IFJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeFBhcmFtcyB9IGZyb20gJy4vcnVuLXZlcnNpb24tbWF0cml4Lm1qcyc7XG5leHBvcnQgeyBydW5PYnNpZGlhblZlcnNpb25NYXRyaXggfSBmcm9tICcuL3J1bi12ZXJzaW9uLW1hdHJpeC5tanMnO1xuZXhwb3J0IHR5cGUgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5tanMnO1xuZXhwb3J0IHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMsXG4gIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyxcbiAgRWxlbWVudFJlY3QsXG4gIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMsXG4gIFNvZnRLZXlib2FyZFRhcFBvaW50LFxuICBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuZXhwb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc1NvZnRLZXlib2FyZFVwLFxuICBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUyxcbiAgcGFyc2VJbnB1dE1ldGhvZFN0YXRlLFxuICByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyxcbiAgVGFwRGV2aWNlUGFyYW1zXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC5tanMnO1xuZXhwb3J0IHtcbiAgcmFpc2VTb2Z0S2V5Ym9hcmQsXG4gIHRhcERldmljZVxufSBmcm9tICcuL3NvZnQta2V5Ym9hcmQubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtcyxcbiAgVGVtcG9yYXJ5VmF1bHRPcHRpb25zXG59IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5leHBvcnQgeyBUZW1wb3JhcnlWYXVsdCB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEFwcGl1bVNlc3Npb25JbmZvLFxuICBBcHBpdW1UcmFuc3BvcnRDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUFzYXIsXG4gIE93bmVkSW5zdGFuY2VDb25maWcsXG4gIE93bmVkSW5zdGFuY2VFbmRwb2ludFxufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuZXhwb3J0IHsgY2hlY2tJc01vYmlsZVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29uc29sZUNhcHR1cmVIYW5kbGUsXG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcbmV4cG9ydCB0eXBlIHsgT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkgfSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5leHBvcnQgeyBERUZBVUxUX09CU0lESUFOX1ZFUlNJT05fU1BFQ1MgfSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG4iXSwKICAibWFwcGluZ3MiOiAiQUFPQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFPUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsU0FBUywyQkFBMkI7QUFFcEMsU0FBUyxpQ0FBaUM7QUFLMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsOEJBQThCO0FBRXZDLFNBQVMsb0NBQW9DO0FBQzdDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyxvQkFBb0I7QUFLN0IsU0FBUyxpQkFBaUI7QUFNMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFNUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsa0NBQWtDO0FBRTNDLFNBQVMsK0JBQStCO0FBTXhDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU1QLFNBQVMsb0NBQW9DO0FBSzdDLFNBQVMsOEJBQThCO0FBRXZDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx3Q0FBd0M7QUFrQmpELFNBQVMsc0JBQXNCO0FBTS9CO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyx5Q0FBeUM7QUFNbEQsU0FBUyxxQ0FBcUM7QUFFOUMsU0FBUyxtQ0FBbUM7QUFNNUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsMkJBQTJCO0FBT3BDLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUywrQkFBK0I7QUFFeEMsU0FBUyxnQ0FBZ0M7QUFFekMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyx1Q0FBdUM7QUFFaEQsU0FBUywrQkFBK0I7QUFFeEMsU0FBUyxnQ0FBZ0M7QUFFekMsU0FBUywrQkFBK0I7QUFTeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFLUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU1QLFNBQVMsc0JBQXNCO0FBSy9CLFNBQVMsdUJBQXVCO0FBT2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0NBQWtDO0FBTTNDLFNBQVMsOEJBQThCO0FBTXZDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxzQ0FBc0M7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist/lib/esm/library.mjs
CHANGED