obsidian-integration-testing 15.0.0 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) 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/host-process-query-verdict.cjs +103 -0
  16. package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
  17. package/dist/lib/cjs/index.cjs +14 -1
  18. package/dist/lib/cjs/index.d.cts +3 -1
  19. package/dist/lib/cjs/label-screenshot.cjs +2 -2
  20. package/dist/lib/cjs/launched-device-selection.cjs +46 -0
  21. package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
  22. package/dist/lib/cjs/library.cjs +1 -1
  23. package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
  24. package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
  25. package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
  26. package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
  27. package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
  28. package/dist/lib/cjs/sharp-loader.cjs +1 -1
  29. package/dist/lib/cjs/sharp-loader.d.cts +67 -2
  30. package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
  31. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
  32. package/dist/lib/cjs/soft-keyboard.cjs +130 -28
  33. package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
  34. package/dist/lib/cjs/transport-appium.cjs +74 -4
  35. package/dist/lib/cjs/transport-appium.d.cts +49 -2
  36. package/dist/lib/cjs/transport-factory.cjs +162 -42
  37. package/dist/lib/esm/adb.d.mts +10 -0
  38. package/dist/lib/esm/adb.mjs +2 -2
  39. package/dist/lib/esm/avd-name-channel.d.mts +152 -0
  40. package/dist/lib/esm/avd-name-channel.mjs +45 -0
  41. package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
  42. package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
  43. package/dist/lib/esm/device-screenshot.d.mts +3 -1
  44. package/dist/lib/esm/device-screenshot.mjs +1 -1
  45. package/dist/lib/esm/emulator-backend.d.mts +81 -0
  46. package/dist/lib/esm/emulator-backend.mjs +19 -1
  47. package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
  48. package/dist/lib/esm/emulator-reclaim.mjs +84 -36
  49. package/dist/lib/esm/enable-plugin.d.mts +3 -1
  50. package/dist/lib/esm/enable-plugin.mjs +17 -8
  51. package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
  52. package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
  53. package/dist/lib/esm/index.d.mts +3 -1
  54. package/dist/lib/esm/index.mjs +15 -1
  55. package/dist/lib/esm/label-screenshot.mjs +2 -2
  56. package/dist/lib/esm/launched-device-selection.d.mts +112 -0
  57. package/dist/lib/esm/launched-device-selection.mjs +21 -0
  58. package/dist/lib/esm/library.mjs +1 -1
  59. package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
  60. package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
  61. package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
  62. package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
  63. package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
  64. package/dist/lib/esm/sharp-loader.d.mts +67 -2
  65. package/dist/lib/esm/sharp-loader.mjs +1 -1
  66. package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
  67. package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
  68. package/dist/lib/esm/soft-keyboard.d.mts +65 -6
  69. package/dist/lib/esm/soft-keyboard.mjs +131 -28
  70. package/dist/lib/esm/transport-appium.d.mts +49 -2
  71. package/dist/lib/esm/transport-appium.mjs +74 -4
  72. package/dist/lib/esm/transport-factory.mjs +176 -44
  73. package/package.json +1 -1
