@delacour/warden-e2e 0.0.0-stage → 0.1.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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/chunk-e6pn5ygy.mjs +5832 -0
  3. package/index.d.ts +1 -0
  4. package/index.mjs +1047 -0
  5. package/package.json +49 -4
  6. package/preload.d.ts +1 -0
  7. package/preload.mjs +4788 -0
  8. package/types/core/src/allocate.d.ts +23 -0
  9. package/types/core/src/builds/app-option.schema.d.ts +37 -0
  10. package/types/core/src/builds/install.d.ts +95 -0
  11. package/types/core/src/builds/resolve.d.ts +74 -0
  12. package/types/core/src/config.defaults.d.ts +25 -0
  13. package/types/core/src/exec.d.ts +18 -0
  14. package/types/core/src/liveness.d.ts +12 -0
  15. package/types/core/src/providers/android.d.ts +132 -0
  16. package/types/core/src/providers/health.d.ts +45 -0
  17. package/types/core/src/providers/provider.types.d.ts +56 -0
  18. package/types/core/src/store.d.ts +105 -0
  19. package/types/core/src/types.d.ts +126 -0
  20. package/types/e2e/src/alert-buttons.d.ts +41 -0
  21. package/types/e2e/src/alert-reader.d.ts +25 -0
  22. package/types/e2e/src/app.d.ts +62 -0
  23. package/types/e2e/src/device-devtools.d.ts +26 -0
  24. package/types/e2e/src/device-link.d.ts +43 -0
  25. package/types/e2e/src/device.d.ts +90 -0
  26. package/types/e2e/src/devtools/cdp.d.ts +65 -0
  27. package/types/e2e/src/devtools/console.d.ts +59 -0
  28. package/types/e2e/src/devtools/devtools.types.d.ts +169 -0
  29. package/types/e2e/src/devtools/facet.d.ts +28 -0
  30. package/types/e2e/src/devtools/inspector.d.ts +48 -0
  31. package/types/e2e/src/devtools/jsonl.d.ts +4 -0
  32. package/types/e2e/src/devtools/native-log.d.ts +50 -0
  33. package/types/e2e/src/devtools/network.d.ts +33 -0
  34. package/types/e2e/src/devtools/network.script.d.ts +24 -0
  35. package/types/e2e/src/devtools/session.d.ts +82 -0
  36. package/types/e2e/src/devtools/tree.d.ts +23 -0
  37. package/types/e2e/src/devtools/tree.script.d.ts +33 -0
  38. package/types/e2e/src/driver/alerts.d.ts +29 -0
  39. package/types/e2e/src/driver/android/adb-session.d.ts +52 -0
  40. package/types/e2e/src/driver/android/android-alert.d.ts +4 -0
  41. package/types/e2e/src/driver/android/android-animations.d.ts +29 -0
  42. package/types/e2e/src/driver/android/android-app.d.ts +32 -0
  43. package/types/e2e/src/driver/android/android-argv.d.ts +122 -0
  44. package/types/e2e/src/driver/android/android-device.d.ts +44 -0
  45. package/types/e2e/src/driver/android/android-driver.d.ts +60 -0
  46. package/types/e2e/src/driver/android/android-dump.d.ts +46 -0
  47. package/types/e2e/src/driver/android/android-state.d.ts +69 -0
  48. package/types/e2e/src/driver/android/uiad-backend.d.ts +63 -0
  49. package/types/e2e/src/driver/android/uiad-client.d.ts +60 -0
  50. package/types/e2e/src/driver/android/uiad-device.d.ts +70 -0
  51. package/types/e2e/src/driver/android/uiad-dex.generated.d.ts +8 -0
  52. package/types/e2e/src/driver/android/uiad-ops.d.ts +62 -0
  53. package/types/e2e/src/driver/android/uiad-protocol.d.ts +209 -0
  54. package/types/e2e/src/driver/android/uiautomator.d.ts +33 -0
  55. package/types/e2e/src/driver/driver.types.d.ts +231 -0
  56. package/types/e2e/src/driver/errors.d.ts +13 -0
  57. package/types/e2e/src/driver/gesture-geometry.d.ts +48 -0
  58. package/types/e2e/src/driver/ios/hid-recovery.d.ts +36 -0
  59. package/types/e2e/src/driver/ios/ios-driver.d.ts +63 -0
  60. package/types/e2e/src/driver/ios/ios-session.d.ts +30 -0
  61. package/types/e2e/src/driver/ios/locate-helper.d.ts +38 -0
  62. package/types/e2e/src/driver/ios/normalize.d.ts +11 -0
  63. package/types/e2e/src/driver/ios/simctl.d.ts +102 -0
  64. package/types/e2e/src/driver/ios/simd-client.d.ts +68 -0
  65. package/types/e2e/src/driver/ios/simd-protocol.d.ts +433 -0
  66. package/types/e2e/src/driver/ios/simd-transport.d.ts +43 -0
  67. package/types/e2e/src/driver/ios/type-budget.d.ts +6 -0
  68. package/types/e2e/src/driver/observation-cache.d.ts +66 -0
  69. package/types/e2e/src/driver/open.d.ts +29 -0
  70. package/types/e2e/src/driver/settle.d.ts +43 -0
  71. package/types/e2e/src/driver/span-detail.d.ts +12 -0
  72. package/types/e2e/src/driver/traced-driver.d.ts +14 -0
  73. package/types/e2e/src/driver/typing.d.ts +48 -0
  74. package/types/e2e/src/driver/unwrap.d.ts +13 -0
  75. package/types/e2e/src/env.d.ts +78 -0
  76. package/types/e2e/src/errors.d.ts +26 -0
  77. package/types/e2e/src/expect/expect.d.ts +27 -0
  78. package/types/e2e/src/expect/matchers.d.ts +72 -0
  79. package/types/e2e/src/fixture-session.d.ts +38 -0
  80. package/types/e2e/src/fixtures.d.ts +14 -0
  81. package/types/e2e/src/index.d.ts +11 -0
  82. package/types/e2e/src/perf/budgets.d.ts +33 -0
  83. package/types/e2e/src/perf/device-perf.d.ts +45 -0
  84. package/types/e2e/src/perf/perf.types.d.ts +59 -0
  85. package/types/e2e/src/preload.d.ts +29 -0
  86. package/types/e2e/src/runner/artifacts.d.ts +13 -0
  87. package/types/e2e/src/runner/attempt.d.ts +63 -0
  88. package/types/e2e/src/runner/callsite.d.ts +2 -0
  89. package/types/e2e/src/runner/failure.d.ts +40 -0
  90. package/types/e2e/src/runner/fixtures.types.d.ts +60 -0
  91. package/types/e2e/src/runner/results.d.ts +48 -0
  92. package/types/e2e/src/runner/scope.d.ts +64 -0
  93. package/types/e2e/src/runner/span.d.ts +40 -0
  94. package/types/e2e/src/runner/step.d.ts +7 -0
  95. package/types/e2e/src/runner/test.d.ts +59 -0
  96. package/types/e2e/src/runner/trace.d.ts +87 -0
  97. package/types/e2e/src/screen/actions.d.ts +93 -0
  98. package/types/e2e/src/screen/context.d.ts +134 -0
  99. package/types/e2e/src/screen/field.d.ts +121 -0
  100. package/types/e2e/src/screen/locator.d.ts +233 -0
  101. package/types/e2e/src/screen/nodes.d.ts +53 -0
  102. package/types/e2e/src/screen/poll.d.ts +57 -0
  103. package/types/e2e/src/screen/queries.d.ts +34 -0
  104. package/types/e2e/src/screen/query.d.ts +60 -0
  105. package/types/e2e/src/screen/react-locator.d.ts +30 -0
  106. package/types/e2e/src/screen/render.d.ts +42 -0
  107. package/types/e2e/src/screen/roles.d.ts +24 -0
  108. package/types/e2e/src/screen/screen.d.ts +61 -0
  109. package/types/e2e/src/screen/selector.d.ts +38 -0
  110. package/types/e2e/src/screen/text.d.ts +13 -0
  111. package/types/e2e/src/session.d.ts +124 -0
  112. package/types/e2e/src/traced-device.d.ts +9 -0
  113. package/types/e2e/src/version.d.ts +7 -0
  114. package/types/types/src/result.d.ts +12 -0
  115. package/README.md +0 -3
