obsidian-integration-testing 16.0.0 → 17.0.1

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.
Files changed (77) hide show
  1. package/dist/lib/cjs/adb.cjs +2 -2
  2. package/dist/lib/cjs/adb.d.cts +10 -0
  3. package/dist/lib/cjs/avd-name-channel.cjs +74 -0
  4. package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
  5. package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
  6. package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
  7. package/dist/lib/cjs/device-screenshot.cjs +1 -1
  8. package/dist/lib/cjs/device-screenshot.d.cts +3 -1
  9. package/dist/lib/cjs/emulator-backend.cjs +22 -1
  10. package/dist/lib/cjs/emulator-backend.d.cts +81 -0
  11. package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
  12. package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
  13. package/dist/lib/cjs/enable-plugin.cjs +17 -8
  14. package/dist/lib/cjs/enable-plugin.d.cts +3 -1
  15. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  16. package/dist/lib/cjs/eval-in-obsidian.d.cts +12 -0
  17. package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
  18. package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
  19. package/dist/lib/cjs/index.cjs +14 -1
  20. package/dist/lib/cjs/index.d.cts +3 -1
  21. package/dist/lib/cjs/launched-device-selection.cjs +46 -0
  22. package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
  23. package/dist/lib/cjs/library.cjs +1 -1
  24. package/dist/lib/cjs/namespace-bootstrap.cjs +62 -1
  25. package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
  26. package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
  27. package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
  28. package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
  29. package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
  30. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  31. package/dist/lib/cjs/sharp-loader.d.cts +67 -2
  32. package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
  33. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
  34. package/dist/lib/cjs/soft-keyboard.cjs +130 -28
  35. package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
  36. package/dist/lib/cjs/transport-appium.cjs +74 -4
  37. package/dist/lib/cjs/transport-appium.d.cts +49 -2
  38. package/dist/lib/cjs/transport-factory.cjs +162 -42
  39. package/dist/lib/esm/adb.d.mts +10 -0
  40. package/dist/lib/esm/adb.mjs +2 -2
  41. package/dist/lib/esm/avd-name-channel.d.mts +152 -0
  42. package/dist/lib/esm/avd-name-channel.mjs +45 -0
  43. package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
  44. package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
  45. package/dist/lib/esm/device-screenshot.d.mts +3 -1
  46. package/dist/lib/esm/device-screenshot.mjs +1 -1
  47. package/dist/lib/esm/emulator-backend.d.mts +81 -0
  48. package/dist/lib/esm/emulator-backend.mjs +19 -1
  49. package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
  50. package/dist/lib/esm/emulator-reclaim.mjs +84 -36
  51. package/dist/lib/esm/enable-plugin.d.mts +3 -1
  52. package/dist/lib/esm/enable-plugin.mjs +17 -8
  53. package/dist/lib/esm/eval-in-obsidian.d.mts +12 -0
  54. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  55. package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
  56. package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
  57. package/dist/lib/esm/index.d.mts +3 -1
  58. package/dist/lib/esm/index.mjs +15 -1
  59. package/dist/lib/esm/launched-device-selection.d.mts +112 -0
  60. package/dist/lib/esm/launched-device-selection.mjs +21 -0
  61. package/dist/lib/esm/library.mjs +1 -1
  62. package/dist/lib/esm/namespace-bootstrap.mjs +62 -1
  63. package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
  64. package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
  65. package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
  66. package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
  67. package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
  68. package/dist/lib/esm/sharp-loader.d.mts +67 -2
  69. package/dist/lib/esm/sharp-loader.mjs +1 -1
  70. package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
  71. package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
  72. package/dist/lib/esm/soft-keyboard.d.mts +65 -6
  73. package/dist/lib/esm/soft-keyboard.mjs +131 -28
  74. package/dist/lib/esm/transport-appium.d.mts +49 -2
  75. package/dist/lib/esm/transport-appium.mjs +74 -4
  76. package/dist/lib/esm/transport-factory.mjs +176 -44
  77. package/package.json +1 -1
