obsidian-integration-testing 12.2.0 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -5
- package/dist/lib/cjs/adb.cjs +1 -1
- package/dist/lib/cjs/app-config.cjs +1 -1
- package/dist/lib/cjs/app-config.d.cts +1 -1
- package/dist/lib/cjs/appium-dependencies.cjs +1 -1
- package/dist/lib/cjs/appium-session-config.cjs +3 -5
- package/dist/lib/cjs/appium-session-config.d.cts +6 -9
- 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/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +1 -1
- package/dist/lib/cjs/device-readiness.cjs +1 -1
- package/dist/lib/cjs/device-settings.cjs +1 -1
- package/dist/lib/cjs/device-settings.d.cts +1 -1
- 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-reaper.cjs +1 -1
- package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
- package/dist/lib/cjs/emulator-reclaim.cjs +1 -1
- package/dist/lib/cjs/emulator-reclaim.d.cts +17 -17
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -0
- package/dist/lib/cjs/fit-screenshot.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.cjs +1 -1
- package/dist/lib/cjs/generate-function-call.d.cts +1 -1
- package/dist/lib/cjs/global-setup-core.cjs +1 -1
- package/dist/lib/cjs/global-setup-core.d.cts +4 -4
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/integration-setup-failed-error.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.cjs +1 -1
- package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
- package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
- package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +13 -3
- package/dist/lib/cjs/obsidian-instance.cjs +1 -1
- package/dist/lib/cjs/obsidian-version-switch.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/owned-vault-seed.cjs +3 -3
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
- package/dist/lib/cjs/process-capture.cjs +1 -1
- package/dist/lib/cjs/process-capture.d.cts +5 -5
- package/dist/lib/cjs/process-exit-message.cjs +1 -1
- package/dist/lib/cjs/process-exit-message.d.cts +2 -2
- package/dist/lib/cjs/run-version-matrix.cjs +3 -3
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/setup-lock.cjs +1 -1
- 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/temporary-vault.cjs +3 -1
- package/dist/lib/cjs/transport-appium.cjs +7 -5
- package/dist/lib/cjs/transport-desktop-cdp.cjs +81 -15
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-factory.cjs +2 -2
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +11 -1
- package/dist/lib/cjs/vault-teardown-verdict.cjs +1 -1
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
- package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/adb.mjs +1 -1
- package/dist/lib/esm/app-config.d.mts +1 -1
- package/dist/lib/esm/app-config.mjs +1 -1
- package/dist/lib/esm/appium-dependencies.mjs +1 -1
- package/dist/lib/esm/appium-session-config.d.mts +6 -9
- package/dist/lib/esm/appium-session-config.mjs +3 -4
- 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/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +1 -1
- package/dist/lib/esm/device-readiness.mjs +1 -1
- package/dist/lib/esm/device-settings.d.mts +1 -1
- package/dist/lib/esm/device-settings.mjs +1 -1
- 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-reaper.d.mts +2 -2
- package/dist/lib/esm/emulator-reaper.mjs +1 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +17 -17
- package/dist/lib/esm/emulator-reclaim.mjs +1 -1
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/eval-in-obsidian.d.mts +5 -0
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/fit-screenshot.mjs +1 -1
- package/dist/lib/esm/generate-function-call.d.mts +1 -1
- package/dist/lib/esm/generate-function-call.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +4 -4
- package/dist/lib/esm/global-setup-core.mjs +1 -1
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/integration-setup-failed-error.mjs +1 -1
- package/dist/lib/esm/jest/global-setup.d.mts +3 -3
- package/dist/lib/esm/jest/global-setup.mjs +1 -1
- package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
- package/dist/lib/esm/leftover-cleanup.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +13 -3
- package/dist/lib/esm/obsidian-instance.mjs +1 -1
- package/dist/lib/esm/obsidian-version-switch.mjs +1 -1
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-vault-seed.mjs +3 -3
- package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/process-capture.d.mts +5 -5
- package/dist/lib/esm/process-capture.mjs +1 -1
- package/dist/lib/esm/process-exit-message.d.mts +2 -2
- package/dist/lib/esm/process-exit-message.mjs +1 -1
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +3 -3
- package/dist/lib/esm/setup-lock.mjs +1 -1
- 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/temporary-vault.mjs +3 -1
- package/dist/lib/esm/transport-appium.mjs +7 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +81 -15
- package/dist/lib/esm/transport-factory.mjs +2 -2
- package/dist/lib/esm/transport-options.d.mts +11 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/vault-teardown-verdict.mjs +1 -1
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
- package/dist/lib/esm/vitest/global-setup.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 +1 -7
|
@@ -11,6 +11,18 @@ class WebViewCdpConnection {
|
|
|
11
11
|
/**
|
|
12
12
|
* Wraps an already-open debugger socket, plus what is needed to tear its port forward down.
|
|
13
13
|
*
|
|
14
|
+
* ONE `message` listener for the socket's whole life, routing both halves of what
|
|
15
|
+
* arrives — CDP events to their subscribed handler, command replies to the
|
|
16
|
+
* {@link send} call waiting on the id. A listener per in-flight command instead
|
|
17
|
+
* would make the count scale with concurrency, so eleven commands in flight at
|
|
18
|
+
* once would cross Node's default `maxListeners` of 10 and report a memory leak
|
|
19
|
+
* that is not one (see the desktop transport's `getPendingCommands`, where the
|
|
20
|
+
* same shape was measured).
|
|
21
|
+
*
|
|
22
|
+
* The parse is guarded because a frame this connection cannot read belongs to
|
|
23
|
+
* nothing it sent: throwing here would throw out of the event dispatch, where
|
|
24
|
+
* nothing can catch it.
|
|
25
|
+
*
|
|
14
26
|
* @param webSocket - The open debugger socket.
|
|
15
27
|
* @param deviceId - The adb device id, needed to drop the port forward on dispose.
|
|
16
28
|
* @param port - The forwarded local port.
|
|
@@ -20,11 +32,25 @@ class WebViewCdpConnection {
|
|
|
20
32
|
this.deviceId = deviceId;
|
|
21
33
|
this.port = port;
|
|
22
34
|
this.webSocket.addEventListener("message", (event) => {
|
|
23
|
-
|
|
24
|
-
|
|
35
|
+
let message;
|
|
36
|
+
try {
|
|
37
|
+
message = JSON.parse(String(event.data));
|
|
38
|
+
} catch {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (message.method !== void 0) {
|
|
42
|
+
this.eventHandlers.get(message.method)?.(message.params ?? {});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (message.id === void 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const pendingCommand = this.pendingCommands.get(message.id);
|
|
49
|
+
if (!pendingCommand) {
|
|
25
50
|
return;
|
|
26
51
|
}
|
|
27
|
-
this.
|
|
52
|
+
this.pendingCommands.delete(message.id);
|
|
53
|
+
pendingCommand(message);
|
|
28
54
|
});
|
|
29
55
|
}
|
|
30
56
|
webSocket;
|
|
@@ -43,6 +69,11 @@ class WebViewCdpConnection {
|
|
|
43
69
|
}
|
|
44
70
|
eventHandlers = /* @__PURE__ */ new Map();
|
|
45
71
|
messageId = 0;
|
|
72
|
+
/**
|
|
73
|
+
* The commands still waiting for a reply, keyed by the CDP message id each was
|
|
74
|
+
* sent with. Emptied by whichever of the reply and the timeout comes first.
|
|
75
|
+
*/
|
|
76
|
+
pendingCommands = /* @__PURE__ */ new Map();
|
|
46
77
|
/**
|
|
47
78
|
* Closes the socket and drops the adb port forward.
|
|
48
79
|
*/
|
|
@@ -86,24 +117,24 @@ class WebViewCdpConnection {
|
|
|
86
117
|
const id = ++this.messageId;
|
|
87
118
|
return new Promise((resolve, reject) => {
|
|
88
119
|
const timeout = setTimeout(() => {
|
|
89
|
-
this.
|
|
120
|
+
this.pendingCommands.delete(id);
|
|
90
121
|
reject(new Error(`WebView CDP command timed out after ${String(CDP_COMMAND_TIMEOUT_IN_MILLISECONDS)}ms: ${method}`));
|
|
91
122
|
}, CDP_COMMAND_TIMEOUT_IN_MILLISECONDS);
|
|
92
|
-
|
|
93
|
-
const message = JSON.parse(String(event.data));
|
|
94
|
-
if (message.id !== id) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
123
|
+
this.pendingCommands.set(id, (message) => {
|
|
97
124
|
clearTimeout(timeout);
|
|
98
|
-
this.webSocket.removeEventListener("message", handler);
|
|
99
125
|
if (message.error) {
|
|
100
126
|
reject(new Error(`WebView CDP command ${method} failed: ${message.error.message ?? "unknown error"}`));
|
|
101
127
|
return;
|
|
102
128
|
}
|
|
103
129
|
resolve(message.result ?? {});
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
|
|
130
|
+
});
|
|
131
|
+
try {
|
|
132
|
+
this.webSocket.send(JSON.stringify({ id, method, params }));
|
|
133
|
+
} catch (error) {
|
|
134
|
+
clearTimeout(timeout);
|
|
135
|
+
this.pendingCommands.delete(id);
|
|
136
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
137
|
+
}
|
|
107
138
|
});
|
|
108
139
|
}
|
|
109
140
|
/**
|
|
@@ -232,4 +263,4 @@ export {
|
|
|
232
263
|
parseWebViewDevtoolsSocketName,
|
|
233
264
|
selectWebViewPageTarget
|
|
234
265
|
};
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3dlYnZpZXctY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSBzZWNvbmQsIGluZGVwZW5kZW50IENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb25uZWN0aW9uIHRvIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcsIHVzZWQgdG8gaW5qZWN0XG4gKiAqKnRydXN0ZWQqKiBpbnB1dCBvbiBBbmRyb2lkIChzZWUgKipMMzkqKikuXG4gKlxuICogSXQgaXMgZGVsaWJlcmF0ZWx5IHNlcGFyYXRlIGZyb20gdGhlIEFwcGl1bSBzZXNzaW9uIHJhdGhlciB0aGFuIGxheWVyZWQgb24gaXQuIGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgXG4gKiBydW5zIHRoZSB3aG9sZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUgaW5zaWRlIG9uZSBXM0MgKkV4ZWN1dGUgU2NyaXB0Kiwgd2hpY2ggYXdhaXRzIHRoZSByZXR1cm5lZFxuICogcHJvbWlzZSBcdTIwMTQgc28gd2hpbGUgYSBjbG9zdXJlIHNpdHMgd2FpdGluZyBvbiBgbGliLmNsaWNrRWxlbWVudCguLi4pYCwgdGhlIFdlYkRyaXZlciBzZXNzaW9uIGlzIGJ1c3kgYW5kXG4gKiBjYW5ub3QgYmUgYXNrZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4gQ0RQIGlzIGlkLW11bHRpcGxleGVkIGFuZCBDaHJvbWl1bSBhY2NlcHRzIG11bHRpcGxlIGRlYnVnZ2VyXG4gKiBjbGllbnRzLCBzbyB0aGlzIHNvY2tldCBzdGF5cyBmcmVlIGV4YWN0bHkgd2hlbiB0aGUgQXBwaXVtIG9uZSBkb2VzIG5vdC4gVGhhdCBpcyB3aGF0IGxldHMgdGhlIHJlbmRlcmVyXG4gKiBjYWxsIGJhY2sgb3V0IHRvIHRoZSBob3N0IG1pZC1jbG9zdXJlLlxuICpcbiAqIFJlYWNoaW5nIHRoZSBXZWJWaWV3J3MgZGVidWdnZXIgaXMgYSB0d28tc3RlcDogdGhlIGFwcCBwdWJsaXNoZXMgYW4gYWJzdHJhY3QgdW5peCBzb2NrZXQgbmFtZWRcbiAqIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV88cGlkPmAsIGBhZGIgZm9yd2FyZGAgbWFwcyBpdCB0byBhIGxvY2FsIFRDUCBwb3J0LCBhbmQgdGhlIHVzdWFsIGAvanNvbmBcbiAqIGVuZHBvaW50IHRoZW4gbGlzdHMgdGhlIHBhZ2UgdGFyZ2V0cy5cbiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENkcElucHV0Q29tbWFuZCB9IGZyb20gJy4vbW9iaWxlLWlucHV0Lm1qcyc7XG5cbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBwaWNrRnJlZVBvcnQgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5cbmNvbnN0IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE1XzAwMDtcbi8vIGBhZGIgZm9yd2FyZCAtLWxpc3RgIHByaW50cyB0aHJlZSBjb2x1bW5zOiBgPGRldmljZUlkPiB0Y3A6PHBvcnQ+IGxvY2FsYWJzdHJhY3Q6PHNvY2tldE5hbWU+YC5cbmNvbnN0IEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQgPSAzO1xuY29uc3QgREVDSU1BTF9SQURJWCA9IDEwO1xuY29uc3QgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5jb25zdCBDRFBfSE9TVCA9ICcxMjcuMC4wLjEnO1xuXG4vKipcbiAqIE9uZSBlbnRyeSBvZiB0aGUgZGVidWdnZXIncyBgL2pzb25gIHRhcmdldCBsaXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENkcFRhcmdldCB7XG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSB1cmw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdlYlNvY2tldERlYnVnZ2VyVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb25uZWN0VG9XZWJWaWV3Q2RwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0VG9XZWJWaWV3Q2RwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIGlkIHdob3NlIFdlYlZpZXcgdG8gYXR0YWNoIHRvLCBlLmcuIGBtZC5vYnNpZGlhbmAuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWRiIGRldmljZSBpZCAoYGVtdWxhdG9yLTU1NTRgLCBhIHNlcmlhbCkgdG8gcnVuIGFkYiBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXJyb3IgaGFsZiBvZiBhIGZhaWxlZCBDRFAgY29tbWFuZCByZXNwb25zZS5cbiAqL1xuaW50ZXJmYWNlIENkcEVycm9yIHtcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIYW5kbGVzIGEgQ0RQIGV2ZW50LlxuICovXG50eXBlIENkcEV2ZW50SGFuZGxlciA9IChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgQ0RQIG1lc3NhZ2U6IGVpdGhlciBhIHJlc3BvbnNlIHRvIGEgY29tbWFuZCAoYGlkYCkgb3IgYW4gZXZlbnQgKGBtZXRob2RgKS5cbiAqL1xuaW50ZXJmYWNlIENkcE1lc3NhZ2Uge1xuICByZWFkb25seSBlcnJvcj86IENkcEVycm9yO1xuICByZWFkb25seSBpZD86IG51bWJlcjtcbiAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgcmVzdWx0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKGEgbGl2ZSBXZWJTb2NrZXQgdG8gYSBXZWJWaWV3LCBhZGIgcG9ydCBmb3J3YXJkaW5nKS4gQ292ZXJlZCBieSB0aGUgQW5kcm9pZCBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IGJ5IHVuaXQgdGVzdHMuIEl0IGVuZHMgYmVmb3JlIGBwYXJzZUZvcndhcmRlZFBvcnRgOiBgcGVyZmVjdGlvbmlzdC9zb3J0LW1vZHVsZXNgIHBsYWNlcyB0aGUgcHVyZSwgdW5pdC10ZXN0ZWQgaGVscGVycyBBRlRFUiB0aGlzIGNsYXNzIGFuZCBgY29ubmVjdFRvV2ViVmlld0NkcGAsIHNvIHRoZXkgbXVzdCBzdGF5IG1lYXN1cmVkLiAqL1xuXG4vKipcbiAqIEFuIG9wZW4gQ0RQIGNvbm5lY3Rpb24gdG8gYSBXZWJWaWV3LlxuICpcbiAqIENvbW1hbmRzIGFyZSBpZC1tdWx0aXBsZXhlZCwgc28gYSBjb21tYW5kIGlzc3VlZCBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyIGNvbXBsZXRlcyB3aGlsZSBhbiBlYXJsaWVyXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAgaXMgc3RpbGwgYXdhaXRpbmcgaXRzIHByb21pc2UgXHUyMDE0IHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcyBjbGFzcyBleGlzdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJWaWV3Q2RwQ29ubmVjdGlvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgc3RpbGwgdXNhYmxlLlxuICAgKlxuICAgKiBSZXN0YXJ0aW5nIHRoZSBhcHAgdGVhcnMgaXRzIFdlYlZpZXcgZG93biBhbmQgdGFrZXMgdGhlIGRlYnVnZ2VyIHRhcmdldCB3aXRoIGl0LCBzbyBhIGNhY2hlZFxuICAgKiBjb25uZWN0aW9uIGhhcyB0byBiZSByZS1jaGVja2VkIHJhdGhlciB0aGFuIGFzc3VtZWQgbGl2ZS5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIHdoaWxlIHRoZSBzb2NrZXQgaXMgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLndlYlNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVycyA9IG5ldyBNYXA8c3RyaW5nLCBDZHBFdmVudEhhbmRsZXI+KCk7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlSWQgPSAwO1xuXG4gIC8qKlxuICAgKiBXcmFwcyBhbiBhbHJlYWR5LW9wZW4gZGVidWdnZXIgc29ja2V0LCBwbHVzIHdoYXQgaXMgbmVlZGVkIHRvIHRlYXIgaXRzIHBvcnQgZm9yd2FyZCBkb3duLlxuICAgKlxuICAgKiBAcGFyYW0gd2ViU29ja2V0IC0gVGhlIG9wZW4gZGVidWdnZXIgc29ja2V0LlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZCwgbmVlZGVkIHRvIGRyb3AgdGhlIHBvcnQgZm9yd2FyZCBvbiBkaXNwb3NlLlxuICAgKiBAcGFyYW0gcG9ydCAtIFRoZSBmb3J3YXJkZWQgbG9jYWwgcG9ydC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHdlYlNvY2tldDogV2ViU29ja2V0LCBwcml2YXRlIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmcsIHByaXZhdGUgcmVhZG9ubHkgcG9ydDogbnVtYmVyKSB7XG4gICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcE1lc3NhZ2U7XG4gICAgICBpZiAobWVzc2FnZS5tZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXZlbnRIYW5kbGVycy5nZXQobWVzc2FnZS5tZXRob2QpPy4obWVzc2FnZS5wYXJhbXMgPz8ge30pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgc29ja2V0IGFuZCBkcm9wcyB0aGUgYWRiIHBvcnQgZm9yd2FyZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2xvc2VTb2NrZXQoKTtcbiAgICBhd2FpdCByZW1vdmVGb3J3YXJkKHRoaXMuZGV2aWNlSWQsIHRoaXMucG9ydCk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMgZGlzcG9zYWwsIGZvciBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVycyB3aGVyZSBhc3luYyB3b3JrIGNhbm5vdCBydW4uXG4gICAqXG4gICAqIFdpdGhvdXQgdGhpcyBhbiBhYnJ1cHQgd29ya2VyIGV4aXQgbGVhdmVzIHRoZSBwb3J0IGZvcndhcmQgYmVoaW5kIFx1MjAxNCB0aGUgYXN5bmMge0BsaW5rIGRpc3Bvc2V9IGFib3ZlXG4gICAqIG5ldmVyIGdldHMgYSB0dXJuLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VTb2NrZXQoKTtcbiAgICB0cnkge1xuICAgICAgZXhlY0ZpbGVTeW5jKCdhZGInLCBbJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2ZvcndhcmQnLCAnLS1yZW1vdmUnLCBgdGNwOiR7U3RyaW5nKHRoaXMucG9ydCl9YF0sIHtcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgICB0aW1lb3V0OiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdCBlZmZvcnQ6IGFkYiBkcm9wcyBldmVyeSBmb3J3YXJkIHdoZW4gdGhlIGRldmljZSBkaXNjb25uZWN0cyBhbnl3YXkuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gYSBDRFAgZXZlbnQuIE9uZSBoYW5kbGVyIHBlciBtZXRob2Q7IHN1YnNjcmliaW5nIGFnYWluIHJlcGxhY2VzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBldmVudCBuYW1lLCBlLmcuIGBSdW50aW1lLmJpbmRpbmdDYWxsZWRgLlxuICAgKiBAcGFyYW0gaGFuZGxlciAtIENhbGxlZCB3aXRoIHRoZSBldmVudCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIG9uKG1ldGhvZDogc3RyaW5nLCBoYW5kbGVyOiBDZHBFdmVudEhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuc2V0KG1ldGhvZCwgaGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBDRFAgY29tbWFuZCBhbmQgd2FpdHMgZm9yIGl0cyByZXNwb25zZS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIFRoZSBDRFAgbWV0aG9kIG5hbWUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgY29tbWFuZCByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgc2VuZChtZXRob2Q6IHN0cmluZywgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IGlkID0gKyt0aGlzLm1lc3NhZ2VJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLndlYlNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYlZpZXcgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKENEUF9DT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoU3RyaW5nKGV2ZW50LmRhdGEpKSBhcyBDZHBNZXNzYWdlO1xuICAgICAgICBpZiAobWVzc2FnZS5pZCAhPT0gaWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIHRoaXMud2ViU29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBXZWJWaWV3IENEUCBjb21tYW5kICR7bWV0aG9kfSBmYWlsZWQ6ICR7bWVzc2FnZS5lcnJvci5tZXNzYWdlID8/ICd1bmtub3duIGVycm9yJ31gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlLnJlc3VsdCA/PyB7fSk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gICAgICB0aGlzLndlYlNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgaWQsIG1ldGhvZCwgcGFyYW1zIH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhbiBvcmRlcmVkIGNvbW1hbmQgc2VxdWVuY2UsIG9uZSBjb21tYW5kIGF0IGEgdGltZS5cbiAgICpcbiAgICogRWFjaCBjb21tYW5kIGlzIGF3YWl0ZWQgYmVmb3JlIHRoZSBuZXh0IGlzIHNlbnQsIHdoaWNoIGlzIHRoZSBvbmx5IG9yZGVyaW5nIGd1YXJhbnRlZSBhbiBpbnB1dFxuICAgKiBzZXF1ZW5jZSBuZWVkcyBcdTIwMTQgYSBsb25nLXByZXNzIGhvbGRzIGl0c2VsZiBmb3IgaXRzIG93biBgZHVyYXRpb25gIHJhdGhlciB0aGFuIGFza2luZyB0aGUgaG9zdCB0b1xuICAgKiBzbGVlcCBiZXR3ZWVuIHR3byB0b3VjaGVzLCBzbyB0aGVyZSBpcyBubyBpbnRlci1jb21tYW5kIGRlbGF5IHRvIGhvbm9yLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZHMgLSBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZEFsbChjb21tYW5kczogcmVhZG9ubHkgQ2RwSW5wdXRDb21tYW5kW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2YgY29tbWFuZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChjb21tYW5kLm1ldGhvZCwgY29tbWFuZC5wYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGRlYnVnZ2VyIHNvY2tldCBhbmQgc3RvcHMgcm91dGluZyBpdHMgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjbG9zZVNvY2tldCgpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50SGFuZGxlcnMuY2xlYXIoKTtcbiAgICBpZiAodGhpcy53ZWJTb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogT3BlbnMgYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgYXBwJ3MgV2ViVmlldy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggYXBwIG9uIHdoaWNoIGRldmljZS5cbiAqIEByZXR1cm5zIFRoZSBvcGVuIGNvbm5lY3Rpb24uIERpc3Bvc2UgaXQgdG8gY2xvc2UgdGhlIHNvY2tldCBhbmQgZHJvcCB0aGUgYWRiIHBvcnQgZm9yd2FyZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb1dlYlZpZXdDZHAocGFyYW1zOiBDb25uZWN0VG9XZWJWaWV3Q2RwUGFyYW1zKTogUHJvbWlzZTxXZWJWaWV3Q2RwQ29ubmVjdGlvbj4ge1xuICBjb25zdCB7IGFwcElkLCBkZXZpY2VJZCB9ID0gcGFyYW1zO1xuXG4gIC8vIGBwaWRvZmAgbGlzdHMgZXZlcnkgbWF0Y2hpbmcgcHJvY2VzczsgdGhlIGFwcCdzIG1haW4gb25lIGlzIGZpcnN0LlxuICBjb25zdCBwaWRvZk91dHB1dCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydzaGVsbCcsICdwaWRvZicsIGFwcElkXSk7XG4gIGNvbnN0IHBpZCA9IHBpZG9mT3V0cHV0LnNwbGl0KC9cXHMrLywgMSlbMF0gPz8gJyc7XG4gIGlmICghcGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke2FwcElkfSBpcyBub3QgcnVubmluZyBvbiAke2RldmljZUlkfSwgc28gaXRzIFdlYlZpZXcgaGFzIG5vIGRlYnVnZ2VyIHRvIGF0dGFjaCB0by5gKTtcbiAgfVxuXG4gIGNvbnN0IHByb2NOZXRVbml4ID0gYXdhaXQgYWRiKGRldmljZUlkLCBbJ3NoZWxsJywgJ2NhdCcsICcvcHJvYy9uZXQvdW5peCddKTtcbiAgY29uc3Qgc29ja2V0TmFtZSA9IHBhcnNlV2ViVmlld0RldnRvb2xzU29ja2V0TmFtZShwcm9jTmV0VW5peCwgcGlkKTtcblxuICBjb25zdCBmb3J3YXJkTGlzdCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgY29uc3QgZXhpc3RpbmdQb3J0ID0gcGFyc2VGb3J3YXJkZWRQb3J0KGZvcndhcmRMaXN0LCBkZXZpY2VJZCwgc29ja2V0TmFtZSk7XG4gIGNvbnN0IHBvcnQgPSBleGlzdGluZ1BvcnQgPz8gYXdhaXQgcGlja0ZyZWVQb3J0KCk7XG4gIGlmIChleGlzdGluZ1BvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGF3YWl0IGFkYihkZXZpY2VJZCwgWydmb3J3YXJkJywgYHRjcDoke1N0cmluZyhwb3J0KX1gLCBgbG9jYWxhYnN0cmFjdDoke3NvY2tldE5hbWV9YF0pO1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBGb3J3YXJkZWQgdGNwOiR7U3RyaW5nKHBvcnQpfSAtPiBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX0gKCR7YXBwSWR9IHBpZCAke3BpZH0pYCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nKGBbd2Vidmlldy1jZHBdIFJldXNpbmcgZm9yd2FyZCB0Y3A6JHtTdHJpbmcocG9ydCl9IC0+IGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfSAoJHthcHBJZH0gcGlkICR7cGlkfSlgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovLyR7Q0RQX0hPU1R9OiR7U3RyaW5nKHBvcnQpfS9qc29uYCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0V2ViVmlld1BhZ2VUYXJnZXQoYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIENkcFRhcmdldFtdKTtcbiAgICBjb25zdCB3ZWJTb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCA/PyAnJyk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ291bGQgbm90IG9wZW4gdGhlIFdlYlZpZXcgQ0RQIHNvY2tldCBhdCAke3RhcmdldC53ZWJTb2NrZXREZWJ1Z2dlclVybCA/PyAnJ30uYCkpO1xuICAgICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBBdHRhY2hlZCB0byBXZWJWaWV3IHRhcmdldCBcIiR7dGFyZ2V0LnRpdGxlID8/ICcnfVwiYCk7XG5cbiAgICByZXR1cm4gbmV3IFdlYlZpZXdDZHBDb25uZWN0aW9uKHdlYlNvY2tldCwgZGV2aWNlSWQsIHBvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGF3YWl0IHJlbW92ZUZvcndhcmQoZGV2aWNlSWQsIHBvcnQpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qKlxuICogRmluZHMgYSBwb3J0IGFscmVhZHkgZm9yd2FyZGVkIHRvIHRoaXMgZGV2aWNlIHNvY2tldCwgc28gcmVwZWF0ZWQgcnVucyByZXVzZSBvbmUgZm9yd2FyZC5cbiAqXG4gKiBXaXRob3V0IHRoaXMgZXZlcnkgcnVuIGFsbG9jYXRlcyBhIGZyZXNoIHBvcnQsIGFuZCBhbnkgcnVuIHRoYXQgZXhpdHMgd2l0aG91dCB0aGUgYXN5bmNcbiAqIHtAbGluayBXZWJWaWV3Q2RwQ29ubmVjdGlvbi5kaXNwb3NlfSBcdTIwMTQgYW4gYWJydXB0IHdvcmtlciBleGl0LCB3aGVyZSBvbmx5IHRoZSBzeW5jaHJvbm91cyB0ZWFyZG93blxuICogcGF0aCBydW5zIFx1MjAxNCBsZWF2ZXMgaXRzIGZvcndhcmQgYmVoaW5kIGZvcmV2ZXIuIFJldXNlIGJvdW5kcyB0aGF0IHRvIGEgc2luZ2xlIGZvcndhcmQgcGVyIHNvY2tldFxuICogcmF0aGVyIHRoYW4gb25lIHBlciBydW4uXG4gKlxuICogQHBhcmFtIGZvcndhcmRMaXN0IC0gVGhlIG91dHB1dCBvZiBgYWRiIGZvcndhcmQgLS1saXN0YC5cbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBhZGIgZGV2aWNlIGlkIHRvIG1hdGNoLlxuICogQHBhcmFtIHNvY2tldE5hbWUgLSBUaGUgYWJzdHJhY3Qgc29ja2V0IG5hbWUgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBUaGUgYWxyZWFkeS1mb3J3YXJkZWQgbG9jYWwgcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGb3J3YXJkZWRQb3J0KGZvcndhcmRMaXN0OiBzdHJpbmcsIGRldmljZUlkOiBzdHJpbmcsIHNvY2tldE5hbWU6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3J3YXJkTGlzdC5zcGxpdCgnXFxuJykpIHtcbiAgICAvLyBgYWRiIGZvcndhcmQgLS1saXN0YCBwcmludHMgYDxkZXZpY2VJZD4gdGNwOjxwb3J0PiBsb2NhbGFic3RyYWN0Ojxzb2NrZXROYW1lPmAuXG4gICAgY29uc3QgW2xpbmVEZXZpY2VJZCwgbG9jYWwsIHJlbW90ZV0gPSBsaW5lLnRyaW0oKS5zcGxpdCgvXFxzKy8sIEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQpO1xuICAgIGlmIChsaW5lRGV2aWNlSWQgIT09IGRldmljZUlkIHx8IHJlbW90ZSAhPT0gYGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfWAgfHwgIWxvY2FsPy5zdGFydHNXaXRoKCd0Y3A6JykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIucGFyc2VJbnQobG9jYWwuc2xpY2UoJ3RjcDonLmxlbmd0aCksIERFQ0lNQUxfUkFESVgpO1xuICAgIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihwb3J0KSkge1xuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgV2ViVmlldydzIGRldnRvb2xzIHNvY2tldCBuYW1lIG91dCBvZiBgL3Byb2MvbmV0L3VuaXhgLlxuICpcbiAqIEEgZGV2aWNlIGNhbiBob3N0IHNldmVyYWwgZGVidWdnYWJsZSBXZWJWaWV3cyAob3RoZXIgYXBwcywgYSBsZWZ0b3ZlciBwcm9jZXNzKSwgc28gdGhlIGFwcCdzIG93biBwaWQgaXNcbiAqIHdoYXQgZGlzYW1iaWd1YXRlcyB0aGVtLiBXaGVuIG5vIHNvY2tldCBtYXRjaGVzIHRoYXQgcGlkIHRoZSBzb2xlIHJlbWFpbmluZyBjYW5kaWRhdGUgaXMgdXNlZCBcdTIwMTQgYVxuICogV2ViVmlldyB3aG9zZSBzb2NrZXQgaXMgbmFtZWQgYWZ0ZXIgYSBjaGlsZCBwcm9jZXNzIHJhdGhlciB0aGFuIHRoZSBvbmUgYHBpZG9mYCByZXBvcnRlZCBzdGlsbCBoYXMgdG8gYmVcbiAqIHJlYWNoYWJsZSBcdTIwMTQgYnV0IHR3byB1bmF0dHJpYnV0YWJsZSBjYW5kaWRhdGVzIGlzIGFtYmlndW91cyBlbm91Z2ggdG8gcmVmdXNlLlxuICpcbiAqIEBwYXJhbSBwcm9jTmV0VW5peCAtIFRoZSBjb250ZW50cyBvZiBgL3Byb2MvbmV0L3VuaXhgLlxuICogQHBhcmFtIHBpZCAtIFRoZSBhcHBsaWNhdGlvbidzIHByb2Nlc3MgaWQuXG4gKiBAcmV0dXJucyBUaGUgc29ja2V0IG5hbWUsIGUuZy4gYHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXzE4MDU2YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2ViVmlld0RldnRvb2xzU29ja2V0TmFtZShwcm9jTmV0VW5peDogc3RyaW5nLCBwaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSB3aG9sZSBtYXRjaCBtaW51cyBpdHMgbGVhZGluZyBgQGAsIHJhdGhlciB0aGFuIGEgbmFtZWQgY2FwdHVyZSBncm91cDogYSBtYW5kYXRvcnkgZ3JvdXAgaXMgYWx3YXlzXG4gIC8vIFByZXNlbnQgb25jZSB0aGUgcGF0dGVybiBoYXMgbWF0Y2hlZCwgc28gYG1hdGNoLmdyb3Vwcz8uWyduYW1lJ10gPz8gJydgIHdvdWxkIGxlYXZlIGJlaGluZCB0d28gYnJhbmNoZXNcbiAgLy8gTm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGFuZCB0aGlzIGZpbGUgaXMgbWVhc3VyZWQgYWdhaW5zdCBhIDEwMCUgYnJhbmNoIGdhdGUuXG4gIGNvbnN0IG5hbWVzID0gW1xuICAgIC4uLm5ldyBTZXQoWy4uLnByb2NOZXRVbml4Lm1hdGNoQWxsKC9Ad2Vidmlld19kZXZ0b29sc19yZW1vdGVfXFx3Ky9nKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFswXS5zbGljZSgnQCcubGVuZ3RoKSkpXG4gIF07XG5cbiAgLy8gRGVzdHJ1Y3R1cmVkIHJhdGhlciB0aGFuIGluZGV4ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYHNvbGVOYW1lYCBjYXJyaWVzIHRoZSBcInRoZXJlIGlzIGF0IGxlYXN0IG9uZVwiXG4gIC8vIEZhY3QgaW4gdGhlIHR5cGUsIHNvIG5laXRoZXIgdGhlIGVtcHR5IGNoZWNrIGJlbG93IG5vciB0aGUgc2luZ2xlLWNhbmRpZGF0ZSBvbmUgbGVhdmVzIGEgZGVhZCBicmFuY2guXG4gIGNvbnN0IFtzb2xlTmFtZSwgLi4ub3RoZXJOYW1lc10gPSBuYW1lcztcblxuICBpZiAoc29sZU5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdObyBgd2Vidmlld19kZXZ0b29sc19yZW1vdGVfKmAgc29ja2V0IG9uIHRoZSBkZXZpY2UuIE9ic2lkaWFuIE1vYmlsZSBpcyBub3QgcnVubmluZywgb3IgaXRzIFdlYlZpZXcgJ1xuICAgICAgICArICdkZWJ1Z2dlciBpcyBkaXNhYmxlZC4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGV4YWN0TmFtZSA9IGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV8ke3BpZH1gO1xuICBpZiAobmFtZXMuaW5jbHVkZXMoZXhhY3ROYW1lKSkge1xuICAgIHJldHVybiBleGFjdE5hbWU7XG4gIH1cblxuICBpZiAob3RoZXJOYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gc29sZU5hbWU7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYE5vIFxcYCR7ZXhhY3ROYW1lfVxcYCBzb2NrZXQsIGFuZCAke1N0cmluZyhuYW1lcy5sZW5ndGgpfSBvdGhlciBkZWJ1Z2dhYmxlIFdlYlZpZXdzIGFyZSBwcmVzZW50IGBcbiAgICAgICsgYCgke25hbWVzLmpvaW4oJywgJyl9KSwgc28gdGhlIHJpZ2h0IG9uZSBjYW5ub3QgYmUgY2hvc2VuLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgT2JzaWRpYW4gcGFnZSB0YXJnZXQgb3V0IG9mIHRoZSBkZWJ1Z2dlcidzIGAvanNvbmAgbGlzdC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0cyAtIFRoZSBgL2pzb25gIHJlc3BvbnNlLlxuICogQHJldHVybnMgVGhlIHBhZ2UgdGFyZ2V0IHRvIGF0dGFjaCB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdlYlZpZXdQYWdlVGFyZ2V0KHRhcmdldHM6IHJlYWRvbmx5IENkcFRhcmdldFtdKTogQ2RwVGFyZ2V0IHtcbiAgY29uc3QgdGFyZ2V0ID0gdGFyZ2V0cy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50eXBlID09PSAncGFnZScgJiYgQm9vbGVhbihjYW5kaWRhdGUud2ViU29ja2V0RGVidWdnZXJVcmwpKVxuICAgID8/IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBCb29sZWFuKGNhbmRpZGF0ZS53ZWJTb2NrZXREZWJ1Z2dlclVybCkpO1xuXG4gIGlmICghdGFyZ2V0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgV2ViVmlldyBkZWJ1Z2dlciBsaXN0ZWQgbm8gdGFyZ2V0IHdpdGggYSBXZWJTb2NrZXQgZW5kcG9pbnQuJyk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChhZGIgc2hlbGwtb3V0cykuIENvdmVyZWQgYnkgdGhlIEFuZHJvaWQgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCBieSB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIFJ1bnMgYW4gYWRiIGNvbW1hbmQgYWdhaW5zdCBvbmUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBhZGIgZGV2aWNlIGlkLlxuICogQHBhcmFtIGNvbW1hbmRBcmd1bWVudHMgLSBUaGUgYWRiIGFyZ3VtZW50cyBhZnRlciBgLXMgPGRldmljZUlkPmAuXG4gKiBAcmV0dXJucyBUcmltbWVkIHN0ZG91dC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWRiKGRldmljZUlkOiBzdHJpbmcsIGNvbW1hbmRBcmd1bWVudHM6IHN0cmluZ1tdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIGRldmljZUlkLCAuLi5jb21tYW5kQXJndW1lbnRzXSwge1xuICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgfSk7XG5cbiAgcmV0dXJuIHN0ZG91dC50cmltKCk7XG59XG5cbi8qKlxuICogRHJvcHMgYW4gYWRiIHBvcnQgZm9yd2FyZCwgaWdub3JpbmcgdGhlIFwibm90IGZvdW5kXCIgY2FzZS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZC5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIGZvcndhcmRlZCBsb2NhbCBwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVGb3J3YXJkKGRldmljZUlkOiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgJ2ZvcndhcmQnLCAnLS1yZW1vdmUnLCBgdGNwOiR7U3RyaW5nKHBvcnQpfWBdLCB7XG4gICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgc2hvdWxkSWdub3JlRXhpdENvZGU6IHRydWUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0IGVmZm9ydDogdGhlIGZvcndhcmQgaXMgcGVyLXJ1biBhbmQgYWRiIGRyb3BzIGl0IHdoZW4gdGhlIGRldmljZSBkaXNjb25uZWN0cyBhbnl3YXkuXG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWtCQSxTQUFTLG9CQUFvQjtBQUk3QixTQUFTLFlBQVk7QUFDckIsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsb0JBQW9CO0FBRTdCLE1BQU0sOEJBQThCO0FBRXBDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0sV0FBVztBQTBEVixNQUFNLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3QnpCLFlBQTZCLFdBQXVDLFVBQW1DLE1BQWM7QUFBeEY7QUFBdUM7QUFBbUM7QUFDNUcsU0FBSyxVQUFVLGlCQUFpQixXQUFXLENBQUMsVUFBd0I7QUFDbEUsWUFBTSxVQUFVLEtBQUssTUFBTSxPQUFPLE1BQU0sSUFBSSxDQUFDO0FBQzdDLFVBQUksUUFBUSxXQUFXLFFBQVc7QUFDaEM7QUFBQSxNQUNGO0FBRUEsV0FBSyxjQUFjLElBQUksUUFBUSxNQUFNLElBQUksUUFBUSxVQUFVLENBQUMsQ0FBQztBQUFBLElBQy9ELENBQUM7QUFBQSxFQUNIO0FBQUEsRUFUb0M7QUFBQSxFQUF1QztBQUFBLEVBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZjlHLElBQVcsU0FBa0I7QUFDM0IsV0FBTyxLQUFLLFVBQVUsZUFBZSxVQUFVO0FBQUEsRUFDakQ7QUFBQSxFQUVpQixnQkFBZ0Isb0JBQUksSUFBNkI7QUFBQSxFQUUxRCxZQUFZO0FBQUE7QUFBQTtBQUFB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
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3dlYnZpZXctY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSBzZWNvbmQsIGluZGVwZW5kZW50IENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb25uZWN0aW9uIHRvIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcsIHVzZWQgdG8gaW5qZWN0XG4gKiAqKnRydXN0ZWQqKiBpbnB1dCBvbiBBbmRyb2lkIChzZWUgKipMMzkqKikuXG4gKlxuICogSXQgaXMgZGVsaWJlcmF0ZWx5IHNlcGFyYXRlIGZyb20gdGhlIEFwcGl1bSBzZXNzaW9uIHJhdGhlciB0aGFuIGxheWVyZWQgb24gaXQuIGBBcHBpdW1UcmFuc3BvcnQuZXZhbHVhdGVgXG4gKiBydW5zIHRoZSB3aG9sZSBgZXZhbEluT2JzaWRpYW5gIGNsb3N1cmUgaW5zaWRlIG9uZSBXM0MgKkV4ZWN1dGUgU2NyaXB0Kiwgd2hpY2ggYXdhaXRzIHRoZSByZXR1cm5lZFxuICogcHJvbWlzZSBcdTIwMTQgc28gd2hpbGUgYSBjbG9zdXJlIHNpdHMgd2FpdGluZyBvbiBgbGliLmNsaWNrRWxlbWVudCguLi4pYCwgdGhlIFdlYkRyaXZlciBzZXNzaW9uIGlzIGJ1c3kgYW5kXG4gKiBjYW5ub3QgYmUgYXNrZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4gQ0RQIGlzIGlkLW11bHRpcGxleGVkIGFuZCBDaHJvbWl1bSBhY2NlcHRzIG11bHRpcGxlIGRlYnVnZ2VyXG4gKiBjbGllbnRzLCBzbyB0aGlzIHNvY2tldCBzdGF5cyBmcmVlIGV4YWN0bHkgd2hlbiB0aGUgQXBwaXVtIG9uZSBkb2VzIG5vdC4gVGhhdCBpcyB3aGF0IGxldHMgdGhlIHJlbmRlcmVyXG4gKiBjYWxsIGJhY2sgb3V0IHRvIHRoZSBob3N0IG1pZC1jbG9zdXJlLlxuICpcbiAqIFJlYWNoaW5nIHRoZSBXZWJWaWV3J3MgZGVidWdnZXIgaXMgYSB0d28tc3RlcDogdGhlIGFwcCBwdWJsaXNoZXMgYW4gYWJzdHJhY3QgdW5peCBzb2NrZXQgbmFtZWRcbiAqIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV88cGlkPmAsIGBhZGIgZm9yd2FyZGAgbWFwcyBpdCB0byBhIGxvY2FsIFRDUCBwb3J0LCBhbmQgdGhlIHVzdWFsIGAvanNvbmBcbiAqIGVuZHBvaW50IHRoZW4gbGlzdHMgdGhlIHBhZ2UgdGFyZ2V0cy5cbiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENkcElucHV0Q29tbWFuZCB9IGZyb20gJy4vbW9iaWxlLWlucHV0Lm1qcyc7XG5cbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBwaWNrRnJlZVBvcnQgfSBmcm9tICcuL29ic2lkaWFuLWluc3RhbmNlLm1qcyc7XG5cbmNvbnN0IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE1XzAwMDtcbi8vIGBhZGIgZm9yd2FyZCAtLWxpc3RgIHByaW50cyB0aHJlZSBjb2x1bW5zOiBgPGRldmljZUlkPiB0Y3A6PHBvcnQ+IGxvY2FsYWJzdHJhY3Q6PHNvY2tldE5hbWU+YC5cbmNvbnN0IEZPUldBUkRfTElTVF9DT0xVTU5fQ09VTlQgPSAzO1xuY29uc3QgREVDSU1BTF9SQURJWCA9IDEwO1xuLypcbiAqIEJvdW5kcyBvbmUgY29tbWFuZCBvbiBUSElTIHNpZGUgY2hhbm5lbCBcdTIwMTQgYW4gYElucHV0LmRpc3BhdGNoTW91c2VFdmVudGAsIGEgdGFyZ2V0IGxpc3QuIEl0IGlzIG5vdCB0aGVcbiAqIHBlci1ldmFsIGNhcCBhbmQgbXVzdCBub3QgYmUgZGVyaXZlZCBmcm9tIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2A6IG5vIHRlc3QgY2xvc3VyZSB0cmF2ZWxzXG4gKiB0aGlzIHNvY2tldCwgYW5kIHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc2Vjb25kIGNvbm5lY3Rpb24gaXMgdGhhdCBpdCBzdGF5cyBmcmVlIHdoaWxlIHRoZSBBcHBpdW0gc2Vzc2lvblxuICogaXMgYnVzeSBydW5uaW5nIG9uZS4gVGhlIHNoYXJlZCB2YWx1ZSBpcyBhIGNvaW5jaWRlbmNlLlxuICovXG5jb25zdCBDRFBfQ09NTUFORF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IENEUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5cbi8qKlxuICogT25lIGVudHJ5IG9mIHRoZSBkZWJ1Z2dlcidzIGAvanNvbmAgdGFyZ2V0IGxpc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwVGFyZ2V0IHtcbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2ViU29ja2V0RGVidWdnZXJVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvbm5lY3RUb1dlYlZpZXdDZHB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RUb1dlYlZpZXdDZHBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFuZHJvaWQgYXBwbGljYXRpb24gaWQgd2hvc2UgV2ViVmlldyB0byBhdHRhY2ggdG8sIGUuZy4gYG1kLm9ic2lkaWFuYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhZGIgZGV2aWNlIGlkIChgZW11bGF0b3ItNTU1NGAsIGEgc2VyaWFsKSB0byBydW4gYWRiIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBlcnJvciBoYWxmIG9mIGEgZmFpbGVkIENEUCBjb21tYW5kIHJlc3BvbnNlLlxuICovXG5pbnRlcmZhY2UgQ2RwRXJyb3Ige1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBDRFAgZXZlbnQuXG4gKi9cbnR5cGUgQ2RwRXZlbnRIYW5kbGVyID0gKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbi8qKlxuICogQSBDRFAgbWVzc2FnZTogZWl0aGVyIGEgcmVzcG9uc2UgdG8gYSBjb21tYW5kIChgaWRgKSBvciBhbiBldmVudCAoYG1ldGhvZGApLlxuICovXG5pbnRlcmZhY2UgQ2RwTWVzc2FnZSB7XG4gIHJlYWRvbmx5IGVycm9yPzogQ2RwRXJyb3I7XG4gIHJlYWRvbmx5IGlkPzogbnVtYmVyO1xuICByZWFkb25seSBtZXRob2Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSByZXN1bHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBBIGNvbW1hbmQgd2FpdGluZyBmb3IgaXRzIHJlcGx5OiBzZXR0bGVzIHRoZSB7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb24uc2VuZH1cbiAqIGNhbGwncyBwcm9taXNlIGFuZCBjYW5jZWxzIHRoZSB0aW1lb3V0IHRoYXQgd291bGQgb3RoZXJ3aXNlIGZhaWwgaXQuXG4gKi9cbnR5cGUgUGVuZGluZ0NvbW1hbmQgPSAobWVzc2FnZTogQ2RwTWVzc2FnZSkgPT4gdm9pZDtcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoYSBsaXZlIFdlYlNvY2tldCB0byBhIFdlYlZpZXcsIGFkYiBwb3J0IGZvcndhcmRpbmcpLiBDb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdW5pdCB0ZXN0cy4gSXQgZW5kcyBiZWZvcmUgYHBhcnNlRm9yd2FyZGVkUG9ydGA6IGBwZXJmZWN0aW9uaXN0L3NvcnQtbW9kdWxlc2AgcGxhY2VzIHRoZSBwdXJlLCB1bml0LXRlc3RlZCBoZWxwZXJzIEFGVEVSIHRoaXMgY2xhc3MgYW5kIGBjb25uZWN0VG9XZWJWaWV3Q2RwYCwgc28gdGhleSBtdXN0IHN0YXkgbWVhc3VyZWQuICovXG5cbi8qKlxuICogQW4gb3BlbiBDRFAgY29ubmVjdGlvbiB0byBhIFdlYlZpZXcuXG4gKlxuICogQ29tbWFuZHMgYXJlIGlkLW11bHRpcGxleGVkLCBzbyBhIGNvbW1hbmQgaXNzdWVkIGZyb20gaW5zaWRlIGFuIGV2ZW50IGhhbmRsZXIgY29tcGxldGVzIHdoaWxlIGFuIGVhcmxpZXJcbiAqIGBSdW50aW1lLmV2YWx1YXRlYCBpcyBzdGlsbCBhd2FpdGluZyBpdHMgcHJvbWlzZSBcdTIwMTQgd2hpY2ggaXMgdGhlIHdob2xlIHJlYXNvbiB0aGlzIGNsYXNzIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlZpZXdDZHBDb25uZWN0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNvY2tldCBpcyBzdGlsbCB1c2FibGUuXG4gICAqXG4gICAqIFJlc3RhcnRpbmcgdGhlIGFwcCB0ZWFycyBpdHMgV2ViVmlldyBkb3duIGFuZCB0YWtlcyB0aGUgZGVidWdnZXIgdGFyZ2V0IHdpdGggaXQsIHNvIGEgY2FjaGVkXG4gICAqIGNvbm5lY3Rpb24gaGFzIHRvIGJlIHJlLWNoZWNrZWQgcmF0aGVyIHRoYW4gYXNzdW1lZCBsaXZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hpbGUgdGhlIHNvY2tldCBpcyBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBldmVudEhhbmRsZXJzID0gbmV3IE1hcDxzdHJpbmcsIENkcEV2ZW50SGFuZGxlcj4oKTtcblxuICBwcml2YXRlIG1lc3NhZ2VJZCA9IDA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kcyBzdGlsbCB3YWl0aW5nIGZvciBhIHJlcGx5LCBrZXllZCBieSB0aGUgQ0RQIG1lc3NhZ2UgaWQgZWFjaCB3YXNcbiAgICogc2VudCB3aXRoLiBFbXB0aWVkIGJ5IHdoaWNoZXZlciBvZiB0aGUgcmVwbHkgYW5kIHRoZSB0aW1lb3V0IGNvbWVzIGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nQ29tbWFuZHMgPSBuZXcgTWFwPG51bWJlciwgUGVuZGluZ0NvbW1hbmQ+KCk7XG5cbiAgLyoqXG4gICAqIFdyYXBzIGFuIGFscmVhZHktb3BlbiBkZWJ1Z2dlciBzb2NrZXQsIHBsdXMgd2hhdCBpcyBuZWVkZWQgdG8gdGVhciBpdHMgcG9ydCBmb3J3YXJkIGRvd24uXG4gICAqXG4gICAqIE9ORSBgbWVzc2FnZWAgbGlzdGVuZXIgZm9yIHRoZSBzb2NrZXQncyB3aG9sZSBsaWZlLCByb3V0aW5nIGJvdGggaGFsdmVzIG9mIHdoYXRcbiAgICogYXJyaXZlcyBcdTIwMTQgQ0RQIGV2ZW50cyB0byB0aGVpciBzdWJzY3JpYmVkIGhhbmRsZXIsIGNvbW1hbmQgcmVwbGllcyB0byB0aGVcbiAgICoge0BsaW5rIHNlbmR9IGNhbGwgd2FpdGluZyBvbiB0aGUgaWQuIEEgbGlzdGVuZXIgcGVyIGluLWZsaWdodCBjb21tYW5kIGluc3RlYWRcbiAgICogd291bGQgbWFrZSB0aGUgY291bnQgc2NhbGUgd2l0aCBjb25jdXJyZW5jeSwgc28gZWxldmVuIGNvbW1hbmRzIGluIGZsaWdodCBhdFxuICAgKiBvbmNlIHdvdWxkIGNyb3NzIE5vZGUncyBkZWZhdWx0IGBtYXhMaXN0ZW5lcnNgIG9mIDEwIGFuZCByZXBvcnQgYSBtZW1vcnkgbGVha1xuICAgKiB0aGF0IGlzIG5vdCBvbmUgKHNlZSB0aGUgZGVza3RvcCB0cmFuc3BvcnQncyBgZ2V0UGVuZGluZ0NvbW1hbmRzYCwgd2hlcmUgdGhlXG4gICAqIHNhbWUgc2hhcGUgd2FzIG1lYXN1cmVkKS5cbiAgICpcbiAgICogVGhlIHBhcnNlIGlzIGd1YXJkZWQgYmVjYXVzZSBhIGZyYW1lIHRoaXMgY29ubmVjdGlvbiBjYW5ub3QgcmVhZCBiZWxvbmdzIHRvXG4gICAqIG5vdGhpbmcgaXQgc2VudDogdGhyb3dpbmcgaGVyZSB3b3VsZCB0aHJvdyBvdXQgb2YgdGhlIGV2ZW50IGRpc3BhdGNoLCB3aGVyZVxuICAgKiBub3RoaW5nIGNhbiBjYXRjaCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHdlYlNvY2tldCAtIFRoZSBvcGVuIGRlYnVnZ2VyIHNvY2tldC5cbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGFkYiBkZXZpY2UgaWQsIG5lZWRlZCB0byBkcm9wIHRoZSBwb3J0IGZvcndhcmQgb24gZGlzcG9zZS5cbiAgICogQHBhcmFtIHBvcnQgLSBUaGUgZm9yd2FyZGVkIGxvY2FsIHBvcnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3ZWJTb2NrZXQ6IFdlYlNvY2tldCwgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nLCBwcml2YXRlIHJlYWRvbmx5IHBvcnQ6IG51bWJlcikge1xuICAgIHRoaXMud2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2U6IENkcE1lc3NhZ2U7XG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuZGF0YSkpIGFzIENkcE1lc3NhZ2U7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5tZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKT8uKG1lc3NhZ2UucGFyYW1zID8/IHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGVuZGluZ0NvbW1hbmQgPSB0aGlzLnBlbmRpbmdDb21tYW5kcy5nZXQobWVzc2FnZS5pZCk7XG4gICAgICBpZiAoIXBlbmRpbmdDb21tYW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZW5kaW5nQ29tbWFuZHMuZGVsZXRlKG1lc3NhZ2UuaWQpO1xuICAgICAgcGVuZGluZ0NvbW1hbmQobWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBzb2NrZXQgYW5kIGRyb3BzIHRoZSBhZGIgcG9ydCBmb3J3YXJkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbG9zZVNvY2tldCgpO1xuICAgIGF3YWl0IHJlbW92ZUZvcndhcmQodGhpcy5kZXZpY2VJZCwgdGhpcy5wb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBkaXNwb3NhbCwgZm9yIGBwcm9jZXNzLm9uKCdleGl0JylgIGhhbmRsZXJzIHdoZXJlIGFzeW5jIHdvcmsgY2Fubm90IHJ1bi5cbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGFuIGFicnVwdCB3b3JrZXIgZXhpdCBsZWF2ZXMgdGhlIHBvcnQgZm9yd2FyZCBiZWhpbmQgXHUyMDE0IHRoZSBhc3luYyB7QGxpbmsgZGlzcG9zZX0gYWJvdmVcbiAgICogbmV2ZXIgZ2V0cyBhIHR1cm4uXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZVN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVNvY2tldCgpO1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ2FkYicsIFsnLXMnLCB0aGlzLmRldmljZUlkLCAnZm9yd2FyZCcsICctLXJlbW92ZScsIGB0Y3A6JHtTdHJpbmcodGhpcy5wb3J0KX1gXSwge1xuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICAgIHRpbWVvdXQ6IEFEQl9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0IGVmZm9ydDogYWRiIGRyb3BzIGV2ZXJ5IGZvcndhcmQgd2hlbiB0aGUgZGV2aWNlIGRpc2Nvbm5lY3RzIGFueXdheS5cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byBhIENEUCBldmVudC4gT25lIGhhbmRsZXIgcGVyIG1ldGhvZDsgc3Vic2NyaWJpbmcgYWdhaW4gcmVwbGFjZXMgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgQ0RQIGV2ZW50IG5hbWUsIGUuZy4gYFJ1bnRpbWUuYmluZGluZ0NhbGxlZGAuXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gQ2FsbGVkIHdpdGggdGhlIGV2ZW50IHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgb24obWV0aG9kOiBzdHJpbmcsIGhhbmRsZXI6IENkcEV2ZW50SGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRIYW5kbGVycy5zZXQobWV0aG9kLCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIENEUCBjb21tYW5kIGFuZCB3YWl0cyBmb3IgaXRzIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIENEUCBtZXRob2QgbmFtZS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgbWV0aG9kIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBjb21tYW5kIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBzZW5kKG1ldGhvZDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgY29uc3QgaWQgPSArK3RoaXMubWVzc2FnZUlkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZ0NvbW1hbmRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFdlYlZpZXcgQ0RQIGNvbW1hbmQgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKENEUF9DT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tczogJHttZXRob2R9YCkpO1xuICAgICAgfSwgQ0RQX0NPTU1BTkRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLnBlbmRpbmdDb21tYW5kcy5zZXQoaWQsIChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBXZWJWaWV3IENEUCBjb21tYW5kICR7bWV0aG9kfSBmYWlsZWQ6ICR7bWVzc2FnZS5lcnJvci5tZXNzYWdlID8/ICd1bmtub3duIGVycm9yJ31gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlLnJlc3VsdCA/PyB7fSk7XG4gICAgICB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy53ZWJTb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGlkLCBtZXRob2QsIHBhcmFtcyB9KSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAvLyBOb3RoaW5nIHdpbGwgYW5zd2VyIGEgc2VuZCB0aGF0IHRocmV3LCBzbyBob2xkaW5nIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bGwgdGltZW91dCB3b3VsZCBvbmx5IGRlbGF5IHRoZSBmYWlsdXJlIGFuZCB0aGVuIG1pc25hbWUgaXQuXG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQ29tbWFuZHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYW4gb3JkZXJlZCBjb21tYW5kIHNlcXVlbmNlLCBvbmUgY29tbWFuZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEVhY2ggY29tbWFuZCBpcyBhd2FpdGVkIGJlZm9yZSB0aGUgbmV4dCBpcyBzZW50LCB3aGljaCBpcyB0aGUgb25seSBvcmRlcmluZyBndWFyYW50ZWUgYW4gaW5wdXRcbiAgICogc2VxdWVuY2UgbmVlZHMgXHUyMDE0IGEgbG9uZy1wcmVzcyBob2xkcyBpdHNlbGYgZm9yIGl0cyBvd24gYGR1cmF0aW9uYCByYXRoZXIgdGhhbiBhc2tpbmcgdGhlIGhvc3QgdG9cbiAgICogc2xlZXAgYmV0d2VlbiB0d28gdG91Y2hlcywgc28gdGhlcmUgaXMgbm8gaW50ZXItY29tbWFuZCBkZWxheSB0byBob25vci5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzIC0gVGhlIGNvbW1hbmRzIHRvIHNlbmQsIGluIG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRBbGwoY29tbWFuZHM6IHJlYWRvbmx5IENkcElucHV0Q29tbWFuZFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBjb21tYW5kIG9mIGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmQoY29tbWFuZC5tZXRob2QsIGNvbW1hbmQucGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBkZWJ1Z2dlciBzb2NrZXQgYW5kIHN0b3BzIHJvdXRpbmcgaXRzIGV2ZW50cy5cbiAgICovXG4gIHByaXZhdGUgY2xvc2VTb2NrZXQoKTogdm9pZCB7XG4gICAgdGhpcy5ldmVudEhhbmRsZXJzLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMud2ViU29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICB0aGlzLndlYlNvY2tldC5jbG9zZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE9wZW5zIGEgQ0RQIGNvbm5lY3Rpb24gdG8gdGhlIGFwcCdzIFdlYlZpZXcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFdoaWNoIGFwcCBvbiB3aGljaCBkZXZpY2UuXG4gKiBAcmV0dXJucyBUaGUgb3BlbiBjb25uZWN0aW9uLiBEaXNwb3NlIGl0IHRvIGNsb3NlIHRoZSBzb2NrZXQgYW5kIGRyb3AgdGhlIGFkYiBwb3J0IGZvcndhcmQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9XZWJWaWV3Q2RwKHBhcmFtczogQ29ubmVjdFRvV2ViVmlld0NkcFBhcmFtcyk6IFByb21pc2U8V2ViVmlld0NkcENvbm5lY3Rpb24+IHtcbiAgY29uc3QgeyBhcHBJZCwgZGV2aWNlSWQgfSA9IHBhcmFtcztcblxuICAvLyBgcGlkb2ZgIGxpc3RzIGV2ZXJ5IG1hdGNoaW5nIHByb2Nlc3M7IHRoZSBhcHAncyBtYWluIG9uZSBpcyBmaXJzdC5cbiAgY29uc3QgcGlkb2ZPdXRwdXQgPSBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnc2hlbGwnLCAncGlkb2YnLCBhcHBJZF0pO1xuICBjb25zdCBwaWQgPSBwaWRvZk91dHB1dC5zcGxpdCgvXFxzKy8sIDEpWzBdID8/ICcnO1xuICBpZiAoIXBpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHthcHBJZH0gaXMgbm90IHJ1bm5pbmcgb24gJHtkZXZpY2VJZH0sIHNvIGl0cyBXZWJWaWV3IGhhcyBubyBkZWJ1Z2dlciB0byBhdHRhY2ggdG8uYCk7XG4gIH1cblxuICBjb25zdCBwcm9jTmV0VW5peCA9IGF3YWl0IGFkYihkZXZpY2VJZCwgWydzaGVsbCcsICdjYXQnLCAnL3Byb2MvbmV0L3VuaXgnXSk7XG4gIGNvbnN0IHNvY2tldE5hbWUgPSBwYXJzZVdlYlZpZXdEZXZ0b29sc1NvY2tldE5hbWUocHJvY05ldFVuaXgsIHBpZCk7XG5cbiAgY29uc3QgZm9yd2FyZExpc3QgPSBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIGNvbnN0IGV4aXN0aW5nUG9ydCA9IHBhcnNlRm9yd2FyZGVkUG9ydChmb3J3YXJkTGlzdCwgZGV2aWNlSWQsIHNvY2tldE5hbWUpO1xuICBjb25zdCBwb3J0ID0gZXhpc3RpbmdQb3J0ID8/IGF3YWl0IHBpY2tGcmVlUG9ydCgpO1xuICBpZiAoZXhpc3RpbmdQb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBhZGIoZGV2aWNlSWQsIFsnZm9yd2FyZCcsIGB0Y3A6JHtTdHJpbmcocG9ydCl9YCwgYGxvY2FsYWJzdHJhY3Q6JHtzb2NrZXROYW1lfWBdKTtcbiAgICBsb2coYFt3ZWJ2aWV3LWNkcF0gRm9yd2FyZGVkIHRjcDoke1N0cmluZyhwb3J0KX0gLT4gbG9jYWxhYnN0cmFjdDoke3NvY2tldE5hbWV9ICgke2FwcElkfSBwaWQgJHtwaWR9KWApO1xuICB9IGVsc2Uge1xuICAgIGxvZyhgW3dlYnZpZXctY2RwXSBSZXVzaW5nIGZvcndhcmQgdGNwOiR7U3RyaW5nKHBvcnQpfSAtPiBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX0gKCR7YXBwSWR9IHBpZCAke3BpZH0pYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8ke0NEUF9IT1NUfToke1N0cmluZyhwb3J0KX0vanNvbmApO1xuICAgIGNvbnN0IHRhcmdldCA9IHNlbGVjdFdlYlZpZXdQYWdlVGFyZ2V0KGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBDZHBUYXJnZXRbXSk7XG4gICAgY29uc3Qgd2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldCh0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwgPz8gJycpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHdlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICB3ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvdWxkIG5vdCBvcGVuIHRoZSBXZWJWaWV3IENEUCBzb2NrZXQgYXQgJHt0YXJnZXQud2ViU29ja2V0RGVidWdnZXJVcmwgPz8gJyd9LmApKTtcbiAgICAgIH0sIHsgb25jZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBsb2coYFt3ZWJ2aWV3LWNkcF0gQXR0YWNoZWQgdG8gV2ViVmlldyB0YXJnZXQgXCIke3RhcmdldC50aXRsZSA/PyAnJ31cImApO1xuXG4gICAgcmV0dXJuIG5ldyBXZWJWaWV3Q2RwQ29ubmVjdGlvbih3ZWJTb2NrZXQsIGRldmljZUlkLCBwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCByZW1vdmVGb3J3YXJkKGRldmljZUlkLCBwb3J0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4vKipcbiAqIEZpbmRzIGEgcG9ydCBhbHJlYWR5IGZvcndhcmRlZCB0byB0aGlzIGRldmljZSBzb2NrZXQsIHNvIHJlcGVhdGVkIHJ1bnMgcmV1c2Ugb25lIGZvcndhcmQuXG4gKlxuICogV2l0aG91dCB0aGlzIGV2ZXJ5IHJ1biBhbGxvY2F0ZXMgYSBmcmVzaCBwb3J0LCBhbmQgYW55IHJ1biB0aGF0IGV4aXRzIHdpdGhvdXQgdGhlIGFzeW5jXG4gKiB7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb24uZGlzcG9zZX0gXHUyMDE0IGFuIGFicnVwdCB3b3JrZXIgZXhpdCwgd2hlcmUgb25seSB0aGUgc3luY2hyb25vdXMgdGVhcmRvd25cbiAqIHBhdGggcnVucyBcdTIwMTQgbGVhdmVzIGl0cyBmb3J3YXJkIGJlaGluZCBmb3JldmVyLiBSZXVzZSBib3VuZHMgdGhhdCB0byBhIHNpbmdsZSBmb3J3YXJkIHBlciBzb2NrZXRcbiAqIHJhdGhlciB0aGFuIG9uZSBwZXIgcnVuLlxuICpcbiAqIEBwYXJhbSBmb3J3YXJkTGlzdCAtIFRoZSBvdXRwdXQgb2YgYGFkYiBmb3J3YXJkIC0tbGlzdGAuXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZCB0byBtYXRjaC5cbiAqIEBwYXJhbSBzb2NrZXROYW1lIC0gVGhlIGFic3RyYWN0IHNvY2tldCBuYW1lIHRvIG1hdGNoLlxuICogQHJldHVybnMgVGhlIGFscmVhZHktZm9yd2FyZGVkIGxvY2FsIHBvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRm9yd2FyZGVkUG9ydChmb3J3YXJkTGlzdDogc3RyaW5nLCBkZXZpY2VJZDogc3RyaW5nLCBzb2NrZXROYW1lOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZm9yd2FyZExpc3Quc3BsaXQoJ1xcbicpKSB7XG4gICAgLy8gYGFkYiBmb3J3YXJkIC0tbGlzdGAgcHJpbnRzIGA8ZGV2aWNlSWQ+IHRjcDo8cG9ydD4gbG9jYWxhYnN0cmFjdDo8c29ja2V0TmFtZT5gLlxuICAgIGNvbnN0IFtsaW5lRGV2aWNlSWQsIGxvY2FsLCByZW1vdGVdID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvLCBGT1JXQVJEX0xJU1RfQ09MVU1OX0NPVU5UKTtcbiAgICBpZiAobGluZURldmljZUlkICE9PSBkZXZpY2VJZCB8fCByZW1vdGUgIT09IGBsb2NhbGFic3RyYWN0OiR7c29ja2V0TmFtZX1gIHx8ICFsb2NhbD8uc3RhcnRzV2l0aCgndGNwOicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyLnBhcnNlSW50KGxvY2FsLnNsaWNlKCd0Y3A6Jy5sZW5ndGgpLCBERUNJTUFMX1JBRElYKTtcbiAgICBpZiAoTnVtYmVyLmlzU2FmZUludGVnZXIocG9ydCkpIHtcbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIFdlYlZpZXcncyBkZXZ0b29scyBzb2NrZXQgbmFtZSBvdXQgb2YgYC9wcm9jL25ldC91bml4YC5cbiAqXG4gKiBBIGRldmljZSBjYW4gaG9zdCBzZXZlcmFsIGRlYnVnZ2FibGUgV2ViVmlld3MgKG90aGVyIGFwcHMsIGEgbGVmdG92ZXIgcHJvY2VzcyksIHNvIHRoZSBhcHAncyBvd24gcGlkIGlzXG4gKiB3aGF0IGRpc2FtYmlndWF0ZXMgdGhlbS4gV2hlbiBubyBzb2NrZXQgbWF0Y2hlcyB0aGF0IHBpZCB0aGUgc29sZSByZW1haW5pbmcgY2FuZGlkYXRlIGlzIHVzZWQgXHUyMDE0IGFcbiAqIFdlYlZpZXcgd2hvc2Ugc29ja2V0IGlzIG5hbWVkIGFmdGVyIGEgY2hpbGQgcHJvY2VzcyByYXRoZXIgdGhhbiB0aGUgb25lIGBwaWRvZmAgcmVwb3J0ZWQgc3RpbGwgaGFzIHRvIGJlXG4gKiByZWFjaGFibGUgXHUyMDE0IGJ1dCB0d28gdW5hdHRyaWJ1dGFibGUgY2FuZGlkYXRlcyBpcyBhbWJpZ3VvdXMgZW5vdWdoIHRvIHJlZnVzZS5cbiAqXG4gKiBAcGFyYW0gcHJvY05ldFVuaXggLSBUaGUgY29udGVudHMgb2YgYC9wcm9jL25ldC91bml4YC5cbiAqIEBwYXJhbSBwaWQgLSBUaGUgYXBwbGljYXRpb24ncyBwcm9jZXNzIGlkLlxuICogQHJldHVybnMgVGhlIHNvY2tldCBuYW1lLCBlLmcuIGB3ZWJ2aWV3X2RldnRvb2xzX3JlbW90ZV8xODA1NmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVdlYlZpZXdEZXZ0b29sc1NvY2tldE5hbWUocHJvY05ldFVuaXg6IHN0cmluZywgcGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBUaGUgd2hvbGUgbWF0Y2ggbWludXMgaXRzIGxlYWRpbmcgYEBgLCByYXRoZXIgdGhhbiBhIG5hbWVkIGNhcHR1cmUgZ3JvdXA6IGEgbWFuZGF0b3J5IGdyb3VwIGlzIGFsd2F5c1xuICAvLyBwcmVzZW50IG9uY2UgdGhlIHBhdHRlcm4gaGFzIG1hdGNoZWQsIHNvIGBtYXRjaC5ncm91cHM/LlsnbmFtZSddID8/ICcnYCB3b3VsZCBsZWF2ZSBiZWhpbmQgdHdvIGJyYW5jaGVzXG4gIC8vIG5vIGlucHV0IGNhbiBldmVyIHJlYWNoIFx1MjAxNCBhbmQgdGhpcyBmaWxlIGlzIG1lYXN1cmVkIGFnYWluc3QgYSAxMDAlIGJyYW5jaCBnYXRlLlxuICBjb25zdCBuYW1lcyA9IFtcbiAgICAuLi5uZXcgU2V0KFsuLi5wcm9jTmV0VW5peC5tYXRjaEFsbCgvQHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlX1xcdysvZyldXG4gICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMF0uc2xpY2UoJ0AnLmxlbmd0aCkpKVxuICBdO1xuXG4gIC8vIERlc3RydWN0dXJlZCByYXRoZXIgdGhhbiBpbmRleGVkIGZvciB0aGUgc2FtZSByZWFzb246IGBzb2xlTmFtZWAgY2FycmllcyB0aGUgXCJ0aGVyZSBpcyBhdCBsZWFzdCBvbmVcIlxuICAvLyBmYWN0IGluIHRoZSB0eXBlLCBzbyBuZWl0aGVyIHRoZSBlbXB0eSBjaGVjayBiZWxvdyBub3IgdGhlIHNpbmdsZS1jYW5kaWRhdGUgb25lIGxlYXZlcyBhIGRlYWQgYnJhbmNoLlxuICBjb25zdCBbc29sZU5hbWUsIC4uLm90aGVyTmFtZXNdID0gbmFtZXM7XG5cbiAgaWYgKHNvbGVOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnTm8gYHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXypgIHNvY2tldCBvbiB0aGUgZGV2aWNlLiBPYnNpZGlhbiBNb2JpbGUgaXMgbm90IHJ1bm5pbmcsIG9yIGl0cyBXZWJWaWV3ICdcbiAgICAgICAgKyAnZGVidWdnZXIgaXMgZGlzYWJsZWQuJ1xuICAgICk7XG4gIH1cblxuICBjb25zdCBleGFjdE5hbWUgPSBgd2Vidmlld19kZXZ0b29sc19yZW1vdGVfJHtwaWR9YDtcbiAgaWYgKG5hbWVzLmluY2x1ZGVzKGV4YWN0TmFtZSkpIHtcbiAgICByZXR1cm4gZXhhY3ROYW1lO1xuICB9XG5cbiAgaWYgKG90aGVyTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHNvbGVOYW1lO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBObyBcXGAke2V4YWN0TmFtZX1cXGAgc29ja2V0LCBhbmQgJHtTdHJpbmcobmFtZXMubGVuZ3RoKX0gb3RoZXIgZGVidWdnYWJsZSBXZWJWaWV3cyBhcmUgcHJlc2VudCBgXG4gICAgICArIGAoJHtuYW1lcy5qb2luKCcsICcpfSksIHNvIHRoZSByaWdodCBvbmUgY2Fubm90IGJlIGNob3Nlbi5gXG4gICk7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIE9ic2lkaWFuIHBhZ2UgdGFyZ2V0IG91dCBvZiB0aGUgZGVidWdnZXIncyBgL2pzb25gIGxpc3QuXG4gKlxuICogQHBhcmFtIHRhcmdldHMgLSBUaGUgYC9qc29uYCByZXNwb25zZS5cbiAqIEByZXR1cm5zIFRoZSBwYWdlIHRhcmdldCB0byBhdHRhY2ggdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RXZWJWaWV3UGFnZVRhcmdldCh0YXJnZXRzOiByZWFkb25seSBDZHBUYXJnZXRbXSk6IENkcFRhcmdldCB7XG4gIGNvbnN0IHRhcmdldCA9IHRhcmdldHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUudHlwZSA9PT0gJ3BhZ2UnICYmIEJvb2xlYW4oY2FuZGlkYXRlLndlYlNvY2tldERlYnVnZ2VyVXJsKSlcbiAgICA/PyB0YXJnZXRzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gQm9vbGVhbihjYW5kaWRhdGUud2ViU29ja2V0RGVidWdnZXJVcmwpKTtcblxuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIFdlYlZpZXcgZGVidWdnZXIgbGlzdGVkIG5vIHRhcmdldCB3aXRoIGEgV2ViU29ja2V0IGVuZHBvaW50LicpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoYWRiIHNoZWxsLW91dHMpLiBDb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdW5pdCB0ZXN0cy4gKi9cblxuLyoqXG4gKiBSdW5zIGFuIGFkYiBjb21tYW5kIGFnYWluc3Qgb25lIGRldmljZS5cbiAqXG4gKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgYWRiIGRldmljZSBpZC5cbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFkYiBhcmd1bWVudHMgYWZ0ZXIgYC1zIDxkZXZpY2VJZD5gLlxuICogQHJldHVybnMgVHJpbW1lZCBzdGRvdXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFkYihkZXZpY2VJZDogc3RyaW5nLCBjb21tYW5kQXJndW1lbnRzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgLi4uY29tbWFuZEFyZ3VtZW50c10sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH0pO1xuXG4gIHJldHVybiBzdGRvdXQudHJpbSgpO1xufVxuXG4vKipcbiAqIERyb3BzIGFuIGFkYiBwb3J0IGZvcndhcmQsIGlnbm9yaW5nIHRoZSBcIm5vdCBmb3VuZFwiIGNhc2UuXG4gKlxuICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGFkYiBkZXZpY2UgaWQuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBmb3J3YXJkZWQgbG9jYWwgcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlRm9yd2FyZChkZXZpY2VJZDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgZGV2aWNlSWQsICdmb3J3YXJkJywgJy0tcmVtb3ZlJywgYHRjcDoke1N0cmluZyhwb3J0KX1gXSwge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdCBlZmZvcnQ6IHRoZSBmb3J3YXJkIGlzIHBlci1ydW4gYW5kIGFkYiBkcm9wcyBpdCB3aGVuIHRoZSBkZXZpY2UgZGlzY29ubmVjdHMgYW55d2F5LlxuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFrQkEsU0FBUyxvQkFBb0I7QUFJN0IsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsV0FBVztBQUNwQixTQUFTLG9CQUFvQjtBQUU3QixNQUFNLDhCQUE4QjtBQUVwQyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLGdCQUFnQjtBQU90QixNQUFNLHNDQUFzQztBQUM1QyxNQUFNLFdBQVc7QUFnRVYsTUFBTSxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBMEN6QixZQUE2QixXQUF1QyxVQUFtQyxNQUFjO0FBQXhGO0FBQXVDO0FBQW1DO0FBQzVHLFNBQUssVUFBVSxpQkFBaUIsV0FBVyxDQUFDLFVBQXdCO0FBQ2xFLFVBQUk7QUFDSixVQUFJO0FBQ0Ysa0JBQVUsS0FBSyxNQUFNLE9BQU8sTUFBTSxJQUFJLENBQUM7QUFBQSxNQUN6QyxR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QUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFjTyxTQUFTLCtCQUErQixhQUFxQixLQUFxQjtBQUl2RixRQUFNLFFBQVE7QUFBQSxJQUNaLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxZQUFZLFNBQVMsK0JBQStCLENBQUMsRUFDakUsSUFBSSxDQUFDLFVBQVUsTUFBTSxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDL0M7QUFJQSxRQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSTtBQUVsQyxNQUFJLGFBQWEsUUFBVztBQUMxQixVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsSUFFRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFlBQVksMkJBQTJCLEdBQUc7QUFDaEQsTUFBSSxNQUFNLFNBQVMsU0FBUyxHQUFHO0FBQzdCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sSUFBSTtBQUFBLElBQ1IsUUFBUSxTQUFTLGtCQUFrQixPQUFPLE1BQU0sTUFBTSxDQUFDLDJDQUMvQyxNQUFNLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDMUI7QUFDRjtBQVFPLFNBQVMsd0JBQXdCLFNBQTBDO0FBQ2hGLFFBQU0sU0FBUyxRQUFRLEtBQUssQ0FBQyxjQUFjLFVBQVUsU0FBUyxVQUFVLFFBQVEsVUFBVSxvQkFBb0IsQ0FBQyxLQUMxRyxRQUFRLEtBQUssQ0FBQyxjQUFjLFFBQVEsVUFBVSxvQkFBb0IsQ0FBQztBQUV4RSxNQUFJLENBQUMsUUFBUTtBQUNYLFVBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLEVBQ3BGO0FBRUEsU0FBTztBQUNUO0FBV0EsZUFBZSxJQUFJLFVBQWtCLGtCQUE2QztBQUNoRixRQUFNLFNBQVMsTUFBTSxLQUFLLENBQUMsT0FBTyxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsR0FBRztBQUFBLElBQ3RFLFNBQVM7QUFBQSxJQUNULHVCQUF1QjtBQUFBLEVBQ3pCLENBQUM7QUFFRCxTQUFPLE9BQU8sS0FBSztBQUNyQjtBQVFBLGVBQWUsY0FBYyxVQUFrQixNQUE2QjtBQUMxRSxNQUFJO0FBQ0YsVUFBTSxLQUFLLENBQUMsT0FBTyxNQUFNLFVBQVUsV0FBVyxZQUFZLE9BQU8sT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHO0FBQUEsTUFDaEYsU0FBUztBQUFBLE1BQ1Qsc0JBQXNCO0FBQUEsTUFDdEIsdUJBQXVCO0FBQUEsSUFDekIsQ0FBQztBQUFBLEVBQ0gsUUFBUTtBQUFBLEVBRVI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "obsidian-integration-testing",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "Simplifies integration testing of Obsidian plugins.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -165,18 +165,12 @@
|
|
|
165
165
|
"overrides": {
|
|
166
166
|
"@puppeteer/browsers": "^3.2.2",
|
|
167
167
|
"@sinonjs/fake-timers": "13.0.5",
|
|
168
|
-
"brace-expansion": "^5.0.9",
|
|
169
168
|
"deepmerge-ts": "^8.0.2",
|
|
170
169
|
"eslint-plugin-import": "$eslint-plugin-import-x",
|
|
171
170
|
"fflate": "^0.8.3",
|
|
172
|
-
"glob": "^13.0.6",
|
|
173
171
|
"js-yaml": "4.3.2",
|
|
174
172
|
"lodash": "4.18.1",
|
|
175
|
-
"markdown-it": "^15.0.2",
|
|
176
|
-
"readdir-glob": "^3.0.0",
|
|
177
173
|
"smol-toml": "^1.8.0",
|
|
178
|
-
"test-exclude": "^8.0.0",
|
|
179
|
-
"tmp": "^0.2.7",
|
|
180
174
|
"type-fest": "$type-fest",
|
|
181
175
|
"typescript": "$typescript",
|
|
182
176
|
"vite": "$vite"
|