@@ -0,0 +1,8 @@
1
+ export declare const UIAD_DEX: {
2
+ readonly protocol: 1;
3
+ readonly version: "0.3.0";
4
+ readonly bytes: 31124;
5
+ readonly dexSha256: "d6cb11a3bffc6b00d3ea46c4fdd1721c23973b72b0769f26c2478e7a1769be4c";
6
+ readonly sourceSha256: "d03ff47b9a5890fcc8de5d76b504b05c90402edda60ac69f765c78ec8195cfdc";
7
+ readonly base64: "ZGV4CjAzOAALAG3vu0DO4qAAXoGM16R6HlujKaD7mhyUeQAAcAAAAHhWNBIAAAAAAAAAAMR4AAA8AgAAcAAAAF0AAABgCQAAeQAAANQKAAA+AAAAgBAAAOkAAABwEgAACAAAALgZAADcXgAAuBoAAM5TAADQUwAA01MAAN9TAADqUwAA9lMAAPpTAAD9UwAAAFQAABBUAAAdVAAAKFQAADlUAABIVAAAV1QAAGFUAABzVAAAglQAAJBUAACiVAAAs1QAAL9UAADLVAAA2lQAAOVUAADzVAAAAFUAAAtVAAATVQAAHlUAADRVAABIVQAAX1UAAGpVAABzVQAAfVUAAItVAAChVQAArVUAAMJVAADPVQAA3lUAAAZWAAAUVgAAH1YAACtWAAA2VgAAQFYAAHFWAAB6VgAAhFYAAI1WAACoVgAAtlYAAMNWAADGVgAAzVYAANFWAADYVgAA4lYAAOpWAADvVgAAElcAADdXAABeVwAAjFcAALVXAAC8VwAAz1cAANJXAADWVwAA2VcAAN1XAADiVwAA9FcAAANYAAAKWAAAFlgAABxYAAAqWAAAOVgAADxYAABQWAAAYFgAAGNYAABoWAAAbFgAAHFYAAB0WAAAeFgAAHxYAACBWAAAhVgAAIpYAACVWAAAmFgAAJxYAACgWAAAq1gAALRYAAC4WAAAvVgAAMVYAADJWAAA0FgAANVYAADeWAAA51gAAPhYAAD8WAAAA1kAAAhZAAANWQAAE1kAABdZAABQWQAAiVkAAKVZAADPWQAA6lkAAANaAAAfWgAAM1oAAEhaAABkWgAAeVoAAI9aAACpWgAAwFoAAN9aAAD3WgAAElsAACtbAABVWwAAg1sAAJ9bAADQWwAABFwAADpcAABeXAAAg1wAAKNcAADGXAAA7FwAAAtdAAAnXQAARl0AAGBdAACBXQAAm10AALddAADOXQAA5V0AAAJeAAAaXgAAMV4AAENeAABYXgAAcl4AAIVeAACZXgAAsF4AAMNeAADYXgAA+l4AAAxfAAAvXwAAQ18AAFlfAABtXwAAiF8AAJxfAACwXwAAx18AAOJfAAADYAAAMmAAAE5gAABqYAAAgWAAAJdgAACpYAAAu2AAAN5gAAADYQAAJmEAAEphAAB0YQAApmEAAM1hAADvYQAABWIAAB9iAAA2YgAAPWIAAEhiAABRYgAAVmIAAGBiAABpYgAAcmIAAINiAACJYgAAk2IAAJpiAADZYgAACmMAABRjAAAXYwAAIGMAACRjAAArYwAAL2MAADZjAAA/YwAASWMAAE1jAABSYwAAWmMAAF9jAABlYwAAamMAAG5jAAB0YwAAd2MAAHtjAAB/YwAAhGMAAIhjAACOYwAAlGMAAJljAACeYwAApWMAAKxjAACwYwAAtGMAAN9jAAAOZAAAImQAADdkAABMZAAAUmQAAFZkAABaZAAAXmQAAGJkAABmZAAAamQAAHpkAAB+ZAAAoGQAALtkAADHZAAA02QAAN9kAADrZAAA92QAAARlAAAMZQAAGGUAAB1lAAAiZQAATGUAAGBlAACFZQAAqWUAANhlAADgZQAA7GUAAPhlAAAGZgAADmYAAB1mAAAlZgAAMGYAADlmAABAZgAATGYAAFdmAABeZgAAZGYAAG5mAAB3ZgAAgmYAAJBmAACbZgAAp2YAALdmAADBZgAAyGYAAM9mAADYZgAA3mYAAOdmAADxZgAA/WYAAAZnAAAUZwAAGmcAACZnAAAwZwAAQGcAAEhnAABNZwAAWGcAAGRnAAB1ZwAAgGcAAIxnAACSZwAAmWcAAL1nAADIZwAAzmcAANVnAADcZwAA52cAAPBnAAD+ZwAAB2gAABBoAAAuaAAANWgAADxoAABFaAAAaGgAAIRoAACgaAAArmgAALNoAADGaAAA0GgAANpoAADkaAAA82gAAP1oAAALaQAAImkAADppAABNaQAAWGkAAGlpAAB3aQAAgmkAAI9pAACWaQAAo2kAAKtpAAC5aQAAyGkAANJpAADdaQAA6WkAAPRpAAD9aQAADWoAAB1qAAAtagAANmoAAE1qAABaagAAamoAAHVqAAB+agAAk2oAAKpqAAC0agAAvWoAANRqAADeagAA6moAAPJqAAD7agAABWsAAA1rAAAVawAAI2sAAC1rAAAzawAAO2sAAF5rAABiawAAamsAAG5rAACAawAAjWsAAJVrAACeawAAp2sAALZrAADIawAA42sAAAdsAAAXbAAALmwAADlsAABEbAAAT2wAAFdsAABhbAAAbmwAAHlsAACGbAAAkmwAAJtsAACmbAAAs2wAAL5sAADKbAAA22wAAOJsAADubAAA/GwAAAhtAAAbbQAALG0AADZtAABFbQAASm0AAFNtAABgbQAAbW0AAHNtAAB7bQAAgG0AAI9tAACVbQAAm20AAKBtAACqbQAAtW0AALptAADCbQAAyW0AANBtAADWbQAA3W0AAOptAADwbQAAAm4AACNuAABHbgAAiG4AAKRuAACrbgAAtm4AAL5uAADUbgAA2G4AAORuAADvbgAA924AAABvAAALbwAAEG8AABpvAAAhbwAAMG8AADVvAABMbwAAX28AAGhvAABybwAAg28AAItvAACObwAAl28AAKNvAACqbwAAtG8AAL1vAADGbwAA0W8AAN1vAADobwAA728AAPtvAAACcAAAB3AAAAtwAAAScAAAHnAAACpwAAA2cAAAQXAAAEtwAABRcAAAWHAAAGdwAABycAAAiXAAAKpwAACycAAAwHAAANBwAADbcAAA5HAAAOxwAAD2cAAAA3EAAAlxAAAYcQAAH3EAAClxAAA6cQAAQXEAAExxAABUcQAAW3EAAHhxAAB9cQAAinEAAJFxAACXcQAAp3EAAMVxAADKcQAA0HEAAB9yAAAncgAAL3IAADpyAABBcgAATnIAAFtyAABlcgAAb3IAAHRyAAB6cgAAhXIAAI9yAACTcgAApnIAALRyAADCcgAAyXIAANJyAADhcgAA53IAAPRyAAAEcwAAC3MAABhzAAAhcwAALnMAADVzAAA4cwAAPHMAAEBzAABDcwAAR3MAAEtzAABocwAAcnMAAH5zAACZcwAAvHMAANVzAAD/cwAAC3QAABN0AAAfdAAAKnQAADR0AABBdAAATHQAAFB0AABTdAAAaXQAAHh0AAB9dAAARAAAAEYAAABQAAAAUwAAAFcAAAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAAAIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAAjgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACcAAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoAAACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtgAAALcAAAC4AAAAuQAAALoAAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADPAAAA3wAAAOoAAADrAAAA7AAAAO0AAADuAAAA7wAAAPAAAADxAAAARQAAAAAAAAA0UQAARwAAAAEAAAA8UQAASAAAAAEAAABEUQAAUwAAAAMAAAAAAAAAVAAAAAMAAABMUQAAVQAAAAMAAAA8UQAAVgAAAAMAAABUUQAAVwAAAAQAAAAAAAAAWAAAAAQAAABcUQAAWQAAAAQAAABkUQAAWgAAAAQAAABsUQAAXAAAAAQAAAB0UQAAWwAAAAQAAAB8UQAAXAAAAAQAAACEUQAAXgAAAAUAAAAAAAAAXgAAAAkAAAAAAAAAbwAAAAoAAACMUQAAXgAAAA8AAAAAAAAAZwAAABkAAACUUQAAaQAAABkAAACgUQAAawAAABkAAACwUQAAagAAABkAAADQUQAAXgAAABsAAAAAAAAAYwAAABsAAAA0UQAAZgAAABsAAABkUQAAcQAAAC8AAADgUQAAXgAAADAAAAAAAAAAZAAAADAAAABMUQAAbAAAADAAAADoUQAAXgAAADEAAAAAAAAAbAAAADEAAAA8UQAAYwAAADUAAAA0UQAAXgAAADkAAAAAAAAAYwAAADkAAAA0UQAAbwAAADkAAADwUQAAbwAAADkAAAD4UQAAbAAAADkAAAB8UQAAbAAAADkAAAAAUgAAXgAAADsAAAAAAAAAYQAAADsAAAAIUgAAYgAAADsAAAAcUgAAYwAAADsAAAA0UQAAZQAAADsAAAAsUgAAaAAAADsAAABsUQAAbAAAADsAAAA8UgAAbAAAADsAAAA8UQAAbwAAADsAAABEUgAAcAAAADsAAABMUgAAbAAAADsAAABYUgAAbQAAADsAAABgUgAAbgAAADsAAABsUgAAXwAAADwAAAB0UgAAYAAAADwAAAB8UgAAYwAAADwAAAA0UQAAZgAAADwAAABkUQAAbAAAADwAAACEUgAAbAAAADwAAAA8UgAAbAAAADwAAAA8UQAAbAAAADwAAACMUgAAcQAAADwAAADgUQAAXgAAAD8AAAAAAAAAbAAAAEEAAACUUgAAbwAAAEMAAACcUgAAbAAAAEQAAAA8UQAAXgAAAEYAAAAAAAAAXgAAAEcAAAAAAAAAbAAAAEcAAAA8UQAAbAAAAEwAAAA8UQAAbAAAAE0AAACkUgAA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KABIADsBAAAoAGcAIQIAACsAVwA7AAAALwBpAA4BAAAvABkAGAIAADAAAAARAQAAMAADAKcBAAAwABsA/wEAADAAJgANAgAAMQAeAD8BAAAxAD0AUgEAADEAPgBTAQAAMQA+AGEBAAAxACYAYgEAADIAagCYAQAAMgBqAJoBAAAzAFsAOwAAADUAKQAMAgAANQAfABgCAAA3AAQArAEAADcACgCsAQAANwAEAK8BAAA3AAoArwEAADcACADdAQAAOQBIADsAAAA5AB0ATwEAADkASAC9AQAAOQBLABoCAAA7AHEAIAEAADsAcgAuAQAAOwB4AEsBAAA7AAMAdQEAADsAaQCUAQAAOwADAKcBAAA7ACYAEAIAADsALAAYAgAAPABIADsAAAA8AEkAOwAAADwAWwA7AAAAPAAzAAsBAAA8ADQACwEAADwANQALAQAAPAA2AAsBAAA8ADcACwEAADwAOAALAQAAPAA5AAsBAAA8ADsACwEAADwAJgANAgAAPQBJADUBAAA9AFgA7AEAAD4AWgA7AAAAPgBIAPkBAAA/ACYAYAEAAD8AJgANAgAAQAAiALUBAABBACUAtQEAAEEAZgDoAQAAQgA8AEwBAABDACMAjgEAAEMAZgDoAQAARAA/AD8BAABFAEgAOwAAAEYAaQB0AQAARgAgALYBAABHAHIABAEAAEcAIQBJAQAARwBpAJQBAABHAEAAoAEAAEcAAwD0AQAASABIADsAAABIAHQANgEAAEgAdQA5AQAASABiAP4BAABJAEgAOwAAAEkASADeAQAASgBIADoAAABKAEgAOwAAAEoASAD8AAAASgAvAP0AAABKAFsA/gAAAEoALwAwAQAASgB2AHMBAABKAF4AqAEAAEoAaACrAQAASgAtANQBAABKAFsA5gEAAEoASADnAQAASgBEAPgBAABLAGUAOwAAAEsAVAC/AQAATABfADsAAABMACYAYAEAAE0ASAA7AAAATgBhADsAAABPAEgAOwAAAE8AawD8AAAATwAkAP0AAABPAA0A/wAAAE8ADAAAAQAATwAYAAMBAABPAEMADQEAAE8ATAAQAQAATwBIABUBAABPAEgAFwEAAE8ASAAaAQAATwBkACoBAABPAAkAMgEAAE8AFgA+AQAATwAxAEQBAABPABUASAEAAE8AJgB2AQAATwAcAHkBAABPAEgA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ABAsImRpc3BsYXlFcnJvciI6AA0sImVsZW1lbnRzIjpbAAwsImVuY29kZU1zIjoAECwiZmlyc3RFdmVudE1zIjoADywiZm9jdXNlZCI6dHJ1ZQAKLCJncmFiTXMiOgAKLCJoZWlnaHQiOgANLCJsYXN0QWdvTXMiOgAJLCJsYXllciI6AAwsIm1heExhZ01zIjoACywibWVzc2FnZSI6AAksIm1vZGVsIjoABiwibXMiOgAJLCJub2RlcyI6ABQsIm9rIjpmYWxzZSwiZXJyb3IiOgASLCJvayI6dHJ1ZSwiZGF0YSI6ABUsIm9rIjp0cnVlLCJkYXRhIjp7fX0ACSwib3JkZXIiOgAHLCJwaWQiOgAILCJwbmciOiIADCwicG9pbnRlcnMiOgAULCJwcm90b2NvbCI6MSwic2RrIjoACiwicmVhZE1zIjoAEywicmVhc29uIjoidGltZW91dCIACywicmVsZWFzZSI6AA0sInJldHJ5YWJsZSI6ACYsInJldHJ5YWJsZSI6ZmFsc2UsImRldGFpbCI6eyJyZWFzb24iOgAMLCJyb3RhdGlvbiI6AAksInNjYWxlIjoACiwic2NyZWVuIjoACSwidGl0bGUiOgAILCJ0eXBlIjoALywidWlBdXRvbWF0aW9uIjp7InN0YXRlIjoiY29ubmVjdGVkIiwiY29ubmVjdCI6AAcsInVpZCI6AAgsInVwTXMiOgAHLCJ2aWEiOgAZLCJ2aWEiOiJldmVudHMiLCJldmVudHMiOgAMLCJ3YWl0ZWRNcyI6AAssIndpbmRvd3MiOgABLwAFMC4zLjAAAjogAAU6dHJ1ZQAIPGNsaW5pdD4ABjxpbml0PgADPjspACFBQ1RJT05fQVJHVU1FTlRfU0VMRUNUSU9OX0VORF9JTlQAI0FDVElPTl9BUkdVTUVOVF9TRUxFQ1RJT05fU1RBUlRfSU5UACVBQ1RJT05fQVJHVU1FTlRfU0VUX1RFWFRfQ0hBUlNFUVVFTkNFACxBQ1RJT05fU0VUX1NFTEVDVElPTiB3YXMgcmVmdXNlZCBieSB0aGUgbm9kZQAnQUNUSU9OX1NFVF9URVhUIHdhcyByZWZ1c2VkIGJ5IHRoZSBub2RlAAVBU0NJSQARQWxyZWFkeSBjb25uZWN0ZWQAAUMAAkNJAAFEAAJETAADRExEABBFX0FYX1VOQVZBSUxBQkxFAA1FX0JBRF9SRVFVRVNUAAVFX0hJRAAKRV9JTlRFUk5BTAAERV9JTwAMRV9OT19FTEVNRU5UAA1FX1VOU1VQUE9SVEVEAAFGABJHRVNUVVJFX01BWF9GUkFNRVMADkdFU1RVUkVfTUFYX01TAAFJAANJSUkAAklMAANJTEkAAUoAAkpEAAJKSgADSkpKAAJKTAADSkxKAAlKc29uLmphdmEAAUwAAkxDAAJMRgAJTEZGRkZKSUpKAAdMRkZJSkpaAAJMSQADTElJAAZMSUlJSloAAkxKAAVMSklGRgADTEpKAAdMSkpJRkZJAAdMSkpJSUxJAA9MSkpJSUxMSUlGRklJSUkAAkxMAAVMTERKSgADTExJAANMTEwABExMTFoAAkxaADdMYW5kcm9pZC9hY2Nlc3NpYmlsaXR5c2VydmljZS9BY2Nlc3NpYmlsaXR5U2VydmljZUluZm87ADdMYW5kcm9pZC9hcHAvVWlBdXRvbWF0aW9uJE9uQWNjZXNzaWJpbGl0eUV2ZW50TGlzdGVuZXI7ABpMYW5kcm9pZC9hcHAvVWlBdXRvbWF0aW9uOwAoTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwJENvbXByZXNzRm9ybWF0OwAZTGFuZHJvaWQvZ3JhcGhpY3MvQml0bWFwOwAXTGFuZHJvaWQvZ3JhcGhpY3MvUmVjdDsAGkxhbmRyb2lkL29zL0J1aWxkJFZFUlNJT047ABJMYW5kcm9pZC9vcy9CdWlsZDsAE0xhbmRyb2lkL29zL0J1bmRsZTsAGkxhbmRyb2lkL29zL0hhbmRsZXJUaHJlYWQ7ABNMYW5kcm9pZC9vcy9Mb29wZXI7ABRMYW5kcm9pZC9vcy9Qcm9jZXNzOwAYTGFuZHJvaWQvb3MvU3lzdGVtQ2xvY2s7ABVMYW5kcm9pZC91dGlsL0Jhc2U2NDsAHUxhbmRyb2lkL3V0aWwvRGlzcGxheU1ldHJpY3M7ABZMYW5kcm9pZC92aWV3L0Rpc3BsYXk7ABlMYW5kcm9pZC92aWV3L0lucHV0RXZlbnQ7ABdMYW5kcm9pZC92aWV3L0tleUV2ZW50OwAoTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyQ29vcmRzOwAsTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyUHJvcGVydGllczsAGkxhbmRyb2lkL3ZpZXcvTW90aW9uRXZlbnQ7AC9MYW5kcm9pZC92aWV3L2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eUV2ZW50OwAyTGFuZHJvaWQvdmlldy9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlOb2RlSW5mbzsANExhbmRyb2lkL3ZpZXcvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5V2luZG93SW5mbzsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAI0xkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdNZXRob2Q7AB5MZGFsdmlrL2Fubm90YXRpb24vSW5uZXJDbGFzczsAIUxkYWx2aWsvYW5ub3RhdGlvbi9NZW1iZXJDbGFzc2VzOwAkTGRhbHZpay9hbm5vdGF0aW9uL01ldGhvZFBhcmFtZXRlcnM7AB1MZGFsdmlrL2Fubm90YXRpb24vU2lnbmF0dXJlOwAaTGRhbHZpay9hbm5vdGF0aW9uL1Rocm93czsAHUxqYXZhL2lvL0J1ZmZlcmVkSW5wdXRTdHJlYW07ABhMamF2YS9pby9CdWZmZXJlZFJlYWRlcjsAH0xqYXZhL2lvL0J5dGVBcnJheU91dHB1dFN0cmVhbTsAGExqYXZhL2lvL0ZpbGVEZXNjcmlwdG9yOwAaTGphdmEvaW8vRmlsZU91dHB1dFN0cmVhbTsAFUxqYXZhL2lvL0lPRXhjZXB0aW9uOwAVTGphdmEvaW8vSW5wdXRTdHJlYW07ABtMamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcjsAFkxqYXZhL2lvL091dHB1dFN0cmVhbTsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwAQTGphdmEvaW8vUmVhZGVyOwATTGphdmEvbGFuZy9Cb29sZWFuOwAYTGphdmEvbGFuZy9DaGFyU2VxdWVuY2U7ABFMamF2YS9sYW5nL0NsYXNzOwASTGphdmEvbGFuZy9Eb3VibGU7ABVMamF2YS9sYW5nL0V4Y2VwdGlvbjsAEUxqYXZhL2xhbmcvRmxvYXQ7ABNMamF2YS9sYW5nL0ludGVnZXI7ACBMamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uOwAQTGphdmEvbGFuZy9NYXRoOwAhTGphdmEvbGFuZy9Ob1N1Y2hNZXRob2RFeGNlcHRpb247ABJMamF2YS9sYW5nL09iamVjdDsAFExqYXZhL2xhbmcvUnVubmFibGU7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAEkxqYXZhL2xhbmcvU3lzdGVtOwASTGphdmEvbGFuZy9UaHJlYWQ7ABVMamF2YS9sYW5nL1Rocm93YWJsZTsAGUxqYXZhL2xhbmcvcmVmbGVjdC9BcnJheTsAH0xqYXZhL2xhbmcvcmVmbGVjdC9Db25zdHJ1Y3RvcjsALUxqYXZhL2xhbmcvcmVmbGVjdC9JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsAGkxqYXZhL25pby9jaGFyc2V0L0NoYXJzZXQ7ABVMamF2YS91dGlsL0FycmF5TGlzdDsAFExqYXZhL3V0aWwvSXRlcmF0b3I7ABBMamF2YS91dGlsL0xpc3Q7ABBMamF2YS91dGlsL0xpc3Q8ACFMbnovY28vZGVsYWNvdXIvd2FyZGVuL3VpYWQvSnNvbjsAI0xuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9NYWluJDE7ACFMbnovY28vZGVsYWNvdXIvd2FyZGVuL3VpYWQvTWFpbjsAIkxuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkMTsAKExuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkT3BFcnJvcjsAMExuei9jby9kZWxhY291ci93YXJkZW4vdWlhZC9VaWEkU25hcHNob3RPcHRpb25zOwAlTG56L2NvL2RlbGFjb3VyL3dhcmRlbi91aWFkL1VpYSRXYWxrOwAgTG56L2NvL2RlbGFjb3VyL3dhcmRlbi91aWFkL1VpYTsAFExvcmcvanNvbi9KU09OQXJyYXk7ABhMb3JnL2pzb24vSlNPTkV4Y2VwdGlvbjsAFUxvcmcvanNvbi9KU09OT2JqZWN0OwAFTU9ERUwACU1haW4uamF2YQAHT3BFcnJvcgADUE5HAAhQUk9UT0NPTAAHUkVMRUFTRQAHU0RLX0lOVAAPU25hcHNob3RPcHRpb25zAARUWVBFAAhVUy1BU0NJSQAFVVRGLTgAPVVpQXV0b21hdGlvbihMb29wZXIsIElVaUF1dG9tYXRpb25Db25uZWN0aW9uKSBtaXNzaW5nIG9uIEFQSSAAL1VpQXV0b21hdGlvbkNvbm5lY3Rpb24gaXMgbm90IHJlYWNoYWJsZSBvbiBBUEkgAAhVaWEuamF2YQABVgAHVkVSU0lPTgACVkkABVZJSUlJAAJWSgAFVkpJTEkAB1ZKSklJSUkACFZKSklJTElaAAJWTAADVkxJAAZWTElJSVoAA1ZMTAAEVkxMWgADVkxaAAJWWgAEV2FsawABWgACWkQAAlpJAANaSUwAAlpMAARaTElJAARaTElMAANaTEwAA1pMWgAFWkxaTEwABVpMWkxaAAJbQgACW0kAKVtMYW5kcm9pZC92aWV3L01vdGlvbkV2ZW50JFBvaW50ZXJDb29yZHM7AC1bTGFuZHJvaWQvdmlldy9Nb3Rpb25FdmVudCRQb2ludGVyUHJvcGVydGllczsAEltMamF2YS9sYW5nL0NsYXNzOwATW0xqYXZhL2xhbmcvT2JqZWN0OwATW0xqYXZhL2xhbmcvU3RyaW5nOwAEW1tbRgACXCIAAlxcAAJcbgACXHIAAlx0AAJcdQAOXSwidHJ1bmNhdGVkIjoAAl19ACBhIGdlc3R1cmUgbGFzdHMgYXQgbW9zdCA2MDAwMCBtcwAZYSBwYXRoIGhhcyAxLi4xMDAwIHBvaW50cwAKYWNjZXNzJDAwMAAKYWNjZXNzJDEwMAAKYWNjZXNzJDIwMAAKYWNjZXNzJDIwMgAKYWNjZXNzJDMwOAALYWNjZXNzRmxhZ3MABmFjdGl2ZQAKYWN0aXZlUm9vdAADYWRkAANhbGwAKGFsbCBwYXRocyBuZWVkIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMAEmFscmVhZHkgcmVnaXN0ZXJlZAAjYW5kcm9pZC5hcHAuSVVpQXV0b21hdGlvbkNvbm5lY3Rpb24AImFuZHJvaWQuYXBwLlVpQXV0b21hdGlvbkNvbm5lY3Rpb24ALWFuZHJvaWQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckdsb2JhbAAGYXBwZW5kAApiYWQgcGF0aDogAApiYWRHZXN0dXJlAAxib29sZWFuVmFsdWUABmJvdHRvbQANY2FuY2VsR2VzdHVyZQAGY2hhckF0AAljaGVja2FibGUAB2NoZWNrZWQABWNsYXNzAApjbGVhckNhY2hlAAljbGlja2FibGUABWNsb3NlAARjb2RlAAhjb21wcmVzcwAHY29ubmVjdAAJY29ubmVjdCgpAAxjb25uZWN0KGludCkACWNvbm5lY3RNcwAKY29ubmVjdFZpYQAOY29ubmVjdF9mYWlsZWQACGNvbnRhaW5zAAVjb3VudAAFZGVidWcAB2RlbnNpdHkABGRlc2MAB2Rlc3Ryb3kACGRpc2FibGVkAApkaXNjb25uZWN0AAdkaXNwbGF5AAxkaXNwbGF5RXJyb3IABGR1bXAACmR1cmF0aW9uTXMACGVkaXRhYmxlAA5lbmNvZGVUb1N0cmluZwAGZXF1YWxzAANlcnIACWVycm9ySnNvbgAKZXZlbnRDb3VudAAPZXZlbnRDb3VudFNpbmNlAAlldmVudExvY2sACmV2ZW50VHlwZXMABGV4aXQABWZpZWxkACJmaW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5Vmlld0lkAAlmaW5kRm9jdXMABGZsYWcABWZsYWdzAAVmbHVzaAAJZm9jdXNhYmxlAAdmb2N1c2VkAAxmb2N1c2VkSW5wdXQAB2Zvck5hbWUAB2ZyYW1lTXMAHGZyYW1lTXMgbXVzdCBiZSBpbiAoMCwgMTAwMF0ABWZyZXNoAAVnYXBNcwAHZ2VzdHVyZQAhZ2VzdHVyZSBmYWlsZWQgYmVmb3JlIGFueSBpbnB1dDogABpnZXN0dXJlIGludGVycnVwdGVkIGFmdGVyIAAaZ2VzdHVyZSB0YWtlcyAxIG9yIDIgcGF0aHMADGdlc3R1cmVFdmVudAADZ2V0ABFnZXRCb3VuZHNJblNjcmVlbgAIZ2V0Qnl0ZXMACGdldENhdXNlAAhnZXRDaGlsZAANZ2V0Q2hpbGRDb3VudAAIZ2V0Q2xhc3MADGdldENsYXNzTmFtZQAVZ2V0Q29udGVudERlc2NyaXB0aW9uABZnZXREZWNsYXJlZENvbnN0cnVjdG9yABFnZXREZWNsYXJlZE1ldGhvZAAJZ2V0RG91YmxlAA9nZXREcmF3aW5nT3JkZXIADGdldEV2ZW50VHlwZQAJZ2V0SGVpZ2h0AAtnZXRIaW50VGV4dAAFZ2V0SWQAC2dldEluc3RhbmNlAAZnZXRJbnQADGdldEpTT05BcnJheQANZ2V0SlNPTk9iamVjdAAIZ2V0TGF5ZXIACWdldExvb3BlcgAKZ2V0TWVzc2FnZQAJZ2V0TWV0aG9kAAdnZXROYW1lAA5nZXRQYWNrYWdlTmFtZQAOZ2V0UmVhbERpc3BsYXkADmdldFJlYWxNZXRyaWNzAAdnZXRSb290ABVnZXRSb290SW5BY3RpdmVXaW5kb3cAC2dldFJvdGF0aW9uAA5nZXRTZXJ2aWNlSW5mbwAJZ2V0U3RyaW5nAAdnZXRUZXh0ABNnZXRUZXh0U2VsZWN0aW9uRW5kABVnZXRUZXh0U2VsZWN0aW9uU3RhcnQACGdldFRpdGxlAAdnZXRUeXBlABVnZXRWaWV3SWRSZXNvdXJjZU5hbWUACGdldFdpZHRoAApnZXRXaW5kb3dzAAZoYW5kbGUAB2hhc05leHQACGhhc2hDb2RlAAZoZWFsdGgABmhlaWdodAAMaGVpZ2h0UGl4ZWxzAAhoZWxkVGV4dAAEaGludAAGaG9sZE1zACFob2xkTXMgYW5kIHJlbGVhc2VNcyBtdXN0IGJlID49IDAAAmlkAAZpZGxlTXMAAmluABBpbmNsdWRlSW52aXNpYmxlAAtpbml0RGlzcGxheQAGaW5qZWN0AAdpbmplY3QyAAdpbmplY3QzAA1pbmplY3RHZXN0dXJlABBpbmplY3RJbnB1dEV2ZW50ABlpbmplY3RJbnB1dEV2ZW50IGZhaWxlZDogACJpbmplY3RJbnB1dEV2ZW50IHJlZnVzZWQgdGhlIGV2ZW50AA5pbmplY3RMb29rZWRVcAAVaW5qZWN0Tm9BbmltYXRpb25XYWl0AAlpbmplY3RPbmUACWludGVyc2VjdAAJaW52aXNpYmxlAAZpbnZva2UACGlzQWN0aXZlAAtpc0NoZWNrYWJsZQAJaXNDaGVja2VkAAtpc0NsaWNrYWJsZQAKaXNFZGl0YWJsZQAHaXNFbXB0eQAJaXNFbmFibGVkAAtpc0ZvY3VzYWJsZQAJaXNGb2N1c2VkAAppc0luZmluaXRlAA9pc0xvbmdDbGlja2FibGUABWlzTmFOAAppc1Bhc3N3b3JkAAxpc1Njcm9sbGFibGUACmlzU2VsZWN0ZWQAEWlzU2hvd2luZ0hpbnRUZXh0AA9pc1Zpc2libGVUb1VzZXIACGl0ZXJhdG9yAA1rZWVwSW52aXNpYmxlAANrZXkAB2tleUNvZGUAC2xhc3RFdmVudE1zAAtsYXN0SW5wdXRNcwAEbGVmdAAGbGVuZ3RoAANsb2cADWxvbmdDbGlja2FibGUABGxvb3AABG1haW4AA21heAAIbWF4Tm9kZXMACW1ldGFTdGF0ZQADbWluAAZtb3Rpb24ABW15UGlkAAVteVVpZAAEbmFtZQAFbmFtZXMAC25ld0luc3RhbmNlAARuZXh0ABBubyBmb2N1c2VkIGlucHV0AB9ubyBmb2N1c2VkIGlucHV0IHRvIHNldCB0ZXh0IG9uACJubyByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgd2luZG93AD9ubyByb290IG5vZGUgZm9yIHRoZSBhY3RpdmUgd2luZG93IChVaUF1dG9tYXRpb24gcmV0dXJuZWQgbnVsbCkAGm5vIHdpbmRvdyB3aXRoIGEgcm9vdCBub2RlAAVub2RlcwAJbm90aWZ5QWxsAAZvYnRhaW4AFG9uQWNjZXNzaWJpbGl0eUV2ZW50AAJvcAAKb3B0Qm9vbGVhbgAJb3B0RG91YmxlAAZvcHRJbnQAB29wdExvbmcACW9wdFN0cmluZwADb3V0AAhwYXNzd29yZAAFcGF0aHMADXBlcmZvcm1BY3Rpb24AA3BrZwAVcG9pbnRzIG11c3QgYmUgZmluaXRlABFwcmVwYXJlTWFpbkxvb3BlcgAHcHJlc3NNcwAIcHJlc3N1cmUAD3B1dENoYXJTZXF1ZW5jZQAGcHV0SW50AAFxAAdxdWlldE1zAApxdWl0U2FmZWx5AAVxdW90ZQAIcmVhZExpbmUAB3JlY3ljbGUAB3JlZnJlc2gACXJlbGVhc2VNcwAKcmVzb3VyY2VJZAAJcmV0cnlhYmxlAAVyaWdodAAKcm9vdFdhaXRNcwAFcm91bmQAA3J1bgACc2IABXNjb3BlAApzY3JlZW5Kc29uAApzY3JlZW5zaG90AApzY3JvbGxhYmxlAAlzZWxlY3RBbGwACHNlbGVjdGVkAARzZW5kAAVzZXJ2ZQANc2V0QWNjZXNzaWJsZQAJc2V0RGFlbW9uABVzZXRJbnRlcmFjdGl2ZVdpbmRvd3MAH3NldE9uQWNjZXNzaWJpbGl0eUV2ZW50TGlzdGVuZXIABnNldE91dAAMc2V0U2VsZWN0aW9uAA5zZXRTZXJ2aWNlSW5mbwAJc2V0U291cmNlAAdzZXRUZXh0AAZzZXR0bGUACHNodXRkb3duAAtzaWduaWZpY2FudAAEc2l6ZQANc2tpcEludmlzaWJsZQAFc2xlZXAACHNuYXBzaG90AA9zbmFwc2hvdE9wdGlvbnMABXN0YXJ0AAlzdGFydGVkTXMABnN0ZG91dAAFc3RlcHMAG3N0b2NrIHNlcnZpY2UgaW5mbyBmbGFncz0weAADc3RyAAtzdWJTZXF1ZW5jZQAFc3dpcGUABHN5bmMADnRha2VTY3JlZW5zaG90ABx0YWtlU2NyZWVuc2hvdCByZXR1cm5lZCBudWxsAAN0YXAABHRleHQATXRoZSB0ZXh0IG9mIGEgcGFzc3dvcmQgZmllbGQgaXMgbm90IHJlYWRhYmxlLCBzbyBpdCBjYW5ub3QgYmUgZWRpdGVkIGluIHBsYWNlAAZ0aGlzJDAABnRocmVhZAAJdGltZW91dE1zAAV0aW1lcwALdG9CeXRlQXJyYXkAC3RvSGV4U3RyaW5nAAh0b1N0cmluZwAIdG9vbFR5cGUAA3RvcAAEdHJpbQAJdHJ1bmNhdGVkAAh0eXBlVGV4dAACdWEAEXVpYXV0b21hdGlvbl9idXN5AAx1bmtub3duIG9wOiAADHVwdGltZU1pbGxpcwAFdmFsdWUAB3ZhbHVlT2YADXZpc2libGVCb3VuZHMABHdhaXQAC3dhcmRlbi11aWFkAA53YXJkZW4tdWlhZC1pbwAFd2lkdGgAC3dpZHRoUGl4ZWxzAAd3aW5kb3dzAAt3aW5kb3dzSnNvbgAFd3JpdGUAAXgAAngxAAJ4MgABeQACeTEAAnkyABt7ImJhY2tlbmQiOiJ1aWFkIiwic2NyZWVuIjoACHsiY29kZSI6AAp7ImRvd25NcyI6ABl7ImV2ZW50IjoiZmF0YWwiLCJlcnJvciI6ACF7ImV2ZW50IjoiZmF0YWwiLCJlcnJvciI6eyJjb2RlIjoAF3siZXZlbnQiOiJsb2ciLCJsZXZlbCI6ACh7ImV2ZW50IjoicmVhZHkiLCJwcm90b2NvbCI6MSwidmVyc2lvbiI6AAp7ImZyYW1lcyI6AAZ7ImlkIjoACnsibGVuZ3RoIjoACXsicXVpZXQiOgAIeyJ0ZXh0IjoAC3sidmVyc2lvbiI6AAl7IndpZHRoIjoAAnt9AAF9ABR9LCJldmVudHMiOnsiY291bnQiOgANfSwidXB0aW1lTXMiOgADfX19AJ4Bfn5EOHsiYmFja2VuZCI6ImRleCIsImNvbXBpbGF0aW9uLW1vZGUiOiJyZWxlYXNlIiwiaGFzLWNoZWNrc3VtcyI6ZmFsc2UsIm1pbi1hcGkiOjI2LCJzaGEtMSI6IjA4NGE4OTEyNmFlMDU5NmM1OTkxNDNkZjU3YTY1NDY0NmFmMjgzMTMiLCJ2ZXJzaW9uIjoiOS4yLjQtZGV2In0AAh4BlwQaqAIfAoECBACzAx4CIwGXBBwBGDMCIQKBAhwBRBCAALQDHAEeAh4BlwQavQIfAoECBBizAxfDAh0BlwQYTwIfAoECBBizAxfIAh8CgQIEGrMDF94CIgGXBBwFFwYXtReJFzwXqQIjAZcEHAEYTAIgAZcEHAMYTBhNGE4AAAQAmgGCgAS8NgEIuDUBCIQ2AQjUNgAAAQGeAYCABMQ4nwEB3DgEAA0AGRoBGAEYAQqgAYiABPxKAYKABKBLAYgguEsBiCCcSAGIINBLAQq4SAEK0DkBCOhLAQnITAEKoEkBioAIhE0BCpROAQrUSQABAQEdkCCtAYCABNRSrgEB8FIAAgEAHhABEK8BgIAE6FMABwEAIAABAAEAAQABAAEAAQCxAYCABIhUAAcBACcQARABEAEAARABAAEQsgGAgATQVAIOGw0uGgEaMAABAgECAQIBAgESAQIBAgECAQIBAgEQAQIBArMBgIAE/IgBAYgg8FgBiCCAXQGIIOyHAQGIIISIAQECvFcBCtiIAQECuIkBAQL0iQEDAviPAQECpIgBAQKIWAIKyFUCCpxcAQKElQEBApSWAQECjJcBAQKMWQGCAcyXAQIChFcBCrxvAQKQmAEDAqyZAQEC5FoDCqBbBQL8VAEKmIUBvAEAnIoBAQCciwEEAJhdAgD0agcArG4EAPBvAQCEcgMAhHMBALx1AgCweAEA+H0BAOx/AQCEggEDHgQBFzcCJOgDRmDqAAIAAAAedQAAJXUAAAEAAAAvdQAAAQAAADh1AAACAAAASHUAACV1AAACAAAAWnUAAE91AAACAAAAWnUAAGF1AAACAAAAWnUAAGx1AAABAAAAd3UAAAEAAACIdQAAAQAAAJF1AABQdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAKIAAABcdwAAqwAAAFx3AABsdwAAAAAAAAEAAAAAAAAArQAAAGR3AAB4dwAAAAAAAAAAAAAAAAAAhHcAAAAAAAAAAAAAAAAAAJB3AAAAAAAAAAAAAAAAAACsdwAAAAAAABEAAAAAAAAAvQAAAFx3AADAAAAApHcAAMEAAACkdwAAxAAAAKR3AADGAAAApHcAAMcAAACkdwAAyAAAAFx3AADJAAAAXHcAAMoAAACkdwAAzgAAAKR3AADPAAAApHcAANIAAACkdwAA1QAAAKR3AADWAAAApHcAANcAAACkdwAA2AAAAKR3AADaAAAAnHcAABEAAAAAAAAAAQAAAAAAAAABAAAAPAIAAHAAAAACAAAAXQAAAGAJAAADAAAAeQAAANQKAAAEAAAAPgAAAIAQAAAFAAAA6QAAAHASAAAGAAAACAAAALgZAAABIAAAQAAAALgaAAADIAAAPQAAAPhMAAABEAAARQAAACRRAAACIAAAPAIAAM5TAAAEIAAADAAAAB51AAAAIAAACAAAAJ51AAAFIAAAAgAAAEJ3AAADEAAACgAAAFB3AAAGIAAABwAAALR3AAAAEAAAAQAAAMR4AAA=";
8
+ };
@@ -0,0 +1,62 @@
1
+ import type { DriverResult, Logger, Point, ScreenInfo, Snapshot } from "../driver.types";
2
+ import type { GesturePlan } from "../gesture-geometry";
3
+ import type { SettleDetail } from "../settle";
4
+ import { type Clock } from "./android-device";
5
+ import type { UiadBackend } from "./uiad-backend";
6
+ import type { UiadSnapshotData } from "./uiad-protocol";
7
+ /**
8
+ * What the Android driver asks of `warden-uiad`, one method per thing the server does faster than `uiautomator dump`
9
+ * and `input`. Every method answers `undefined` when the server is not the way to do that call (it is off, it could
10
+ * not start, or it refused this one op) and the driver then does it the old way; a result, success or error, is final.
11
+ *
12
+ * Which failures fall back and which are surfaced:
13
+ * - the op was refused (`E_HID`, `E_NO_ELEMENT`, `E_UNSUPPORTED`): nothing happened, the server is fine, this call
14
+ * falls back (a `typeText` with nothing focused is typed by `input text` as before);
15
+ * - the server died, hung or sent nonsense: it is stopped, so the dump can have UiAutomation again, and the next call
16
+ * starts a new one. A read (`snapshot`, `settle`, `selectAll`) falls back; a tap, swipe, key or typed text is
17
+ * surfaced, because it may have happened and doing it twice is worse than a failed step;
18
+ * - the request never left (the server had already gone): started again and sent again, once.
19
+ */
20
+ /** A settled `DriverResult`. */
21
+ type Res<T> = Awaited<DriverResult<T>>;
22
+ export type Maybe<T> = Promise<Res<T> | undefined>;
23
+ export type UiadOps = {
24
+ /** the server is on and has not been given up on: what `capabilities` reports */
25
+ enabled(): boolean;
26
+ /** `up`, `idle`, `busy`, or `off: <why>`: for `health` */
27
+ status(): string;
28
+ snapshot(): Maybe<Snapshot>;
29
+ settle(opts: {
30
+ quietMs: number;
31
+ timeoutMs: number;
32
+ }): Maybe<SettleDetail>;
33
+ tap(point: Point, opts?: {
34
+ count?: number;
35
+ durationMs?: number;
36
+ }): Maybe<void>;
37
+ longPress(point: Point, durationMs?: number): Maybe<void>;
38
+ swipe(from: Point, to: Point, durationMs?: number): Maybe<void>;
39
+ drag(from: Point, to: Point, timing: {
40
+ pressMs: number;
41
+ durationMs: number;
42
+ releaseMs: number;
43
+ }): Maybe<void>;
44
+ /** replay a 1-2 finger plan as one multi-pointer MotionEvent stream (`gesture` op, server 0.3.0+) */
45
+ gesture(plan: GesturePlan): Maybe<void>;
46
+ key(keyCode: number, times?: number): Maybe<void>;
47
+ selectAll(): Maybe<void>;
48
+ typeText(text: string): Maybe<void>;
49
+ /** replace the whole text of the focused input (`ACTION_SET_TEXT`); `undefined` = refused or no server */
50
+ setText(text: string): Maybe<void>;
51
+ stop(): Promise<void>;
52
+ };
53
+ export type UiadOpsDeps = {
54
+ backend: UiadBackend;
55
+ baseScreen: ScreenInfo;
56
+ clock: Clock;
57
+ log?: Logger;
58
+ };
59
+ /** The `Snapshot` the driver builds from a server reply: the same tree the dump of that screen gives. */
60
+ export declare function snapshotFromUiad(data: UiadSnapshotData, baseScreen: ScreenInfo, takenAt: number): Snapshot;
61
+ export declare function createUiadOps(deps: UiadOpsDeps): UiadOps;
62
+ export {};
@@ -0,0 +1,209 @@
1
+ import { z } from "zod";
2
+ import { responseSchema, type WireError } from "../ios/simd-protocol";
3
+ /**
4
+ * Wire format of `warden-uiad` (plan WDN-PERF, "Android server (PERF-3.2)"), the resident UiAutomation server in
5
+ * `native/android/`. The same NDJSON shapes as `warden-simd` (`ios/simd-protocol.ts`, whose framing, `log` / `fatal`
6
+ * events, responses and error mapping it reuses): requests `{id, op, ...params}`; replies `{id, ok:true, data}` /
7
+ * `{id, ok:false, error}`; events `{event:"ready"|"log"|"fatal", ...}`. Unlike simd the server runs one op at a
8
+ * time, so replies come back in request order.
9
+ */
10
+ export declare const UIAD_PROTOCOL = 1;
11
+ /** The class the dex's `Main` lives in; `app_process <dir> <class>` starts it and `ps` shows it. */
12
+ export declare const UIAD_MAIN_CLASS = "nz.co.delacour.warden.uiad.Main";
13
+ /**
14
+ * One accessibility node, with the attributes `uiautomator dump` writes under nearly the same names (a flag that is
15
+ * false is absent, `disabled` is true only for a disabled node, `invisible` only for a node that is not visible to the
16
+ * user). `bounds` is `[left, top, right, bottom]` in screen pixels, clipped to the display like the dump's.
17
+ */
18
+ export type UiadNode = {
19
+ class?: string;
20
+ pkg?: string;
21
+ /** the raw `resource-id`, `pkg:id/name` for platform ids and the bare testID for React Native */
22
+ id?: string;
23
+ text?: string;
24
+ desc?: string;
25
+ hint?: string;
26
+ bounds: readonly [number, number, number, number];
27
+ clickable?: boolean;
28
+ longClickable?: boolean;
29
+ checkable?: boolean;
30
+ checked?: boolean;
31
+ scrollable?: boolean;
32
+ selected?: boolean;
33
+ focused?: boolean;
34
+ focusable?: boolean;
35
+ password?: boolean;
36
+ editable?: boolean;
37
+ disabled?: boolean;
38
+ invisible?: boolean;
39
+ /** drawing order among siblings */
40
+ order?: number;
41
+ children?: UiadNode[];
42
+ };
43
+ /**
44
+ * A node read off the wire, or why it is not one. Hand-written rather than zod: a snapshot is hundreds of nodes and
45
+ * this runs on every one, with no allocation beyond the node itself.
46
+ */
47
+ export declare function readNode(value: unknown, path?: string): UiadNode | string;
48
+ /** What `health` and the `ready` event carry. Unknown fields are kept (a newer server may add some). */
49
+ export declare const healthSchema: z.ZodObject<{
50
+ version: z.ZodString;
51
+ protocol: z.ZodNumber;
52
+ sdk: z.ZodNumber;
53
+ release: z.ZodOptional<z.ZodString>;
54
+ model: z.ZodOptional<z.ZodString>;
55
+ uid: z.ZodOptional<z.ZodNumber>;
56
+ pid: z.ZodOptional<z.ZodNumber>;
57
+ uiAutomation: z.ZodObject<{
58
+ state: z.ZodString;
59
+ connect: z.ZodOptional<z.ZodString>;
60
+ connectMs: z.ZodOptional<z.ZodNumber>;
61
+ }, z.core.$loose>;
62
+ events: z.ZodOptional<z.ZodObject<{
63
+ count: z.ZodNumber;
64
+ lastAgoMs: z.ZodNumber;
65
+ }, z.core.$loose>>;
66
+ uptimeMs: z.ZodOptional<z.ZodNumber>;
67
+ screen: z.ZodOptional<z.ZodObject<{
68
+ width: z.ZodNumber;
69
+ height: z.ZodNumber;
70
+ scale: z.ZodOptional<z.ZodNumber>;
71
+ rotation: z.ZodOptional<z.ZodNumber>;
72
+ }, z.core.$strip>>;
73
+ displayError: z.ZodOptional<z.ZodString>;
74
+ }, z.core.$loose>;
75
+ export type UiadHealth = z.infer<typeof healthSchema>;
76
+ export declare const settleDataSchema: z.ZodObject<{
77
+ quiet: z.ZodBoolean;
78
+ waitedMs: z.ZodNumber;
79
+ via: z.ZodLiteral<"events">;
80
+ events: z.ZodNumber;
81
+ firstEventMs: z.ZodOptional<z.ZodNumber>;
82
+ reason: z.ZodOptional<z.ZodString>;
83
+ }, z.core.$loose>;
84
+ export type UiadSettleData = z.infer<typeof settleDataSchema>;
85
+ export declare const textDataSchema: z.ZodObject<{
86
+ text: z.ZodString;
87
+ caret: z.ZodOptional<z.ZodNumber>;
88
+ caretPlaced: z.ZodOptional<z.ZodBoolean>;
89
+ }, z.core.$loose>;
90
+ export type UiadTextData = z.infer<typeof textDataSchema>;
91
+ export type UiadSnapshotData = {
92
+ backend: "uiad";
93
+ screen: {
94
+ width: number;
95
+ height: number;
96
+ scale?: number;
97
+ rotation?: number;
98
+ };
99
+ windows?: unknown[];
100
+ elements: UiadNode[];
101
+ truncated: boolean;
102
+ nodes: number;
103
+ readMs: number;
104
+ ms: number;
105
+ };
106
+ /** The data of a `snapshot` reply, with every node checked; a string is why it is not one. */
107
+ export declare function readSnapshotData(data: unknown): UiadSnapshotData | string;
108
+ export declare const readyEventSchema: z.ZodObject<{
109
+ event: z.ZodLiteral<"ready">;
110
+ protocol: z.ZodNumber;
111
+ version: z.ZodString;
112
+ data: z.ZodObject<{
113
+ version: z.ZodString;
114
+ protocol: z.ZodNumber;
115
+ sdk: z.ZodNumber;
116
+ release: z.ZodOptional<z.ZodString>;
117
+ model: z.ZodOptional<z.ZodString>;
118
+ uid: z.ZodOptional<z.ZodNumber>;
119
+ pid: z.ZodOptional<z.ZodNumber>;
120
+ uiAutomation: z.ZodObject<{
121
+ state: z.ZodString;
122
+ connect: z.ZodOptional<z.ZodString>;
123
+ connectMs: z.ZodOptional<z.ZodNumber>;
124
+ }, z.core.$loose>;
125
+ events: z.ZodOptional<z.ZodObject<{
126
+ count: z.ZodNumber;
127
+ lastAgoMs: z.ZodNumber;
128
+ }, z.core.$loose>>;
129
+ uptimeMs: z.ZodOptional<z.ZodNumber>;
130
+ screen: z.ZodOptional<z.ZodObject<{
131
+ width: z.ZodNumber;
132
+ height: z.ZodNumber;
133
+ scale: z.ZodOptional<z.ZodNumber>;
134
+ rotation: z.ZodOptional<z.ZodNumber>;
135
+ }, z.core.$strip>>;
136
+ displayError: z.ZodOptional<z.ZodString>;
137
+ }, z.core.$loose>;
138
+ }, z.core.$strip>;
139
+ export type UiadReadyEvent = z.infer<typeof readyEventSchema>;
140
+ export declare const eventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
141
+ event: z.ZodLiteral<"ready">;
142
+ protocol: z.ZodNumber;
143
+ version: z.ZodString;
144
+ data: z.ZodObject<{
145
+ version: z.ZodString;
146
+ protocol: z.ZodNumber;
147
+ sdk: z.ZodNumber;
148
+ release: z.ZodOptional<z.ZodString>;
149
+ model: z.ZodOptional<z.ZodString>;
150
+ uid: z.ZodOptional<z.ZodNumber>;
151
+ pid: z.ZodOptional<z.ZodNumber>;
152
+ uiAutomation: z.ZodObject<{
153
+ state: z.ZodString;
154
+ connect: z.ZodOptional<z.ZodString>;
155
+ connectMs: z.ZodOptional<z.ZodNumber>;
156
+ }, z.core.$loose>;
157
+ events: z.ZodOptional<z.ZodObject<{
158
+ count: z.ZodNumber;
159
+ lastAgoMs: z.ZodNumber;
160
+ }, z.core.$loose>>;
161
+ uptimeMs: z.ZodOptional<z.ZodNumber>;
162
+ screen: z.ZodOptional<z.ZodObject<{
163
+ width: z.ZodNumber;
164
+ height: z.ZodNumber;
165
+ scale: z.ZodOptional<z.ZodNumber>;
166
+ rotation: z.ZodOptional<z.ZodNumber>;
167
+ }, z.core.$strip>>;
168
+ displayError: z.ZodOptional<z.ZodString>;
169
+ }, z.core.$loose>;
170
+ }, z.core.$strip>, z.ZodObject<{
171
+ event: z.ZodLiteral<"log">;
172
+ level: z.ZodEnum<{
173
+ error: "error";
174
+ info: "info";
175
+ warn: "warn";
176
+ debug: "debug";
177
+ }>;
178
+ message: z.ZodString;
179
+ op: z.ZodOptional<z.ZodString>;
180
+ id: z.ZodOptional<z.ZodString>;
181
+ }, z.core.$strip>, z.ZodObject<{
182
+ event: z.ZodLiteral<"fatal">;
183
+ error: z.ZodObject<{
184
+ code: z.ZodString;
185
+ message: z.ZodString;
186
+ retryable: z.ZodOptional<z.ZodBoolean>;
187
+ detail: z.ZodOptional<z.ZodUnknown>;
188
+ }, z.core.$strip>;
189
+ }, z.core.$strip>], "event">;
190
+ export type UiadEvent = z.infer<typeof eventSchema>;
191
+ export type UiadResponse = z.infer<typeof responseSchema>;
192
+ export type UiadMessage = {
193
+ kind: "event";
194
+ event: UiadEvent;
195
+ } | {
196
+ kind: "response";
197
+ response: UiadResponse;
198
+ };
199
+ export type ParsedUiadLine = {
200
+ success: true;
201
+ message: UiadMessage;
202
+ } | {
203
+ success: false;
204
+ reason: string;
205
+ };
206
+ export declare function parseUiadLine(line: string): ParsedUiadLine;
207
+ /** Why the server could not start, from `fatal.error.detail.reason`. */
208
+ export type FatalReason = "uiautomation_busy" | "connect_failed";
209
+ export declare function fatalReason(error: WireError): FatalReason | undefined;
@@ -0,0 +1,33 @@
1
+ import type { Element } from "../driver.types";
2
+ import type { UiadNode } from "./uiad-protocol";
3
+ /** Thrown when the text has no `<hierarchy>` (e.g. `ERROR: null root node returned by UiTestAutomationBridge.`). */
4
+ export declare class UiautomatorParseError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export type ParsedTree = {
8
+ elements: Element[];
9
+ flat: Element[];
10
+ };
11
+ /**
12
+ * Parse `uiautomator dump` output into the normalized tree. Ids are preorder paths (`0`, `0.3`, `0.3.1`).
13
+ * Anything outside `<hierarchy>…</hierarchy>` (the `UI hierarchy dumped to:` trailer, which some images
14
+ * misspell `hierchary`) is ignored. Throws `UiautomatorParseError` when there is no hierarchy at all.
15
+ */
16
+ export declare function parseUiautomatorXml(xml: string, screen: {
17
+ width: number;
18
+ height: number;
19
+ }): ParsedTree;
20
+ /**
21
+ * The normalized tree of a `warden-uiad` snapshot: the same `Element`s, ids and depths `parseUiautomatorXml` gives for
22
+ * the same screen (the server writes the dump's attributes and skips the same invisible nodes), without the XML.
23
+ */
24
+ export declare function parseUiadNodes(nodes: readonly UiadNode[], screen: {
25
+ width: number;
26
+ height: number;
27
+ }): ParsedTree;
28
+ /**
29
+ * Keep clickable / long-clickable / checkable / scrollable / EditText nodes plus all their ancestors.
30
+ * Returns a new tree (inputs untouched) with ids and depths preserved; descendants of a kept node are
31
+ * only retained when they are interactive themselves.
32
+ */
33
+ export declare function interactiveFilter(elements: readonly Element[]): ParsedTree;
@@ -0,0 +1,231 @@
1
+ import type { AsyncResult } from "../../../types/src/result";
2
+ /**
3
+ * The device driver contract every layer of warden-e2e builds on: the spec API (`screen`, `device`,
4
+ * `app`), `warden ui`, specs and the devtools facet all talk to a `Driver`. Implementations:
5
+ * `ios/ios-driver.ts` (warden-simd over NDJSON + `xcrun simctl`) and `android/android-driver.ts`
6
+ * (persistent `adb shell` + uiautomator). `driver.testing.ts` has the scripted FakeDriver for tests.
7
+ *
8
+ * Frozen interface — change it only together with `docs/plans/wdn-e2e.md`.
9
+ */
10
+ export type Platform = "ios" | "android";
11
+ export type DriverErrorCode = "E_HELPER_MISSING" | "E_HELPER_CRASHED" | "E_TIMEOUT" | "E_NOT_BOOTED" | "E_UNKNOWN_DEVICE" | "E_AX_UNAVAILABLE" | "E_APP_UNAVAILABLE" | "E_APP_NOT_RESPONDING" | "E_NO_ELEMENT" | "E_STALE_REF" | "E_UNSUPPORTED" | "E_UNSUPPORTED_TEXT" | "E_HID" | "E_IO" | "E_BAD_REQUEST" | "E_INTERNAL";
12
+ export type DriverError = {
13
+ code: DriverErrorCode;
14
+ message: string;
15
+ retryable: boolean;
16
+ detail?: unknown;
17
+ };
18
+ export type DriverResult<T> = AsyncResult<T, DriverError>;
19
+ /** Points on iOS (portrait-up screen space, same as AX frames), px on Android. */
20
+ export type Point = {
21
+ x: number;
22
+ y: number;
23
+ };
24
+ export type Rect = {
25
+ x: number;
26
+ y: number;
27
+ width: number;
28
+ height: number;
29
+ };
30
+ /** A point on one finger's route; `t` = ms after touch-down. Every point of a gesture carries `t`, or none does. */
31
+ export type TouchPoint = Point & {
32
+ t?: number;
33
+ };
34
+ /** One finger: down at the first point, through the rest, up at the last. All fingers go down and lift together. */
35
+ export type TouchPath = {
36
+ points: readonly TouchPoint[];
37
+ };
38
+ export type GestureOptions = {
39
+ /** untimed paths only: first point to last, each finger at constant speed (by arc length). Default 300. */
40
+ durationMs?: number;
41
+ /** fingers still at their first points before moving (press-then-drag). Default 0. */
42
+ holdMs?: number;
43
+ /** fingers still at their last points before lifting (no fling). Default 0. */
44
+ releaseMs?: number;
45
+ };
46
+ /**
47
+ * `radius`: finger distance from the centre (default 100 pt on iOS, 100 x screen scale px on Android);
48
+ * `angle`: the finger axis in degrees, 0 = horizontal.
49
+ */
50
+ export type TwoFingerOptions = {
51
+ durationMs?: number;
52
+ radius?: number;
53
+ angle?: number;
54
+ };
55
+ export type Role = "button" | "text" | "textfield" | "securefield" | "searchfield" | "image" | "switch" | "checkbox" | "slider" | "link" | "cell" | "list" | "scrollview" | "tab" | "tabbar" | "alert" | "sheet" | "keyboard" | "navbar" | "toolbar" | "window" | "application" | "other";
56
+ /** One accessibility node, normalized across iOS (axbridge / ax) and Android (uiautomator). */
57
+ export type Element = {
58
+ /** driver-local stable id for this snapshot (preorder path such as `0.3.1`, or the backend's unique id) */
59
+ id: string;
60
+ role: Role;
61
+ /** iOS XCUI type (`Button`) or Android class (`android.widget.EditText`) */
62
+ rawType: string;
63
+ /** AX label / content-desc */
64
+ label?: string;
65
+ /** RN testID: iOS accessibilityIdentifier / Android resource-id without the package prefix */
66
+ identifier?: string;
67
+ /** AX value / Android text of inputs */
68
+ value?: string;
69
+ /** Android text; iOS: label of static text */
70
+ text?: string;
71
+ placeholder?: string;
72
+ frame: Rect;
73
+ /** `frame` as 0–1 fractions of the screen */
74
+ normFrame: Rect;
75
+ /** iOS decoded traits; Android flags (clickable, checkable, scrollable, …) */
76
+ traits: string[];
77
+ enabled: boolean;
78
+ focused?: boolean;
79
+ hidden?: boolean;
80
+ selected?: boolean;
81
+ checked?: boolean;
82
+ /** only when reachability was requested (iOS ~18 ms per element) or derivable (Android) */
83
+ hittable?: boolean;
84
+ /** where to tap: iOS `interactable.actionable.at`, else the frame centre */
85
+ tapPoint?: Point;
86
+ pid?: number;
87
+ depth: number;
88
+ children: Element[];
89
+ };
90
+ export type SnapshotBackend = "axbridge" | "ax" | "uiautomator";
91
+ export type ScreenInfo = {
92
+ width: number;
93
+ height: number;
94
+ scale: number;
95
+ rotation?: number;
96
+ };
97
+ export type ModalInfo = {
98
+ pid?: number;
99
+ description?: string;
100
+ };
101
+ export type Snapshot = {
102
+ platform: Platform;
103
+ backend: SnapshotBackend;
104
+ takenAt: number;
105
+ screen: ScreenInfo;
106
+ /** the tree */
107
+ elements: Element[];
108
+ /** the same nodes in preorder (reading order is derived by consumers) */
109
+ flat: Element[];
110
+ truncated: boolean;
111
+ modal?: ModalInfo;
112
+ };
113
+ export type Orientation = "portrait" | "portraitUpsideDown" | "landscapeLeft" | "landscapeRight";
114
+ export type HardwareButton = "home" | "back" | "lock" | "volumeUp" | "volumeDown" | "shake";
115
+ export type KeyName = "Enter" | "Backspace" | "Tab" | "Space" | "Escape" | "Delete" | "Up" | "Down" | "Left" | "Right";
116
+ export type Modifier = "shift" | "cmd" | "alt" | "ctrl";
117
+ export type AlertInfo = {
118
+ title?: string;
119
+ message?: string;
120
+ buttons: Element[];
121
+ };
122
+ export type HealthInfo = {
123
+ platform: Platform;
124
+ id: string;
125
+ version: string;
126
+ /** iOS: negotiated HID transport; Android: `adb` */
127
+ transport: string;
128
+ /** iOS: `axbridge` availability */
129
+ bridge?: "available" | "missing" | "failed";
130
+ screen: ScreenInfo;
131
+ detail?: Record<string, unknown>;
132
+ };
133
+ export type LaunchOptions = {
134
+ /** extra launch arguments (iOS: after the bundle id; Android: intent extras are not supported in v1) */
135
+ args?: readonly string[];
136
+ env?: Record<string, string>;
137
+ /** iOS: `--terminate-running-process`; Android: `am force-stop` first. Default true. */
138
+ relaunch?: boolean;
139
+ };
140
+ export type DriverCapabilities = {
141
+ /** two-finger `pinch` and `rotate` */
142
+ pinch: boolean;
143
+ /** most fingers `gesture` takes: 2 multi-touch, 1 single-finger paths only, 0 no `gesture` */
144
+ maxPointers: 0 | 1 | 2;
145
+ unicodeText: boolean;
146
+ nativeSettle: boolean;
147
+ alerts: boolean;
148
+ reachability: boolean;
149
+ /**
150
+ * `elementAtPoint` costs far less than a whole `snapshot` (iOS: one AX hit-test, ~10 ms, against ~76 ms), so a tap
151
+ * may check the snapshot an assertion just kept with one hit-test instead of taking another. Absent = no (Android's
152
+ * hit-test is a whole snapshot).
153
+ */
154
+ cheapHitTest?: boolean;
155
+ };
156
+ export type AppCommands = {
157
+ launch(bundleId: string, opts?: LaunchOptions): DriverResult<void>;
158
+ terminate(bundleId: string): DriverResult<void>;
159
+ openUrl(url: string): DriverResult<void>;
160
+ install(path: string): DriverResult<void>;
161
+ uninstall(bundleId: string): DriverResult<void>;
162
+ isInstalled(bundleId: string): DriverResult<boolean>;
163
+ isRunning(bundleId: string): DriverResult<boolean>;
164
+ /** wipe app data, keep the build (iOS: core `resetAppData`; Android: `pm clear`) */
165
+ clearData(bundleId: string, opts?: {
166
+ keychain?: boolean;
167
+ }): DriverResult<void>;
168
+ };
169
+ export interface Driver {
170
+ readonly platform: Platform;
171
+ /** udid (iOS) or serial (Android) */
172
+ readonly id: string;
173
+ readonly capabilities: DriverCapabilities;
174
+ health(): DriverResult<HealthInfo>;
175
+ snapshot(opts?: {
176
+ interactiveOnly?: boolean;
177
+ backend?: SnapshotBackend;
178
+ }): DriverResult<Snapshot>;
179
+ elementAtPoint(point: Point, opts?: {
180
+ reachability?: boolean;
181
+ }): DriverResult<Element | null>;
182
+ tap(point: Point, opts?: {
183
+ count?: number;
184
+ durationMs?: number;
185
+ }): DriverResult<void>;
186
+ longPress(point: Point, opts?: {
187
+ durationMs?: number;
188
+ }): DriverResult<void>;
189
+ swipe(from: Point, to: Point, opts?: {
190
+ durationMs?: number;
191
+ momentum?: boolean;
192
+ }): DriverResult<void>;
193
+ drag(from: Point, to: Point, opts?: {
194
+ pressMs?: number;
195
+ durationMs?: number;
196
+ releaseMs?: number;
197
+ }): DriverResult<void>;
198
+ /** Two fingers around `center` spread (`scale` > 1) or close (< 1). */
199
+ pinch(center: Point, scale: number, opts?: TwoFingerOptions): DriverResult<void>;
200
+ /** Two fingers turn `degrees` around `center`; positive is clockwise on screen. */
201
+ rotate(center: Point, degrees: number, opts?: TwoFingerOptions): DriverResult<void>;
202
+ /** 1-2 finger paths on one timeline (`driver/gesture-geometry.ts`); fingers go down and lift together. */
203
+ gesture(paths: readonly TouchPath[], opts?: GestureOptions): DriverResult<void>;
204
+ /** iOS: HID keyboard → paste fallback for non-ASCII; Android: `input text` (ASCII only) */
205
+ typeText(text: string): DriverResult<void>;
206
+ key(key: KeyName, modifiers?: readonly Modifier[]): DriverResult<void>;
207
+ pressButton(button: HardwareButton): DriverResult<void>;
208
+ screenshot(opts?: {
209
+ path?: string;
210
+ scale?: number;
211
+ }): DriverResult<{
212
+ path?: string;
213
+ png?: Uint8Array;
214
+ }>;
215
+ orientation(set?: Orientation): DriverResult<Orientation>;
216
+ /** wait for a quiet UI: iOS axbridge quiescence, else snapshot-hash polling */
217
+ settle(opts?: {
218
+ quietMs?: number;
219
+ timeoutMs?: number;
220
+ }): DriverResult<{
221
+ quiet: boolean;
222
+ waitedMs: number;
223
+ }>;
224
+ /** the system alert / sheet on top, if any */
225
+ alert(): DriverResult<AlertInfo | null>;
226
+ appearance(set?: "light" | "dark"): DriverResult<"light" | "dark">;
227
+ clipboard(set?: string): DriverResult<string>;
228
+ readonly app: AppCommands;
229
+ close(): Promise<void>;
230
+ }
231
+ export type Logger = (line: string) => void;
@@ -0,0 +1,13 @@
1
+ import type { ErrorResult } from "../../../types/src/result";
2
+ import type { DriverError, DriverErrorCode } from "./driver.types";
3
+ export declare function driverError(code: DriverErrorCode, message: string, extra?: {
4
+ retryable?: boolean;
5
+ detail?: unknown;
6
+ }): DriverError;
7
+ /** `err()` for `DriverResult`. */
8
+ export declare function driverErr(code: DriverErrorCode, message: string, extra?: {
9
+ retryable?: boolean;
10
+ detail?: unknown;
11
+ }): ErrorResult<DriverError>;
12
+ /** One line for logs and CLI output. */
13
+ export declare function describeDriverError(error: DriverError): string;