@@ -0,0 +1,73 @@
1
+ import { Buffer } from "node:buffer";
2
+ import {
3
+ formatDuration,
4
+ formatExitCode,
5
+ formatRefusal,
6
+ resolveHostQueryFailure
7
+ } from "./host-process-query-verdict.mjs";
8
+ import { assertNever } from "./type-guards.mjs";
9
+ const LSOF_NOTHING_FOUND_EXIT_CODE = 1;
10
+ function buildPortOwnerQueryMessage(params) {
11
+ const cost = `after ${formatDuration(params.elapsedInMilliseconds)}`;
12
+ const subject = `\`${params.command}\` (asking who listens on port ${String(params.port)})`;
13
+ const consequence = `Nothing is known about what still holds port ${String(params.port)}, so the escalation has no PID to kill \u2014 this is not the same as nothing holding it.`;
14
+ switch (params.outcome) {
15
+ case "answered": {
16
+ return void 0;
17
+ }
18
+ case "crashed": {
19
+ return `Warning: ${subject} died ${cost} without explaining itself (exit ${formatExitCode(params.exitCode)}, nothing on stderr). Suspect a crash or an interfering security product, and try the command by hand. ${consequence}`;
20
+ }
21
+ case "not-found": {
22
+ return `Warning: ${subject} could not be run at all ${cost}: the executable was not found on PATH. ${consequence}`;
23
+ }
24
+ case "output-overran": {
25
+ return `Warning: ${subject} produced more output ${cost} than the query's buffer allows, so none of it could be read. Raise the buffer. ${consequence}`;
26
+ }
27
+ case "refused": {
28
+ return `Warning: ${subject} refused the request ${cost} (exit ${formatExitCode(params.exitCode)}): ${formatRefusal(params.standardError)} ${consequence}`;
29
+ }
30
+ case "timed-out": {
31
+ return `Warning: ${subject} did not finish within its ${formatDuration(params.timeoutInMilliseconds)} budget and was killed ${cost}${params.signal === null ? "" : ` (${params.signal})`}. ${consequence}`;
32
+ }
33
+ default: {
34
+ return assertNever(params.outcome);
35
+ }
36
+ }
37
+ }
38
+ function normalizeSyncExecError(error) {
39
+ const record = typeof error === "object" && error !== null ? error : {};
40
+ const code = typeof record["code"] === "string" ? record["code"] : void 0;
41
+ const status = typeof record["status"] === "number" ? record["status"] : null;
42
+ const signal = typeof record["signal"] === "string" ? record["signal"] : null;
43
+ const isKilled = code === "ETIMEDOUT";
44
+ let errorCode = status;
45
+ if (code === "ENOBUFS") {
46
+ errorCode = "ERR_CHILD_PROCESS_STDIO_MAXBUFFER";
47
+ } else if (code !== void 0 && !isKilled) {
48
+ errorCode = code;
49
+ }
50
+ return {
51
+ errorCode,
52
+ exitCode: status,
53
+ isKilled,
54
+ signal,
55
+ standardError: toText(record["stderr"]),
56
+ standardOutput: toText(record["stdout"])
57
+ };
58
+ }
59
+ function resolvePortOwnerQueryOutcome(params) {
60
+ return !params.hasFailed || params.platform !== "win32" && !params.isKilled && params.errorCode === LSOF_NOTHING_FOUND_EXIT_CODE && params.standardError.trim() === "" && params.standardOutput.trim() === "" ? "answered" : resolveHostQueryFailure(params);
61
+ }
62
+ function toText(stream) {
63
+ if (typeof stream === "string") {
64
+ return stream;
65
+ }
66
+ return Buffer.isBuffer(stream) ? stream.toString("utf-8") : "";
67
+ }
68
+ export {
69
+ buildPortOwnerQueryMessage,
70
+ normalizeSyncExecError,
71
+ resolvePortOwnerQueryOutcome
72
+ };
73
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3BvcnQtb3duZXItcXVlcnktdmVyZGljdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFB1cmUgY2xhc3NpZmljYXRpb24gb2YgdGhlIHBvcnQtb3duZXIgcXVlcnkgXHUyMDE0IGBuZXRzdGF0IC1hbm9gIG9uIFdpbmRvd3MsXG4gKiBgbHNvZiAtdGkgdGNwOjxwb3J0PmAgZWxzZXdoZXJlIFx1MjAxNCBkZWNpZGluZywgZnJvbSBob3cgaXQgZW5kZWQsIHdoZXRoZXIgaXRcbiAqICoqYW5zd2VyZWQqKiBvciAqKmZhaWxlZCoqLCBhbmQgc2F5aW5nIHdoaWNoIGZhaWx1cmUgaW4gb25lIGxpbmUuXG4gKlxuICogVGhlIHF1ZXJ5IGlzIHRoZSBvbmx5IHJlYWwgZXNjYWxhdGlvbiB0aGUgQXBwaXVtIHRlYXJkb3duIGhhczogdGhlIFBJRCB0aGVcbiAqIGhhcm5lc3MgaG9sZHMgaXMgdGhlIGBzaGVsbDogdHJ1ZWAgd3JhcHBlciBpdCBzcGF3bmVkLCBzbyB3aGF0IHN1cnZpdmVzIGEga2lsbFxuICogaXMgZm91bmQgYnkgYXNraW5nIHdobyBzdGlsbCBsaXN0ZW5zIG9uIHRoZSBwb3J0ICgqKkw0NioqKS4gSXQgdXNlZCB0byByZXNvbHZlXG4gKiBhbiBlbXB0eSBsaXN0IGZvciBldmVyeSBlcnJvciwgd2hpY2ggbWFkZSB0aHJlZSBkaWZmZXJlbnQgZW5kaW5ncyBvbmUgc2lsZW50XG4gKiB2YWx1ZTpcbiAqXG4gKiAtIGBsc29mYCBleGl0aW5nIDEgd2l0aCBub3RoaW5nIG9uIGVpdGhlciBzdHJlYW0gXHUyMDE0IHdoaWNoIGlzIGhvdyBpdCBzYXlzXG4gKiAgIG5vdGhpbmcgaG9sZHMgdGhlIHBvcnQqLCBhIGxlZ2l0aW1hdGUgZW1wdHkgYW5zd2VyO1xuICogLSB0aGUgYnVkZ2V0IHJ1bm5pbmcgb3V0IG9uIGEgY29udGVuZGVkIGhvc3Q7XG4gKiAtIHRoZSBjaGlsZCBkeWluZy5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCBpcyBhbiBhbnN3ZXIuIFRoZSBvdGhlciB0d28gZGlzYXJtIHRoZSBlc2NhbGF0aW9uIGV4YWN0bHkgdGhlXG4gKiB3YXkgYSBzaWxlbnRseSBmYWlsZWQgcHJvY2VzcyBsaXN0aW5nIGRpc2FybWVkIHRoZSBlbXVsYXRvcidzXG4gKiAoYGhvc3QtcHJvY2Vzcy1xdWVyeS12ZXJkaWN0LnRzYCksIHNvIHRoZXkgYXJlIGNsYXNzaWZpZWQgYnkgdGhlIHNhbWUgcnVsZXNcbiAqIGFuZCByZXBvcnRlZCwgbm90IHN3YWxsb3dlZC5cbiAqXG4gKiAqKldoeSBhIG1vZHVsZSBvZiBpdHMgb3duIHJhdGhlciB0aGFuIGFuIG9wdGlvbiBvbiB0aGUgcHJvY2Vzcy1saXN0aW5nXG4gKiB2ZXJkaWN0LioqIFRoZSB0d28gcXVlcmllcyBkaXNhZ3JlZSBpbiB0d28gcGxhY2VzLCBub3Qgb25lLiBaZXJvIG93bmVycyBpcyBhXG4gKiBsZWdpdGltYXRlIGFuc3dlciBoZXJlLCBzbyBgemVyby1yb3dzYCBuZXZlciBhcHBsaWVzOyBhbmQgYGxzb2ZgJ3Mgc2lsZW50IGV4aXRcbiAqIDEgbWVhbnMgKm5vdGhpbmcgbGlzdGVucyosIHdoZXJlIGZvciBgdGFza2xpc3RgIGEgc2lsZW50IG5vbi16ZXJvIGV4aXQgaXMgYVxuICogY3Jhc2guIFRoZSBmYWlsdXJlIGJyYW5jaGVzIHRoZW1zZWx2ZXMgYXJlIGRlbGVnYXRlZCB0b1xuICoge0BsaW5rIHJlc29sdmVIb3N0UXVlcnlGYWlsdXJlfSwgc28gdGhlcmUgaXMgc3RpbGwgb25lIGRlZmluaXRpb24gb2ZcbiAqIGBjcmFzaGVkYCwgYHRpbWVkLW91dGAgYW5kIGByZWZ1c2VkYC5cbiAqL1xuXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5cbmltcG9ydCB0eXBlIHsgSG9zdFF1ZXJ5RmFpbHVyZSB9IGZyb20gJy4vaG9zdC1wcm9jZXNzLXF1ZXJ5LXZlcmRpY3QubWpzJztcblxuaW1wb3J0IHtcbiAgZm9ybWF0RHVyYXRpb24sXG4gIGZvcm1hdEV4aXRDb2RlLFxuICBmb3JtYXRSZWZ1c2FsLFxuICByZXNvbHZlSG9zdFF1ZXJ5RmFpbHVyZVxufSBmcm9tICcuL2hvc3QtcHJvY2Vzcy1xdWVyeS12ZXJkaWN0Lm1qcyc7XG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLyoqXG4gKiBUaGUgZXhpdCBjb2RlIGBsc29mYCB1c2VzIGZvciBcImZvdW5kIG5vdGhpbmdcIiwgd2hpY2ggaXQgcmVwb3J0cyBvbiBuZWl0aGVyIHN0cmVhbS5cbiAqL1xuY29uc3QgTFNPRl9OT1RISU5HX0ZPVU5EX0VYSVRfQ09ERSA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkUG9ydE93bmVyUXVlcnlNZXNzYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZFBvcnRPd25lclF1ZXJ5TWVzc2FnZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgY29tbWFuZCB0aGF0IHdhcyBydW4sIGZvciB0aGUgcmVhZGVyIHRvIHRyeSBieSBoYW5kIFx1MjAxNCBlLmcuIGBuZXRzdGF0IC1hbm9gLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICBIb3cgbG9uZyB0aGUgY2FsbCB0b29rIGJlZm9yZSBpdCBlbmRlZCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxhcHNlZEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBjaGlsZCdzIGV4aXQgY29kZSwgd2hlbiBpdCBleGl0ZWQgcmF0aGVyIHRoYW4gZmFpbGluZyB0byBzdGFydCBvciBiZWluZyBraWxsZWQuXG4gICAqL1xuICByZWFkb25seSBleGl0Q29kZTogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgVGhlIHZlcmRpY3QgZnJvbSB7QGxpbmsgcmVzb2x2ZVBvcnRPd25lclF1ZXJ5T3V0Y29tZX0uXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiBQb3J0T3duZXJRdWVyeU91dGNvbWU7XG5cbiAgLyoqXG4gIFRoZSBwb3J0IHdob3NlIG93bmVycyB3ZXJlIGFza2VkIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgVGhlIHNpZ25hbCB0aGUgY2hpbGQgd2FzIGtpbGxlZCB3aXRoLCB3aGVuIGl0IHdhcyBraWxsZWQuXG4gICAqL1xuICByZWFkb25seSBzaWduYWw6IG51bGwgfCBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoYXRldmVyIHRoZSBjaGlsZCB3cm90ZSB0byBzdGRlcnIuXG4gICAqL1xuICByZWFkb25seSBzdGFuZGFyZEVycm9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBidWRnZXQgdGhlIGNhbGwgd2FzIGdpdmVuLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgZmllbGRzIHtAbGluayBub3JtYWxpemVTeW5jRXhlY0Vycm9yfSBleHRyYWN0cyBmcm9tIGFuIGBleGVjRmlsZVN5bmNgIHRocm93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vcm1hbGl6ZWRTeW5jRXhlY0Vycm9yIHtcbiAgLyoqXG4gIFRoZSBlcnJvciBjb2RlIGluIGBleGVjRmlsZWAncyB2b2NhYnVsYXJ5OiB0aGUgbnVtZXJpYyBleGl0IGNvZGUsIG9yIGEgc3RyaW5nIHN1Y2ggYXMgYEVOT0VOVGAgb3IgYEVSUl9DSElMRF9QUk9DRVNTX1NURElPX01BWEJVRkZFUmAuXG4gICAqL1xuICByZWFkb25seSBlcnJvckNvZGU6IG51bGwgfCBudW1iZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBjaGlsZCdzIGV4aXQgY29kZSwgd2hlbiBpdCBleGl0ZWQuXG4gICAqL1xuICByZWFkb25seSBleGl0Q29kZTogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgV2hldGhlciB0aGUgYnVkZ2V0IGV4cGlyZWQgYW5kIHRoZSBjaGlsZCB3YXMga2lsbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNLaWxsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBzaWduYWwgdGhlIGNoaWxkIHdhcyBraWxsZWQgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IHNpZ25hbDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgV2hhdGV2ZXIgdGhlIGNoaWxkIHdyb3RlIHRvIHN0ZGVyci5cbiAgICovXG4gIHJlYWRvbmx5IHN0YW5kYXJkRXJyb3I6IHN0cmluZztcblxuICAvKipcbiAgV2hhdGV2ZXIgdGhlIGNoaWxkIHdyb3RlIHRvIHN0ZG91dCBiZWZvcmUgaXQgZW5kZWQuXG4gICAqL1xuICByZWFkb25seSBzdGFuZGFyZE91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhvdyB0aGUgcG9ydC1vd25lciBxdWVyeSBlbmRlZC5cbiAqXG4gKiBgYW5zd2VyZWRgIGNvdmVycyBib3RoIGEgbGlzdGVuZXIgZm91bmQgYW5kIG5vbmUgZm91bmQgXHUyMDE0IHRoZSBxdWVyeSBzdWNjZWVkZWRcbiAqIGVpdGhlciB3YXkuIFRoZSByZXN0IGFyZSB7QGxpbmsgcmVzb2x2ZUhvc3RRdWVyeUZhaWx1cmV9J3MgZmFpbHVyZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBvcnRPd25lclF1ZXJ5T3V0Y29tZSA9ICdhbnN3ZXJlZCcgfCBIb3N0UXVlcnlGYWlsdXJlO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlUG9ydE93bmVyUXVlcnlPdXRjb21lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUG9ydE93bmVyUXVlcnlPdXRjb21lUGFyYW1zIHtcbiAgLyoqXG4gIGBleGVjRmlsZWAncyBgZXJyb3IuY29kZWA6IHRoZSBudW1lcmljIGV4aXQgY29kZSwgb3IgYSBzdHJpbmcgbGlrZSBgRU5PRU5UYCB3aGVuIHRoZSBjaGlsZCBuZXZlciByYW4uXG4gICAqL1xuICByZWFkb25seSBlcnJvckNvZGU6IG51bGwgfCBudW1iZXIgfCBzdHJpbmc7XG5cbiAgLyoqXG4gIFdoZXRoZXIgYGV4ZWNGaWxlYCByZXBvcnRlZCBhbiBlcnJvciBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBoYXNGYWlsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gIGBleGVjRmlsZWAncyBgZXJyb3Iua2lsbGVkYDogd2hldGhlciB0aGUgYnVkZ2V0IGV4cGlyZWQgYW5kIHRoZSBjaGlsZCB3YXMga2lsbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNLaWxsZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBob3N0IHBsYXRmb3JtLCB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYSBzaWxlbnQgZXhpdCAxIGlzIGBsc29mYCBzYXlpbmcgKm5vdGhpbmcgbGlzdGVucyouXG4gICAqL1xuICByZWFkb25seSBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtO1xuXG4gIC8qKlxuICBXaGF0ZXZlciB0aGUgY2hpbGQgd3JvdGUgdG8gc3RkZXJyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhbmRhcmRFcnJvcjogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGF0ZXZlciB0aGUgY2hpbGQgd3JvdGUgdG8gc3Rkb3V0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhbmRhcmRPdXRwdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHNpbmdsZSBsaW5lIHRoZSBxdWVyeSBsb2dzIGZvciBhbiBvdXRjb21lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgb3V0Y29tZSBwbHVzIHRoZSBjb21tYW5kLCB0aGUgcG9ydCwgdGhlIGJ1ZGdldCBhbmQgd2hhdCB0aGUgY2hpbGQgbGVmdCBiZWhpbmQuXG4gKiBAcmV0dXJucyBUaGUgd2FybmluZyB0byBsb2csIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHF1ZXJ5IGFuc3dlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb3J0T3duZXJRdWVyeU1lc3NhZ2UocGFyYW1zOiBCdWlsZFBvcnRPd25lclF1ZXJ5TWVzc2FnZVBhcmFtcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvc3QgPSBgYWZ0ZXIgJHtmb3JtYXREdXJhdGlvbihwYXJhbXMuZWxhcHNlZEluTWlsbGlzZWNvbmRzKX1gO1xuICBjb25zdCBzdWJqZWN0ID0gYFxcYCR7cGFyYW1zLmNvbW1hbmR9XFxgIChhc2tpbmcgd2hvIGxpc3RlbnMgb24gcG9ydCAke1N0cmluZyhwYXJhbXMucG9ydCl9KWA7XG4gIGNvbnN0IGNvbnNlcXVlbmNlID0gYE5vdGhpbmcgaXMga25vd24gYWJvdXQgd2hhdCBzdGlsbCBob2xkcyBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX0sIHNvIHRoZSBlc2NhbGF0aW9uIGhhcyBubyBQSUQgdG8ga2lsbCBcdTIwMTQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgbm90aGluZyBob2xkaW5nIGl0LmA7XG5cbiAgc3dpdGNoIChwYXJhbXMub3V0Y29tZSkge1xuICAgIGNhc2UgJ2Fuc3dlcmVkJzoge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2FzZSAnY3Jhc2hlZCc6IHtcbiAgICAgIHJldHVybiBgV2FybmluZzogJHtzdWJqZWN0fSBkaWVkICR7Y29zdH0gd2l0aG91dCBleHBsYWluaW5nIGl0c2VsZiAoZXhpdCAke2Zvcm1hdEV4aXRDb2RlKHBhcmFtcy5leGl0Q29kZSl9LCBub3RoaW5nIG9uIHN0ZGVycikuIFN1c3BlY3QgYSBjcmFzaCBvciBhbiBpbnRlcmZlcmluZyBzZWN1cml0eSBwcm9kdWN0LCBhbmQgdHJ5IHRoZSBjb21tYW5kIGJ5IGhhbmQuICR7Y29uc2VxdWVuY2V9YDtcbiAgICB9XG4gICAgY2FzZSAnbm90LWZvdW5kJzoge1xuICAgICAgcmV0dXJuIGBXYXJuaW5nOiAke3N1YmplY3R9IGNvdWxkIG5vdCBiZSBydW4gYXQgYWxsICR7Y29zdH06IHRoZSBleGVjdXRhYmxlIHdhcyBub3QgZm91bmQgb24gUEFUSC4gJHtjb25zZXF1ZW5jZX1gO1xuICAgIH1cbiAgICBjYXNlICdvdXRwdXQtb3ZlcnJhbic6IHtcbiAgICAgIHJldHVybiBgV2FybmluZzogJHtzdWJqZWN0fSBwcm9kdWNlZCBtb3JlIG91dHB1dCAke2Nvc3R9IHRoYW4gdGhlIHF1ZXJ5J3MgYnVmZmVyIGFsbG93cywgc28gbm9uZSBvZiBpdCBjb3VsZCBiZSByZWFkLiBSYWlzZSB0aGUgYnVmZmVyLiAke2NvbnNlcXVlbmNlfWA7XG4gICAgfVxuICAgIGNhc2UgJ3JlZnVzZWQnOiB7XG4gICAgICByZXR1cm4gYFdhcm5pbmc6ICR7c3ViamVjdH0gcmVmdXNlZCB0aGUgcmVxdWVzdCAke2Nvc3R9IChleGl0ICR7Zm9ybWF0RXhpdENvZGUocGFyYW1zLmV4aXRDb2RlKX0pOiAke2Zvcm1hdFJlZnVzYWwocGFyYW1zLnN0YW5kYXJkRXJyb3IpfSAke2NvbnNlcXVlbmNlfWA7XG4gICAgfVxuICAgIGNhc2UgJ3RpbWVkLW91dCc6IHtcbiAgICAgIHJldHVybiBgV2FybmluZzogJHtzdWJqZWN0fSBkaWQgbm90IGZpbmlzaCB3aXRoaW4gaXRzICR7Zm9ybWF0RHVyYXRpb24ocGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IGJ1ZGdldCBhbmQgd2FzIGtpbGxlZCAke2Nvc3R9JHtwYXJhbXMuc2lnbmFsID09PSBudWxsID8gJycgOiBgICgke3BhcmFtcy5zaWduYWx9KWB9LiAke2NvbnNlcXVlbmNlfWA7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBhc3NlcnROZXZlcihwYXJhbXMub3V0Y29tZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdHMgd2hhdCBhbiBgZXhlY0ZpbGVTeW5jYCB0aHJvdyBjYXJyaWVzLCBpbiBgZXhlY0ZpbGVgJ3Mgdm9jYWJ1bGFyeS5cbiAqXG4gKiBUaGUgc3luY2hyb25vdXMgQVBJIHJlcG9ydHMgdGhlIHNhbWUgZW5kaW5ncyB3aXRoIGRpZmZlcmVudCBmaWVsZHM6IGFuXG4gKiBleHBpcmVkIGJ1ZGdldCBpcyBgY29kZTogJ0VUSU1FRE9VVCdgIHJhdGhlciB0aGFuIGBraWxsZWQ6IHRydWVgLCBhbiBvdmVycnVuXG4gKiBidWZmZXIgaXMgYEVOT0JVRlNgLCBhbmQgdGhlIGV4aXQgY29kZSBpcyBgc3RhdHVzYCByYXRoZXIgdGhhbiBgY29kZWAuXG4gKiBOb3JtYWxpemluZyBoZXJlIGxldHMgdGhlIHN5bmMgdGVhcmRvd24gY2xhc3NpZnkgd2l0aCB0aGUgc2FtZSB2ZXJkaWN0IGFzIHRoZVxuICogYXN5bmMgb25lLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFdoYXRldmVyIGBleGVjRmlsZVN5bmNgIHRocmV3LlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgZmllbGRzOyBhbiB1bnJlY29nbml6YWJsZSB0aHJvdyByZWFkcyBhcyBhIGNyYXNoIHdpdGggbm8gZXZpZGVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTeW5jRXhlY0Vycm9yKGVycm9yOiB1bmtub3duKTogTm9ybWFsaXplZFN5bmNFeGVjRXJyb3Ige1xuICBjb25zdCByZWNvcmQgPSB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsID8gZXJyb3IgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gOiB7fTtcbiAgY29uc3QgY29kZSA9IHR5cGVvZiByZWNvcmRbJ2NvZGUnXSA9PT0gJ3N0cmluZycgPyByZWNvcmRbJ2NvZGUnXSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhdHVzID0gdHlwZW9mIHJlY29yZFsnc3RhdHVzJ10gPT09ICdudW1iZXInID8gcmVjb3JkWydzdGF0dXMnXSA6IG51bGw7XG4gIGNvbnN0IHNpZ25hbCA9IHR5cGVvZiByZWNvcmRbJ3NpZ25hbCddID09PSAnc3RyaW5nJyA/IHJlY29yZFsnc2lnbmFsJ10gOiBudWxsO1xuICBjb25zdCBpc0tpbGxlZCA9IGNvZGUgPT09ICdFVElNRURPVVQnO1xuXG4gIGxldCBlcnJvckNvZGU6IG51bGwgfCBudW1iZXIgfCBzdHJpbmcgPSBzdGF0dXM7XG4gIGlmIChjb2RlID09PSAnRU5PQlVGUycpIHtcbiAgICBlcnJvckNvZGUgPSAnRVJSX0NISUxEX1BST0NFU1NfU1RESU9fTUFYQlVGRkVSJztcbiAgfSBlbHNlIGlmIChjb2RlICE9PSB1bmRlZmluZWQgJiYgIWlzS2lsbGVkKSB7XG4gICAgZXJyb3JDb2RlID0gY29kZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3JDb2RlLFxuICAgIGV4aXRDb2RlOiBzdGF0dXMsXG4gICAgaXNLaWxsZWQsXG4gICAgc2lnbmFsLFxuICAgIHN0YW5kYXJkRXJyb3I6IHRvVGV4dChyZWNvcmRbJ3N0ZGVyciddKSxcbiAgICBzdGFuZGFyZE91dHB1dDogdG9UZXh0KHJlY29yZFsnc3Rkb3V0J10pXG4gIH07XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIHBvcnQtb3duZXIgcXVlcnkgZW5kZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFdoYXQgYGV4ZWNGaWxlYCByZXBvcnRlZCwgYW5kIHRoZSBwbGF0Zm9ybSBpdCByYW4gb24uXG4gKiBAcmV0dXJucyBUaGUgb3V0Y29tZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQb3J0T3duZXJRdWVyeU91dGNvbWUocGFyYW1zOiBSZXNvbHZlUG9ydE93bmVyUXVlcnlPdXRjb21lUGFyYW1zKTogUG9ydE93bmVyUXVlcnlPdXRjb21lIHtcbiAgcmV0dXJuICFwYXJhbXMuaGFzRmFpbGVkIHx8IChwYXJhbXMucGxhdGZvcm0gIT09ICd3aW4zMidcbiAgICAgICYmICFwYXJhbXMuaXNLaWxsZWRcbiAgICAgICYmIHBhcmFtcy5lcnJvckNvZGUgPT09IExTT0ZfTk9USElOR19GT1VORF9FWElUX0NPREVcbiAgICAgICYmIHBhcmFtcy5zdGFuZGFyZEVycm9yLnRyaW0oKSA9PT0gJydcbiAgICAgICYmIHBhcmFtcy5zdGFuZGFyZE91dHB1dC50cmltKCkgPT09ICcnKVxuICAgID8gJ2Fuc3dlcmVkJ1xuICAgIDogcmVzb2x2ZUhvc3RRdWVyeUZhaWx1cmUocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIGNoaWxkJ3MgY2FwdHVyZWQgc3RyZWFtLCB3aGljaGV2ZXIgZm9ybSBgZXhlY0ZpbGVTeW5jYCBsZWZ0IGl0IGluLlxuICpcbiAqIEBwYXJhbSBzdHJlYW0gLSBBIHN0cmluZywgYSBgQnVmZmVyYCwgb3Igbm90aGluZy5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0LCBvciBhbiBlbXB0eSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvVGV4dChzdHJlYW06IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHN0cmVhbSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyZWFtO1xuICB9XG5cbiAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihzdHJlYW0pID8gc3RyZWFtLnRvU3RyaW5nKCd1dGYtOCcpIDogJyc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFnQ0EsU0FBUyxjQUFjO0FBSXZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG1CQUFtQjtBQUs1QixNQUFNLCtCQUErQjtBQW1JOUIsU0FBUywyQkFBMkIsUUFBOEQ7QUFDdkcsUUFBTSxPQUFPLFNBQVMsZUFBZSxPQUFPLHFCQUFxQixDQUFDO0FBQ2xFLFFBQU0sVUFBVSxLQUFLLE9BQU8sT0FBTyxrQ0FBa0MsT0FBTyxPQUFPLElBQUksQ0FBQztBQUN4RixRQUFNLGNBQWMsZ0RBQWdELE9BQU8sT0FBTyxJQUFJLENBQUM7QUFFdkYsVUFBUSxPQUFPLFNBQVM7QUFBQSxJQUN0QixLQUFLLFlBQVk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsS0FBSyxXQUFXO0FBQ2QsYUFBTyxZQUFZLE9BQU8sU0FBUyxJQUFJLG9DQUFvQyxlQUFlLE9BQU8sUUFBUSxDQUFDLDBHQUEwRyxXQUFXO0FBQUEsSUFDak87QUFBQSxJQUNBLEtBQUssYUFBYTtBQUNoQixhQUFPLFlBQVksT0FBTyw0QkFBNEIsSUFBSSwyQ0FBMkMsV0FBVztBQUFBLElBQ2xIO0FBQUEsSUFDQSxLQUFLLGtCQUFrQjtBQUNyQixhQUFPLFlBQVksT0FBTyx5QkFBeUIsSUFBSSxtRkFBbUYsV0FBVztBQUFBLElBQ3ZKO0FBQUEsSUFDQSxLQUFLLFdBQVc7QUFDZCxhQUFPLFlBQVksT0FBTyx3QkFBd0IsSUFBSSxVQUFVLGVBQWUsT0FBTyxRQUFRLENBQUMsTUFBTSxjQUFjLE9BQU8sYUFBYSxDQUFDLElBQUksV0FBVztBQUFBLElBQ3pKO0FBQUEsSUFDQSxLQUFLLGFBQWE7QUFDaEIsYUFBTyxZQUFZLE9BQU8sOEJBQThCLGVBQWUsT0FBTyxxQkFBcUIsQ0FBQywwQkFBMEIsSUFBSSxHQUFHLE9BQU8sV0FBVyxPQUFPLEtBQUssS0FBSyxPQUFPLE1BQU0sR0FBRyxLQUFLLFdBQVc7QUFBQSxJQUMxTTtBQUFBLElBQ0EsU0FBUztBQUNQLGFBQU8sWUFBWSxPQUFPLE9BQU87QUFBQSxJQUNuQztBQUFBLEVBQ0Y7QUFDRjtBQWNPLFNBQVMsdUJBQXVCLE9BQXlDO0FBQzlFLFFBQU0sU0FBUyxPQUFPLFVBQVUsWUFBWSxVQUFVLE9BQU8sUUFBbUMsQ0FBQztBQUNqRyxRQUFNLE9BQU8sT0FBTyxPQUFPLE1BQU0sTUFBTSxXQUFXLE9BQU8sTUFBTSxJQUFJO0FBQ25FLFFBQU0sU0FBUyxPQUFPLE9BQU8sUUFBUSxNQUFNLFdBQVcsT0FBTyxRQUFRLElBQUk7QUFDekUsUUFBTSxTQUFTLE9BQU8sT0FBTyxRQUFRLE1BQU0sV0FBVyxPQUFPLFFBQVEsSUFBSTtBQUN6RSxRQUFNLFdBQVcsU0FBUztBQUUxQixNQUFJLFlBQW9DO0FBQ3hDLE1BQUksU0FBUyxXQUFXO0FBQ3RCLGdCQUFZO0FBQUEsRUFDZCxXQUFXLFNBQVMsVUFBYSxDQUFDLFVBQVU7QUFDMUMsZ0JBQVk7QUFBQSxFQUNkO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWO0FBQUEsSUFDQTtBQUFBLElBQ0EsZUFBZSxPQUFPLE9BQU8sUUFBUSxDQUFDO0FBQUEsSUFDdEMsZ0JBQWdCLE9BQU8sT0FBTyxRQUFRLENBQUM7QUFBQSxFQUN6QztBQUNGO0FBUU8sU0FBUyw2QkFBNkIsUUFBbUU7QUFDOUcsU0FBTyxDQUFDLE9BQU8sYUFBYyxPQUFPLGFBQWEsV0FDMUMsQ0FBQyxPQUFPLFlBQ1IsT0FBTyxjQUFjLGdDQUNyQixPQUFPLGNBQWMsS0FBSyxNQUFNLE1BQ2hDLE9BQU8sZUFBZSxLQUFLLE1BQU0sS0FDcEMsYUFDQSx3QkFBd0IsTUFBTTtBQUNwQztBQVFBLFNBQVMsT0FBTyxRQUF5QjtBQUN2QyxNQUFJLE9BQU8sV0FBVyxVQUFVO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLFNBQVMsTUFBTSxJQUFJLE9BQU8sU0FBUyxPQUFPLElBQUk7QUFDOUQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -3,7 +3,14 @@ import {
3
3
  runAdbText,
4
4
  runAdbTextWithoutDevice
5
5
  } from "./adb.mjs";