@@ -0,0 +1,161 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure classification of the port-owner query — `netstat -ano` on Windows,
5
+ * `lsof -ti tcp:<port>` elsewhere — deciding, from how it ended, whether it
6
+ * **answered** or **failed**, and saying which failure in one line.
7
+ *
8
+ * The query is the only real escalation the Appium teardown has: the PID the
9
+ * harness holds is the `shell: true` wrapper it spawned, so what survives a kill
10
+ * is found by asking who still listens on the port (**L46**). It used to resolve
11
+ * an empty list for every error, which made three different endings one silent
12
+ * value:
13
+ *
14
+ * - `lsof` exiting 1 with nothing on either stream — which is how it says
15
+ * nothing holds the port*, a legitimate empty answer;
16
+ * - the budget running out on a contended host;
17
+ * - the child dying.
18
+ *
19
+ * Only the first is an answer. The other two disarm the escalation exactly the
20
+ * way a silently failed process listing disarmed the emulator's
21
+ * (`host-process-query-verdict.ts`), so they are classified by the same rules
22
+ * and reported, not swallowed.
23
+ *
24
+ * **Why a module of its own rather than an option on the process-listing
25
+ * verdict.** The two queries disagree in two places, not one. Zero owners is a
26
+ * legitimate answer here, so `zero-rows` never applies; and `lsof`'s silent exit
27
+ * 1 means *nothing listens*, where for `tasklist` a silent non-zero exit is a
28
+ * crash. The failure branches themselves are delegated to
29
+ * {@link resolveHostQueryFailure}, so there is still one definition of
30
+ * `crashed`, `timed-out` and `refused`.
31
+ */
32
+ import type { HostQueryFailure } from './host-process-query-verdict.mjs';
33
+ /**
34
+ * Parameters for {@link buildPortOwnerQueryMessage}.
35
+ */
36
+ export interface BuildPortOwnerQueryMessageParams {
37
+ /**
38
+ The command that was run, for the reader to try by hand — e.g. `netstat -ano`.
39
+ */
40
+ readonly command: string;
41
+ /**
42
+ How long the call took before it ended, in milliseconds.
43
+ */
44
+ readonly elapsedInMilliseconds: number;
45
+ /**
46
+ The child's exit code, when it exited rather than failing to start or being killed.
47
+ */
48
+ readonly exitCode: null | number;
49
+ /**
50
+ The verdict from {@link resolvePortOwnerQueryOutcome}.
51
+ */
52
+ readonly outcome: PortOwnerQueryOutcome;
53
+ /**
54
+ The port whose owners were asked for.
55
+ */
56
+ readonly port: number;
57
+ /**
58
+ The signal the child was killed with, when it was killed.
59
+ */
60
+ readonly signal: null | string;
61
+ /**
62
+ Whatever the child wrote to stderr.
63
+ */
64
+ readonly standardError: string;
65
+ /**
66
+ The budget the call was given, in milliseconds.
67
+ */
68
+ readonly timeoutInMilliseconds: number;
69
+ }
70
+ /**
71
+ * The fields {@link normalizeSyncExecError} extracts from an `execFileSync` throw.
72
+ */
73
+ export interface NormalizedSyncExecError {
74
+ /**
75
+ The error code in `execFile`'s vocabulary: the numeric exit code, or a string such as `ENOENT` or `ERR_CHILD_PROCESS_STDIO_MAXBUFFER`.
76
+ */
77
+ readonly errorCode: null | number | string;
78
+ /**
79
+ The child's exit code, when it exited.
80
+ */
81
+ readonly exitCode: null | number;
82
+ /**
83
+ Whether the budget expired and the child was killed.
84
+ */
85
+ readonly isKilled: boolean;
86
+ /**
87
+ The signal the child was killed with.
88
+ */
89
+ readonly signal: null | string;
90
+ /**
91
+ Whatever the child wrote to stderr.
92
+ */
93
+ readonly standardError: string;
94
+ /**
95
+ Whatever the child wrote to stdout before it ended.
96
+ */
97
+ readonly standardOutput: string;
98
+ }
99
+ /**
100
+ * How the port-owner query ended.
101
+ *
102
+ * `answered` covers both a listener found and none found — the query succeeded
103
+ * either way. The rest are {@link resolveHostQueryFailure}'s failures.
104
+ */
105
+ export type PortOwnerQueryOutcome = 'answered' | HostQueryFailure;
106
+ /**
107
+ * Parameters for {@link resolvePortOwnerQueryOutcome}.
108
+ */
109
+ export interface ResolvePortOwnerQueryOutcomeParams {
110
+ /**
111
+ `execFile`'s `error.code`: the numeric exit code, or a string like `ENOENT` when the child never ran.
112
+ */
113
+ readonly errorCode: null | number | string;
114
+ /**
115
+ Whether `execFile` reported an error at all.
116
+ */
117
+ readonly hasFailed: boolean;
118
+ /**
119
+ `execFile`'s `error.killed`: whether the budget expired and the child was killed.
120
+ */
121
+ readonly isKilled: boolean;
122
+ /**
123
+ The host platform, which decides whether a silent exit 1 is `lsof` saying *nothing listens*.
124
+ */
125
+ readonly platform: NodeJS.Platform;
126
+ /**
127
+ Whatever the child wrote to stderr.
128
+ */
129
+ readonly standardError: string;
130
+ /**
131
+ Whatever the child wrote to stdout.
132
+ */
133
+ readonly standardOutput: string;
134
+ }
135
+ /**
136
+ * Builds the single line the query logs for an outcome.
137
+ *
138
+ * @param params - The outcome plus the command, the port, the budget and what the child left behind.
139
+ * @returns The warning to log, or `undefined` when the query answered.
140
+ */
141
+ export declare function buildPortOwnerQueryMessage(params: BuildPortOwnerQueryMessageParams): string | undefined;
142
+ /**
143
+ * Extracts what an `execFileSync` throw carries, in `execFile`'s vocabulary.
144
+ *
145
+ * The synchronous API reports the same endings with different fields: an
146
+ * expired budget is `code: 'ETIMEDOUT'` rather than `killed: true`, an overrun
147
+ * buffer is `ENOBUFS`, and the exit code is `status` rather than `code`.
148
+ * Normalizing here lets the sync teardown classify with the same verdict as the
149
+ * async one.
150
+ *
151
+ * @param error - Whatever `execFileSync` threw.
152
+ * @returns The normalized fields; an unrecognizable throw reads as a crash with no evidence.
153
+ */
154
+ export declare function normalizeSyncExecError(error: unknown): NormalizedSyncExecError;
155
+ /**
156
+ * Decides how the port-owner query ended.
157
+ *
158
+ * @param params - What `execFile` reported, and the platform it ran on.
159
+ * @returns The outcome.
160
+ */
161
+ export declare function resolvePortOwnerQueryOutcome(params: ResolvePortOwnerQueryOutcomeParams): PortOwnerQueryOutcome;
@@ -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