obsidian-integration-testing 12.1.0 → 12.1.2

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 (51) hide show
  1. package/dist/lib/cjs/adb.cjs +61 -0
  2. package/dist/lib/cjs/adb.d.cts +61 -0
  3. package/dist/lib/cjs/device-screenshot.cjs +42 -0
  4. package/dist/lib/cjs/device-screenshot.d.cts +36 -0
  5. package/dist/lib/cjs/device-setting-restore.cjs +45 -0
  6. package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
  7. package/dist/lib/cjs/device-settings-command.cjs +49 -0
  8. package/dist/lib/cjs/device-settings-command.d.cts +76 -0
  9. package/dist/lib/cjs/device-settings.cjs +88 -0
  10. package/dist/lib/cjs/device-settings.d.cts +94 -0
  11. package/dist/lib/cjs/emulator-device-id.cjs +32 -0
  12. package/dist/lib/cjs/emulator-device-id.d.cts +49 -0
  13. package/dist/lib/cjs/index.cjs +56 -3
  14. package/dist/lib/cjs/index.d.cts +18 -0
  15. package/dist/lib/cjs/library.cjs +1 -1
  16. package/dist/lib/cjs/mobile-input.cjs +14 -1
  17. package/dist/lib/cjs/mobile-input.d.cts +30 -0
  18. package/dist/lib/cjs/namespace-bootstrap.cjs +9 -1
  19. package/dist/lib/cjs/resolve-emulator-device-id.cjs +54 -0
  20. package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -0
  21. package/dist/lib/cjs/soft-keyboard-geometry.cjs +75 -0
  22. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
  23. package/dist/lib/cjs/soft-keyboard.cjs +118 -0
  24. package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
  25. package/dist/lib/cjs/transport-appium.cjs +5 -1
  26. package/dist/lib/esm/adb.d.mts +61 -0
  27. package/dist/lib/esm/adb.mjs +35 -0
  28. package/dist/lib/esm/device-screenshot.d.mts +36 -0
  29. package/dist/lib/esm/device-screenshot.mjs +18 -0
  30. package/dist/lib/esm/device-setting-restore.d.mts +60 -0
  31. package/dist/lib/esm/device-setting-restore.mjs +20 -0
  32. package/dist/lib/esm/device-settings-command.d.mts +76 -0
  33. package/dist/lib/esm/device-settings-command.mjs +23 -0
  34. package/dist/lib/esm/device-settings.d.mts +94 -0
  35. package/dist/lib/esm/device-settings.mjs +67 -0
  36. package/dist/lib/esm/emulator-device-id.d.mts +49 -0
  37. package/dist/lib/esm/emulator-device-id.mjs +8 -0
  38. package/dist/lib/esm/index.d.mts +18 -0
  39. package/dist/lib/esm/index.mjs +58 -2
  40. package/dist/lib/esm/library.mjs +1 -1
  41. package/dist/lib/esm/mobile-input.d.mts +30 -0
  42. package/dist/lib/esm/mobile-input.mjs +12 -1
  43. package/dist/lib/esm/namespace-bootstrap.mjs +9 -1
  44. package/dist/lib/esm/resolve-emulator-device-id.d.mts +28 -0
  45. package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -0
  46. package/dist/lib/esm/soft-keyboard-geometry.d.mts +156 -0
  47. package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
  48. package/dist/lib/esm/soft-keyboard.d.mts +82 -0
  49. package/dist/lib/esm/soft-keyboard.mjs +91 -0
  50. package/dist/lib/esm/transport-appium.mjs +7 -1
  51. package/package.json +4 -3
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var adb_exports = {};
20
+ __export(adb_exports, {
21
+ runAdbBinary: () => runAdbBinary,
22
+ runAdbText: () => runAdbText,
23
+ runAdbTextWithoutDevice: () => runAdbTextWithoutDevice
24
+ });
25
+ module.exports = __toCommonJS(adb_exports);
26
+ var import_node_child_process = require("node:child_process");
27
+ const OUTPUT_MAX_BUFFER_IN_BYTES = 67108864;
28
+ async function runAdbBinary(params) {
29
+ const commandArguments = ["-s", params.deviceId, ...params.commandArguments];
30
+ return await new Promise((resolve, reject) => {
31
+ (0, import_node_child_process.execFile)("adb", commandArguments, { encoding: "buffer", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES }, (error, stdout) => {
32
+ if (error) {
33
+ reject(new Error(`Failed to run 'adb ${commandArguments.join(" ")}': ${error.message}. Is ADB installed and in PATH?`));
34
+ return;
35
+ }
36
+ resolve(stdout);
37
+ });
38
+ });
39
+ }
40
+ async function runAdbText(params) {
41
+ const stdout = await runAdbBinary(params);
42
+ return new TextDecoder().decode(stdout).trim();
43
+ }
44
+ async function runAdbTextWithoutDevice(commandArguments) {
45
+ return await new Promise((resolve, reject) => {
46
+ (0, import_node_child_process.execFile)("adb", [...commandArguments], { encoding: "utf-8", maxBuffer: OUTPUT_MAX_BUFFER_IN_BYTES }, (error, stdout) => {
47
+ if (error) {
48
+ reject(new Error(`Failed to run 'adb ${commandArguments.join(" ")}': ${error.message}. Is ADB installed and in PATH?`));
49
+ return;
50
+ }
51
+ resolve(stdout.trim());
52
+ });
53
+ });
54
+ }
55
+ // Annotate the CommonJS export names for ESM import in node:
56
+ 0 && (module.exports = {
57
+ runAdbBinary,
58
+ runAdbText,
59
+ runAdbTextWithoutDevice
60
+ });
61
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FkYi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJ1bnMgYGFkYmAgYW5kIGhhbmRzIGJhY2sgd2hhdCBpdCBwcmludGVkIFx1MjAxNCBhcyB0ZXh0LCBvciBhcyByYXcgYnl0ZXMuXG4gKlxuICogVGhlIGhhcm5lc3MgYWxyZWFkeSBzaGVsbHMgb3V0IHRvIGBhZGJgIGluIGhhbGYgYSBkb3plbiBwbGFjZXMgaW5zaWRlXG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIC8gYHRyYW5zcG9ydC1hcHBpdW1gLCBidXQgYWx3YXlzIHRocm91Z2ggYGV4ZWNgLCB3aGljaFxuICogZGVjb2RlcyBzdGRvdXQgYXMgVVRGLTguIFRoYXQgaXMgZmluZSBmb3IgYGRldmljZXNgIGFuZCBgc2V0dGluZ3MgZ2V0YCBhbmRcbiAqIGZhdGFsbHkgd3JvbmcgZm9yIGBleGVjLW91dCBzY3JlZW5jYXAgLXBgLCB3aG9zZSBzdGRvdXQgaXMgYSBQTkc6IGRlY29kaW5nIGl0XG4gKiBhcyB0ZXh0IGNvcnJ1cHRzIGV2ZXJ5IGJ5dGUgYWJvdmUgMHg3Ri4gSGVuY2UgdGhlIHR3byBydW5uZXJzIGhlcmUgXHUyMDE0IHRoZSBzYW1lXG4gKiBjb21tYW5kIHNoYXBlLCBkaWZmZXJpbmcgb25seSBpbiB3aGV0aGVyIHRoZSBvdXRwdXQgaXMgZGVjb2RlZC5cbiAqXG4gKiBUaGVzZSBhcmUgdGhlIHByb2Nlc3MgbGF5ZXIgZm9yIHRoZSBkZXZpY2UtZmFjaW5nIGhlbHBlcnMgYSBjYXB0dXJlIHN1aXRlXG4gKiB1c2VzIChgZGV2aWNlLXNjcmVlbnNob3RgLCBgZGV2aWNlLXNldHRpbmdzYCwgYHNvZnQta2V5Ym9hcmRgKTsgdGhleSBhcmUgbm90IGFcbiAqIGdlbmVyYWwtcHVycG9zZSBhZGIgd3JhcHBlciBhbmQgZGVsaWJlcmF0ZWx5IGRvIG5vdCB0cnkgdG8gYmVjb21lIG9uZS5cbiAqXG4gKiBFdmVyeSBmdW5jdGlvbiBoZXJlIHNoZWxscyBvdXQsIHNvIHRoZSB3aG9sZSBtb2R1bGUgaXMgaW50ZWdyYXRpb24tdGltZSBjb2RlLlxuICogVGhhdCBpcyBhbHNvIHdoeSB0aGUgcGFyc2luZyBhbmQgZ2VvbWV0cnkgdGhlc2UgaGVscGVycyBkZXBlbmQgb24gbGl2ZSBpblxuICogdGhlaXIgb3duIG1vZHVsZXMgXHUyMDE0IHRoZSBzYW1lIHNwbGl0IGBhZGItZGV2aWNlLWxpc3RgIGFscmVhZHkgaGFzIGZyb20gdGhlXG4gKiB0cmFuc3BvcnQgZmFjdG9yeSwgc28gYSBzb3J0IHJ1bGUgY2FuIG5ldmVyIG1vdmUgYSB1bml0LXRlc3RlZCBmdW5jdGlvblxuICogaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jay5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChzaGVsbHMgb3V0IHRvIGEgcmVhbCBkZXZpY2UpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bkFkYkJpbmFyeX0gYW5kIHtAbGluayBydW5BZGJUZXh0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5BZGJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIGFmdGVyIGAtcyA8ZGV2aWNlSWQ+YCwgZS5nLiBgWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCAnMTAnLCAnMjAnXWAuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLCBhcyBgYWRiIGRldmljZXNgIGxpc3RzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNjcmVlbmNhcCBvZiBhIDkwMHgxNjAwIGRldmljZSBydW5zIHRvIGFib3V0IDEwMCBLQiwgYnV0IGEgdGFibGV0IEFWRCdzIGZyYW1lYnVmZmVyIGlzIHNldmVyYWwgTUIgYW5kXG4gKiB0aGUgZGVmYXVsdCAxIE1pQiBgbWF4QnVmZmVyYCBmYWlscyB0aGUgY2FsbCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSB1c2FibGUgaW1hZ2UuXG4gKi9cbmNvbnN0IE9VVFBVVF9NQVhfQlVGRkVSX0lOX0JZVEVTID0gNjdfMTA4Xzg2NDtcblxuLyoqXG4gKiBSdW5zIGBhZGIgLXMgPGRldmljZUlkPiA8Y29tbWFuZEFyZ3VtZW50cz5gIGFuZCByZXR1cm5zIHN0ZG91dCAqKnVuZGVjb2RlZCoqLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJhdyBzdGRvdXQgYnl0ZXMuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJCaW5hcnkocGFyYW1zOiBSdW5BZGJQYXJhbXMpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgY29tbWFuZEFyZ3VtZW50cyA9IFsnLXMnLCBwYXJhbXMuZGV2aWNlSWQsIC4uLnBhcmFtcy5jb21tYW5kQXJndW1lbnRzXTtcblxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGV4ZWNGaWxlKCdhZGInLCBjb21tYW5kQXJndW1lbnRzLCB7IGVuY29kaW5nOiAnYnVmZmVyJywgbWF4QnVmZmVyOiBPVVRQVVRfTUFYX0JVRkZFUl9JTl9CWVRFUyB9LCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiAke2NvbW1hbmRBcmd1bWVudHMuam9pbignICcpfSc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUnVucyBgYWRiIC1zIDxkZXZpY2VJZD4gPGNvbW1hbmRBcmd1bWVudHM+YCBhbmQgcmV0dXJucyBzdGRvdXQgYXMgdHJpbW1lZCB0ZXh0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgYXJndW1lbnRzIHRvIHJ1bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gc3Rkb3V0LCB3aXRoIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYWRiIGNvdWxkIG5vdCBiZSBydW4sIG9yIGV4aXRlZCBub24temVyby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFkYlRleHQocGFyYW1zOiBSdW5BZGJQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCBydW5BZGJCaW5hcnkocGFyYW1zKTtcbiAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShzdGRvdXQpLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSdW5zIGBhZGIgPGNvbW1hbmRBcmd1bWVudHM+YCB3aXRoIG5vIGRldmljZSBzZWxlY3RlZC5cbiAqXG4gKiBPbmx5IGBkZXZpY2VzYCBuZWVkcyB0aGlzIFx1MjAxNCBldmVyeSBvdGhlciBjYWxsIGluIHRoaXMgZmFtaWx5IGFkZHJlc3NlcyBvbmUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyB0byBydW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHN0ZG91dCwgd2l0aCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFkYiBjb3VsZCBub3QgYmUgcnVuLCBvciBleGl0ZWQgbm9uLXplcm8uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5BZGJUZXh0V2l0aG91dERldmljZShjb21tYW5kQXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2FkYicsIFsuLi5jb21tYW5kQXJndW1lbnRzXSwgeyBlbmNvZGluZzogJ3V0Zi04JywgbWF4QnVmZmVyOiBPVVRQVVRfTUFYX0JVRkZFUl9JTl9CWVRFUyB9LCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gJ2FkYiAke2NvbW1hbmRBcmd1bWVudHMuam9pbignICcpfSc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJlc29sdmUoc3Rkb3V0LnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF5QkEsZ0NBQXlCO0FBcUJ6QixNQUFNLDZCQUE2QjtBQVNuQyxlQUFzQixhQUFhLFFBQTJDO0FBQzVFLFFBQU0sbUJBQW1CLENBQUMsTUFBTSxPQUFPLFVBQVUsR0FBRyxPQUFPLGdCQUFnQjtBQUUzRSxTQUFPLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQzVDLDRDQUFTLE9BQU8sa0JBQWtCLEVBQUUsVUFBVSxVQUFVLFdBQVcsMkJBQTJCLEdBQUcsQ0FBQyxPQUFPLFdBQVc7QUFDbEgsVUFBSSxPQUFPO0FBQ1QsZUFBTyxJQUFJLE1BQU0sc0JBQXNCLGlCQUFpQixLQUFLLEdBQUcsQ0FBQyxNQUFNLE1BQU0sT0FBTyxpQ0FBaUMsQ0FBQztBQUN0SDtBQUFBLE1BQ0Y7QUFFQSxjQUFRLE1BQU07QUFBQSxJQUNoQixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFTQSxlQUFzQixXQUFXLFFBQXVDO0FBQ3RFLFFBQU0sU0FBUyxNQUFNLGFBQWEsTUFBTTtBQUN4QyxTQUFPLElBQUksWUFBWSxFQUFFLE9BQU8sTUFBTSxFQUFFLEtBQUs7QUFDL0M7QUFXQSxlQUFzQix3QkFBd0Isa0JBQXNEO0FBQ2xHLFNBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsNENBQVMsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsRUFBRSxVQUFVLFNBQVMsV0FBVywyQkFBMkIsR0FBRyxDQUFDLE9BQU8sV0FBVztBQUN0SCxVQUFJLE9BQU87QUFDVCxlQUFPLElBQUksTUFBTSxzQkFBc0IsaUJBQWlCLEtBQUssR0FBRyxDQUFDLE1BQU0sTUFBTSxPQUFPLGlDQUFpQyxDQUFDO0FBQ3RIO0FBQUEsTUFDRjtBQUVBLGNBQVEsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUN2QixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Runs `adb` and hands back what it printed — as text, or as raw bytes.
5
+ *
6
+ * The harness already shells out to `adb` in half a dozen places inside
7
+ * `transport-factory` / `transport-appium`, but always through `exec`, which
8
+ * decodes stdout as UTF-8. That is fine for `devices` and `settings get` and
9
+ * fatally wrong for `exec-out screencap -p`, whose stdout is a PNG: decoding it
10
+ * as text corrupts every byte above 0x7F. Hence the two runners here — the same
11
+ * command shape, differing only in whether the output is decoded.
12
+ *
13
+ * These are the process layer for the device-facing helpers a capture suite
14
+ * uses (`device-screenshot`, `device-settings`, `soft-keyboard`); they are not a
15
+ * general-purpose adb wrapper and deliberately do not try to become one.
16
+ *
17
+ * Every function here shells out, so the whole module is integration-time code.
18
+ * That is also why the parsing and geometry these helpers depend on live in
19
+ * their own modules — the same split `adb-device-list` already has from the
20
+ * transport factory, so a sort rule can never move a unit-tested function
21
+ * inside a coverage-ignored block.
22
+ */
23
+ /**
24
+ * Parameters for {@link runAdbBinary} and {@link runAdbText}.
25
+ */
26
+ export interface RunAdbParams {
27
+ /**
28
+ * The arguments to pass after `-s <deviceId>`, e.g. `['shell', 'input', 'tap', '10', '20']`.
29
+ */
30
+ readonly commandArguments: readonly string[];
31
+ /**
32
+ * The device to address, as `adb devices` lists it.
33
+ */
34
+ readonly deviceId: string;
35
+ }
36
+ /**
37
+ * Runs `adb -s <deviceId> <commandArguments>` and returns stdout **undecoded**.
38
+ *
39
+ * @param params - The device and the arguments to run.
40
+ * @returns A {@link Promise} that resolves to the raw stdout bytes.
41
+ * @throws Error if adb could not be run, or exited non-zero.
42
+ */
43
+ export declare function runAdbBinary(params: RunAdbParams): Promise<Uint8Array>;
44
+ /**
45
+ * Runs `adb -s <deviceId> <commandArguments>` and returns stdout as trimmed text.
46
+ *
47
+ * @param params - The device and the arguments to run.
48
+ * @returns A {@link Promise} that resolves to stdout, with surrounding whitespace removed.
49
+ * @throws Error if adb could not be run, or exited non-zero.
50
+ */
51
+ export declare function runAdbText(params: RunAdbParams): Promise<string>;
52
+ /**
53
+ * Runs `adb <commandArguments>` with no device selected.
54
+ *
55
+ * Only `devices` needs this — every other call in this family addresses one device.
56
+ *
57
+ * @param commandArguments - The arguments to run.
58
+ * @returns A {@link Promise} that resolves to stdout, with surrounding whitespace removed.
59
+ * @throws Error if adb could not be run, or exited non-zero.
60
+ */
61
+ export declare function runAdbTextWithoutDevice(commandArguments: readonly string[]): Promise<string>;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var device_screenshot_exports = {};
20
+ __export(device_screenshot_exports, {
21
+ captureDeviceScreenshot: () => captureDeviceScreenshot
22
+ });
23
+ module.exports = __toCommonJS(device_screenshot_exports);
24
+ var import_adb = require("./adb.cjs");
25
+ var import_capture_screenshot = require("./capture-screenshot.cjs");
26
+ async function captureDeviceScreenshot(params) {
27
+ const bytes = await (0, import_adb.runAdbBinary)({
28
+ commandArguments: ["exec-out", "screencap", "-p"],
29
+ deviceId: params.deviceId
30
+ });
31
+ if (!(0, import_capture_screenshot.isPng)(bytes)) {
32
+ throw new Error(
33
+ `captureDeviceScreenshot: ${params.deviceId} returned ${String(bytes.length)} bytes that are not a PNG. A device that is still booting, or an adb transport that decoded the stream as text, both look like this.`
34
+ );
35
+ }
36
+ return bytes;
37
+ }
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ captureDeviceScreenshot
41
+ });
42
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUqKiB0aGUgd2F5IGEgcGFnZSBjYXB0dXJlIGlzLlxuICogUmVhY2ggZm9yIHRoaXMgb25seSBmb3IgdGhlIHNob3RzIHRoYXQgbmVlZCB0aGUga2V5Ym9hcmQ7IGxlYXZlIHRoZSByZXN0IG9uXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAuXG4gKi9cblxuaW1wb3J0IHsgcnVuQWRiQmluYXJ5IH0gZnJvbSAnLi9hZGIuY2pzJztcbmltcG9ydCB7IGlzUG5nIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QuY2pzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2FwdHVyZURldmljZVNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIGRldmljZSdzIGZyYW1lYnVmZmVyIGFzIGEgUE5HLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIHBob3RvZ3JhcGguXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB3aGF0IGNhbWUgYmFjayBpcyBub3QgYSBQTkcgXHUyMDE0IHdoaWNoIGlzIHdoYXQgYSB0cnVuY2F0ZWQgb3IgdGV4dC1kZWNvZGVkIGNhcHR1cmUgbG9va3NcbiAqICAgbGlrZSwgYW5kIGlzIGZhciBjaGVhcGVyIHRvIGNhdGNoIGhlcmUgdGhhbiBpbiBhbiBpbWFnZSBkaWZmLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZURldmljZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlRGV2aWNlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBieXRlcyA9IGF3YWl0IHJ1bkFkYkJpbmFyeSh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydleGVjLW91dCcsICdzY3JlZW5jYXAnLCAnLXAnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIGlmICghaXNQbmcoYnl0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90OiAke3BhcmFtcy5kZXZpY2VJZH0gcmV0dXJuZWQgJHtTdHJpbmcoYnl0ZXMubGVuZ3RoKX0gYnl0ZXMgdGhhdCBhcmUgbm90IGEgUE5HLiBgXG4gICAgICAgICsgJ0EgZGV2aWNlIHRoYXQgaXMgc3RpbGwgYm9vdGluZywgb3IgYW4gYWRiIHRyYW5zcG9ydCB0aGF0IGRlY29kZWQgdGhlIHN0cmVhbSBhcyB0ZXh0LCBib3RoIGxvb2sgbGlrZSB0aGlzLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxpQkFBNkI7QUFDN0IsZ0NBQXNCO0FBc0J0QixlQUFzQix3QkFBd0IsUUFBNEQ7QUFDeEcsUUFBTSxRQUFRLFVBQU0seUJBQWE7QUFBQSxJQUMvQixrQkFBa0IsQ0FBQyxZQUFZLGFBQWEsSUFBSTtBQUFBLElBQ2hELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxNQUFJLEtBQUMsaUNBQU0sS0FBSyxHQUFHO0FBQ2pCLFVBQU0sSUFBSTtBQUFBLE1BQ1IsNEJBQTRCLE9BQU8sUUFBUSxhQUFhLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQSxJQUU5RTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Photographs the DEVICE, not the web page.
5
+ *
6
+ * `captureObsidianScreenshot` goes through Appium in the WebView context, so on
7
+ * Android it captures the page: no status bar, and — the reason this exists —
8
+ * no soft keyboard, because the IME is a system window and not part of the
9
+ * page. A frame that is meant to show what a phone looks like therefore cannot
10
+ * be taken that way.
11
+ *
12
+ * `adb exec-out screencap -p` reads the framebuffer instead, which is the same
13
+ * route the trusted-input passes already use. The trade is deliberate and worth
14
+ * writing down at every call site: a device capture carries the status-bar clock
15
+ * and battery, so it is **not byte-reproducible** the way a page capture is.
16
+ * Reach for this only for the shots that need the keyboard; leave the rest on
17
+ * `captureObsidianScreenshot`.
18
+ */
19
+ /**
20
+ * Parameters for {@link captureDeviceScreenshot}.
21
+ */
22
+ export interface CaptureDeviceScreenshotParams {
23
+ /**
24
+ * The device to photograph.
25
+ */
26
+ readonly deviceId: string;
27
+ }
28
+ /**
29
+ * Captures the device's framebuffer as a PNG.
30
+ *
31
+ * @param params - The device to photograph.
32
+ * @returns A {@link Promise} that resolves to the raw PNG bytes.
33
+ * @throws Error if what came back is not a PNG — which is what a truncated or text-decoded capture looks
34
+ * like, and is far cheaper to catch here than in an image diff.
35
+ */
36
+ export declare function captureDeviceScreenshot(params: CaptureDeviceScreenshotParams): Promise<Uint8Array>;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var device_setting_restore_exports = {};
20
+ __export(device_setting_restore_exports, {
21
+ DeviceSettingRestoreKind: () => DeviceSettingRestoreKind,
22
+ resolveDeviceSettingRestore: () => resolveDeviceSettingRestore
23
+ });
24
+ module.exports = __toCommonJS(device_setting_restore_exports);
25
+ var DeviceSettingRestoreKind = /* @__PURE__ */ ((DeviceSettingRestoreKind2) => {
26
+ DeviceSettingRestoreKind2["Delete"] = "delete";
27
+ DeviceSettingRestoreKind2["Write"] = "write";
28
+ return DeviceSettingRestoreKind2;
29
+ })(DeviceSettingRestoreKind || {});
30
+ const UNSET_SETTING_VALUE = "null";
31
+ function resolveDeviceSettingRestore(previousValue) {
32
+ if (previousValue === UNSET_SETTING_VALUE) {
33
+ return { kind: "delete" /* Delete */ };
34
+ }
35
+ return {
36
+ kind: "write" /* Write */,
37
+ value: previousValue
38
+ };
39
+ }
40
+ // Annotate the CommonJS export names for ESM import in node:
41
+ 0 && (module.exports = {
42
+ DeviceSettingRestoreKind,
43
+ resolveDeviceSettingRestore
44
+ });
45
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5nLXJlc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIGhvdyBhIGRldmljZSBzZXR0aW5nIHRoYXQgd2FzIGNoYW5nZWQgZm9yIGEgY2FwdHVyZSBnZXRzIHB1dCBiYWNrLlxuICpcbiAqIEEgc3VpdGUgdGhhdCBmbGlwcyBhIHNldHRpbmcgb3dlcyB0aGUgZGV2aWNlIGl0cyBvcmlnaW5hbCB2YWx1ZSBiYWNrIFx1MjAxNFxuICogaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIGl0IG5ldmVyIGhhZCBvbmUuIGBzZXR0aW5ncyBnZXRgIHByaW50cyB0aGUgbGl0ZXJhbFxuICogYG51bGxgIGZvciBhIHNldHRpbmcgdGhhdCBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLCBhbmQgYHNldHRpbmdzIHB1dCBcdTIwMjYgbnVsbGBcbiAqIGRvZXMgKipub3QqKiByZXByb2R1Y2UgdGhhdCBzdGF0ZTogaXQgd3JpdGVzIHRoZSBmb3VyLWNoYXJhY3RlciBzdHJpbmdcbiAqIGBudWxsYC4gUmVzdG9yaW5nIGFuIHVuc2V0IHNldHRpbmcgdGFrZXMgYHNldHRpbmdzIGRlbGV0ZWAsIHdoaWNoIGlzIHdoeSB0aGlzXG4gKiBpcyBhIGRlY2lzaW9uIHJhdGhlciB0aGFuIGEgc3RyYWlnaHQgd3JpdGUtYmFjay5cbiAqXG4gKiBQdXJlIGFuZCB1bml0LXRlc3RlZDsgdGhlIGNhbGxzIHRoYXQgY2FycnkgaXQgb3V0IGxpdmUgaW4gYGRldmljZS1zZXR0aW5nc2AuXG4gKi9cblxuLyoqXG4gKiBIb3cgYSBzZXR0aW5nIGlzIHJlc3RvcmVkLlxuICovXG5leHBvcnQgZW51bSBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmcgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbiwgc28gcmVzdG9yaW5nIGl0IG1lYW5zIHJlbW92aW5nIGl0IGFnYWluLlxuICAgKi9cbiAgRGVsZXRlID0gJ2RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nIGhlbGQgYSB2YWx1ZSwgd2hpY2ggaXMgd3JpdHRlbiBiYWNrIHZlcmJhdGltLlxuICAgKi9cbiAgV3JpdGUgPSAnd3JpdGUnXG59XG5cbi8qKlxuICogV2hhdCByZXN0b3JpbmcgYSBzZXR0aW5nIHJlcXVpcmVzOiBwdXR0aW5nIGEgdmFsdWUgYmFjaywgb3IgcmVtb3ZpbmcgaXQgYWdhaW4uXG4gKi9cbmV4cG9ydCB0eXBlIERldmljZVNldHRpbmdSZXN0b3JlID0gRGV2aWNlU2V0dGluZ1Jlc3RvcmVEZWxldGUgfCBEZXZpY2VTZXR0aW5nUmVzdG9yZVdyaXRlO1xuXG4vKipcbiAqIFJlc3RvcmluZyBhIHNldHRpbmcgYnkgcmVtb3ZpbmcgaXQsIGJlY2F1c2UgaXQgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VTZXR0aW5nUmVzdG9yZURlbGV0ZSB7XG4gIC8qKlxuICAgKiBEaXNjcmltaW5hdGVzIHRoZSB1bmlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERldmljZVNldHRpbmdSZXN0b3JlS2luZC5EZWxldGU7XG59XG5cbi8qKlxuICogUmVzdG9yaW5nIGEgc2V0dGluZyBieSB3cml0aW5nIGl0cyBwcmV2aW91cyB2YWx1ZSBiYWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZVNldHRpbmdSZXN0b3JlV3JpdGUge1xuICAvKipcbiAgICogRGlzY3JpbWluYXRlcyB0aGUgdW5pb24uXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQuV3JpdGU7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZSBiYWNrLCBleGFjdGx5IGFzIGl0IHdhcyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBzZXR0aW5ncyBnZXRgIHByaW50cyBmb3IgYSBzZXR0aW5nIHRoYXQgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbi5cbiAqL1xuY29uc3QgVU5TRVRfU0VUVElOR19WQUxVRSA9ICdudWxsJztcblxuLyoqXG4gKiBEZWNpZGVzIGhvdyBhIHNldHRpbmcgcmVhZCBiZWZvcmUgYSBjaGFuZ2UgaXMgcHV0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNWYWx1ZSAtIEV4YWN0bHkgd2hhdCBgcmVhZERldmljZVNldHRpbmdgIHJldHVybmVkIGJlZm9yZSB0aGUgY2hhbmdlLlxuICogQHJldHVybnMgV2hldGhlciB0byB3cml0ZSB0aGUgdmFsdWUgYmFjayBvciB0byByZW1vdmUgdGhlIHNldHRpbmcgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmUocHJldmlvdXNWYWx1ZTogc3RyaW5nKTogRGV2aWNlU2V0dGluZ1Jlc3RvcmUge1xuICBpZiAocHJldmlvdXNWYWx1ZSA9PT0gVU5TRVRfU0VUVElOR19WQUxVRSkge1xuICAgIHJldHVybiB7IGtpbmQ6IERldmljZVNldHRpbmdSZXN0b3JlS2luZC5EZWxldGUgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2luZDogRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLldyaXRlLFxuICAgIHZhbHVlOiBwcmV2aW91c1ZhbHVlXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFrQk8sSUFBSywyQkFBTCxrQkFBS0EsOEJBQUw7QUFJTCxFQUFBQSwwQkFBQSxZQUFTO0FBS1QsRUFBQUEsMEJBQUEsV0FBUTtBQVRFLFNBQUFBO0FBQUEsR0FBQTtBQTZDWixNQUFNLHNCQUFzQjtBQVFyQixTQUFTLDRCQUE0QixlQUE2QztBQUN2RixNQUFJLGtCQUFrQixxQkFBcUI7QUFDekMsV0FBTyxFQUFFLE1BQU0sc0JBQWdDO0FBQUEsRUFDakQ7QUFFQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogWyJEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQiXQp9Cg==
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Decides how a device setting that was changed for a capture gets put back.
5
+ *
6
+ * A suite that flips a setting owes the device its original value back —
7
+ * including the case where it never had one. `settings get` prints the literal
8
+ * `null` for a setting that has never been written, and `settings put … null`
9
+ * does **not** reproduce that state: it writes the four-character string
10
+ * `null`. Restoring an unset setting takes `settings delete`, which is why this
11
+ * is a decision rather than a straight write-back.
12
+ *
13
+ * Pure and unit-tested; the calls that carry it out live in `device-settings`.
14
+ */
15
+ /**
16
+ * How a setting is restored.
17
+ */
18
+ export declare enum DeviceSettingRestoreKind {
19
+ /**
20
+ * The setting had never been written, so restoring it means removing it again.
21
+ */
22
+ Delete = "delete",
23
+ /**
24
+ * The setting held a value, which is written back verbatim.
25
+ */
26
+ Write = "write"
27
+ }
28
+ /**
29
+ * What restoring a setting requires: putting a value back, or removing it again.
30
+ */
31
+ export type DeviceSettingRestore = DeviceSettingRestoreDelete | DeviceSettingRestoreWrite;
32
+ /**
33
+ * Restoring a setting by removing it, because it had never been written.
34
+ */
35
+ export interface DeviceSettingRestoreDelete {
36
+ /**
37
+ * Discriminates the union.
38
+ */
39
+ readonly kind: DeviceSettingRestoreKind.Delete;
40
+ }
41
+ /**
42
+ * Restoring a setting by writing its previous value back.
43
+ */
44
+ export interface DeviceSettingRestoreWrite {
45
+ /**
46
+ * Discriminates the union.
47
+ */
48
+ readonly kind: DeviceSettingRestoreKind.Write;
49
+ /**
50
+ * The value to write back, exactly as it was read.
51
+ */
52
+ readonly value: string;
53
+ }
54
+ /**
55
+ * Decides how a setting read before a change is put back afterwards.
56
+ *
57
+ * @param previousValue - Exactly what `readDeviceSetting` returned before the change.
58
+ * @returns Whether to write the value back or to remove the setting again.
59
+ */
60
+ export declare function resolveDeviceSettingRestore(previousValue: string): DeviceSettingRestore;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var device_settings_command_exports = {};
20
+ __export(device_settings_command_exports, {
21
+ DeviceSettingNamespace: () => DeviceSettingNamespace,
22
+ DeviceSettingVerb: () => DeviceSettingVerb,
23
+ buildDeviceSettingsCommandArguments: () => buildDeviceSettingsCommandArguments
24
+ });
25
+ module.exports = __toCommonJS(device_settings_command_exports);
26
+ var DeviceSettingNamespace = /* @__PURE__ */ ((DeviceSettingNamespace2) => {
27
+ DeviceSettingNamespace2["Global"] = "global";
28
+ DeviceSettingNamespace2["Secure"] = "secure";
29
+ DeviceSettingNamespace2["System"] = "system";
30
+ return DeviceSettingNamespace2;
31
+ })(DeviceSettingNamespace || {});
32
+ var DeviceSettingVerb = /* @__PURE__ */ ((DeviceSettingVerb2) => {
33
+ DeviceSettingVerb2["Delete"] = "delete";
34
+ DeviceSettingVerb2["Get"] = "get";
35
+ DeviceSettingVerb2["Put"] = "put";
36
+ return DeviceSettingVerb2;
37
+ })(DeviceSettingVerb || {});
38
+ function buildDeviceSettingsCommandArguments(params) {
39
+ const namespace = params.namespace ?? "secure" /* Secure */;
40
+ const value = params.verb === "put" /* Put */ && params.value !== void 0 ? [params.value] : [];
41
+ return ["shell", "settings", params.verb, namespace, params.name, ...value];
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ DeviceSettingNamespace,
46
+ DeviceSettingVerb,
47
+ buildDeviceSettingsCommandArguments
48
+ });
49
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5ncy1jb21tYW5kLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQnVpbGRzIHRoZSBgYWRiIHNoZWxsIHNldHRpbmdzIFx1MjAyNmAgYXJndW1lbnQgbGlzdC5cbiAqXG4gKiBTcGxpdCBvdXQgb2Yge0BsaW5rIC4vZGV2aWNlLXNldHRpbmdzLnRzfSBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiB7QGxpbmsgLi9hZGItZGV2aWNlLWxpc3QudHN9IGlzIHNwbGl0IG91dCBvZiB0aGUgdHJhbnNwb3J0IGZhY3Rvcnk6IHRoZVxuICogYXJndW1lbnQgbGlzdCBpcyBwdXJlIGFuZCB3b3J0aCB1bml0LXRlc3RpbmcsIHdoaWxlIHRoZSBjYWxsIHRoYXQgcnVucyBpdCBpc1xuICogaW50ZWdyYXRpb24tdGltZSBjb2RlIHRoYXQgYSB1bml0IHRlc3QgY2Fubm90IHJlYWNoLiBLZWVwaW5nIHRoZW0gaW4gb25lIGZpbGVcbiAqIHdvdWxkIHB1dCB0aGUgbmFtZXNwYWNlIGRlZmF1bHQgaW5zaWRlIGEgY292ZXJhZ2UtaWdub3JlZCBibG9jaywgd2hlcmUgbm90aGluZ1xuICogY2hlY2tzIHRoYXQgaXQgaXMgd2hhdCB0aGUgZG9jdW1lbnRhdGlvbiBjbGFpbXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgYHNldHRpbmdzYCBuYW1lc3BhY2VzIHRoaXMgaGVscGVyIGFkZHJlc3Nlcy5cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlU2V0dGluZ05hbWVzcGFjZSB7XG4gIC8qKlxuICAgKiBEZXZpY2Utd2lkZSBzZXR0aW5ncywgZS5nLiBgaGlkZV9lcnJvcl9kaWFsb2dzYC5cbiAgICovXG4gIEdsb2JhbCA9ICdnbG9iYWwnLFxuXG4gIC8qKlxuICAgKiBQZXItdXNlciBzZXR0aW5ncyB0aGUgc3lzdGVtIHJlYWRzLCBlLmcuIGBzaG93X2ltZV93aXRoX2hhcmRfa2V5Ym9hcmRgLlxuICAgKi9cbiAgU2VjdXJlID0gJ3NlY3VyZScsXG5cbiAgLyoqXG4gICAqIFBlci11c2VyIHNldHRpbmdzIGFwcHMgbWF5IHJlYWQsIGUuZy4gYHNjcmVlbl9icmlnaHRuZXNzYC5cbiAgICovXG4gIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIGBzZXR0aW5nc2Agc3ViLWNvbW1hbmRzIHRoaXMgaGVscGVyIGlzc3Vlcy5cbiAqL1xuZXhwb3J0IGVudW0gRGV2aWNlU2V0dGluZ1ZlcmIge1xuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgc2V0dGluZywgcmV0dXJuaW5nIGl0IHRvIG5ldmVyLWhhdmluZy1iZWVuLXdyaXR0ZW4uXG4gICAqL1xuICBEZWxldGUgPSAnZGVsZXRlJyxcblxuICAvKipcbiAgICogUmVhZHMgdGhlIHNldHRpbmcsIHByaW50aW5nIGBudWxsYCB3aGVuIGl0IGhhcyBuZXZlciBiZWVuIHdyaXR0ZW4uXG4gICAqL1xuICBHZXQgPSAnZ2V0JyxcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBzZXR0aW5nLlxuICAgKi9cbiAgUHV0ID0gJ3B1dCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGREZXZpY2VTZXR0aW5nc0NvbW1hbmRBcmd1bWVudHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nJ3MgbmFtZSB3aXRoaW4ge0BsaW5rIG5hbWVzcGFjZX0sIGUuZy4gYHNob3dfaW1lX3dpdGhfaGFyZF9rZXlib2FyZGAuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBuYW1lc3BhY2UgdGhlIG5hbWUgbGl2ZXMgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBEZXZpY2VTZXR0aW5nTmFtZXNwYWNlLlNlY3VyZX1cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZT86IERldmljZVNldHRpbmdOYW1lc3BhY2U7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZS4gTWVhbmluZ2Z1bCBvbmx5IGZvciB7QGxpbmsgRGV2aWNlU2V0dGluZ1ZlcmIuUHV0fS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3ViLWNvbW1hbmQgdG8gaXNzdWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJiOiBEZXZpY2VTZXR0aW5nVmVyYjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGFyZ3VtZW50cyBmb3IgYGFkYiBzaGVsbCBzZXR0aW5ncyA8dmVyYj4gPG5hbWVzcGFjZT4gPG5hbWU+IFt2YWx1ZV1gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3ViLWNvbW1hbmQsIHRoZSBzZXR0aW5nLCBpdHMgbmFtZXNwYWNlIGFuZCBcdTIwMTQgZm9yIGEgd3JpdGUgXHUyMDE0IGl0cyB2YWx1ZS5cbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMgdG8gaGFuZCB0byBgcnVuQWRiVGV4dGAsIGBzaGVsbGAgaW5jbHVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyhwYXJhbXM6IEJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lc3BhY2UgPSBwYXJhbXMubmFtZXNwYWNlID8/IERldmljZVNldHRpbmdOYW1lc3BhY2UuU2VjdXJlO1xuICBjb25zdCB2YWx1ZSA9IHBhcmFtcy52ZXJiID09PSBEZXZpY2VTZXR0aW5nVmVyYi5QdXQgJiYgcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQgPyBbcGFyYW1zLnZhbHVlXSA6IFtdO1xuXG4gIHJldHVybiBbJ3NoZWxsJywgJ3NldHRpbmdzJywgcGFyYW1zLnZlcmIsIG5hbWVzcGFjZSwgcGFyYW1zLm5hbWUsIC4uLnZhbHVlXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JPLElBQUsseUJBQUwsa0JBQUtBLDRCQUFMO0FBSUwsRUFBQUEsd0JBQUEsWUFBUztBQUtULEVBQUFBLHdCQUFBLFlBQVM7QUFLVCxFQUFBQSx3QkFBQSxZQUFTO0FBZEMsU0FBQUE7QUFBQSxHQUFBO0FBb0JMLElBQUssb0JBQUwsa0JBQUtDLHVCQUFMO0FBSUwsRUFBQUEsbUJBQUEsWUFBUztBQUtULEVBQUFBLG1CQUFBLFNBQU07QUFLTixFQUFBQSxtQkFBQSxTQUFNO0FBZEksU0FBQUE7QUFBQSxHQUFBO0FBa0RMLFNBQVMsb0NBQW9DLFFBQTZEO0FBQy9HLFFBQU0sWUFBWSxPQUFPLGFBQWE7QUFDdEMsUUFBTSxRQUFRLE9BQU8sU0FBUyxtQkFBeUIsT0FBTyxVQUFVLFNBQVksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBRXRHLFNBQU8sQ0FBQyxTQUFTLFlBQVksT0FBTyxNQUFNLFdBQVcsT0FBTyxNQUFNLEdBQUcsS0FBSztBQUM1RTsiLAogICJuYW1lcyI6IFsiRGV2aWNlU2V0dGluZ05hbWVzcGFjZSIsICJEZXZpY2VTZXR0aW5nVmVyYiJdCn0K
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Builds the `adb shell settings …` argument list.
5
+ *
6
+ * Split out of {@link ./device-settings.ts} for the same reason
7
+ * {@link ./adb-device-list.ts} is split out of the transport factory: the
8
+ * argument list is pure and worth unit-testing, while the call that runs it is
9
+ * integration-time code that a unit test cannot reach. Keeping them in one file
10
+ * would put the namespace default inside a coverage-ignored block, where nothing
11
+ * checks that it is what the documentation claims.
12
+ */
13
+ /**
14
+ * The `settings` namespaces this helper addresses.
15
+ */
16
+ export declare enum DeviceSettingNamespace {
17
+ /**
18
+ * Device-wide settings, e.g. `hide_error_dialogs`.
19
+ */
20
+ Global = "global",
21
+ /**
22
+ * Per-user settings the system reads, e.g. `show_ime_with_hard_keyboard`.
23
+ */
24
+ Secure = "secure",
25
+ /**
26
+ * Per-user settings apps may read, e.g. `screen_brightness`.
27
+ */
28
+ System = "system"
29
+ }
30
+ /**
31
+ * The `settings` sub-commands this helper issues.
32
+ */
33
+ export declare enum DeviceSettingVerb {
34
+ /**
35
+ * Removes the setting, returning it to never-having-been-written.
36
+ */
37
+ Delete = "delete",
38
+ /**
39
+ * Reads the setting, printing `null` when it has never been written.
40
+ */
41
+ Get = "get",
42
+ /**
43
+ * Writes the setting.
44
+ */
45
+ Put = "put"
46
+ }
47
+ /**
48
+ * Parameters for {@link buildDeviceSettingsCommandArguments}.
49
+ */
50
+ export interface BuildDeviceSettingsCommandArgumentsParams {
51
+ /**
52
+ * The setting's name within {@link namespace}, e.g. `show_ime_with_hard_keyboard`.
53
+ */
54
+ readonly name: string;
55
+ /**
56
+ * The settings namespace the name lives in.
57
+ *
58
+ * @default {@link DeviceSettingNamespace.Secure}
59
+ */
60
+ readonly namespace?: DeviceSettingNamespace;
61
+ /**
62
+ * The value to write. Meaningful only for {@link DeviceSettingVerb.Put}.
63
+ */
64
+ readonly value?: string;
65
+ /**
66
+ * The sub-command to issue.
67
+ */
68
+ readonly verb: DeviceSettingVerb;
69
+ }
70
+ /**
71
+ * Builds the arguments for `adb shell settings <verb> <namespace> <name> [value]`.
72
+ *
73
+ * @param params - The sub-command, the setting, its namespace and — for a write — its value.
74
+ * @returns The arguments to hand to `runAdbText`, `shell` included.
75
+ */
76
+ export declare function buildDeviceSettingsCommandArguments(params: BuildDeviceSettingsCommandArgumentsParams): string[];
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var device_settings_exports = {};
20
+ __export(device_settings_exports, {
21
+ deleteDeviceSetting: () => deleteDeviceSetting,
22
+ readDeviceSetting: () => readDeviceSetting,
23
+ withSoftKeyboardEnabled: () => withSoftKeyboardEnabled,
24
+ writeDeviceSetting: () => writeDeviceSetting
25
+ });
26
+ module.exports = __toCommonJS(device_settings_exports);
27
+ var import_adb = require("./adb.cjs");
28
+ var import_device_setting_restore = require("./device-setting-restore.cjs");
29
+ var import_device_settings_command = require("./device-settings-command.cjs");
30
+ const SOFT_KEYBOARD_SETTING_NAME = "show_ime_with_hard_keyboard";
31
+ const SOFT_KEYBOARD_SETTING_ON = "1";
32
+ async function deleteDeviceSetting(params) {
33
+ await (0, import_adb.runAdbText)({
34
+ commandArguments: (0, import_device_settings_command.buildDeviceSettingsCommandArguments)({
35
+ name: params.name,
36
+ ...params.namespace !== void 0 && { namespace: params.namespace },
37
+ verb: import_device_settings_command.DeviceSettingVerb.Delete
38
+ }),
39
+ deviceId: params.deviceId
40
+ });
41
+ }
42
+ async function readDeviceSetting(params) {
43
+ return await (0, import_adb.runAdbText)({
44
+ commandArguments: (0, import_device_settings_command.buildDeviceSettingsCommandArguments)({
45
+ name: params.name,
46
+ ...params.namespace !== void 0 && { namespace: params.namespace },
47
+ verb: import_device_settings_command.DeviceSettingVerb.Get
48
+ }),
49
+ deviceId: params.deviceId
50
+ });
51
+ }
52
+ async function withSoftKeyboardEnabled(params) {
53
+ const settingParams = {
54
+ deviceId: params.deviceId,
55
+ name: SOFT_KEYBOARD_SETTING_NAME
56
+ };
57
+ const previousValue = await readDeviceSetting(settingParams);
58
+ await writeDeviceSetting({ ...settingParams, value: SOFT_KEYBOARD_SETTING_ON });
59
+ try {
60
+ return await params.callback();
61
+ } finally {
62
+ const restore = (0, import_device_setting_restore.resolveDeviceSettingRestore)(previousValue);
63
+ if (restore.kind === import_device_setting_restore.DeviceSettingRestoreKind.Delete) {
64
+ await deleteDeviceSetting(settingParams);
65
+ } else {
66
+ await writeDeviceSetting({ ...settingParams, value: restore.value });
67
+ }
68
+ }
69
+ }
70
+ async function writeDeviceSetting(params) {
71
+ await (0, import_adb.runAdbText)({
72
+ commandArguments: (0, import_device_settings_command.buildDeviceSettingsCommandArguments)({
73
+ name: params.name,
74
+ ...params.namespace !== void 0 && { namespace: params.namespace },
75
+ value: params.value,
76
+ verb: import_device_settings_command.DeviceSettingVerb.Put
77
+ }),
78
+ deviceId: params.deviceId
79
+ });
80
+ }
81
+ // Annotate the CommonJS export names for ESM import in node:
82
+ 0 && (module.exports = {
83
+ deleteDeviceSetting,
84
+ readDeviceSetting,
85
+ withSoftKeyboardEnabled,
86
+ writeDeviceSetting
87
+ });
88
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5ncy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCB3cml0ZXMgQW5kcm9pZCBkZXZpY2Ugc2V0dGluZ3MgXHUyMDE0IGFuZCB3cmFwcyB0aGUgb25lIHNldHRpbmcgYVxuICogc2NyZWVuc2hvdCBzdWl0ZSBoYXMgdG8gY2hhbmdlLlxuICpcbiAqIFRoZSBzY3JlZW5zaG90IEFWRHMgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlXG4gKiBvbi1zY3JlZW4ga2V5Ym9hcmQgZXZlbiB3aGVyZSB0aGUgcGFnZSBhc2tzIGZvciBvbmUuIGBzaG93X2ltZV93aXRoX2hhcmRfa2V5Ym9hcmRgXG4gKiBpcyB3aGF0IHR1cm5zIGl0IGJhY2sgb24uIHtAbGluayB3aXRoU29mdEtleWJvYXJkRW5hYmxlZH0gZmxpcHMgaXQsIHJ1bnMgdGhlXG4gKiB3b3JrLCBhbmQgcHV0cyB0aGUgZGV2aWNlIGJhY2sgZXhhY3RseSBhcyBpdCBmb3VuZCBpdCBcdTIwMTQgaW5jbHVkaW5nIHJlc3RvcmluZyBhXG4gKiBzZXR0aW5nIHRoYXQgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbiwgd2hpY2ggdGFrZXMgYSBkZWxldGUgcmF0aGVyIHRoYW4gYSB3cml0ZVxuICogKHNlZSBgZGV2aWNlLXNldHRpbmctcmVzdG9yZWApLlxuICpcbiAqIEV2ZXJ5IGZ1bmN0aW9uIGhlcmUgc2hlbGxzIG91dCwgc28gdGhlIHdob2xlIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGU7XG4gKiB0aGUgcmVzdG9yZSBkZWNpc2lvbiBhbmQgdGhlIGFyZ3VtZW50IGxpc3QgaXQgZGVwZW5kcyBvbiBhcmUgdW5pdC10ZXN0ZWQgaW5cbiAqIHRoZWlyIG93biBtb2R1bGVzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRGV2aWNlU2V0dGluZ05hbWVzcGFjZSB9IGZyb20gJy4vZGV2aWNlLXNldHRpbmdzLWNvbW1hbmQuY2pzJztcblxuaW1wb3J0IHsgcnVuQWRiVGV4dCB9IGZyb20gJy4vYWRiLmNqcyc7XG5pbXBvcnQge1xuICBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQsXG4gIHJlc29sdmVEZXZpY2VTZXR0aW5nUmVzdG9yZVxufSBmcm9tICcuL2RldmljZS1zZXR0aW5nLXJlc3RvcmUuY2pzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzLFxuICBEZXZpY2VTZXR0aW5nVmVyYlxufSBmcm9tICcuL2RldmljZS1zZXR0aW5ncy1jb21tYW5kLmNqcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGRlbGV0ZURldmljZVNldHRpbmd9IGFuZCB7QGxpbmsgcmVhZERldmljZVNldHRpbmd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZVNldHRpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmcncyBuYW1lIHdpdGhpbiB7QGxpbmsgbmFtZXNwYWNlfSwgZS5nLiBgc2hvd19pbWVfd2l0aF9oYXJkX2tleWJvYXJkYC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIG5hbWVzcGFjZSB0aGUgbmFtZSBsaXZlcyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERldmljZVNldHRpbmdOYW1lc3BhY2UuU2VjdXJlfVxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZXNwYWNlPzogRGV2aWNlU2V0dGluZ05hbWVzcGFjZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWR9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFdoYXQgdGhlIHdyYXBwZWQgd29yayByZXR1cm5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkUGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIFRoZSB3b3JrIHRvIHJ1biB3aGlsZSB0aGUgb24tc2NyZWVuIGtleWJvYXJkIGlzIHBlcm1pdHRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiAodGhpczogdm9pZCkgPT4gUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0byBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd3JpdGVEZXZpY2VTZXR0aW5nfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZURldmljZVNldHRpbmdQYXJhbXMgZXh0ZW5kcyBEZXZpY2VTZXR0aW5nUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmcgZGVjaWRpbmcgd2hldGhlciBBbmRyb2lkIGRyYXdzIGEga2V5Ym9hcmQgd2hpbGUgYSBoYXJkd2FyZSBvbmUgaXMgYXR0YWNoZWQuXG4gKi9cbmNvbnN0IFNPRlRfS0VZQk9BUkRfU0VUVElOR19OQU1FID0gJ3Nob3dfaW1lX3dpdGhfaGFyZF9rZXlib2FyZCc7XG5cbmNvbnN0IFNPRlRfS0VZQk9BUkRfU0VUVElOR19PTiA9ICcxJztcblxuLyoqXG4gKiBDbGVhcnMgYSBkZXZpY2Ugc2V0dGluZywgcmV0dXJuaW5nIGl0IHRvIG5ldmVyLWhhdmluZy1iZWVuLXdyaXR0ZW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nIGFuZCBpdHMgbmFtZXNwYWNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzZXR0aW5nIGlzIGdvbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVEZXZpY2VTZXR0aW5nKHBhcmFtczogRGV2aWNlU2V0dGluZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyh7XG4gICAgICBuYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgIC4uLihwYXJhbXMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lc3BhY2U6IHBhcmFtcy5uYW1lc3BhY2UgfSksXG4gICAgICB2ZXJiOiBEZXZpY2VTZXR0aW5nVmVyYi5EZWxldGVcbiAgICB9KSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgZGV2aWNlIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nIGFuZCBpdHMgbmFtZXNwYWNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgc2V0dGluZydzIHZhbHVlLCBvciB0aGUgbGl0ZXJhbCBgbnVsbGAgd2hlbiBpdCBoYXMgbmV2ZXJcbiAqICAgYmVlbiB3cml0dGVuLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZERldmljZVNldHRpbmcocGFyYW1zOiBEZXZpY2VTZXR0aW5nUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IHJ1bkFkYlRleHQoe1xuICAgIGNvbW1hbmRBcmd1bWVudHM6IGJ1aWxkRGV2aWNlU2V0dGluZ3NDb21tYW5kQXJndW1lbnRzKHtcbiAgICAgIG5hbWU6IHBhcmFtcy5uYW1lLFxuICAgICAgLi4uKHBhcmFtcy5uYW1lc3BhY2UgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWVzcGFjZTogcGFyYW1zLm5hbWVzcGFjZSB9KSxcbiAgICAgIHZlcmI6IERldmljZVNldHRpbmdWZXJiLkdldFxuICAgIH0pLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUGVybWl0cyB0aGUgb24tc2NyZWVuIGtleWJvYXJkIGZvciB0aGUgZHVyYXRpb24gb2YgYSBjYWxsYmFjaywgdGhlbiByZXN0b3JlcyB0aGUgZGV2aWNlIGV4YWN0bHkuXG4gKlxuICogVGhlIHJlc3RvcmUgcnVucyB3aGV0aGVyIHRoZSBjYWxsYmFjayBzdWNjZWVkZWQgb3IgdGhyZXcgXHUyMDE0IGEgc3VpdGUgdGhhdCBkaWVzIG1pZC1jYXB0dXJlIG11c3Qgbm90IGxlYXZlXG4gKiB0aGUgZGV2aWNlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhbiBpdCBmb3VuZCBpdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBXaGF0IHRoZSB3cmFwcGVkIHdvcmsgcmV0dXJucy5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgd29yayB0byBydW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoYXRldmVyIHRoZSBjYWxsYmFjayByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhTb2Z0S2V5Ym9hcmRFbmFibGVkPFQ+KHBhcmFtczogV2l0aFNvZnRLZXlib2FyZEVuYWJsZWRQYXJhbXM8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3Qgc2V0dGluZ1BhcmFtczogRGV2aWNlU2V0dGluZ1BhcmFtcyA9IHtcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkLFxuICAgIG5hbWU6IFNPRlRfS0VZQk9BUkRfU0VUVElOR19OQU1FXG4gIH07XG5cbiAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGF3YWl0IHJlYWREZXZpY2VTZXR0aW5nKHNldHRpbmdQYXJhbXMpO1xuICBhd2FpdCB3cml0ZURldmljZVNldHRpbmcoeyAuLi5zZXR0aW5nUGFyYW1zLCB2YWx1ZTogU09GVF9LRVlCT0FSRF9TRVRUSU5HX09OIH0pO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHBhcmFtcy5jYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIGNvbnN0IHJlc3RvcmUgPSByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmUocHJldmlvdXNWYWx1ZSk7XG4gICAgaWYgKHJlc3RvcmUua2luZCA9PT0gRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLkRlbGV0ZSkge1xuICAgICAgYXdhaXQgZGVsZXRlRGV2aWNlU2V0dGluZyhzZXR0aW5nUGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgd3JpdGVEZXZpY2VTZXR0aW5nKHsgLi4uc2V0dGluZ1BhcmFtcywgdmFsdWU6IHJlc3RvcmUudmFsdWUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZGV2aWNlIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBzZXR0aW5nLCBpdHMgbmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgdG8gd3JpdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHNldHRpbmcgaXMgd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlRGV2aWNlU2V0dGluZyhwYXJhbXM6IFdyaXRlRGV2aWNlU2V0dGluZ1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBidWlsZERldmljZVNldHRpbmdzQ29tbWFuZEFyZ3VtZW50cyh7XG4gICAgICBuYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgIC4uLihwYXJhbXMubmFtZXNwYWNlICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lc3BhY2U6IHBhcmFtcy5uYW1lc3BhY2UgfSksXG4gICAgICB2YWx1ZTogcGFyYW1zLnZhbHVlLFxuICAgICAgdmVyYjogRGV2aWNlU2V0dGluZ1ZlcmIuUHV0XG4gICAgfSksXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQkEsaUJBQTJCO0FBQzNCLG9DQUdPO0FBQ1AscUNBR087QUFzRFAsTUFBTSw2QkFBNkI7QUFFbkMsTUFBTSwyQkFBMkI7QUFRakMsZUFBc0Isb0JBQW9CLFFBQTRDO0FBQ3BGLFlBQU0sdUJBQVc7QUFBQSxJQUNmLHNCQUFrQixvRUFBb0M7QUFBQSxNQUNwRCxNQUFNLE9BQU87QUFBQSxNQUNiLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLE1BQ3BFLE1BQU0saURBQWtCO0FBQUEsSUFDMUIsQ0FBQztBQUFBLElBQ0QsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBU0EsZUFBc0Isa0JBQWtCLFFBQThDO0FBQ3BGLFNBQU8sVUFBTSx1QkFBVztBQUFBLElBQ3RCLHNCQUFrQixvRUFBb0M7QUFBQSxNQUNwRCxNQUFNLE9BQU87QUFBQSxNQUNiLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLE1BQ3BFLE1BQU0saURBQWtCO0FBQUEsSUFDMUIsQ0FBQztBQUFBLElBQ0QsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBWUEsZUFBc0Isd0JBQTJCLFFBQXNEO0FBQ3JHLFFBQU0sZ0JBQXFDO0FBQUEsSUFDekMsVUFBVSxPQUFPO0FBQUEsSUFDakIsTUFBTTtBQUFBLEVBQ1I7QUFFQSxRQUFNLGdCQUFnQixNQUFNLGtCQUFrQixhQUFhO0FBQzNELFFBQU0sbUJBQW1CLEVBQUUsR0FBRyxlQUFlLE9BQU8seUJBQXlCLENBQUM7QUFFOUUsTUFBSTtBQUNGLFdBQU8sTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUMvQixVQUFFO0FBQ0EsVUFBTSxjQUFVLDJEQUE0QixhQUFhO0FBQ3pELFFBQUksUUFBUSxTQUFTLHVEQUF5QixRQUFRO0FBQ3BELFlBQU0sb0JBQW9CLGFBQWE7QUFBQSxJQUN6QyxPQUFPO0FBQ0wsWUFBTSxtQkFBbUIsRUFBRSxHQUFHLGVBQWUsT0FBTyxRQUFRLE1BQU0sQ0FBQztBQUFBLElBQ3JFO0FBQUEsRUFDRjtBQUNGO0FBUUEsZUFBc0IsbUJBQW1CLFFBQWlEO0FBQ3hGLFlBQU0sdUJBQVc7QUFBQSxJQUNmLHNCQUFrQixvRUFBb0M7QUFBQSxNQUNwRCxNQUFNLE9BQU87QUFBQSxNQUNiLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLE1BQ3BFLE9BQU8sT0FBTztBQUFBLE1BQ2QsTUFBTSxpREFBa0I7QUFBQSxJQUMxQixDQUFDO0FBQUEsSUFDRCxVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==