6
+ import {
7
+ buildAvdNameChannelCommand,
8
+ FIRST_AVD_NAME_CHANNEL,
9
+ parseAvdNameAnswer,
10
+ resolveNextAvdNameChannel
11
+ } from "./avd-name-channel.mjs";
6
12
  import { selectEmulatorDeviceId } from "./emulator-device-id.mjs";
13
+ import { ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS } from "./emulator-reclaim.mjs";
7
14
  const EMULATOR_DEVICE_ID_PREFIX = "emulator-";
8
15
  async function resolveEmulatorDeviceId(params) {
9
16
  const candidates = await listEmulatorDeviceCandidates();
@@ -21,13 +28,34 @@ async function listEmulatorDeviceCandidates() {
21
28
  const deviceIds = listOnlineDeviceIds(devicesOutput).filter((deviceId) => deviceId.startsWith(EMULATOR_DEVICE_ID_PREFIX));
22
29
  const candidates = [];
23
30
  for (const deviceId of deviceIds) {
24
- const output = await runAdbText({ commandArguments: ["emu", "avd", "name"], deviceId });
25
- const avdName = output.split("\n", 1)[0]?.trim() ?? "";
26
- candidates.push({ avdName, deviceId });
31
+ candidates.push({ avdName: await probeAvdName(deviceId), deviceId });
27
32
  }
28
33
  return candidates;
29
34
  }
35
+ async function probeAvdName(deviceId) {
36
+ let channel = FIRST_AVD_NAME_CHANNEL;
37
+ while (channel !== void 0) {
38
+ let didChannelRespond = true;
39
+ let reportedAvdName = "";
40
+ try {
41
+ reportedAvdName = parseAvdNameAnswer(
42
+ await runAdbText({
43
+ commandArguments: buildAvdNameChannelCommand(channel),
44
+ deviceId,
45
+ timeoutInMilliseconds: ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS
46
+ })
47
+ );
48
+ } catch {
49
+ didChannelRespond = false;
50
+ }
51
+ if (reportedAvdName.length > 0) {
52
+ return reportedAvdName;
53
+ }
54
+ channel = resolveNextAvdNameChannel({ channel, didChannelRespond });
55
+ }
56
+ return "";
57
+ }
30
58
  export {
31
59
  resolveEmulatorDeviceId
32
60
  };
33
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXNrcyB0aGUgcnVubmluZyBlbXVsYXRvcnMgd2hpY2ggQVZEIGVhY2ggd2FzIHN0YXJ0ZWQgZnJvbSwgYW5kIHJlc29sdmVzIG9uZVxuICogYnkgbmFtZSB0aHJvdWdoIHtAbGluayAuL2VtdWxhdG9yLWRldmljZS1pZC50c30ncyBzZWxlY3Rpb24uXG4gKlxuICogRXZlcnkgZnVuY3Rpb24gaGVyZSBzaGVsbHMgb3V0LCBzbyB0aGUgd2hvbGUgbW9kdWxlIGlzIGludGVncmF0aW9uLXRpbWUgY29kZVxuICogXHUyMDE0IHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBzZWxlY3Rpb24gaXQgZGVsZWdhdGVzIHRvIGxpdmVzIGluIGl0cyBvd24gbW9kdWxlXG4gKiBhbmQgc3RheXMgdW5pdC10ZXN0ZWQuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoc2hlbGxzIG91dCB0byBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSB9IGZyb20gJy4vZW11bGF0b3ItZGV2aWNlLWlkLm1qcyc7XG5cbmltcG9ydCB7IGxpc3RPbmxpbmVEZXZpY2VJZHMgfSBmcm9tICcuL2FkYi1kZXZpY2UtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgcnVuQWRiVGV4dCxcbiAgcnVuQWRiVGV4dFdpdGhvdXREZXZpY2Vcbn0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7IHNlbGVjdEVtdWxhdG9yRGV2aWNlSWQgfSBmcm9tICcuL2VtdWxhdG9yLWRldmljZS1pZC5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRW11bGF0b3JEZXZpY2VJZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFWRCBuYW1lIHRvIG1hdGNoLCBlLmcuIGBvYnNpZGlhbl9zY3JlZW5zaG90c2AuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHByZWZpeCBgYWRiIGRldmljZXNgIGdpdmVzIGFuIGVtdWxhdG9yLCBhcyBvcHBvc2VkIHRvIGEgcGh5c2ljYWxseSBhdHRhY2hlZCBkZXZpY2UuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0RFVklDRV9JRF9QUkVGSVggPSAnZW11bGF0b3ItJztcblxuLyoqXG4gKiBGaW5kcyB0aGUgcnVubmluZyBlbXVsYXRvciB3aG9zZSBBVkQgaXMgdGhlIG5hbWVkIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCB0byBtYXRjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRldmljZSBVRElEIHRvIGFkZHJlc3MgaXQgYnkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIHJ1bm5pbmcgZW11bGF0b3Igd2FzIHN0YXJ0ZWQgZnJvbSB0aGF0IEFWRC4gVGhlIG1lc3NhZ2UgbGlzdHMgd2hhdCBJUyBydW5uaW5nLCBzaW5jZVxuICogICBcInRoZSB3cm9uZyBlbXVsYXRvciBpcyB1cFwiIGFuZCBcIm5vIGVtdWxhdG9yIGlzIHVwXCIgbmVlZCBkaWZmZXJlbnQgYW5zd2Vycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckRldmljZUlkKHBhcmFtczogUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gYXdhaXQgbGlzdEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlcygpO1xuICBjb25zdCBkZXZpY2VJZCA9IHNlbGVjdEVtdWxhdG9yRGV2aWNlSWQoeyBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSwgY2FuZGlkYXRlcyB9KTtcblxuICBpZiAoIWRldmljZUlkKSB7XG4gICAgY29uc3QgbGlzdGVkID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gYCR7Y2FuZGlkYXRlLmRldmljZUlkfSAoJHtjYW5kaWRhdGUuYXZkTmFtZX0pYCkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJlc29sdmVFbXVsYXRvckRldmljZUlkOiBubyBydW5uaW5nIGVtdWxhdG9yIGZvciBBVkQgXCIke3BhcmFtcy5hdmROYW1lfVwiLiBSdW5uaW5nIGVtdWxhdG9yczogJHtsaXN0ZWR9LiBgXG4gICAgICAgICsgJ1N0YXJ0IGl0LCBvciBydW4gdGhpcyBwcm9qZWN0IG9uY2UgdG8gaGF2ZSB0aGUgaGFybmVzcyBzdGFydCBpdC4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZXZpY2VJZDtcbn1cblxuLyoqXG4gKiBBc2tzIGV2ZXJ5IG9ubGluZSBlbXVsYXRvciB3aGljaCBBVkQgaXQgd2FzIHN0YXJ0ZWQgZnJvbS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIG9uZSBlbnRyeSBwZXIgcnVubmluZyBlbXVsYXRvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlcygpOiBQcm9taXNlPEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlW10+IHtcbiAgY29uc3QgZGV2aWNlc091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHRXaXRob3V0RGV2aWNlKFsnZGV2aWNlcyddKTtcbiAgY29uc3QgZGV2aWNlSWRzID0gbGlzdE9ubGluZURldmljZUlkcyhkZXZpY2VzT3V0cHV0KS5maWx0ZXIoKGRldmljZUlkKSA9PiBkZXZpY2VJZC5zdGFydHNXaXRoKEVNVUxBVE9SX0RFVklDRV9JRF9QUkVGSVgpKTtcblxuICBjb25zdCBjYW5kaWRhdGVzOiBFbXVsYXRvckRldmljZUNhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgLy8gYGFkYiBlbXUgYXZkIG5hbWVgIGFuc3dlcnMgd2l0aCB0aGUgbmFtZSBhbmQgdGhlbiBgT0tgLCBlYWNoIG9uIGl0cyBvd24gbGluZS5cbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBydW5BZGJUZXh0KHsgY29tbWFuZEFyZ3VtZW50czogWydlbXUnLCAnYXZkJywgJ25hbWUnXSwgZGV2aWNlSWQgfSk7XG4gICAgY29uc3QgYXZkTmFtZSA9IG91dHB1dC5zcGxpdCgnXFxuJywgMSlbMF0/LnRyaW0oKSA/PyAnJztcbiAgICBjYW5kaWRhdGVzLnB1c2goeyBhdmROYW1lLCBkZXZpY2VJZCB9KTtcbiAgfVxuXG4gIHJldHVybiBjYW5kaWRhdGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBZUEsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQWV2QyxNQUFNLDRCQUE0QjtBQVVsQyxlQUFzQix3QkFBd0IsUUFBd0Q7QUFDcEcsUUFBTSxhQUFhLE1BQU0sNkJBQTZCO0FBQ3RELFFBQU0sV0FBVyx1QkFBdUIsRUFBRSxTQUFTLE9BQU8sU0FBUyxXQUFXLENBQUM7QUFFL0UsTUFBSSxDQUFDLFVBQVU7QUFDYixVQUFNLFNBQVMsV0FBVyxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsUUFBUSxLQUFLLFVBQVUsT0FBTyxHQUFHLEVBQUUsS0FBSyxJQUFJLEtBQUs7QUFDM0csVUFBTSxJQUFJO0FBQUEsTUFDUix5REFBeUQsT0FBTyxPQUFPLHlCQUF5QixNQUFNO0FBQUEsSUFFeEc7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBT0EsZUFBZSwrQkFBbUU7QUFDaEYsUUFBTSxnQkFBZ0IsTUFBTSx3QkFBd0IsQ0FBQyxTQUFTLENBQUM7QUFDL0QsUUFBTSxZQUFZLG9CQUFvQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsU0FBUyxXQUFXLHlCQUF5QixDQUFDO0FBRXhILFFBQU0sYUFBd0MsQ0FBQztBQUMvQyxhQUFXLFlBQVksV0FBVztBQUVoQyxVQUFNLFNBQVMsTUFBTSxXQUFXLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxPQUFPLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDdEYsVUFBTSxVQUFVLE9BQU8sTUFBTSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLO0FBQ3BELGVBQVcsS0FBSyxFQUFFLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
61
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXNrcyB0aGUgcnVubmluZyBlbXVsYXRvcnMgd2hpY2ggQVZEIGVhY2ggd2FzIHN0YXJ0ZWQgZnJvbSwgYW5kIHJlc29sdmVzIG9uZVxuICogYnkgbmFtZSB0aHJvdWdoIHtAbGluayAuL2VtdWxhdG9yLWRldmljZS1pZC50c30ncyBzZWxlY3Rpb24uXG4gKlxuICogRXZlcnkgZnVuY3Rpb24gaGVyZSBzaGVsbHMgb3V0LCBzbyB0aGUgd2hvbGUgbW9kdWxlIGlzIGludGVncmF0aW9uLXRpbWUgY29kZVxuICogXHUyMDE0IHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBzZWxlY3Rpb24gaXQgZGVsZWdhdGVzIHRvIGxpdmVzIGluIGl0cyBvd24gbW9kdWxlXG4gKiBhbmQgc3RheXMgdW5pdC10ZXN0ZWQuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoc2hlbGxzIG91dCB0byBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBBdmROYW1lQ2hhbm5lbCB9IGZyb20gJy4vYXZkLW5hbWUtY2hhbm5lbC5tanMnO1xuaW1wb3J0IHR5cGUgeyBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSB9IGZyb20gJy4vZW11bGF0b3ItZGV2aWNlLWlkLm1qcyc7XG5cbmltcG9ydCB7IGxpc3RPbmxpbmVEZXZpY2VJZHMgfSBmcm9tICcuL2FkYi1kZXZpY2UtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgcnVuQWRiVGV4dCxcbiAgcnVuQWRiVGV4dFdpdGhvdXREZXZpY2Vcbn0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkQXZkTmFtZUNoYW5uZWxDb21tYW5kLFxuICBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMLFxuICBwYXJzZUF2ZE5hbWVBbnN3ZXIsXG4gIHJlc29sdmVOZXh0QXZkTmFtZUNoYW5uZWxcbn0gZnJvbSAnLi9hdmQtbmFtZS1jaGFubmVsLm1qcyc7XG5pbXBvcnQgeyBzZWxlY3RFbXVsYXRvckRldmljZUlkIH0gZnJvbSAnLi9lbXVsYXRvci1kZXZpY2UtaWQubWpzJztcbmltcG9ydCB7IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSBmcm9tICcuL2VtdWxhdG9yLXJlY2xhaW0ubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVFbXVsYXRvckRldmljZUlkUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBBVkQgbmFtZSB0byBtYXRjaCwgZS5nLiBgb2JzaWRpYW5fc2NyZWVuc2hvdHNgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwcmVmaXggYGFkYiBkZXZpY2VzYCBnaXZlcyBhbiBlbXVsYXRvciwgYXMgb3Bwb3NlZCB0byBhIHBoeXNpY2FsbHkgYXR0YWNoZWQgZGV2aWNlLlxuICovXG5jb25zdCBFTVVMQVRPUl9ERVZJQ0VfSURfUFJFRklYID0gJ2VtdWxhdG9yLSc7XG5cbi8qKlxuICogRmluZHMgdGhlIHJ1bm5pbmcgZW11bGF0b3Igd2hvc2UgQVZEIGlzIHRoZSBuYW1lZCBvbmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZXZpY2UgVURJRCB0byBhZGRyZXNzIGl0IGJ5LlxuICogQHRocm93cyBFcnJvciBpZiBubyBydW5uaW5nIGVtdWxhdG9yIHdhcyBzdGFydGVkIGZyb20gdGhhdCBBVkQuIFRoZSBtZXNzYWdlIGxpc3RzIHdoYXQgSVMgcnVubmluZywgc2luY2VcbiAqICAgXCJ0aGUgd3JvbmcgZW11bGF0b3IgaXMgdXBcIiBhbmQgXCJubyBlbXVsYXRvciBpcyB1cFwiIG5lZWQgZGlmZmVyZW50IGFuc3dlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRW11bGF0b3JEZXZpY2VJZChwYXJhbXM6IFJlc29sdmVFbXVsYXRvckRldmljZUlkUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IGF3YWl0IGxpc3RFbXVsYXRvckRldmljZUNhbmRpZGF0ZXMoKTtcbiAgY29uc3QgZGV2aWNlSWQgPSBzZWxlY3RFbXVsYXRvckRldmljZUlkKHsgYXZkTmFtZTogcGFyYW1zLmF2ZE5hbWUsIGNhbmRpZGF0ZXMgfSk7XG5cbiAgaWYgKCFkZXZpY2VJZCkge1xuICAgIGNvbnN0IGxpc3RlZCA9IGNhbmRpZGF0ZXMubWFwKChjYW5kaWRhdGUpID0+IGAke2NhbmRpZGF0ZS5kZXZpY2VJZH0gKCR7Y2FuZGlkYXRlLmF2ZE5hbWV9KWApLmpvaW4oJywgJykgfHwgJ25vbmUnO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByZXNvbHZlRW11bGF0b3JEZXZpY2VJZDogbm8gcnVubmluZyBlbXVsYXRvciBmb3IgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIi4gUnVubmluZyBlbXVsYXRvcnM6ICR7bGlzdGVkfS4gYFxuICAgICAgICArICdTdGFydCBpdCwgb3IgcnVuIHRoaXMgcHJvamVjdCBvbmNlIHRvIGhhdmUgdGhlIGhhcm5lc3Mgc3RhcnQgaXQuJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGV2aWNlSWQ7XG59XG5cbi8qKlxuICogQXNrcyBldmVyeSBvbmxpbmUgZW11bGF0b3Igd2hpY2ggQVZEIGl0IHdhcyBzdGFydGVkIGZyb20uXG4gKlxuICogKipBIGRldmljZSB0aGF0IHdpbGwgbm90IGlkZW50aWZ5IGl0c2VsZiBpcyBsaXN0ZWQgd2l0aCBhbiBlbXB0eSBuYW1lLCBub3RcbiAqIHRocm93biBvdmVyLioqIEl0IGlzIHNvbWVib2R5IGVsc2UncyB3ZWRnZWQgZW11bGF0b3IgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBpdCBpc1xuICogdGhpcyBjYWxsZXIncywgYW5kIGZhaWxpbmcgdGhlIHdob2xlIGxvb2t1cCBvdmVyIGl0IGlzIHByZWNpc2VseSB0aGVcbiAqIG1hY2hpbmUtd2lkZSBpbnRlcmxvY2sgYGF2ZC1uYW1lLWNoYW5uZWwudHNgIGV4aXN0cyB0byB1bmRvIFx1MjAxNCB0aGUgd2FudGVkXG4gKiBlbXVsYXRvciwgc2l0dGluZyByaWdodCBiZXNpZGUgaXQgYW5kIGFuc3dlcmluZyBwZXJmZWN0bHksIGlzIHN0aWxsIGZvdW5kLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gb25lIGVudHJ5IHBlciBydW5uaW5nIGVtdWxhdG9yLlxuICovXG5hc3luYyBmdW5jdGlvbiBsaXN0RW11bGF0b3JEZXZpY2VDYW5kaWRhdGVzKCk6IFByb21pc2U8RW11bGF0b3JEZXZpY2VDYW5kaWRhdGVbXT4ge1xuICBjb25zdCBkZXZpY2VzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dFdpdGhvdXREZXZpY2UoWydkZXZpY2VzJ10pO1xuICBjb25zdCBkZXZpY2VJZHMgPSBsaXN0T25saW5lRGV2aWNlSWRzKGRldmljZXNPdXRwdXQpLmZpbHRlcigoZGV2aWNlSWQpID0+IGRldmljZUlkLnN0YXJ0c1dpdGgoRU1VTEFUT1JfREVWSUNFX0lEX1BSRUZJWCkpO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXZpY2VJZCBvZiBkZXZpY2VJZHMpIHtcbiAgICBjYW5kaWRhdGVzLnB1c2goeyBhdmROYW1lOiBhd2FpdCBwcm9iZUF2ZE5hbWUoZGV2aWNlSWQpLCBkZXZpY2VJZCB9KTtcbiAgfVxuXG4gIHJldHVybiBjYW5kaWRhdGVzO1xufVxuXG4vKipcbiAqIEFza3Mgb25lIGVtdWxhdG9yIHdoaWNoIEFWRCBpdCB3YXMgc3RhcnRlZCBmcm9tLCBvdmVyIGVhY2ggY2hhbm5lbCBpbiB0dXJuLlxuICpcbiAqIFRoZSBndWVzdCBwcm9wZXJ0eSBjb21lcyBmaXJzdCBiZWNhdXNlIGl0IHRyYXZlbHMgYGFkYmRgIFx1MjAxNCB0aGUgY2hhbm5lbCB0aGlzXG4gKiBsb29rdXAgbmVlZHMgYW55d2F5IFx1MjAxNCB3aGlsZSB0aGUgY29uc29sZSBpcyBhIHNlcGFyYXRlIHBvcnQgdGhhdCB3ZWRnZXMgb24gaXRzXG4gKiBvd247IHNlZSBgYXZkLW5hbWUtY2hhbm5lbC50c2AuIEV2ZXJ5IGNhbGwgaXMgYm91bmRlZCwgc28gb25lIHVucmVzcG9uc2l2ZVxuICogZGV2aWNlIGNvc3RzIGEgdGltZW91dCByYXRoZXIgdGhhbiB0aGUgd2hvbGUgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBlbXVsYXRvciB0byBhc2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBBVkQgbmFtZSwgb3IgYCcnYCB3aGVuIG5vIGNoYW5uZWwgaWRlbnRpZmllZCBpdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvYmVBdmROYW1lKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY2hhbm5lbDogQXZkTmFtZUNoYW5uZWwgfCB1bmRlZmluZWQgPSBGSVJTVF9BVkRfTkFNRV9DSEFOTkVMO1xuXG4gIHdoaWxlIChjaGFubmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBsZXQgZGlkQ2hhbm5lbFJlc3BvbmQgPSB0cnVlO1xuICAgIGxldCByZXBvcnRlZEF2ZE5hbWUgPSAnJztcblxuICAgIHRyeSB7XG4gICAgICByZXBvcnRlZEF2ZE5hbWUgPSBwYXJzZUF2ZE5hbWVBbnN3ZXIoXG4gICAgICAgIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgICAgICAgIGNvbW1hbmRBcmd1bWVudHM6IGJ1aWxkQXZkTmFtZUNoYW5uZWxDb21tYW5kKGNoYW5uZWwpLFxuICAgICAgICAgIGRldmljZUlkLFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGRpZENoYW5uZWxSZXNwb25kID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHJlcG9ydGVkQXZkTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gcmVwb3J0ZWRBdmROYW1lO1xuICAgIH1cblxuICAgIGNoYW5uZWwgPSByZXNvbHZlTmV4dEF2ZE5hbWVDaGFubmVsKHsgY2hhbm5lbCwgZGlkQ2hhbm5lbFJlc3BvbmQgfSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFnQkEsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw4QkFBOEI7QUFDdkMsU0FBUyxnREFBZ0Q7QUFlekQsTUFBTSw0QkFBNEI7QUFVbEMsZUFBc0Isd0JBQXdCLFFBQXdEO0FBQ3BHLFFBQU0sYUFBYSxNQUFNLDZCQUE2QjtBQUN0RCxRQUFNLFdBQVcsdUJBQXVCLEVBQUUsU0FBUyxPQUFPLFNBQVMsV0FBVyxDQUFDO0FBRS9FLE1BQUksQ0FBQyxVQUFVO0FBQ2IsVUFBTSxTQUFTLFdBQVcsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLFFBQVEsS0FBSyxVQUFVLE9BQU8sR0FBRyxFQUFFLEtBQUssSUFBSSxLQUFLO0FBQzNHLFVBQU0sSUFBSTtBQUFBLE1BQ1IseURBQXlELE9BQU8sT0FBTyx5QkFBeUIsTUFBTTtBQUFBLElBRXhHO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQWFBLGVBQWUsK0JBQW1FO0FBQ2hGLFFBQU0sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUMsU0FBUyxDQUFDO0FBQy9ELFFBQU0sWUFBWSxvQkFBb0IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLFNBQVMsV0FBVyx5QkFBeUIsQ0FBQztBQUV4SCxRQUFNLGFBQXdDLENBQUM7QUFDL0MsYUFBVyxZQUFZLFdBQVc7QUFDaEMsZUFBVyxLQUFLLEVBQUUsU0FBUyxNQUFNLGFBQWEsUUFBUSxHQUFHLFNBQVMsQ0FBQztBQUFBLEVBQ3JFO0FBRUEsU0FBTztBQUNUO0FBYUEsZUFBZSxhQUFhLFVBQW1DO0FBQzdELE1BQUksVUFBc0M7QUFFMUMsU0FBTyxZQUFZLFFBQVc7QUFDNUIsUUFBSSxvQkFBb0I7QUFDeEIsUUFBSSxrQkFBa0I7QUFFdEIsUUFBSTtBQUNGLHdCQUFrQjtBQUFBLFFBQ2hCLE1BQU0sV0FBVztBQUFBLFVBQ2Ysa0JBQWtCLDJCQUEyQixPQUFPO0FBQUEsVUFDcEQ7QUFBQSxVQUNBLHVCQUF1QjtBQUFBLFFBQ3pCLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRixRQUFRO0FBQ04sMEJBQW9CO0FBQUEsSUFDdEI7QUFFQSxRQUFJLGdCQUFnQixTQUFTLEdBQUc7QUFDOUIsYUFBTztBQUFBLElBQ1Q7QUFFQSxjQUFVLDBCQUEwQixFQUFFLFNBQVMsa0JBQWtCLENBQUM7QUFBQSxFQUNwRTtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -12,12 +12,31 @@
12
12
  */
13
13
  /**
14
14
  * A layer passed to `sharp`'s `composite`.
15
+ *
16
+ * The input is either bytes to draw — an SVG, a PNG — or a block `sharp` creates
17
+ * on the spot, which is how a flat fill is composited without building an image
18
+ * for it first.
15
19
  */
16
20
  export interface SharpCompositeLayer {
17
- readonly input: Buffer;
21
+ readonly input: Buffer | SharpCreateInput;
18
22
  readonly left: number;
19
23
  readonly top: number;
20
24
  }
25
+ /**
26
+ * A solid block of color, created by `sharp` rather than supplied as bytes.
27
+ */
28
+ export interface SharpCreateInput {
29
+ readonly create: SharpCreateSpec;
30
+ }
31
+ /**
32
+ * The block `sharp` is asked to create: a rectangle of one flat color.
33
+ */
34
+ export interface SharpCreateSpec {
35
+ readonly background: SharpRgbColor;
36
+ readonly channels: number;
37
+ readonly height: number;
38
+ readonly width: number;
39
+ }
21
40
  /**
22
41
  * The `sharp` entry point the image helpers use.
23
42
  */
@@ -28,10 +47,12 @@ export type SharpFactory = (input: Uint8Array) => SharpInstance;
28
47
  export interface SharpInstance {
29
48
  blur: (this: void, sigma: number) => SharpInstance;
30
49
  composite: (this: void, layers: SharpCompositeLayer[]) => SharpInstance;
50
+ ensureAlpha: (this: void) => SharpInstance;
31
51
  metadata: (this: void) => Promise<SharpMetadata>;
32
52
  png: (this: void) => SharpInstance;
53
+ raw: (this: void) => SharpInstance;
33
54
  resize: (this: void, width: number, height: number, options?: SharpResizeOptions) => SharpInstance;
34
- toBuffer: (this: void) => Promise<Buffer>;
55
+ toBuffer: SharpToBuffer;
35
56
  trim: (this: void, options: SharpTrimOptions) => SharpInstance;
36
57
  }
37
58
  /**
@@ -41,12 +62,56 @@ export interface SharpMetadata {
41
62
  readonly height?: number | undefined;
42
63
  readonly width?: number | undefined;
43
64
  }
65
+ /**
66
+ * The geometry raw pixels have to be read with — without it they are a flat run of bytes.
67
+ */
68
+ export interface SharpRawInfo {
69
+ readonly channels: number;
70
+ readonly height: number;
71
+ readonly width: number;
72
+ }
73
+ /**
74
+ * A frame's raw pixels and the geometry they have to be read with.
75
+ */
76
+ export interface SharpRawResult {
77
+ readonly data: Uint8Array;
78
+ readonly info: SharpRawInfo;
79
+ }
44
80
  /**
45
81
  * The subset of `sharp`'s resize options the image helpers set.
46
82
  */
47
83
  export interface SharpResizeOptions {
48
84
  readonly fit: 'cover' | 'fill';
49
85
  }
86
+ /**
87
+ * Asks `toBuffer` for the pixels AND the geometry they are to be read with.
88
+ *
89
+ * Literal `true` rather than `boolean`, so the overload that returns
90
+ * {@link SharpRawResult} is only selected when the geometry is genuinely coming
91
+ * back — a `false` would resolve to bare bytes with the width silently missing.
92
+ */
93
+ export interface SharpResolveWithObjectOptions {
94
+ readonly resolveWithObject: true;
95
+ }
96
+ /**
97
+ * A color as `sharp` names its channels.
98
+ */
99
+ export interface SharpRgbColor {
100
+ readonly b: number;
101
+ readonly g: number;
102
+ readonly r: number;
103
+ }
104
+ /**
105
+ * `sharp`'s `toBuffer`, in the two shapes the image helpers call it in.
106
+ *
107
+ * Written as an overloaded call signature rather than a union return, because
108
+ * which one comes back is decided by the argument and a caller should not have
109
+ * to narrow a result it already knows the shape of.
110
+ */
111
+ export interface SharpToBuffer {
112
+ (this: void): Promise<Buffer>;
113
+ (this: void, options: SharpResolveWithObjectOptions): Promise<SharpRawResult>;
114
+ }
50
115
  /**
51
116
  * The subset of `sharp`'s trim options the image helpers set.
52
117
  */
@@ -13,4 +13,4 @@ async function importSharp(caller) {
13
13
  export {
14
14
  importSharp
15
15
  };
16
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwQ29tcG9zaXRlTGF5ZXIge1xuICByZWFkb25seSBpbnB1dDogQnVmZmVyO1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBgc2hhcnBgIGVudHJ5IHBvaW50IHRoZSBpbWFnZSBoZWxwZXJzIHVzZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcnBGYWN0b3J5ID0gKGlucHV0OiBVaW50OEFycmF5KSA9PiBTaGFycEluc3RhbmNlO1xuXG4vKipcbiAqIE9uZSBgc2hhcnBgIHBpcGVsaW5lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwSW5zdGFuY2Uge1xuICBibHVyOiAodGhpczogdm9pZCwgc2lnbWE6IG51bWJlcikgPT4gU2hhcnBJbnN0YW5jZTtcbiAgY29tcG9zaXRlOiAodGhpczogdm9pZCwgbGF5ZXJzOiBTaGFycENvbXBvc2l0ZUxheWVyW10pID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxCdWZmZXI+O1xuICB0cmltOiAodGhpczogdm9pZCwgb3B0aW9uczogU2hhcnBUcmltT3B0aW9ucykgPT4gU2hhcnBJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBzaGFycGAncyBtZXRhZGF0YSB0aGUgaW1hZ2UgaGVscGVycyByZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwTWV0YWRhdGEge1xuICByZWFkb25seSBoZWlnaHQ/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHdpZHRoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIHJlc2l6ZSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFJlc2l6ZU9wdGlvbnMge1xuICByZWFkb25seSBmaXQ6ICdjb3ZlcicgfCAnZmlsbCc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgc2hhcnBgJ3MgdHJpbSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFRyaW1PcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvdyBmYXIgYSBwaXhlbCBtYXkgZGlmZmVyIGZyb20gdGhlIHRyaW1tZWQtYXdheSBjb2xvciBiZWZvcmUgaXQgY291bnRzIGFzXG4gICAqIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBMb2FkcyBgc2hhcnBgIG9uIGRlbWFuZC5cbiAqXG4gKiBAcGFyYW0gY2FsbGVyIC0gTmFtZSBvZiB0aGUgY2FsbGluZyBoZWxwZXIsIHNvIHRoZSBlcnJvciBzYXlzIHdoaWNoIG9uZSBuZWVkcyBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGBzaGFycGAgZmFjdG9yeS5cbiAqIEB0aHJvd3MgRXJyb3IgbmFtaW5nIHRoZSBtaXNzaW5nIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydFNoYXJwKGNhbGxlcjogc3RyaW5nKTogUHJvbWlzZTxTaGFycEZhY3Rvcnk+IHtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHNoYXJwYCBpcyBhbiBPUFRJT05BTCBwZWVyLCBzbyBpdCBtdXN0IGJlIGxvYWRlZCBsYXppbHk6IGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGl0cyBuYXRpdmUgYmluYXJpZXMgaW50byBldmVyeSBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleC5cbiAgICBjb25zdCBzaGFycE1vZHVsZSA9IGF3YWl0IGltcG9ydCgnc2hhcnAnKTtcbiAgICBjb25zdCBmYWN0b3J5OiB1bmtub3duID0gc2hhcnBNb2R1bGUuZGVmYXVsdDtcbiAgICByZXR1cm4gZmFjdG9yeSBhcyBTaGFycEZhY3Rvcnk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFJlYWNoZWQgb25seSB3aGVuIHRoZSBvcHRpb25hbCBwZWVyIGlzIGFic2VudCwgd2hpY2ggaXQgbmV2ZXIgaXMgaW4gdGhpcyBwYWNrYWdlJ3Mgb3duIHRlc3QgcnVuLiAqL1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAke2NhbGxlcn0gbmVlZHMgdGhlIG9wdGlvbmFsIHBlZXIgZGVwZW5kZW5jeSBcInNoYXJwXCIuIGBcbiAgICAgICAgKyAnSW5zdGFsbCBpdCBpbiB0aGUgY29uc3VtaW5nIHByb2plY3QgKG5wbSBpIC1EIHNoYXJwKS4nLFxuICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICk7XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBeUVBLGVBQXNCLFlBQVksUUFBdUM7QUFDdkUsTUFBSTtBQUVGLFVBQU0sY0FBYyxNQUFNLE9BQU8sT0FBTztBQUN4QyxVQUFNLFVBQW1CLFlBQVk7QUFDckMsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFnQjtBQUV2QixVQUFNLElBQUk7QUFBQSxNQUNSLEdBQUcsTUFBTTtBQUFBLE1BRVQsRUFBRSxPQUFPLE1BQU07QUFBQSxJQUNqQjtBQUFBLEVBRUY7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
16
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NoYXJwLWxvYWRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExhemlseSBsb2FkcyBgc2hhcnBgLCB0aGUgT1BUSU9OQUwgcGVlciBkZXBlbmRlbmN5IHRoZSBpbWFnZSBoZWxwZXJzIG5lZWQsIGFuZFxuICogZGVzY3JpYmVzIHRoZSBzbGljZSBvZiBpdHMgc3VyZmFjZSB0aGV5IHVzZS5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIGBzaGFycGAnc1xuICogcGxhdGZvcm0tc3BlY2lmaWMgbmF0aXZlIGJpbmFyaWVzIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsXG4gKiB3aGVuIG9ubHkgc2NyZWVuc2hvdCBwb3N0LXByb2Nlc3NpbmcgbmVlZHMgdGhlbS4gVGhlIHR5cGUgaXMgc3RydWN0dXJhbCBmb3JcbiAqIHRoZSBzYW1lIHJlYXNvbjogdGhpcyBtb2R1bGUgdHlwZS1jaGVja3Mgd2l0aG91dCBgc2hhcnBgJ3Mgb3duIHR5cGVzIGJlaW5nXG4gKiByZXNvbHZhYmxlLlxuICovXG5cbi8qKlxuICogQSBsYXllciBwYXNzZWQgdG8gYHNoYXJwYCdzIGBjb21wb3NpdGVgLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBlaXRoZXIgYnl0ZXMgdG8gZHJhdyBcdTIwMTQgYW4gU1ZHLCBhIFBORyBcdTIwMTQgb3IgYSBibG9jayBgc2hhcnBgIGNyZWF0ZXNcbiAqIG9uIHRoZSBzcG90LCB3aGljaCBpcyBob3cgYSBmbGF0IGZpbGwgaXMgY29tcG9zaXRlZCB3aXRob3V0IGJ1aWxkaW5nIGFuIGltYWdlXG4gKiBmb3IgaXQgZmlyc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBDb21wb3NpdGVMYXllciB7XG4gIHJlYWRvbmx5IGlucHV0OiBCdWZmZXIgfCBTaGFycENyZWF0ZUlucHV0O1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgc29saWQgYmxvY2sgb2YgY29sb3IsIGNyZWF0ZWQgYnkgYHNoYXJwYCByYXRoZXIgdGhhbiBzdXBwbGllZCBhcyBieXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycENyZWF0ZUlucHV0IHtcbiAgcmVhZG9ubHkgY3JlYXRlOiBTaGFycENyZWF0ZVNwZWM7XG59XG5cbi8qKlxuICogVGhlIGJsb2NrIGBzaGFycGAgaXMgYXNrZWQgdG8gY3JlYXRlOiBhIHJlY3RhbmdsZSBvZiBvbmUgZmxhdCBjb2xvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycENyZWF0ZVNwZWMge1xuICByZWFkb25seSBiYWNrZ3JvdW5kOiBTaGFycFJnYkNvbG9yO1xuICByZWFkb25seSBjaGFubmVsczogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgYHNoYXJwYCBlbnRyeSBwb2ludCB0aGUgaW1hZ2UgaGVscGVycyB1c2UuXG4gKi9cbmV4cG9ydCB0eXBlIFNoYXJwRmFjdG9yeSA9IChpbnB1dDogVWludDhBcnJheSkgPT4gU2hhcnBJbnN0YW5jZTtcblxuLyoqXG4gKiBPbmUgYHNoYXJwYCBwaXBlbGluZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycEluc3RhbmNlIHtcbiAgYmx1cjogKHRoaXM6IHZvaWQsIHNpZ21hOiBudW1iZXIpID0+IFNoYXJwSW5zdGFuY2U7XG4gIGNvbXBvc2l0ZTogKHRoaXM6IHZvaWQsIGxheWVyczogU2hhcnBDb21wb3NpdGVMYXllcltdKSA9PiBTaGFycEluc3RhbmNlO1xuICBlbnN1cmVBbHBoYTogKHRoaXM6IHZvaWQpID0+IFNoYXJwSW5zdGFuY2U7XG4gIG1ldGFkYXRhOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxTaGFycE1ldGFkYXRhPjtcbiAgcG5nOiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmF3OiAodGhpczogdm9pZCkgPT4gU2hhcnBJbnN0YW5jZTtcbiAgcmVzaXplOiAodGhpczogdm9pZCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9wdGlvbnM/OiBTaGFycFJlc2l6ZU9wdGlvbnMpID0+IFNoYXJwSW5zdGFuY2U7XG4gIHRvQnVmZmVyOiBTaGFycFRvQnVmZmVyO1xuICB0cmltOiAodGhpczogdm9pZCwgb3B0aW9uczogU2hhcnBUcmltT3B0aW9ucykgPT4gU2hhcnBJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBzaGFycGAncyBtZXRhZGF0YSB0aGUgaW1hZ2UgaGVscGVycyByZWFkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwTWV0YWRhdGEge1xuICByZWFkb25seSBoZWlnaHQ/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHdpZHRoPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBnZW9tZXRyeSByYXcgcGl4ZWxzIGhhdmUgdG8gYmUgcmVhZCB3aXRoIFx1MjAxNCB3aXRob3V0IGl0IHRoZXkgYXJlIGEgZmxhdCBydW4gb2YgYnl0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBSYXdJbmZvIHtcbiAgcmVhZG9ubHkgY2hhbm5lbHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBmcmFtZSdzIHJhdyBwaXhlbHMgYW5kIHRoZSBnZW9tZXRyeSB0aGV5IGhhdmUgdG8gYmUgcmVhZCB3aXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwUmF3UmVzdWx0IHtcbiAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbiAgcmVhZG9ubHkgaW5mbzogU2hhcnBSYXdJbmZvO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYHNoYXJwYCdzIHJlc2l6ZSBvcHRpb25zIHRoZSBpbWFnZSBoZWxwZXJzIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFJlc2l6ZU9wdGlvbnMge1xuICByZWFkb25seSBmaXQ6ICdjb3ZlcicgfCAnZmlsbCc7XG59XG5cbi8qKlxuICogQXNrcyBgdG9CdWZmZXJgIGZvciB0aGUgcGl4ZWxzIEFORCB0aGUgZ2VvbWV0cnkgdGhleSBhcmUgdG8gYmUgcmVhZCB3aXRoLlxuICpcbiAqIExpdGVyYWwgYHRydWVgIHJhdGhlciB0aGFuIGBib29sZWFuYCwgc28gdGhlIG92ZXJsb2FkIHRoYXQgcmV0dXJuc1xuICoge0BsaW5rIFNoYXJwUmF3UmVzdWx0fSBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gdGhlIGdlb21ldHJ5IGlzIGdlbnVpbmVseSBjb21pbmdcbiAqIGJhY2sgXHUyMDE0IGEgYGZhbHNlYCB3b3VsZCByZXNvbHZlIHRvIGJhcmUgYnl0ZXMgd2l0aCB0aGUgd2lkdGggc2lsZW50bHkgbWlzc2luZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaGFycFJlc29sdmVXaXRoT2JqZWN0T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHJlc29sdmVXaXRoT2JqZWN0OiB0cnVlO1xufVxuXG4vKipcbiAqIEEgY29sb3IgYXMgYHNoYXJwYCBuYW1lcyBpdHMgY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBSZ2JDb2xvciB7XG4gIHJlYWRvbmx5IGI6IG51bWJlcjtcbiAgcmVhZG9ubHkgZzogbnVtYmVyO1xuICByZWFkb25seSByOiBudW1iZXI7XG59XG5cbi8qKlxuICogYHNoYXJwYCdzIGB0b0J1ZmZlcmAsIGluIHRoZSB0d28gc2hhcGVzIHRoZSBpbWFnZSBoZWxwZXJzIGNhbGwgaXQgaW4uXG4gKlxuICogV3JpdHRlbiBhcyBhbiBvdmVybG9hZGVkIGNhbGwgc2lnbmF0dXJlIHJhdGhlciB0aGFuIGEgdW5pb24gcmV0dXJuLCBiZWNhdXNlXG4gKiB3aGljaCBvbmUgY29tZXMgYmFjayBpcyBkZWNpZGVkIGJ5IHRoZSBhcmd1bWVudCBhbmQgYSBjYWxsZXIgc2hvdWxkIG5vdCBoYXZlXG4gKiB0byBuYXJyb3cgYSByZXN1bHQgaXQgYWxyZWFkeSBrbm93cyB0aGUgc2hhcGUgb2YuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcnBUb0J1ZmZlciB7XG4gICh0aGlzOiB2b2lkKTogUHJvbWlzZTxCdWZmZXI+O1xuICAodGhpczogdm9pZCwgb3B0aW9uczogU2hhcnBSZXNvbHZlV2l0aE9iamVjdE9wdGlvbnMpOiBQcm9taXNlPFNoYXJwUmF3UmVzdWx0Pjtcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGBzaGFycGAncyB0cmltIG9wdGlvbnMgdGhlIGltYWdlIGhlbHBlcnMgc2V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJwVHJpbU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGZhciBhIHBpeGVsIG1heSBkaWZmZXIgZnJvbSB0aGUgdHJpbW1lZC1hd2F5IGNvbG9yIGJlZm9yZSBpdCBjb3VudHMgYXNcbiAgICogY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZDogbnVtYmVyO1xufVxuXG4vKipcbiAqIExvYWRzIGBzaGFycGAgb24gZGVtYW5kLlxuICpcbiAqIEBwYXJhbSBjYWxsZXIgLSBOYW1lIG9mIHRoZSBjYWxsaW5nIGhlbHBlciwgc28gdGhlIGVycm9yIHNheXMgd2hpY2ggb25lIG5lZWRzIGl0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYHNoYXJwYCBmYWN0b3J5LlxuICogQHRocm93cyBFcnJvciBuYW1pbmcgdGhlIG1pc3Npbmcgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U2hhcnAoY2FsbGVyOiBzdHJpbmcpOiBQcm9taXNlPFNoYXJwRmFjdG9yeT4ge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBgc2hhcnBgIGlzIGFuIE9QVElPTkFMIHBlZXIsIHNvIGl0IG11c3QgYmUgbG9hZGVkIGxhemlseTogYSBzdGF0aWMgaW1wb3J0IHdvdWxkIGRyYWcgaXRzIG5hdGl2ZSBiaW5hcmllcyBpbnRvIGV2ZXJ5IGNvbnN1bWVyIG9mIHRoaXMgcGFja2FnZSdzIGluZGV4LlxuICAgIGNvbnN0IHNoYXJwTW9kdWxlID0gYXdhaXQgaW1wb3J0KCdzaGFycCcpO1xuICAgIGNvbnN0IGZhY3Rvcnk6IHVua25vd24gPSBzaGFycE1vZHVsZS5kZWZhdWx0O1xuICAgIHJldHVybiBmYWN0b3J5IGFzIFNoYXJwRmFjdG9yeTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gUmVhY2hlZCBvbmx5IHdoZW4gdGhlIG9wdGlvbmFsIHBlZXIgaXMgYWJzZW50LCB3aGljaCBpdCBuZXZlciBpcyBpbiB0aGlzIHBhY2thZ2UncyBvd24gdGVzdCBydW4uICovXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y2FsbGVyfSBuZWVkcyB0aGUgb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IFwic2hhcnBcIi4gYFxuICAgICAgICArICdJbnN0YWxsIGl0IGluIHRoZSBjb25zdW1pbmcgcHJvamVjdCAobnBtIGkgLUQgc2hhcnApLicsXG4gICAgICB7IGNhdXNlOiBlcnJvciB9XG4gICAgKTtcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFpSkEsZUFBc0IsWUFBWSxRQUF1QztBQUN2RSxNQUFJO0FBRUYsVUFBTSxjQUFjLE1BQU0sT0FBTyxPQUFPO0FBQ3hDLFVBQU0sVUFBbUIsWUFBWTtBQUNyQyxXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBRXZCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsR0FBRyxNQUFNO0FBQUEsTUFFVCxFQUFFLE9BQU8sTUFBTTtBQUFBLElBQ2pCO0FBQUEsRUFFRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -148,12 +148,25 @@ export declare const DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS = 100;
148
148
  * A bare "the keyboard did not come up" is unreadable — what the reader needs is what the page saw and what
149
149
  * the device thought, side by side, because the two disagreeing is the whole diagnosis. The page's half is
150
150
  * the lift and the two tops it came from, since the lift is the verdict; a lift of zero gets a sentence of
151
- * its own, being the one reading that an already-up keyboard also produces.
151
+ * its own, saying what is left once an already-up keyboard has been ruled out.
152
152
  *
153
153
  * @param params - The evidence gathered before the first touch and after the last one.
154
154
  * @returns The message, ready to throw.
155
155
  */
156
156
  export declare function buildSoftKeyboardDiagnosticMessage(params: BuildSoftKeyboardDiagnosticMessageParams): string;
157
+ /**
158
+ * Decides whether the device reports an IME showing, from `dumpsys input_method`.
159
+ *
160
+ * This is the DEVICE's answer, and it is the one `raiseSoftKeyboard` asks before it measures anything:
161
+ * nothing in the page reports the keyboard, and the geometric proof in {@link checkIsSoftKeyboardUp}
162
+ * cannot see a keyboard that was already up when its baseline was read. It is deliberately NOT the proof
163
+ * that a raise worked — a device reports `mInputShown=true` just as readily for an IME drawn over a field
164
+ * that never moved, which is exactly the unproved frame the geometric delta exists to refuse.
165
+ *
166
+ * @param inputMethodState - The fields {@link parseInputMethodState} returned.
167
+ * @returns Whether the device says an IME is showing.
168
+ */
169
+ export declare function checkIsInputMethodShown(inputMethodState: string): boolean;
157
170
  /**
158
171
  * Decides whether the IME is up, from how far the field moved.
159
172
  *
@@ -167,7 +180,9 @@ export declare function buildSoftKeyboardDiagnosticMessage(params: BuildSoftKeyb
167
180
  * that from a centred modal with no keyboard — both read as "clear of the bottom and not moving" — and of
168
181
  * the two possible wrong answers, a loud `false` is the one worth keeping: it fails a capture rather than
169
182
  * silently returning a screenshot of a keyboard that is not there. Read the baseline with the keyboard
170
- * down, which is what `raiseSoftKeyboard` does.
183
+ * down. `raiseSoftKeyboard` guarantees that itself: it asks the device ({@link checkIsInputMethodShown})
184
+ * and puts a showing keyboard down before it reads the baseline, so every call proves its own lift rather
185
+ * than taking the device's word for one.
171
186
  *
172
187
  * @param params - The geometry before and after the touch, and how far the field must have lifted.
173
188
  * @returns Whether the field lifted far enough to have made room for a keyboard.
@@ -1,5 +1,6 @@
1
1
  const DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS = 100;
2
2
  const INPUT_METHOD_STATE_REG_EXP = /mInputShown|mIsInputViewShown|mHaveConnection|mShowRequested/;
3
+ const INPUT_SHOWN_REG_EXP = /(?:^|[\s|])mInputShown=true(?:$|[\s|])/;
3
4
  const CENTER_DIVISOR = 2;
4
5
  function buildSoftKeyboardDiagnosticMessage(params) {
5
6
  const baselineTop = params.baselineSnapshot.inputRect?.top ?? null;
@@ -9,10 +10,13 @@ function buildSoftKeyboardDiagnosticMessage(params) {
9
10
  `raiseSoftKeyboard: the keyboard did not come up. Device framebuffer written to ${params.screenshotPath}.`,
10
11
  `page: innerHeight=${String(params.snapshot.innerHeight)} baselineInputTop=${formatMeasurement(baselineTop)} inputTop=${formatMeasurement(currentTop)} lift=${formatMeasurement(lift)}`,
11
12
  `device: ${params.inputMethodState || "(no input_method state reported)"}`,
12
- ...lift === 0 ? ["The field did not move at all. If the device says the keyboard is showing, it was already up before the first touch \u2014 this check cannot tell that from a field that never lifts."] : []
13
+ ...lift === 0 ? [buildZeroLiftStatement(params.inputMethodState)] : []
13
14
  ];
14
15
  return lines.join("\n");
15
16
  }
17
+ function checkIsInputMethodShown(inputMethodState) {
18
+ return INPUT_SHOWN_REG_EXP.test(inputMethodState);
19
+ }
16
20
  function checkIsSoftKeyboardUp(params) {
17
21
  const baselineRect = params.baselineSnapshot.inputRect;
18
22
  const { inputRect } = params.snapshot;
@@ -38,14 +42,19 @@ function resolveSoftKeyboardTapPoints(params) {
38
42
  { xInPixels, yInPixels: centerYInPixels }
39
43
  ];
40
44
  }
45
+ function buildZeroLiftStatement(inputMethodState) {
46
+ const cause = checkIsInputMethodShown(inputMethodState) ? "The device says a keyboard is showing now, so the touch raised one and it did not lift this field." : "The device says no keyboard is showing, so the touch raised none.";
47
+ return `The field did not move at all. No keyboard was up when the baseline was read \u2014 raiseSoftKeyboard puts down one the device reports showing before it measures \u2014 so this is not a keyboard left up by an earlier call. ${cause}`;
48
+ }
41
49
  function formatMeasurement(value) {
42
50
  return value === null ? "(no input)" : String(value);
43
51
  }
44
52
  export {
45
53
  DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
46
54
  buildSoftKeyboardDiagnosticMessage,
55
+ checkIsInputMethodShown,
47
56
  checkIsSoftKeyboardUp,
48
57
  parseInputMethodState,
49
58
  resolveSoftKeyboardTapPoints
50
59
  };
51
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgYmVpbmcgdGhlIG9uZSByZWFkaW5nIHRoYXQgYW4gYWxyZWFkeS11cCBrZXlib2FyZCBhbHNvIHByb2R1Y2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gLFxuICAgIC4uLihsaWZ0ID09PSAwID8gWydUaGUgZmllbGQgZGlkIG5vdCBtb3ZlIGF0IGFsbC4gSWYgdGhlIGRldmljZSBzYXlzIHRoZSBrZXlib2FyZCBpcyBzaG93aW5nLCBpdCB3YXMgYWxyZWFkeSB1cCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoIFx1MjAxNCB0aGlzIGNoZWNrIGNhbm5vdCB0ZWxsIHRoYXQgZnJvbSBhIGZpZWxkIHRoYXQgbmV2ZXIgbGlmdHMuJ10gOiBbXSlcbiAgXTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gaG93IGZhciB0aGUgZmllbGQgbW92ZWQuXG4gKlxuICogVGhlIHZlcmRpY3QgaXMgYSAqKmRlbHRhKio6IHRoZSBmaWVsZCBtdXN0IGhhdmUgcmlzZW4gZnJvbSB3aGVyZSBpdCBzYXQgYmVmb3JlIHRoZSB0b3VjaCwgYnkgYXQgbGVhc3RcbiAqIGBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVsc2AuIE9ic2lkaWFuIE1vYmlsZSBsaWZ0cyB3aGF0ZXZlciBpcyBvbiBzY3JlZW4gdG8gbWFrZSByb29tIGZvciB0aGUgSU1FLFxuICogc28gYSBmaWVsZCB0aGF0IGhhcyBub3QgbW92ZWQgaGFzIGhhZCBubyBrZXlib2FyZCBhcnJpdmUgdW5kZXIgaXQgXHUyMDE0IHdoZXRoZXIgaXQgaXMgYSBib3R0b20tYW5jaG9yZWRcbiAqIHN1Z2dlc3RlciBvciBhIGNlbnRyZWQgbW9kYWwuXG4gKlxuICogKipUaGUgb25lIGNhc2UgdGhpcyBnZXRzIHdyb25nLCBkZWxpYmVyYXRlbHk6KiogYSBrZXlib2FyZCB0aGF0IHdhcyAqYWxyZWFkeSogdXAgYmVmb3JlIHRoZSBiYXNlbGluZSB3YXNcbiAqIHJlYWQuIFRoZSBmaWVsZCBoYXMgbm93aGVyZSBsZWZ0IHRvIGxpZnQgdG8sIHNvIHRoZSBhbnN3ZXIgaXMgYGZhbHNlYC4gTm8gYW1vdW50IG9mIGdlb21ldHJ5IHNlcGFyYXRlc1xuICogdGhhdCBmcm9tIGEgY2VudHJlZCBtb2RhbCB3aXRoIG5vIGtleWJvYXJkIFx1MjAxNCBib3RoIHJlYWQgYXMgXCJjbGVhciBvZiB0aGUgYm90dG9tIGFuZCBub3QgbW92aW5nXCIgXHUyMDE0IGFuZCBvZlxuICogdGhlIHR3byBwb3NzaWJsZSB3cm9uZyBhbnN3ZXJzLCBhIGxvdWQgYGZhbHNlYCBpcyB0aGUgb25lIHdvcnRoIGtlZXBpbmc6IGl0IGZhaWxzIGEgY2FwdHVyZSByYXRoZXIgdGhhblxuICogc2lsZW50bHkgcmV0dXJuaW5nIGEgc2NyZWVuc2hvdCBvZiBhIGtleWJvYXJkIHRoYXQgaXMgbm90IHRoZXJlLiBSZWFkIHRoZSBiYXNlbGluZSB3aXRoIHRoZSBrZXlib2FyZFxuICogZG93biwgd2hpY2ggaXMgd2hhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRvZXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICByZXR1cm4gdG9wT2Zmc2V0SW5QaXhlbHMgPT09IDBcbiAgICA/IFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV1cbiAgICA6IFtcbiAgICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICAgIF07XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIG1lYXN1cmVtZW50IGZvciB0aGUgZGlhZ25vc3RpYywgc2F5aW5nIHNvIHJhdGhlciB0aGFuIHByaW50aW5nIGEgbnVtYmVyIHdoZW4gdGhlcmUgd2FzIG5vbmUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lYXN1cmVtZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgZmllbGQgd2FzIG5vdCBvbiBzY3JlZW4gdG8gbWVhc3VyZS5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIgYXMgdGV4dCwgb3IgYChubyBpbnB1dClgLlxuICovXG5mdW5jdGlvbiBmb3JtYXRNZWFzdXJlbWVudCh2YWx1ZTogbnVsbCB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/ICcobm8gaW5wdXQpJyA6IFN0cmluZyh2YWx1ZSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrS08sTUFBTSw0Q0FBNEM7QUFLekQsTUFBTSw2QkFBNkI7QUFLbkMsTUFBTSxpQkFBaUI7QUFhaEIsU0FBUyxtQ0FBbUMsUUFBMEQ7QUFDM0csUUFBTSxjQUFjLE9BQU8saUJBQWlCLFdBQVcsT0FBTztBQUM5RCxRQUFNLGFBQWEsT0FBTyxTQUFTLFdBQVcsT0FBTztBQUNyRCxRQUFNLE9BQU8sZ0JBQWdCLFFBQVEsZUFBZSxPQUFPLE9BQU8sY0FBYztBQUVoRixRQUFNLFFBQVE7QUFBQSxJQUNaLGtGQUFrRixPQUFPLGNBQWM7QUFBQSxJQUN2RyxxQkFBcUIsT0FBTyxPQUFPLFNBQVMsV0FBVyxDQUFDLHFCQUFxQixrQkFBa0IsV0FBVyxDQUFDLGFBQWEsa0JBQWtCLFVBQVUsQ0FBQyxTQUFTLGtCQUFrQixJQUFJLENBQUM7QUFBQSxJQUNyTCxXQUFXLE9BQU8sb0JBQW9CLGtDQUFrQztBQUFBLElBQ3hFLEdBQUksU0FBUyxJQUFJLENBQUMsdUxBQWtMLElBQUksQ0FBQztBQUFBLEVBQzNNO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQW9CTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxTQUFPLHNCQUFzQixJQUN6QixDQUFDLEVBQUUsV0FBVyxXQUFXLGdCQUFnQixDQUFDLElBQzFDO0FBQUEsSUFDQSxFQUFFLFdBQVcsV0FBVyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDNUQsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCO0FBQUEsRUFDMUM7QUFDSjtBQVFBLFNBQVMsa0JBQWtCLE9BQThCO0FBQ3ZELFNBQU8sVUFBVSxPQUFPLGVBQWUsT0FBTyxLQUFLO0FBQ3JEOyIsCiAgIm5hbWVzIjogW10KfQo=
60
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhhdCB0aGUgZmllbGQgKm1vdmVzKiwgd2hpY2ggaXMgd2h5IHRoZSBkZXRlY3Rpb24gaGVyZSBpcyBnZW9tZXRyaWMgcmF0aGVyXG4gKiB0aGFuIGFuIEFQSSBjYWxsLiBUd28gcnVucyBmYWlsZWQgb24gdGhhdCBiZWZvcmUgYSBmcmFtZWJ1ZmZlciBkdW1wIHNhaWQgc28sXG4gKiB3aGljaCBpcyBhbHNvIHdoeSB0aGUgZGlhZ25vc3RpYyBiZWxvdyBleGlzdHMuXG4gKlxuICogKipUaGUgc2lnbmFsIGlzIGEgREVMVEEgYWdhaW5zdCBhIGJhc2VsaW5lIHJlYWQgYmVmb3JlIHRoZSB0b3VjaCwgbm90IHRoZVxuICogZmllbGQncyBhYnNvbHV0ZSBvZmZzZXQgZnJvbSB0aGUgYm90dG9tLioqIFRoZSBhYnNvbHV0ZSBvZmZzZXQgd2FzIHRoZSBvcmlnaW5hbFxuICogdGVzdCBhbmQgaXQgaXMgcmlnaHQgb25seSBmb3IgYSAqKmJvdHRvbS1hbmNob3JlZCoqIGZpZWxkIFx1MjAxNCBhIHN1Z2dlc3RlciwgYVxuICogY29tbWFuZCBwYWxldHRlIFx1MjAxNCB3aGVyZSBcImNsZWFyIG9mIHRoZSBib3R0b21cIiBhbmQgXCJsaWZ0ZWRcIiBhcmUgdGhlIHNhbWVcbiAqIHNlbnRlbmNlLiBGb3IgYSAqKmNlbnRyZWQgbW9kYWwqKiB0aGUgY29uZGl0aW9uIGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vXG4gKiBrZXlib2FyZCBhdCBhbGwsIHNvIHRoZSB0ZXN0IHBhc3NlZCB2YWN1b3VzbHkgYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgcmV0dXJuZWRcbiAqIHN1Y2Nlc3MgaGF2aW5nIGRpc3BhdGNoZWQgbm8gdG91Y2ggKG1lYXN1cmVkIDIwMjYtMDktMTIgYWdhaW5zdCBhIGNlbnRyZWRcbiAqIHByb21wdCBtb2RhbDogdGhlIGZpZWxkJ3MgYHRvcGAgcmVhZCBgMzUyLjQ0NTMxMjVgIGJlZm9yZSBhbmQgYWZ0ZXIgcmVhbCB0YXBzXG4gKiBhbmQgdGhlIGNoZWNrIHNhaWQgdGhlIGtleWJvYXJkIHdhcyB1cCBib3RoIHRpbWVzKS4gQSBkZWx0YSBpcyB0aGUgc2FtZSBwdWJsaWNcbiAqIEFQSSBmb3IgYm90aCBzaGFwZXMsIGFuZCBpdCBjb3N0cyBhIGZpZWxkIHRoYXQgY2Fubm90IG1vdmUgaXRzIHZlcmRpY3QgXHUyMDE0IHNlZVxuICoge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gZm9yIHRoZSBvbmUgY2FzZSB0aGF0IHRyYWRlcyBhd2F5LlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCwgd2hpY2ggaXMgd2hhdCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCAqKmJlZm9yZSoqIHRoZSBmaXJzdCB0b3VjaCwgd2l0aCB0aGUga2V5Ym9hcmQgc3RpbGwgZG93bi5cbiAgICpcbiAgICogUmVxdWlyZWQsIGFuZCBkZWxpYmVyYXRlbHkgbm90IG9wdGlvbmFsOiBhbiBhYnNlbnQgYmFzZWxpbmUgY291bGQgb25seSBtZWFuIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogYWJzb2x1dGUtb2Zmc2V0IHRlc3QsIHdoaWNoIGlzIHRoZSB2YWN1b3VzIHBhc3MgdGhpcyBwYXJhbWV0ZXIgZXhpc3RzIHRvIG1ha2UgdW5yZXByZXNlbnRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZWxpbmVTbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcblxuICAvKipcbiAgICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU31cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgdG8ganVkZ2UsIHJlYWQgYWZ0ZXIgdGhlIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Q7XG59XG5cbi8qKlxuICogQSByZWN0YW5nbGUgYXMgdGhlIHJlbmRlcmVyIHJlcG9ydHMgaXQsIGluIENTUyBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFJlY3Qge1xuICAvKipcbiAgICogVGhlIHJlY3RhbmdsZSdzIGhlaWdodC5cbiAgICovXG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSB2aWV3cG9ydCdzIHRvcCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyB3aWR0aC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcG9pbnQgb24gdGhlIGRldmljZSdzIHNjcmVlbiwgaW4gZGV2aWNlIHBpeGVscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTb2Z0S2V5Ym9hcmRUYXBQb2ludCB7XG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgeEluUGl4ZWxzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXN0YW5jZSBmcm9tIHRoZSBzY3JlZW4ncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHlJblBpeGVsczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gIC8qKlxuICAgKiBUaGUgcmF0aW8gYmV0d2VlbiBDU1MgcGl4ZWxzIGFuZCB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxSYXRpbzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQncyBoZWlnaHQgaW4gQ1NTIHBpeGVscy5cbiAgICpcbiAgICogS2VwdCBmb3IgdGhlIGRpYWdub3N0aWMgYXMgbXVjaCBhcyB0aGUgZGVjaXNpb246IGl0IGRvZXMgKipub3QqKiBzaHJpbmsgd2hlbiB0aGUga2V5Ym9hcmQgY29tZXMgdXAuXG4gICAqL1xuICByZWFkb25seSBpbm5lckhlaWdodDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZmllbGQncyByZWN0LCB3aGljaCBpcyB3aGF0IHNheXMgd2hldGhlciB0aGUga2V5Ym9hcmQgaXMgdXAsIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBvbiBzY3JlZW4uXG4gICAqL1xuICByZWFkb25seSBpbnB1dFJlY3Q6IEVsZW1lbnRSZWN0IHwgbnVsbDtcblxuICAvKipcbiAgICogVGhlIHdpbmRvdydzIG9mZnNldCBmcm9tIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYXMgdGhlIHBhZ2UgdW5kZXJzdGFuZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5ZOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0IGEgcmFpc2VkIGtleWJvYXJkIGxpZnRzIHRoZSBmaWVsZCBieSwgc28gYSBzdHJheSByb3VuZGluZyBwaXhlbCBpcyBub3QgcmVhZCBhcyBvbmUuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSBpdCBpcyB0aGUgbnVtYmVyIGJvdGgge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH0gYW5kIGByYWlzZVNvZnRLZXlib2FyZGAgZGVmYXVsdCB0byxcbiAqIGFuZCBhIHN1aXRlIHRpZ2h0ZW5pbmcgaXQgd2FudHMgdG8gc2F5IHNvIHJlbGF0aXZlIHRvIHRoaXMgcmF0aGVyIHRoYW4gaW4gdGhlIGFic3RyYWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NSU5JTVVNX0tFWUJPQVJEX0hFSUdIVF9JTl9QSVhFTFMgPSAxMDA7XG5cbi8qKlxuICogVGhlIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgZmllbGRzIHRoYXQgc2F5IHdoZXRoZXIgdGhlIElNRSBpcyBhY3R1YWxseSBzaG93aW5nLlxuICovXG5jb25zdCBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUCA9IC9tSW5wdXRTaG93bnxtSXNJbnB1dFZpZXdTaG93bnxtSGF2ZUNvbm5lY3Rpb258bVNob3dSZXF1ZXN0ZWQvO1xuXG4vKipcbiAqIFRoZSBmbGFnIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgc2V0cyB3aGlsZSBhbiBJTUUgaXMgc2hvd2luZywgYXMgYSB3aG9sZSB0b2tlbiBcdTIwMTQgc28gbmVpdGhlciBhIHZhbHVlIHRoYXRcbiAqIG1lcmVseSBzdGFydHMgd2l0aCBgdHJ1ZWAgbm9yIGEgbG9uZ2VyIGZpZWxkIG5hbWUgZW5kaW5nIGluIGBtSW5wdXRTaG93bmAgY2FuIG1hdGNoLlxuICovXG5jb25zdCBJTlBVVF9TSE9XTl9SRUdfRVhQID0gLyg/Ol58W1xcc3xdKW1JbnB1dFNob3duPXRydWUoPzokfFtcXHN8XSkvO1xuXG4vKipcbiAqIEhvdyBtYW55IGVxdWFsIHBhcnRzIHRoZSBmaWVsZCBpcyBzcGxpdCBpbnRvIHRvIGZpbmQgaXRzIGNlbnRyZS5cbiAqL1xuY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBhIGZhaWxlZCByYWlzZSByZXBvcnRzLlxuICpcbiAqIEEgYmFyZSBcInRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXBcIiBpcyB1bnJlYWRhYmxlIFx1MjAxNCB3aGF0IHRoZSByZWFkZXIgbmVlZHMgaXMgd2hhdCB0aGUgcGFnZSBzYXcgYW5kIHdoYXRcbiAqIHRoZSBkZXZpY2UgdGhvdWdodCwgc2lkZSBieSBzaWRlLCBiZWNhdXNlIHRoZSB0d28gZGlzYWdyZWVpbmcgaXMgdGhlIHdob2xlIGRpYWdub3Npcy4gVGhlIHBhZ2UncyBoYWxmIGlzXG4gKiB0aGUgbGlmdCBhbmQgdGhlIHR3byB0b3BzIGl0IGNhbWUgZnJvbSwgc2luY2UgdGhlIGxpZnQgaXMgdGhlIHZlcmRpY3Q7IGEgbGlmdCBvZiB6ZXJvIGdldHMgYSBzZW50ZW5jZSBvZlxuICogaXRzIG93biwgc2F5aW5nIHdoYXQgaXMgbGVmdCBvbmNlIGFuIGFscmVhZHktdXAga2V5Ym9hcmQgaGFzIGJlZW4gcnVsZWQgb3V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZpZGVuY2UgZ2F0aGVyZWQgYmVmb3JlIHRoZSBmaXJzdCB0b3VjaCBhbmQgYWZ0ZXIgdGhlIGxhc3Qgb25lLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UsIHJlYWR5IHRvIHRocm93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZShwYXJhbXM6IEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlbGluZVRvcCA9IHBhcmFtcy5iYXNlbGluZVNuYXBzaG90LmlucHV0UmVjdD8udG9wID8/IG51bGw7XG4gIGNvbnN0IGN1cnJlbnRUb3AgPSBwYXJhbXMuc25hcHNob3QuaW5wdXRSZWN0Py50b3AgPz8gbnVsbDtcbiAgY29uc3QgbGlmdCA9IGJhc2VsaW5lVG9wID09PSBudWxsIHx8IGN1cnJlbnRUb3AgPT09IG51bGwgPyBudWxsIDogYmFzZWxpbmVUb3AgLSBjdXJyZW50VG9wO1xuXG4gIGNvbnN0IGxpbmVzID0gW1xuICAgIGByYWlzZVNvZnRLZXlib2FyZDogdGhlIGtleWJvYXJkIGRpZCBub3QgY29tZSB1cC4gRGV2aWNlIGZyYW1lYnVmZmVyIHdyaXR0ZW4gdG8gJHtwYXJhbXMuc2NyZWVuc2hvdFBhdGh9LmAsXG4gICAgYHBhZ2U6IGlubmVySGVpZ2h0PSR7U3RyaW5nKHBhcmFtcy5zbmFwc2hvdC5pbm5lckhlaWdodCl9IGJhc2VsaW5lSW5wdXRUb3A9JHtmb3JtYXRNZWFzdXJlbWVudChiYXNlbGluZVRvcCl9IGlucHV0VG9wPSR7Zm9ybWF0TWVhc3VyZW1lbnQoY3VycmVudFRvcCl9IGxpZnQ9JHtmb3JtYXRNZWFzdXJlbWVudChsaWZ0KX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gLFxuICAgIC4uLihsaWZ0ID09PSAwID8gW2J1aWxkWmVyb0xpZnRTdGF0ZW1lbnQocGFyYW1zLmlucHV0TWV0aG9kU3RhdGUpXSA6IFtdKVxuICBdO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIGRldmljZSByZXBvcnRzIGFuIElNRSBzaG93aW5nLCBmcm9tIGBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKlxuICogVGhpcyBpcyB0aGUgREVWSUNFJ3MgYW5zd2VyLCBhbmQgaXQgaXMgdGhlIG9uZSBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGFza3MgYmVmb3JlIGl0IG1lYXN1cmVzIGFueXRoaW5nOlxuICogbm90aGluZyBpbiB0aGUgcGFnZSByZXBvcnRzIHRoZSBrZXlib2FyZCwgYW5kIHRoZSBnZW9tZXRyaWMgcHJvb2YgaW4ge0BsaW5rIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcH1cbiAqIGNhbm5vdCBzZWUgYSBrZXlib2FyZCB0aGF0IHdhcyBhbHJlYWR5IHVwIHdoZW4gaXRzIGJhc2VsaW5lIHdhcyByZWFkLiBJdCBpcyBkZWxpYmVyYXRlbHkgTk9UIHRoZSBwcm9vZlxuICogdGhhdCBhIHJhaXNlIHdvcmtlZCBcdTIwMTQgYSBkZXZpY2UgcmVwb3J0cyBgbUlucHV0U2hvd249dHJ1ZWAganVzdCBhcyByZWFkaWx5IGZvciBhbiBJTUUgZHJhd24gb3ZlciBhIGZpZWxkXG4gKiB0aGF0IG5ldmVyIG1vdmVkLCB3aGljaCBpcyBleGFjdGx5IHRoZSB1bnByb3ZlZCBmcmFtZSB0aGUgZ2VvbWV0cmljIGRlbHRhIGV4aXN0cyB0byByZWZ1c2UuXG4gKlxuICogQHBhcmFtIGlucHV0TWV0aG9kU3RhdGUgLSBUaGUgZmllbGRzIHtAbGluayBwYXJzZUlucHV0TWV0aG9kU3RhdGV9IHJldHVybmVkLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZGV2aWNlIHNheXMgYW4gSU1FIGlzIHNob3dpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIElOUFVUX1NIT1dOX1JFR19FWFAudGVzdChpbnB1dE1ldGhvZFN0YXRlKTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIElNRSBpcyB1cCwgZnJvbSBob3cgZmFyIHRoZSBmaWVsZCBtb3ZlZC5cbiAqXG4gKiBUaGUgdmVyZGljdCBpcyBhICoqZGVsdGEqKjogdGhlIGZpZWxkIG11c3QgaGF2ZSByaXNlbiBmcm9tIHdoZXJlIGl0IHNhdCBiZWZvcmUgdGhlIHRvdWNoLCBieSBhdCBsZWFzdFxuICogYG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzYC4gT2JzaWRpYW4gTW9iaWxlIGxpZnRzIHdoYXRldmVyIGlzIG9uIHNjcmVlbiB0byBtYWtlIHJvb20gZm9yIHRoZSBJTUUsXG4gKiBzbyBhIGZpZWxkIHRoYXQgaGFzIG5vdCBtb3ZlZCBoYXMgaGFkIG5vIGtleWJvYXJkIGFycml2ZSB1bmRlciBpdCBcdTIwMTQgd2hldGhlciBpdCBpcyBhIGJvdHRvbS1hbmNob3JlZFxuICogc3VnZ2VzdGVyIG9yIGEgY2VudHJlZCBtb2RhbC5cbiAqXG4gKiAqKlRoZSBvbmUgY2FzZSB0aGlzIGdldHMgd3JvbmcsIGRlbGliZXJhdGVseToqKiBhIGtleWJvYXJkIHRoYXQgd2FzICphbHJlYWR5KiB1cCBiZWZvcmUgdGhlIGJhc2VsaW5lIHdhc1xuICogcmVhZC4gVGhlIGZpZWxkIGhhcyBub3doZXJlIGxlZnQgdG8gbGlmdCB0bywgc28gdGhlIGFuc3dlciBpcyBgZmFsc2VgLiBObyBhbW91bnQgb2YgZ2VvbWV0cnkgc2VwYXJhdGVzXG4gKiB0aGF0IGZyb20gYSBjZW50cmVkIG1vZGFsIHdpdGggbm8ga2V5Ym9hcmQgXHUyMDE0IGJvdGggcmVhZCBhcyBcImNsZWFyIG9mIHRoZSBib3R0b20gYW5kIG5vdCBtb3ZpbmdcIiBcdTIwMTQgYW5kIG9mXG4gKiB0aGUgdHdvIHBvc3NpYmxlIHdyb25nIGFuc3dlcnMsIGEgbG91ZCBgZmFsc2VgIGlzIHRoZSBvbmUgd29ydGgga2VlcGluZzogaXQgZmFpbHMgYSBjYXB0dXJlIHJhdGhlciB0aGFuXG4gKiBzaWxlbnRseSByZXR1cm5pbmcgYSBzY3JlZW5zaG90IG9mIGEga2V5Ym9hcmQgdGhhdCBpcyBub3QgdGhlcmUuIFJlYWQgdGhlIGJhc2VsaW5lIHdpdGggdGhlIGtleWJvYXJkXG4gKiBkb3duLiBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGd1YXJhbnRlZXMgdGhhdCBpdHNlbGY6IGl0IGFza3MgdGhlIGRldmljZSAoe0BsaW5rIGNoZWNrSXNJbnB1dE1ldGhvZFNob3dufSlcbiAqIGFuZCBwdXRzIGEgc2hvd2luZyBrZXlib2FyZCBkb3duIGJlZm9yZSBpdCByZWFkcyB0aGUgYmFzZWxpbmUsIHNvIGV2ZXJ5IGNhbGwgcHJvdmVzIGl0cyBvd24gbGlmdCByYXRoZXJcbiAqIHRoYW4gdGFraW5nIHRoZSBkZXZpY2UncyB3b3JkIGZvciBvbmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0b3VjaCwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBsaWZ0ZWQgZmFyIGVub3VnaCB0byBoYXZlIG1hZGUgcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlbGluZVJlY3QgPSBwYXJhbXMuYmFzZWxpbmVTbmFwc2hvdC5pbnB1dFJlY3Q7XG4gIGNvbnN0IHsgaW5wdXRSZWN0IH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghYmFzZWxpbmVSZWN0IHx8ICFpbnB1dFJlY3QpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtaW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA9IHBhcmFtcy5taW5pbXVtS2V5Ym9hcmRIZWlnaHRJblBpeGVscyA/PyBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMUztcbiAgcmV0dXJuIGJhc2VsaW5lUmVjdC50b3AgLSBpbnB1dFJlY3QudG9wID4gbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM7XG59XG5cbi8qKlxuICogUmVkdWNlcyBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHRvIHRoZSBoYW5kZnVsIG9mIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgc2hvd2luZy5cbiAqXG4gKiBAcGFyYW0gZHVtcHN5c091dHB1dCAtIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGlucHV0X21ldGhvZGAuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJlc3RpbmcgZmllbGRzLCB0cmltbWVkIGFuZCBqb2luZWQsIG9yIGFuIGVtcHR5IHN0cmluZyB3aGVuIG5vbmUgd2VyZSByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZHVtcHN5c091dHB1dFxuICAgIC5zcGxpdCgnXFxuJylcbiAgICAuZmlsdGVyKChsaW5lKSA9PiBJTlBVVF9NRVRIT0RfU1RBVEVfUkVHX0VYUC50ZXN0KGxpbmUpKVxuICAgIC5tYXAoKGxpbmUpID0+IGxpbmUudHJpbSgpKVxuICAgIC5qb2luKCcgfCAnKTtcbn1cblxuLyoqXG4gKiBXb3JrcyBvdXQgd2hlcmUgdG8gdG91Y2gsIGluIHRoZSBkZXZpY2UgcGl4ZWxzIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBzcGVha3MuXG4gKlxuICogVHdvIGNhbmRpZGF0ZXMsIG5vdCBvbmU6IHRoZSBXZWJWaWV3IG1heSBvciBtYXkgbm90IHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwYWdlIGNhbm5vdFxuICogdGVsbCB3aGljaC4gQm90aCBsYW5kIGluc2lkZSB0aGUgZmllbGQgXHUyMDE0IGl0IGlzIHRhbGxlciB0aGFuIHRoZSBvZmZzZXQgXHUyMDE0IHNvIGEgd3JvbmcgZ3Vlc3MgY29zdHMgb25lIHRvdWNoXG4gKiByYXRoZXIgdGhhbiBhIG1pcy10YXAgb24gd2hhdGV2ZXIgc2l0cyBiZWxvdy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdlb21ldHJ5IHRoZSB0YXAgaXMgYWltZWQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBwb2ludHMgdG8gdHJ5LCBpbiBvcmRlciwgb3IgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUgZmllbGQgaXMgbm90IG9uIHNjcmVlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHMocGFyYW1zOiBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zKTogU29mdEtleWJvYXJkVGFwUG9pbnRbXSB7XG4gIGNvbnN0IHsgZGV2aWNlUGl4ZWxSYXRpbywgaW5wdXRSZWN0LCBzY3JlZW5ZIH0gPSBwYXJhbXMuc25hcHNob3Q7XG4gIGlmICghaW5wdXRSZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgeEluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LmxlZnQgKyBpbnB1dFJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgY2VudGVyWUluUGl4ZWxzID0gTWF0aC5yb3VuZCgoaW5wdXRSZWN0LnRvcCArIGlucHV0UmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUikgKiBkZXZpY2VQaXhlbFJhdGlvKTtcbiAgY29uc3QgdG9wT2Zmc2V0SW5QaXhlbHMgPSBNYXRoLnJvdW5kKHNjcmVlblkgKiBkZXZpY2VQaXhlbFJhdGlvKTtcblxuICByZXR1cm4gdG9wT2Zmc2V0SW5QaXhlbHMgPT09IDBcbiAgICA/IFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV1cbiAgICA6IFtcbiAgICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgICB7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfVxuICAgIF07XG59XG5cbi8qKlxuICogU2F5cyB3aGF0IGEgbGlmdCBvZiB6ZXJvIG1lYW5zLCBub3cgdGhhdCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIHB1dHMgZG93biBhbnkga2V5Ym9hcmQgYWxyZWFkeSBzaG93aW5nXG4gKiBiZWZvcmUgaXQgcmVhZHMgaXRzIGJhc2VsaW5lLlxuICpcbiAqIEl0IHVzZWQgdG8gYmUgYSBoaW50IFx1MjAxNCBcImlmIHRoZSBkZXZpY2Ugc2F5cyB0aGUga2V5Ym9hcmQgaXMgc2hvd2luZywgaXQgd2FzIGFscmVhZHkgdXBcIiBcdTIwMTQgcHJpbnRlZCB1bmRlciBhblxuICogZXJyb3Igd2hvc2Ugb3duIGRldmljZSBsaW5lIG9mdGVuIHNhaWQgZXhhY3RseSB0aGF0LiBUaGUgaGVscGVyIGhhcyBzaW5jZSB0YWtlbiB0aGF0IGNhdXNlIGF3YXksIHNvIHRoZVxuICogc2VudGVuY2Ugc3RhdGVzIHdoYXQgaXMgbGVmdCByYXRoZXIgdGhhbiBndWVzc2luZyBhdCB3aGF0IG1pZ2h0IGJlLlxuICpcbiAqIEBwYXJhbSBpbnB1dE1ldGhvZFN0YXRlIC0gVGhlIGZpZWxkcyB7QGxpbmsgcGFyc2VJbnB1dE1ldGhvZFN0YXRlfSByZXR1cm5lZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIFRoZSBzdGF0ZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkWmVyb0xpZnRTdGF0ZW1lbnQoaW5wdXRNZXRob2RTdGF0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY2F1c2UgPSBjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKVxuICAgID8gJ1RoZSBkZXZpY2Ugc2F5cyBhIGtleWJvYXJkIGlzIHNob3dpbmcgbm93LCBzbyB0aGUgdG91Y2ggcmFpc2VkIG9uZSBhbmQgaXQgZGlkIG5vdCBsaWZ0IHRoaXMgZmllbGQuJ1xuICAgIDogJ1RoZSBkZXZpY2Ugc2F5cyBubyBrZXlib2FyZCBpcyBzaG93aW5nLCBzbyB0aGUgdG91Y2ggcmFpc2VkIG5vbmUuJztcblxuICByZXR1cm4gJ1RoZSBmaWVsZCBkaWQgbm90IG1vdmUgYXQgYWxsLiBObyBrZXlib2FyZCB3YXMgdXAgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHJlYWQgXHUyMDE0IHJhaXNlU29mdEtleWJvYXJkIHB1dHMgZG93biAnXG4gICAgKyBgb25lIHRoZSBkZXZpY2UgcmVwb3J0cyBzaG93aW5nIGJlZm9yZSBpdCBtZWFzdXJlcyBcdTIwMTQgc28gdGhpcyBpcyBub3QgYSBrZXlib2FyZCBsZWZ0IHVwIGJ5IGFuIGVhcmxpZXIgY2FsbC4gJHtjYXVzZX1gO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBtZWFzdXJlbWVudCBmb3IgdGhlIGRpYWdub3N0aWMsIHNheWluZyBzbyByYXRoZXIgdGhhbiBwcmludGluZyBhIG51bWJlciB3aGVuIHRoZXJlIHdhcyBub25lLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtZWFzdXJlbWVudCwgb3IgYG51bGxgIHdoZW4gdGhlIGZpZWxkIHdhcyBub3Qgb24gc2NyZWVuIHRvIG1lYXN1cmUuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyIGFzIHRleHQsIG9yIGAobm8gaW5wdXQpYC5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0TWVhc3VyZW1lbnQodmFsdWU6IG51bGwgfCBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyAnKG5vIGlucHV0KScgOiBTdHJpbmcodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBa0tPLE1BQU0sNENBQTRDO0FBS3pELE1BQU0sNkJBQTZCO0FBTW5DLE1BQU0sc0JBQXNCO0FBSzVCLE1BQU0saUJBQWlCO0FBYWhCLFNBQVMsbUNBQW1DLFFBQTBEO0FBQzNHLFFBQU0sY0FBYyxPQUFPLGlCQUFpQixXQUFXLE9BQU87QUFDOUQsUUFBTSxhQUFhLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFDckQsUUFBTSxPQUFPLGdCQUFnQixRQUFRLGVBQWUsT0FBTyxPQUFPLGNBQWM7QUFFaEYsUUFBTSxRQUFRO0FBQUEsSUFDWixrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxxQkFBcUIsa0JBQWtCLFdBQVcsQ0FBQyxhQUFhLGtCQUFrQixVQUFVLENBQUMsU0FBUyxrQkFBa0IsSUFBSSxDQUFDO0FBQUEsSUFDckwsV0FBVyxPQUFPLG9CQUFvQixrQ0FBa0M7QUFBQSxJQUN4RSxHQUFJLFNBQVMsSUFBSSxDQUFDLHVCQUF1QixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQztBQUFBLEVBQ3hFO0FBRUEsU0FBTyxNQUFNLEtBQUssSUFBSTtBQUN4QjtBQWNPLFNBQVMsd0JBQXdCLGtCQUFtQztBQUN6RSxTQUFPLG9CQUFvQixLQUFLLGdCQUFnQjtBQUNsRDtBQXNCTyxTQUFTLHNCQUFzQixRQUE4QztBQUNsRixRQUFNLGVBQWUsT0FBTyxpQkFBaUI7QUFDN0MsUUFBTSxFQUFFLFVBQVUsSUFBSSxPQUFPO0FBQzdCLE1BQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxhQUFhLE1BQU0sVUFBVSxNQUFNO0FBQzVDO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxTQUFPLHNCQUFzQixJQUN6QixDQUFDLEVBQUUsV0FBVyxXQUFXLGdCQUFnQixDQUFDLElBQzFDO0FBQUEsSUFDQSxFQUFFLFdBQVcsV0FBVyxrQkFBa0Isa0JBQWtCO0FBQUEsSUFDNUQsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCO0FBQUEsRUFDMUM7QUFDSjtBQWFBLFNBQVMsdUJBQXVCLGtCQUFrQztBQUNoRSxRQUFNLFFBQVEsd0JBQXdCLGdCQUFnQixJQUNsRCx1R0FDQTtBQUVKLFNBQU8sa09BQzBHLEtBQUs7QUFDeEg7QUFRQSxTQUFTLGtCQUFrQixPQUE4QjtBQUN2RCxTQUFPLFVBQVUsT0FBTyxlQUFlLE9BQU8sS0FBSztBQUNyRDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -22,6 +22,30 @@
22
22
  * unrepresentable rather than merely corrected: the delta of the baseline
23
23
  * against itself is zero, so the first iteration always taps.
24
24
  *
25
+ * **A keyboard ALREADY up is put down first**, because a delta cannot see
26
+ * one: the field has already lifted, so it reads as a field that never moved.
27
+ * That was every frame after the first of a suite that takes several — the
28
+ * keyboard left up by one frame, or brought back by Obsidian focusing the
29
+ * next modal's field, made the next baseline already-lifted (measured
30
+ * 2026-09-20: frames 2-5 each failed `lift=0` beside `mInputShown=true`,
31
+ * each framebuffer showing a correctly lifted field under a fully drawn
32
+ * keyboard). The alternative was to accept `lift=0` whenever the device says
33
+ * a keyboard is showing, and it was refused: that is a frame the helper did
34
+ * not prove, which is the vacuous pass the delta was introduced to end,
35
+ * re-opened by a different door. So the device is asked, a showing IME is
36
+ * retracted with `KEYCODE_BACK`, and the lift is proved as before. It has to
37
+ * happen HERE, not after the previous capture: lowering it there was tried,
38
+ * and the IME came back on its own before the next baseline was read.
39
+ *
40
+ * 4. **That touch draws a selection handle when it lands inside TEXT**, and a
41
+ * device capture photographs it. Chromium shows the insertion handle on a tap
42
+ * into text and none on a tap into an EMPTY editable, and a value written by
43
+ * script raises none at all — so the field is emptied for the touch and its
44
+ * text written back afterwards. `obsidian-link-picker` shipped a teal handle
45
+ * in a store listing image twice before anyone worked out where it came from,
46
+ * and nothing in this module's own documentation of the touch hinted at it.
47
+ * See `shouldEmptyFieldForTouch`.
48
+ *
25
49
  * The geometry that decides whether it worked is unit-tested in
26
50
  * `soft-keyboard-geometry`; everything here drives a real device, so the whole
27
51
  * module is integration-time code.
@@ -52,6 +76,25 @@ export interface RaiseSoftKeyboardParams {
52
76
  * When omitted, `DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS` from `soft-keyboard-geometry` applies.
53
77
  */
54
78
  readonly minimumKeyboardHeightInPixels?: number;
79
+ /**
80
+ * Whether to empty the field before the touch, and write its text back afterwards.
81
+ *
82
+ * **On by default, because the touch that raises the keyboard also draws a selection handle when it
83
+ * lands inside TEXT.** Chromium shows the insertion handle on a tap into text and draws none on a tap
84
+ * into an EMPTY editable, and a device capture photographs it — which is how `obsidian-link-picker`
85
+ * shipped a teal handle in a store listing image twice before anyone understood where it came from. A
86
+ * value written by script raises no handle, so emptying the field, touching it, and writing the text
87
+ * back leaves the frame showing the same query with nothing hanging off it.
88
+ *
89
+ * Only an `<input>` or a `<textarea>` is emptied. A `contenteditable` holding text is REFUSED rather
90
+ * than written to: its content usually belongs to an editor that owns its own DOM, and blanking that
91
+ * by hand destroys it. Empty such a field yourself, or turn this off.
92
+ *
93
+ * Turning it off restores the pre-2026-09-23 behaviour exactly: the field is touched as it stands.
94
+ *
95
+ * @default true
96
+ */
97
+ readonly shouldEmptyFieldForTouch?: boolean;
55
98
  /**
56
99
  * The vault to read the geometry from. When omitted, the current test context's vault is used.
57
100
  */
@@ -76,15 +119,31 @@ export interface TapDeviceParams {
76
119
  * Call it inside `withSoftKeyboardEnabled` — the device setting alone does not raise the keyboard, and this
77
120
  * touch alone cannot while the setting suppresses it.
78
121
  *
79
- * **Call it with the keyboard DOWN.** The first read is the baseline every later read is compared against,
80
- * so a keyboard that is already up leaves the field nothing to lift by and this throws. That is the
81
- * deliberate trade for working on a centred modal as well as a bottom-anchored one — see
82
- * {@link checkIsSoftKeyboardUp}.
122
+ * **A keyboard that is already up is put DOWN first.** The first geometry read is the baseline every later
123
+ * read is compared against, so a keyboard already up would leave the field nothing to lift by and read as
124
+ * one that never came. The device is asked before anything else, and a showing IME is retracted with
125
+ * `KEYCODE_BACK` — asked FIRST because, with no IME showing, that key reaches the app and closes the very
126
+ * modal the frame is about to photograph. So the helper is safe to call once per frame of a multi-frame
127
+ * suite, and every call still proves its own lift. The other answer — accepting a zero lift whenever the
128
+ * device reports a keyboard — was refused, because it accepts a frame the helper did not prove.
129
+ *
130
+ * **The field is EMPTIED for the touch and written back afterwards**, because a touch that lands inside
131
+ * text draws Chromium's selection handle and the framebuffer photographs it — see
132
+ * {@link RaiseSoftKeyboardParams.shouldEmptyFieldForTouch}, which turns that off.
133
+ *
134
+ * **The geometry returned is read with the field still empty**, and the text is written back after it.
135
+ * That is the state the proven capture suites assert against, and it is deliberate rather than
136
+ * incidental: the baseline is read AFTER the field is emptied, so the lift is measured between two reads
137
+ * of the same field content. A field whose own text changes the layout around it — a suggester whose row
138
+ * count answers the query — moves when it is cleared, and a delta measured across that move is not a
139
+ * keyboard. Read the geometry again yourself if the restored text moves anything you are about to assert
140
+ * on.
83
141
  *
84
142
  * @param params - The device, the field to touch, and how far it must lift.
85
143
  * @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
86
- * @throws Error if the field never matched, or if it never lifted, the latter after writing the device
87
- * framebuffer and the device's own `input_method` state to the diagnostics directory.
144
+ * @throws Error if a keyboard already up would not go down, if the field never matched, if it holds text
145
+ * this cannot empty and put back, or if it never lifted — the last after writing the device framebuffer
146
+ * and the device's own `input_method` state to the diagnostics directory.
88
147
  */
89
148
  export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
90
149
  /**