obsidian-integration-testing 11.0.0 → 12.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 (234) hide show
  1. package/dist/lib/cjs/adb-device-list.cjs +54 -0
  2. package/dist/lib/cjs/adb-device-list.d.cts +72 -0
  3. package/dist/lib/cjs/android-sdk.cjs +52 -0
  4. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  5. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  6. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  7. package/dist/lib/cjs/appium-server-marker.cjs +112 -0
  8. package/dist/lib/cjs/appium-server-marker.d.cts +103 -0
  9. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  10. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  11. package/dist/lib/cjs/cli.cjs +104 -19
  12. package/dist/lib/cjs/cli.d.cts +16 -8
  13. package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
  14. package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
  15. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  16. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  17. package/dist/lib/cjs/config-directory.cjs +46 -0
  18. package/dist/lib/cjs/config-directory.d.cts +45 -0
  19. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  20. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  21. package/dist/lib/cjs/context-provider.cjs +12 -1
  22. package/dist/lib/cjs/context-provider.d.cts +26 -3
  23. package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
  24. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +114 -0
  25. package/dist/lib/cjs/demo-vault-populate.cjs +38 -10
  26. package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
  27. package/dist/lib/cjs/device-readiness.cjs +38 -3
  28. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  29. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  30. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  31. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  32. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  33. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  34. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  35. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  36. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  37. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  38. package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
  39. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  40. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  41. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  42. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  43. package/dist/lib/cjs/index.cjs +24 -1
  44. package/dist/lib/cjs/index.d.cts +14 -5
  45. package/dist/lib/cjs/installer-asset.cjs +1 -1
  46. package/dist/lib/cjs/installer-asset.d.cts +1 -1
  47. package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
  48. package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
  49. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  50. package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
  51. package/dist/lib/cjs/kill-process-tree.cjs +18 -7
  52. package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
  53. package/dist/lib/cjs/library.cjs +1 -1
  54. package/dist/lib/cjs/mobile-input.cjs +173 -0
  55. package/dist/lib/cjs/mobile-input.d.cts +156 -0
  56. package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
  57. package/dist/lib/cjs/obsidian-installer.cjs +1 -1
  58. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  59. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  60. package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
  61. package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
  62. package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
  63. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  64. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  65. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  66. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  67. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  68. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  69. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  70. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  71. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  72. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  73. package/dist/lib/cjs/port-owner.cjs +61 -0
  74. package/dist/lib/cjs/port-owner.d.cts +47 -0
  75. package/dist/lib/cjs/process-capture.cjs +62 -0
  76. package/dist/lib/cjs/process-capture.d.cts +83 -0
  77. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  78. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  79. package/dist/lib/cjs/process-liveness.cjs +51 -0
  80. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  81. package/dist/lib/cjs/release-catalog.cjs +73 -0
  82. package/dist/lib/cjs/release-catalog.d.cts +125 -0
  83. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  84. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  85. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  86. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  87. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  88. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  89. package/dist/lib/cjs/transport-appium.cjs +223 -17
  90. package/dist/lib/cjs/transport-appium.d.cts +104 -3
  91. package/dist/lib/cjs/transport-desktop-cdp.cjs +201 -6
  92. package/dist/lib/cjs/transport-desktop-cdp.d.cts +100 -0
  93. package/dist/lib/cjs/transport-factory.cjs +1165 -142
  94. package/dist/lib/cjs/transport-factory.d.cts +10 -1
  95. package/dist/lib/cjs/transport-options.cjs +11 -3
  96. package/dist/lib/cjs/transport-options.d.cts +131 -12
  97. package/dist/lib/cjs/transport.cjs +1 -1
  98. package/dist/lib/cjs/transport.d.cts +7 -1
  99. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  100. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  101. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  102. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  103. package/dist/lib/cjs/version-matrix.cjs +1 -1
  104. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  105. package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
  106. package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
  107. package/dist/lib/cjs/vitest/setup.cjs +2 -1
  108. package/dist/lib/cjs/vitest/setup.d.cts +5 -0
  109. package/dist/lib/cjs/vitest/typings.d.cts +6 -4
  110. package/dist/lib/cjs/webview-cdp.cjs +263 -0
  111. package/dist/lib/cjs/webview-cdp.d.cts +156 -0
  112. package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
  113. package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
  114. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  115. package/dist/lib/esm/adb-device-list.mjs +28 -0
  116. package/dist/lib/esm/android-sdk.d.mts +29 -0
  117. package/dist/lib/esm/android-sdk.mjs +18 -0
  118. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  119. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  120. package/dist/lib/esm/appium-server-marker.d.mts +103 -0
  121. package/dist/lib/esm/appium-server-marker.mjs +89 -0
  122. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  123. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  124. package/dist/lib/esm/cli.d.mts +16 -8
  125. package/dist/lib/esm/cli.mjs +110 -19
  126. package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
  127. package/dist/lib/esm/community-plugin-registry.mjs +23 -0
  128. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  129. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  130. package/dist/lib/esm/config-directory.d.mts +45 -0
  131. package/dist/lib/esm/config-directory.mjs +21 -0
  132. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  133. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  134. package/dist/lib/esm/context-provider.d.mts +26 -3
  135. package/dist/lib/esm/context-provider.mjs +10 -1
  136. package/dist/lib/esm/demo-vault-bootstrap.d.mts +114 -0
  137. package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
  138. package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
  139. package/dist/lib/esm/demo-vault-populate.mjs +35 -9
  140. package/dist/lib/esm/device-readiness.d.mts +83 -9
  141. package/dist/lib/esm/device-readiness.mjs +34 -2
  142. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  143. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  144. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  145. package/dist/lib/esm/emulator-backend.mjs +45 -0
  146. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  147. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  148. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  149. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  150. package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
  151. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  152. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  153. package/dist/lib/esm/global-setup-core.mjs +34 -35
  154. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  155. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  156. package/dist/lib/esm/index.d.mts +14 -5
  157. package/dist/lib/esm/index.mjs +26 -2
  158. package/dist/lib/esm/installer-asset.d.mts +1 -1
  159. package/dist/lib/esm/installer-asset.mjs +1 -1
  160. package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
  161. package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
  162. package/dist/lib/esm/jest/global-setup.d.mts +5 -1
  163. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  164. package/dist/lib/esm/kill-process-tree.d.mts +10 -2
  165. package/dist/lib/esm/kill-process-tree.mjs +16 -6
  166. package/dist/lib/esm/library.mjs +1 -1
  167. package/dist/lib/esm/mobile-input.d.mts +156 -0
  168. package/dist/lib/esm/mobile-input.mjs +144 -0
  169. package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
  170. package/dist/lib/esm/obsidian-installer.mjs +1 -1
  171. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  172. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  173. package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
  174. package/dist/lib/esm/obsidian-metadata.mjs +123 -17
  175. package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
  176. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  177. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  178. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  179. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  180. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  181. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  182. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  183. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  184. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  185. package/dist/lib/esm/parent-liveness.mjs +42 -5
  186. package/dist/lib/esm/port-owner.d.mts +47 -0
  187. package/dist/lib/esm/port-owner.mjs +36 -0
  188. package/dist/lib/esm/process-capture.d.mts +83 -0
  189. package/dist/lib/esm/process-capture.mjs +38 -0
  190. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  191. package/dist/lib/esm/process-exit-message.mjs +13 -8
  192. package/dist/lib/esm/process-liveness.d.mts +18 -0
  193. package/dist/lib/esm/process-liveness.mjs +17 -0
  194. package/dist/lib/esm/release-catalog.d.mts +125 -0
  195. package/dist/lib/esm/release-catalog.mjs +46 -0
  196. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  197. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  198. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  199. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  200. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  201. package/dist/lib/esm/temporary-vault.mjs +43 -8
  202. package/dist/lib/esm/transport-appium.d.mts +104 -3
  203. package/dist/lib/esm/transport-appium.mjs +233 -17
  204. package/dist/lib/esm/transport-desktop-cdp.d.mts +100 -0
  205. package/dist/lib/esm/transport-desktop-cdp.mjs +208 -7
  206. package/dist/lib/esm/transport-factory.d.mts +10 -1
  207. package/dist/lib/esm/transport-factory.mjs +1220 -149
  208. package/dist/lib/esm/transport-options.d.mts +131 -12
  209. package/dist/lib/esm/transport-options.mjs +9 -2
  210. package/dist/lib/esm/transport.d.mts +7 -1
  211. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  212. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  213. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  214. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  215. package/dist/lib/esm/version-matrix.d.mts +2 -2
  216. package/dist/lib/esm/version-matrix.mjs +1 -1
  217. package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
  218. package/dist/lib/esm/vitest/global-setup.mjs +14 -7
  219. package/dist/lib/esm/vitest/setup.d.mts +5 -0
  220. package/dist/lib/esm/vitest/setup.mjs +3 -1
  221. package/dist/lib/esm/vitest/typings.d.mts +6 -4
  222. package/dist/lib/esm/webview-cdp.d.mts +156 -0
  223. package/dist/lib/esm/webview-cdp.mjs +235 -0
  224. package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
  225. package/dist/lib/esm/wedged-appium-server.mjs +86 -0
  226. package/package.json +25 -23
  227. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  228. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  229. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  230. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  231. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  232. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  233. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  234. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -29,6 +29,23 @@ export interface ObsidianAndroidAppiumTransportOptions {
29
29
  * The Appium server URL (e.g. `'http://localhost:4723'`).
30
30
  */
31
31
  readonly appiumUrl: string;
32
+ /**
33
+ * Timeout in milliseconds for Obsidian Mobile to get as far as `globalThis.app`
34
+ * existing after the vault is (re)opened.
35
+ *
36
+ * The first of the two budgets the transport spends after `location.reload()`.
37
+ * It covers the app's own cold start — the WebView reloading and Obsidian's
38
+ * bundle coming up — which on a cold or contended guest can take minutes, and
39
+ * is not work {@link layoutReadyTimeoutInMilliseconds} should be sized for.
40
+ * Only once `globalThis.app` appears does that far tighter clock start.
41
+ *
42
+ * Splitting the two is what stops a first run after a machine restart from
43
+ * failing by design: the old single 90s wall clock started at the reload, so a
44
+ * cold app start spent it before Obsidian had begun laying anything out.
45
+ *
46
+ * @default `180000`
47
+ */
48
+ readonly appStartTimeoutInMilliseconds?: number;
32
49
  /**
33
50
  * The Android AVD (Android Virtual Device) name.
34
51
  *
@@ -48,9 +65,8 @@ export interface ObsidianAndroidAppiumTransportOptions {
48
65
  */
49
66
  readonly deviceId?: string;
50
67
  /**
51
- * Timeout in milliseconds for waiting, after `sys.boot_completed`, for a
52
- * harness-started emulator to become idle before the Appium session is
53
- * established.
68
+ * Timeout in milliseconds for waiting, after `sys.boot_completed`, for the
69
+ * emulator to become idle before the Appium session is established.
54
70
  *
55
71
  * `sys.boot_completed` fires *before* the guest is actually idle: package
56
72
  * optimization and system services keep churning, so establishing the session
@@ -58,8 +74,12 @@ export interface ObsidianAndroidAppiumTransportOptions {
58
74
  * contend with that work and inflates session establishment ~3x. The factory
59
75
  * instead waits until the boot animation has stopped and the package manager
60
76
  * is serving, proceeding early once idle or after this budget (best-effort — a
61
- * timeout logs a warning and proceeds). Set `0` to skip the wait. Only applies
62
- * to a harness-started emulator, not a reused one.
77
+ * timeout logs a warning and proceeds). Set `0` to skip the wait.
78
+ *
79
+ * Applies to a **reused** device as well as a harness-started one. A device
80
+ * that is merely present in `adb devices` can still be mid-`dex2oat`, and
81
+ * skipping the gate there is what left a run polling a churning guest until
82
+ * {@link layoutReadyTimeoutInMilliseconds} ran out.
63
83
  *
64
84
  * @default `60000`
65
85
  */
@@ -88,14 +108,21 @@ export interface ObsidianAndroidAppiumTransportOptions {
88
108
  */
89
109
  readonly isEmulatorVisible?: boolean;
90
110
  /**
91
- * Timeout in milliseconds for waiting for `app.workspace.layoutReady` after
92
- * the vault is (re)opened.
111
+ * Timeout in milliseconds for waiting for `app.workspace.layoutReady`, counted
112
+ * from the moment {@link appStartTimeoutInMilliseconds} is satisfied — not
113
+ * from the reload.
114
+ *
115
+ * The second of the two budgets the transport spends after `location.reload()`.
116
+ * It covers only Obsidian's own work — opening the vault and loading every
117
+ * plugin — once the app itself is up, which is why it can stay tight: measured
118
+ * at ~1s, and ≤8.4s under 12-core + disk + memory stress.
93
119
  *
94
- * Registering a vault triggers a full Obsidian re-init (`location.reload()`
95
- * reopens the vault and reloads every plugin the heaviest startup step). On
96
- * a cold-booted or under-provisioned emulator that init can take a while, so
97
- * this budget is the largest of the transport timeouts. Raise it further if
98
- * releases still flake on slow CI emulators.
120
+ * Blowing it therefore means Obsidian genuinely stalled, **or** that each probe
121
+ * round-trip is being inflated by a busy guest. The timeout error names which,
122
+ * by reporting the probe count and slowest round-trip alongside the furthest
123
+ * startup milestone reached: a handful of probes each taking tens of seconds is
124
+ * a contended guest, and the knob for that is
125
+ * {@link deviceIdleTimeoutInMilliseconds}, not this one.
99
126
  *
100
127
  * @default `90000`
101
128
  */
@@ -114,6 +141,31 @@ export interface ObsidianAndroidAppiumTransportOptions {
114
141
  * @default `7200000`
115
142
  */
116
143
  readonly leftoverMaxAgeInMilliseconds?: number;
144
+ /**
145
+ * Timeout in milliseconds for waiting, after the device-idle gate, for the
146
+ * emulator to report a **validated default network** before the Appium session
147
+ * is established.
148
+ *
149
+ * A device can be idle, fully packaged and answering `adb` while still having
150
+ * no route: the two {@link deviceIdleTimeoutInMilliseconds} signals are
151
+ * satisfied well before the default network is created and validated, which
152
+ * lands ~80s into guest uptime. That gap is dangerous rather than merely slow
153
+ * — a test that reaches the network there runs to completion against a
154
+ * silently **empty result**, which no assertion inside the suite can tell
155
+ * apart from a genuinely empty response.
156
+ *
157
+ * The factory polls `dumpsys connectivity` until an active default network
158
+ * reports validation, proceeding early once it does or after this budget
159
+ * (best-effort — a timeout logs a warning naming the missing network and
160
+ * proceeds). Set `0` to skip the wait, e.g. for a deliberately offline AVD or
161
+ * a suite that never touches the network.
162
+ *
163
+ * Applies to a **reused** device as well as a harness-started one, for the
164
+ * same reason the idle gate does.
165
+ *
166
+ * @default `120000`
167
+ */
168
+ readonly networkReadyTimeoutInMilliseconds?: number;
117
169
  /**
118
170
  * Number of extra attempts to enable the plugin and verify it loaded, on top
119
171
  * of the first attempt.
@@ -188,6 +240,30 @@ export interface ObsidianAndroidAppiumTransportOptions {
188
240
  * @default `true`
189
241
  */
190
242
  readonly shouldAutoStartAppium?: boolean;
243
+ /**
244
+ * Whether the auto-started emulator may resume — and refresh — the AVD's
245
+ * saved boot snapshot.
246
+ *
247
+ * When `false` (the default) the emulator is started with
248
+ * `-no-snapshot-load -no-snapshot-save`, so every run cold-boots a guest whose
249
+ * state nothing carried over. That is the hermetic default a test harness
250
+ * owes its callers, and it is also the safe one: a snapshot the harness loads
251
+ * but never writes rots unnoticed, and the failure it eventually produces — a
252
+ * device that serves adb, accepts a session, then drops `offline` about half a
253
+ * minute later — is indistinguishable from a code regression. Measured on one
254
+ * AVD back to back, a resumed snapshot killed the guest ~90s in *every* time,
255
+ * while the same AVD cold-booted in 50s and stayed up.
256
+ *
257
+ * Set it to `true` on a **persistent runner** whose AVD is not shared with
258
+ * anything else: the emulator then both loads and saves `default_boot`, so the
259
+ * snapshot each run resumes is one a previous run wrote, and the ~112s cold
260
+ * boot is largely bought back. The trade is test isolation — a guest that
261
+ * carries state between runs — so it is opt-in per project, never a default.
262
+ * Ignored when reusing an already-running device (nothing is launched).
263
+ *
264
+ * @default `false`
265
+ */
266
+ readonly shouldReuseEmulatorSnapshot?: boolean;
191
267
  /**
192
268
  * Whether the harness removes the temporary directories earlier runs leaked.
193
269
  *
@@ -244,6 +320,35 @@ export interface ObsidianCdpTransportOptions {
244
320
  * Defaults to 30000
245
321
  */
246
322
  readonly commandTimeoutInMilliseconds?: number;
323
+ /**
324
+ * The vault's **config folder** — Obsidian's per-vault *Override config
325
+ * folder* setting, e.g. `'.obsidian-desktop'`. Must start with a dot, must not
326
+ * be the bare dot, and must not contain a path separator; anything else throws
327
+ * before Obsidian is launched, because Obsidian itself would silently
328
+ * substitute `.obsidian`.
329
+ *
330
+ * Needed to open a vault that keeps its settings somewhere other than
331
+ * `.obsidian` — a vault with a stale `.obsidian` beside the real folder would
332
+ * otherwise open successfully against the wrong settings and report success.
333
+ * The override lives in `localStorage`, keyed by vault id, and so is scoped to
334
+ * a user-data directory: an owned instance gets a fresh temp one and therefore
335
+ * inherits nothing from the user's Obsidian, however that vault is configured
336
+ * there.
337
+ *
338
+ * Setting it costs one extra boot phase: the instance is launched to the
339
+ * starter screen, the override is written in that renderer, and the vault is
340
+ * then opened over IPC. After the vault is ready its actual
341
+ * `app.vault.configDir` is read back and any mismatch throws
342
+ * `ConfigDirectoryFallbackError` — there is no knob to downgrade that, because a
343
+ * vault opened against the wrong config folder is silently the wrong vault.
344
+ *
345
+ * Only meaningful in owned mode; **ignored in attach mode** ({@link ObsidianCdpTransportOptions.port}
346
+ * set), where the vault is opened by the user's own Obsidian under its own
347
+ * config.
348
+ *
349
+ * @default `undefined` (Obsidian's own default, `.obsidian`)
350
+ */
351
+ readonly configDirectory?: string;
247
352
  /**
248
353
  * Grace window in milliseconds for fast-failing a **dead boot** of the owned
249
354
  * instance.
@@ -442,3 +547,17 @@ export type ObsidianTransportOptions = ObsidianAndroidAppiumTransportOptions | O
442
547
  * @returns `true` for a mobile transport, `false` for desktop.
443
548
  */
444
549
  export declare function checkIsMobileTransport(options: ObsidianTransportOptions): boolean;
550
+ /**
551
+ * The config folder a vault the harness **owns** will actually read, or `undefined` when it is
552
+ * Obsidian's own default.
553
+ *
554
+ * {@link ObsidianCdpTransportOptions.configDirectory} is the only knob that moves it, and it is
555
+ * meaningful only in owned mode: in attach mode the vault is opened by the user's own Obsidian under
556
+ * its own config, and on Android there is no override at all. Anything the harness writes into a vault
557
+ * before it is opened has to go where that vault will look, so this is the answer every such writer
558
+ * needs — see `ensureHeadlessVaultConfig`.
559
+ *
560
+ * @param options - The resolved transport options.
561
+ * @returns The overridden config folder name, or `undefined` for Obsidian's default.
562
+ */
563
+ export declare function resolveOwnedConfigDirectory(options: ObsidianTransportOptions): string | undefined;
@@ -1,7 +1,14 @@
1
1
  function checkIsMobileTransport(options) {
2
2
  return options.type === "obsidian-android-appium";
3
3
  }
4
+ function resolveOwnedConfigDirectory(options) {
5
+ if (options.type !== "obsidian-cdp" || options.port !== void 0) {
6
+ return void 0;
7
+ }
8
+ return options.configDirectory;
9
+ }
4
10
  export {
5
- checkIsMobileTransport
11
+ checkIsMobileTransport,
12
+ resolveOwnedConfigDirectory
6
13
  };
7
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbmRyb2lkIEFWRCAoQW5kcm9pZCBWaXJ0dWFsIERldmljZSkgbmFtZS5cbiAgICpcbiAgICogVGhlIHRyYW5zcG9ydCBmYWN0b3J5IGxhdW5jaGVzIGBlbXVsYXRvciAtYXZkIDxhdmROYW1lPmAgYXMgYSBiYWNrZ3JvdW5kXG4gICAqIHByb2Nlc3MgYW5kIHBvbGxzIHVudGlsIHRoZSBkZXZpY2UgYXBwZWFycy4gVGhlIGVtdWxhdG9yIGlzIGtpbGxlZFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIFJ1biBgZW11bGF0b3IgLWxpc3QtYXZkc2AgdG8gc2VlIGF2YWlsYWJsZSBBVkQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCB0byByZXVzZSAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYWZ0ZXIgdGhlIEFwcGl1bSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkLiBXaGVuIHByZXNlbnQgYWxvbmdzaWRlIHtAbGluayBzZXNzaW9uSWR9LCB0aGUgdHJhbnNwb3J0XG4gICAqIGZhY3Rvcnkgc2tpcHMgZW11bGF0b3Igc3RhcnR1cCBhbmQgYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLCBmb3IgYVxuICAgKiBoYXJuZXNzLXN0YXJ0ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpc1xuICAgKiBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC4gT25seSBhcHBsaWVzXG4gICAqIHRvIGEgaGFybmVzcy1zdGFydGVkIGVtdWxhdG9yLCBub3QgYSByZXVzZWQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBjb25zb2xlIHdpbmRvdyBpcyBzaG93bi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIHByb2Nlc3MgaXMgc3Bhd25lZCB3aXRoXG4gICAqIGl0cyBjb25zb2xlIHdpbmRvdyBoaWRkZW4gKGB3aW5kb3dzSGlkZWApIGFuZCBpdHMgb3V0cHV0IGRpc2NhcmRlZCwgc28gaXRcbiAgICogbmVpdGhlciBzdGVhbHMgZm9jdXMgbm9yIHdyaXRlcyB0byB0aGUgaW52b2tpbmcgdGVybWluYWwuIElnbm9yZWQgd2hlblxuICAgKiBhdHRhY2hpbmcgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIEFwcGl1bSBzZXJ2ZXIgKHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19XG4gICAqIGBmYWxzZWAsIG9yIHRoZSBzZXJ2ZXIgYWxyZWFkeSByZWFjaGFibGUpLiBTZXQgYHRydWVgIHRvIHNlZSB0aGUgc2VydmVyIGxvZyB3aW5kb3dcbiAgICogYW5kIGl0cyBsaXZlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBbmRyb2lkIGVtdWxhdG9yIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgZW11bGF0b3IgaXMgc3RhcnRlZCB3aXRoIGAtbm8td2luZG93YFxuICAgKiAoaGVhZGxlc3MpLCBzbyBpdCBuZXZlciBzdGVhbHMgZm9jdXMuIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZ1xuICAgKiBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQgdG8gaGlkZSkuIFNldCBgdHJ1ZWAgdG8gd2F0Y2ggdGhlIGVtdWxhdG9yIFVJLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgYWZ0ZXJcbiAgICogdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQuXG4gICAqXG4gICAqIFJlZ2lzdGVyaW5nIGEgdmF1bHQgdHJpZ2dlcnMgYSBmdWxsIE9ic2lkaWFuIHJlLWluaXQgKGBsb2NhdGlvbi5yZWxvYWQoKWBcbiAgICogcmVvcGVucyB0aGUgdmF1bHQgYW5kIHJlbG9hZHMgZXZlcnkgcGx1Z2luIFx1MjAxNCB0aGUgaGVhdmllc3Qgc3RhcnR1cCBzdGVwKS4gT25cbiAgICogYSBjb2xkLWJvb3RlZCBvciB1bmRlci1wcm92aXNpb25lZCBlbXVsYXRvciB0aGF0IGluaXQgY2FuIHRha2UgYSB3aGlsZSwgc29cbiAgICogdGhpcyBidWRnZXQgaXMgdGhlIGxhcmdlc3Qgb2YgdGhlIHRyYW5zcG9ydCB0aW1lb3V0cy4gUmFpc2UgaXQgZnVydGhlciBpZlxuICAgKiByZWxlYXNlcyBzdGlsbCBmbGFrZSBvbiBzbG93IENJIGVtdWxhdG9ycy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciAqKmhvc3QqKiBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmVcbiAgICoge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfSByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBHb3Zlcm5zIHRoZSBob3N0LXNpZGUgc3dlZXAgb25seSAodGhlIGB0ZW1wLXZhdWx0LSpgIHN0YWdpbmcgZGlyZWN0b3JpZXNcbiAgICogdGhpcyBydW4ncyBtYWNoaW5lIGFjY3VtdWxhdGVzIGluIGl0cyB0ZW1wIGRpcikuIFRoZSAqKmRldmljZSoqIHN3ZWVwIGlzXG4gICAqIHVuY29uZGl0aW9uYWw6IEFuZHJvaWQgcnVucyBob2xkIHRoZSBleGNsdXNpdmUgYGFuZHJvaWRgIHNldHVwIGxvY2ssIHNvIG5vXG4gICAqIGNvbmN1cnJlbnQgcnVuIGNhbiBvd24gYSBkZXZpY2UgdmF1bHQsIGFuZCBhbiBhZ2UgZ2F0ZSB0aGVyZSB3b3VsZCBsZXQgYVxuICAgKiB2YXVsdCBsZWFrZWQgbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1biBcdTIwMTQgd2hpY2ggaXMgdGhlIGZhaWx1cmVcbiAgICogbG9vcCB0aGUgc3dlZXAgZXhpc3RzIHRvIGJyZWFrLiBTZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBob3N0IG1hdGNoIHRvby5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaGFybmVzcyByZW1vdmVzIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgZWFybGllciBydW5zIGxlYWtlZC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgZWFjaCBydW4gc3dlZXBzIGF0IHN0YXJ0ICoqYW5kKiogYXQgZW5kOiBvbiB0aGVcbiAgICogZGV2aWNlLCBldmVyeSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcnkgdW5kZXIge0BsaW5rIHZhdWx0QmFzZVBhdGh9IChwbHVzIHRoZVxuICAgKiBzdGFsZSB2YXVsdCByZWdpc3RyYXRpb25zIGluIE9ic2lkaWFuIE1vYmlsZSdzIGBsb2NhbFN0b3JhZ2VgKTsgb24gdGhlIGhvc3QsXG4gICAqIHRoZSBsZWZ0b3ZlciBgdGVtcC12YXVsdC0qYCBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGRpcmVjdG9yaWVzIG9sZGVyIHRoYW5cbiAgICoge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LlxuICAgKlxuICAgKiBBIHJ1biB0aGF0IGRpZXMgY2Fubm90IGNsZWFuIHVwIGFmdGVyIGl0c2VsZiBcdTIwMTQgaXRzIHRlYXJkb3duIGdvZXMgdGhyb3VnaCB0aGVcbiAgICogV2ViVmlldywgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIHdoYXQgbW9zdCBBbmRyb2lkIGZhaWx1cmVzIGFyZSBcdTIwMTQgc28gdGhlXG4gICAqIHJlc2lkdWUgYWNjdW11bGF0ZXMgYW5kIHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXAgZW51bWVyYXRpb24gdW50aWwgaXRcbiAgICogbWlzc2VzIHRoZSBXZWJWaWV3LXJlYWRpbmVzcyBidWRnZXQuIFRoZSBzdGFydCBzd2VlcCBpcyB0aGUgaGFsZiB0aGF0IGJyZWFrc1xuICAgKiB0aGF0IGxvb3AsIGJlY2F1c2UgaXQgcnVucyBiZWZvcmUgYW55dGhpbmcgdGhhdCBjYW4gZGllLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogT24gc2xvdyBlbXVsYXRvcnMsIHRoZSBDaHJvbWVEcml2ZXIgcHJveHkgdGhhdCBoYW5kbGVzIFdlYlZpZXcgY29tbWFuZHNcbiAgICogbWF5IG5vdCBiZSByZWFkeSBpbW1lZGlhdGVseSBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gc3RhcnRzLiBUaGlzIHRpbWVvdXRcbiAgICogY29udHJvbHMgaG93IGxvbmcgdG8gcG9sbCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBkZXNrdG9wIHRlc3RpbmcgdmlhIENocm9tZSBEZXZUb29scyBQcm90b2NvbC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGRlc2t0b3AgdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHRoZSBoYXJuZXNzICoqbGF1bmNoZXMgYW5kXG4gKiBvd25zIGFuIGlzb2xhdGVkIE9ic2lkaWFuIGluc3RhbmNlKiogaW4gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciAobmV2ZXJcbiAqIHRvdWNoaW5nIHRoZSB1c2VyJ3MgT2JzaWRpYW4pLCBjb25uZWN0ZWQgb3ZlciBhIGZyZWUgQ0RQIHBvcnQuIFByb3ZpZGVcbiAqIHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH0gdG8gaW5zdGVhZCBhdHRhY2ggdG8gYW5cbiAqIGFscmVhZHktcnVubmluZyBPYnNpZGlhbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKiBEZWZhdWx0cyB0byAzMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgKipkZWFkIGJvb3QqKiBvZiB0aGUgb3duZWRcbiAgICogaW5zdGFuY2UuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBjYW5ub3QgcnVuIG9uIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbCAodGhlIGluc3RhbGxlclxuICAgKiB2ZXJzaW9uIGlzIHRvbyBvbGQgZm9yIHRoZSBhcHAgdmVyc2lvbiksIHRoZSByZW5kZXJlciBsb2FkcyBidXQgbmV2ZXJcbiAgICogYm9vdHN0cmFwczogYGRvY3VtZW50LmJvZHlgIHN0YXlzIGVtcHR5IGFuZCBgd2luZG93LmFwcGAgcmVtYWluc1xuICAgKiBgdW5kZWZpbmVkYCBcdTIwMTQgYSBibGFjayBzY3JlZW4uIFJhdGhlciB0aGFuIHdhaXRpbmcgb3V0IHRoZSBmdWxsIHJlYWRpbmVzc1xuICAgKiB0aW1lb3V0LCB0aGUgb3duZWQtdmF1bHQgcmVhZGluZXNzIHBvbGwgY29uY2x1ZGVzIHRoZSBib290IGlzIGRlYWQgb25jZSB0aGVcbiAgICogcmVuZGVyZXIgaGFzIGJlZW4gYGRvY3VtZW50LnJlYWR5U3RhdGVgIGAnY29tcGxldGUnYCBmb3IgdGhpcyBsb25nIHdpdGggbm9cbiAgICogYHdpbmRvdy5hcHBgIGFuZCBhbiBlbXB0eSBgPGJvZHk+YCwgYW5kIHRocm93cyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS4gU2V0IGAwYCB0byBkaXNhYmxlIGZhc3QtZmFpbCBhbmRcbiAgICogcmVzdG9yZSB0aGUgcGxhaW4gd2FpdC1vdXQtdGhlLXJlYWRpbmVzcy10aW1lb3V0IGJlaGF2aW9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKiBEZWZhdWx0cyB0byBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB7QGxpbmsgcG9ydH0gYXMgdGhlIENEUCBwb3J0IG9mIGEgKipoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZSoqXG4gICAqIHRoYXQgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGFuZCBwcmVwYXJlZCAodmF1bHQgcmVnaXN0ZXJlZCxcbiAgICogcGx1Z2luIGVuYWJsZWQpLlxuICAgKlxuICAgKiBQb3B1bGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgZ2xvYmFsIHNldHVwIGFuZCBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgdmlhXG4gICAqIHRoZSBmcmFtZXdvcmsncyBjb250ZXh0IG1lY2hhbmlzbSAoZS5nLiBWaXRlc3QgYHByb3ZpZGVgL2BpbmplY3RgKS4gV2hlbiBzZXQsXG4gICAqIHRoZSB3b3JrZXIgKiphdHRhY2hlcyoqIHRvIHRoZSBvd25lZCBpbnN0YW5jZSBvbiB7QGxpbmsgcG9ydH0gaW5zdGVhZCBvZlxuICAgKiBsYXVuY2hpbmcgaXRzIG93biwgYW5kIHNraXBzIHRoZSB1c2VyLXNjb3BlIHZhdWx0LXJlZ2lzdHJhdGlvbiBwcmVmbGlnaHQgXHUyMDE0XG4gICAqIHRoZSBvd25lZCBpbnN0YW5jZSdzIHZhdWx0IGxpdmVzIGluIGFuIGlzb2xhdGVkIHVzZXItZGF0YSBjb25maWcsIG5vdCB0aGVcbiAgICogdXNlci1zY29wZSByZWdpc3RyeS4gRG8gbm90IHNldCB0aGlzIG1hbnVhbGx5OyBmb3IgcGxhaW4gYXR0YWNoIG1vZGUgdXNlXG4gICAqIHtAbGluayBwb3J0fSBhbG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IGlzSGFybmVzc093bmVkSW5zdGFuY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZCBkZXNrdG9wIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCwgdGhlIGhhcm5lc3MgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIHdpdGhcbiAgICoga2VlcC1hbGl2ZSBDaHJvbWl1bSBmbGFncyBhbmQgbW92ZXMgaXRzIHdpbmRvdyAqKm9mZi1zY3JlZW4qKiBvbmNlIEVsZWN0cm9uJ3NcbiAgICogcmVtb3RlIGJyaWRnZSBpcyBhdmFpbGFibGUsIHNvIHRoZSBydW4gbmV2ZXIgc3RlYWxzIGZvY3VzIG9yIHBvcHMgYSB3aW5kb3cgaW5cbiAgICogZnJvbnQgb2YgeW91LiBPZmYtc2NyZWVuIChub3QgbWluaW1pemVkKSBrZWVwcyB0aGUgcmVuZGVyZXIgbGl2ZSwgc29cbiAgICogYHNldFRpbWVvdXRgLCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCwgYDpob3ZlcmAsIGFuZCB0cnVzdGVkIGlucHV0IGJlaGF2ZVxuICAgKiBpZGVudGljYWxseSB0byBhIHZpc2libGUgd2luZG93LiBEZWZhdWx0cyB0byBgdHJ1ZWA7IGludGVncmF0aW9uIHNldHVwXG4gICAqIGV4cGxpY2l0bHkgcGFzc2VzIGBmYWxzZWAgdG8gYXZvaWQgc3RlYWxpbmcgZm9jdXMuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGVcbiAgICogKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiBtb3ZlcyB0aGUgdXNlcidzIG93biBydW5uaW5nIHdpbmRvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvdyBvbGQgYSBsZWZ0b3ZlciBkaXJlY3RvcnkgbXVzdCBiZSBiZWZvcmUge0BsaW5rIHNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiByZW1vdmVzIGl0LlxuICAgKlxuICAgKiBUaGUgZ2F0ZSBtYXR0ZXJzIG1vc3Qgb24gZGVza3RvcDogcnVucyBhcmUgZGVsaWJlcmF0ZWx5ICoqbm90Kiogc2VyaWFsaXplZFxuICAgKiAoZWFjaCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSwgYW5kIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzXG4gICAqIG9uZSB0ZW1wIGRpcmVjdG9yeSwgc28gYSB5b3VuZyBgdGVtcC12YXVsdC0qYCAvIGB1c2VyZGF0YS0qYCBkaXJlY3RvcnkgbWF5XG4gICAqIHdlbGwgYmVsb25nIHRvIGEgcnVuIHRoYXQgaXMgc3RpbGwgaW4gZmxpZ2h0LiBSYWlzZSBpdCBpZiBhIHJ1biBvZiB5b3VycyBjYW5cbiAgICogb3V0bGl2ZSB0aGUgZGVmYXVsdDsgc2V0IGAwYCB0byByZW1vdmUgZXZlcnkgbWF0Y2ggcmVnYXJkbGVzcyBvZiBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipFbGVjdHJvbiBzaGVsbCoqIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFRoZSBtYXRjaGluZyBHaXRIdWIgcmVsZWFzZSBpbnN0YWxsZXIgaXMgZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkIHRvIGFcbiAgICogcG9ydGFibGUgc2hlbGwgKGNhY2hlZCBmb3IgcmV1c2UpLiBQdWJsaWMgcmVsZWFzZXMgb25seSBcdTIwMTQgY2F0YWx5c3QgYnVpbGRzXG4gICAqIGhhdmUgbm8gcHVibGljIGluc3RhbGxlci4gSWdub3JlZCB3aGVuIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGlucyB0aGUgKipPYnNpZGlhbiBhcHAgdmVyc2lvbioqIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy5cbiAgICpcbiAgICogQWNjZXB0cyBhbiBleHBsaWNpdCBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLlxuICAgKiBWZXJzaW9ucyBhdCBvciBhYm92ZSB0aGUgc2hlbGwgdmVyc2lvbiBhcmUgYXBwbGllZCBhcyBhIGNoZWFwIGFzYXIgc3dhcDtcbiAgICogb2xkZXIgdmVyc2lvbnMgdHJhbnNwYXJlbnRseSB1c2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbC4gV2hlbiBvbWl0dGVkLFxuICAgKiB0aGUgdXNlcidzIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9XG4gICAqIChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0byAodGhlXG4gICAqIGAtLXJlbW90ZS1kZWJ1Z2dpbmctcG9ydGAgaXQgd2FzIGxhdW5jaGVkIHdpdGgpLiBXaGVuIHNldCwgdGhlIGhhcm5lc3NcbiAgICogYXR0YWNoZXMgaW5zdGVhZCBvZiBvd25pbmcgYW4gaW5zdGFuY2UsIGFuZCB0aGUgdmVyc2lvbiBrbm9icyBhcmUgaWdub3JlZC5cbiAgICogV2hlbiBvbWl0dGVkLCBhbiBvd25lZCBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5XG4gICAqIGNob3NlbiBmcmVlIHBvcnQgKG5vIHBvcnQgaXMgaGFyZGNvZGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbGF1bmNoIHRoZSBvd25lZCBpbnN0YW5jZSB3aXRoIENocm9taXVtJ3Mgc2FuZGJveCBkaXNhYmxlZFxuICAgKiAoYC0tbm8tc2FuZGJveGApLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gYm9vdCBhbiBvd25lZCBpbnN0YW5jZSBvbiBMaW51eCB3aGVuIHRoZXJlIGlzIG5vXG4gICAqIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZCBgY2hyb21lLXNhbmRib3hgIGhlbHBlciBcdTIwMTQgZS5nLiBhIHBvcnRhYmxlIHNoZWxsXG4gICAqIGV4dHJhY3RlZCBmcm9tIGFuIGluc3RhbGxlciwgb3IgYSBDSSBydW5uZXIgbGF1bmNoaW5nIGFzIGEgbm9uLXJvb3QgdXNlciwgaW5cbiAgICogd2hpY2ggY2FzZSB0aGUgcmVuZGVyZXIgb3RoZXJ3aXNlIHJlZnVzZXMgdG8gc3RhcnQuIEhhcm1sZXNzIG9uXG4gICAqIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpIFx1MjAxNCB0aGUgaGFybmVzcyBuZXZlclxuICAgKiByZWxhdW5jaGVzIHRoZSB1c2VyJ3MgcnVubmluZyBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgYW5kIGF0IGVuZCBmb3JcbiAgICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZyBkaXJlY3RvcmllcyBhbmQgb3duZWQgYHVzZXJkYXRhLSpgIGluc3RhbmNlIHByb2ZpbGVzXG4gICAqIG9sZGVyIHRoYW4ge0BsaW5rIGxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHN9LiBBIHJ1biBraWxsZWQgbWlkLWZsaWdodFxuICAgKiBuZXZlciByZWFjaGVzIGl0cyBvd24gY2xlYW51cCwgc28gd2l0aG91dCB0aGlzIHRoZSB0ZW1wIGRpcmVjdG9yeSBncm93c1xuICAgKiB3aXRob3V0IGJvdW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFN3ZWVwTGVmdG92ZXJzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhbiAqKnVucnVubmFibGUqKiBpbnN0YWxsZXJcdTIxOTRhcHAgdmVyc2lvbiBwYWlyIGZhaWxzIGZhc3QgYmVmb3JlIGxhdW5jaC5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgKHRoZVxuICAgKiBvbGRlc3QgaW5zdGFsbGVyIHRoZSBhcHAncyBhc2FyIGNhbiBib290IG9uKSB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24sIGJlZm9yZSBhbnl0aGluZ1xuICAgKiBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLiBTZXQgYGZhbHNlYCB0byBsZXQgdGhlIHBpbiBwcm9jZWVkIHRvIGxhdW5jaFxuICAgKiBpbnN0ZWFkIFx1MjAxNCB3aGVyZSB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbFxuICAgKiAoYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLCBzZWUge0BsaW5rIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kc30pXG4gICAqIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXNcbiAgICogc3VyZmFjZWQgYXMgZGF0YSByYXRoZXIgdGhhbiB0aHJvd24uIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZCBpbnN0YW5jZVxuICAgKiAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdCBhZnRlciBib290LlxuICAgKlxuICAgKiBXaGVuIGFuIGFzYXIgaXMgc3dhcHBlZCBvbnRvIGFuIGluc3RhbGxlciBzaGVsbCB0b28gb2xkIGZvciBpdCwgdGhlIGluc3RhbmNlXG4gICAqIG1heSBub3QgZGVhZC1ib290IFx1MjAxNCBpdCBjYW4gc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZFxuICAgKiBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmcgKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWBcbiAgICogKHRoZSBkZWZhdWx0KSwgdGhlIHRyYW5zcG9ydCB2ZXJpZmllcyB0aGUgcnVubmluZyBhcHAgdmVyc2lvbiBhZ2FpbnN0IHRoZSBwaW5cbiAgICogcG9zdC1ib290IGFuZCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBvbiBhIG1pc21hdGNoLiBTZXQgYGZhbHNlYCB0b1xuICAgKiBsZXQgdGhlIGJvb3QgcHJvY2VlZCBcdTIwMTQgdGhlIG1pc21hdGNoIGlzIHRoZW4gc3VyZmFjZWQgYXMgZGF0YSAodGhlIGZhbGxiYWNrXG4gICAqIHZlcmRpY3QpIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlIHJ1bm5pbmcgYVxuICAgKiBzd2FwcGVkLWluIGFzYXIgKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQsIGFuZCB3aGVuIG5vIGFzYXIgaXNcbiAgICogc3dhcHBlZCBcdTIwMTQgdGhlcmUgaXMgbm90aGluZyB0byB2ZXJpZnkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyAqKmJvdGgqKiBjb21wYXRpYmlsaXR5IG5hZ3M6IHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIChhXG4gICAqIHJ1bm5hYmxlIGluc3RhbGxlciBiZWxvdyB0aGUgcmVjb21tZW5kZWQgZmxvb3IpIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZyAoYSBsaXZlIEVsZWN0cm9uIGJlbG93IHRoZSBhcHAncyByZWNvbW1lbmRlZFxuICAgKiBtaW5pbXVtKS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzcyBsb2c7IHNldFxuICAgKiBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBjb21wdXRlZCBhbmQgc3VyZmFjZWQgYXNcbiAgICogZGF0YSAoYGNvbXBhdGliaWxpdHlgIC8gYGVsZWN0cm9uQ29tcGF0aWJpbGl0eWApLCBvbmx5IHRoZSBsb2cgaXMgc3VwcHJlc3NlZC5cbiAgICogRG9lcyBub3QgYWZmZWN0IHRoZSBgJ3VucnVubmFibGUnYCB0aHJvdyAoc2VlXG4gICAqIHtAbGluayBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSkuIE9ubHkgYXBwbGllcyB0byBhbiBvd25lZFxuICAgKiBpbnN0YW5jZSAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudCBmb3IgdGhlIHRyYW5zcG9ydCB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ29ic2lkaWFuLWNkcCc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvZiBhbGwgc3VwcG9ydGVkIHRyYW5zcG9ydCBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBVc2VkIGluIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCB0byBzZWxlY3QgYW5kXG4gKiBjb25maWd1cmUgdGhlIHRyYW5zcG9ydCBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCB0eXBlIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyA9XG4gIHwgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuICB8IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucztcblxuLyoqXG4gKiBXaGV0aGVyIHRoZXNlIG9wdGlvbnMgZGVzY3JpYmUgYSBtb2JpbGUgdHJhbnNwb3J0LlxuICpcbiAqIFRoZSBzYW1lIGZhY3QgYXMge0BsaW5rIE9ic2lkaWFuVHJhbnNwb3J0LmlzTW9iaWxlfSwgYnV0IGtub3dhYmxlIGZyb20gdGhlIG9wdGlvbnMgYWxvbmUgXHUyMDE0IHNvIGEgY2FsbGVyXG4gKiBjYW4gYWN0IG9uIGl0IGJlZm9yZSBwYXlpbmcgZm9yIGEgZGV2aWNlLiBSZWFkaW5nIGl0IG9mZiBhIGxpdmUgdHJhbnNwb3J0IG1lYW5zIGJvb3RpbmcgdGhlIGVtdWxhdG9yXG4gKiBhbmQgdGhlIEFwcGl1bSBzZXNzaW9uIGZpcnN0LCB3aGljaCBpcyB+NzAgcyB0byBsZWFybiBzb21ldGhpbmcgdGhlIGRpc2NyaW1pbmFudCBhbHJlYWR5IHNheXMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgZm9yIGEgbW9iaWxlIHRyYW5zcG9ydCwgYGZhbHNlYCBmb3IgZGVza3RvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zKTogYm9vbGVhbiB7XG4gIHJldHVybiBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrZU8sU0FBUyx1QkFBdUIsU0FBNEM7QUFDakYsU0FBTyxRQUFRLFNBQVM7QUFDMUI7IiwKICAibmFtZXMiOiBbXQp9Cg==
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB0eXBlcyBmb3IgY29uZmlndXJpbmcgdGhlIE9ic2lkaWFuIHRyYW5zcG9ydFxuICogdmlhIHZpdGVzdCBgZW52aXJvbm1lbnRPcHRpb25zYC5cbiAqL1xuXG4vKipcbiAqIFRyYW5zcG9ydCBvcHRpb25zIGZvciBBbmRyb2lkIHRlc3RpbmcgdmlhIEFwcGl1bSBXZWJWaWV3IGluamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYFxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgdG8gYmVjb21lIHJlYWR5XG4gICAqIChpdHMgYC9zdGF0dXNgIGVuZHBvaW50IHRvIHJlc3BvbmQpLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgaGFybmVzcyBhdXRvLXN0YXJ0cyB0aGUgQXBwaXVtIHNlcnZlclxuICAgKiAoe0BsaW5rIHNob3VsZEF1dG9TdGFydEFwcGl1bX0pOyBpZ25vcmVkIHdoZW4gYXR0YWNoaW5nIHRvIGFuXG4gICAqIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuIE9uIGEgY29sZCBtYWNoaW5lIHRoZSBgbnB4IGFwcGl1bWAgc2VydmVyIGNhbiB0YWtlXG4gICAqIGEgd2hpbGUgdG8gZmluaXNoIGJvb3RpbmcsIHNvIHJhaXNlIHRoaXMgaWYgc3RhcnR1cCB0aW1lcyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMIChlLmcuIGAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJ2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBPYnNpZGlhbiBNb2JpbGUgdG8gZ2V0IGFzIGZhciBhcyBgZ2xvYmFsVGhpcy5hcHBgXG4gICAqIGV4aXN0aW5nIGFmdGVyIHRoZSB2YXVsdCBpcyAocmUpb3BlbmVkLlxuICAgKlxuICAgKiBUaGUgZmlyc3Qgb2YgdGhlIHR3byBidWRnZXRzIHRoZSB0cmFuc3BvcnQgc3BlbmRzIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAuXG4gICAqIEl0IGNvdmVycyB0aGUgYXBwJ3Mgb3duIGNvbGQgc3RhcnQgXHUyMDE0IHRoZSBXZWJWaWV3IHJlbG9hZGluZyBhbmQgT2JzaWRpYW4nc1xuICAgKiBidW5kbGUgY29taW5nIHVwIFx1MjAxNCB3aGljaCBvbiBhIGNvbGQgb3IgY29udGVuZGVkIGd1ZXN0IGNhbiB0YWtlIG1pbnV0ZXMsIGFuZFxuICAgKiBpcyBub3Qgd29yayB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IHNob3VsZCBiZSBzaXplZCBmb3IuXG4gICAqIE9ubHkgb25jZSBgZ2xvYmFsVGhpcy5hcHBgIGFwcGVhcnMgZG9lcyB0aGF0IGZhciB0aWdodGVyIGNsb2NrIHN0YXJ0LlxuICAgKlxuICAgKiBTcGxpdHRpbmcgdGhlIHR3byBpcyB3aGF0IHN0b3BzIGEgZmlyc3QgcnVuIGFmdGVyIGEgbWFjaGluZSByZXN0YXJ0IGZyb21cbiAgICogZmFpbGluZyBieSBkZXNpZ246IHRoZSBvbGQgc2luZ2xlIDkwcyB3YWxsIGNsb2NrIHN0YXJ0ZWQgYXQgdGhlIHJlbG9hZCwgc28gYVxuICAgKiBjb2xkIGFwcCBzdGFydCBzcGVudCBpdCBiZWZvcmUgT2JzaWRpYW4gaGFkIGJlZ3VuIGxheWluZyBhbnl0aGluZyBvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxODAwMDBgXG4gICAqL1xuICByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIEFuZHJvaWQgQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBuYW1lLlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGZhY3RvcnkgbGF1bmNoZXMgYGVtdWxhdG9yIC1hdmQgPGF2ZE5hbWU+YCBhcyBhIGJhY2tncm91bmRcbiAgICogcHJvY2VzcyBhbmQgcG9sbHMgdW50aWwgdGhlIGRldmljZSBhcHBlYXJzLiBUaGUgZW11bGF0b3IgaXMga2lsbGVkXG4gICAqIG9uIHRyYW5zcG9ydCBkaXNwb3NhbC5cbiAgICpcbiAgICogUnVuIGBlbXVsYXRvciAtbGlzdC1hdmRzYCB0byBzZWUgYXZhaWxhYmxlIEFWRCBuYW1lcy5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIHRvIHJldXNlIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICpcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGdsb2JhbCBzZXR1cCBhZnRlciB0aGUgQXBwaXVtIHNlc3Npb24gaXNcbiAgICogZXN0YWJsaXNoZWQuIFdoZW4gcHJlc2VudCBhbG9uZ3NpZGUge0BsaW5rIHNlc3Npb25JZH0sIHRoZSB0cmFuc3BvcnRcbiAgICogZmFjdG9yeSBza2lwcyBlbXVsYXRvciBzdGFydHVwIGFuZCBhdHRhY2hlcyB0byB0aGUgZXhpc3Rpbmcgc2Vzc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZywgYWZ0ZXIgYHN5cy5ib290X2NvbXBsZXRlZGAsIGZvciB0aGVcbiAgICogZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBBcHBpdW0gc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZywgc28gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uXG4gICAqIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IG9uZSBvZiBVaUF1dG9tYXRvcjIncyBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzXG4gICAqIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGVzIHNlc3Npb24gZXN0YWJsaXNobWVudCB+M3guIFRoZSBmYWN0b3J5XG4gICAqIGluc3RlYWQgd2FpdHMgdW50aWwgdGhlIGJvb3QgYW5pbWF0aW9uIGhhcyBzdG9wcGVkIGFuZCB0aGUgcGFja2FnZSBtYW5hZ2VyXG4gICAqIGlzIHNlcnZpbmcsIHByb2NlZWRpbmcgZWFybHkgb25jZSBpZGxlIG9yIGFmdGVyIHRoaXMgYnVkZ2V0IChiZXN0LWVmZm9ydCBcdTIwMTQgYVxuICAgKiB0aW1lb3V0IGxvZ3MgYSB3YXJuaW5nIGFuZCBwcm9jZWVkcykuIFNldCBgMGAgdG8gc2tpcCB0aGUgd2FpdC5cbiAgICpcbiAgICogQXBwbGllcyB0byBhICoqcmV1c2VkKiogZGV2aWNlIGFzIHdlbGwgYXMgYSBoYXJuZXNzLXN0YXJ0ZWQgb25lLiBBIGRldmljZVxuICAgKiB0aGF0IGlzIG1lcmVseSBwcmVzZW50IGluIGBhZGIgZGV2aWNlc2AgY2FuIHN0aWxsIGJlIG1pZC1gZGV4Mm9hdGAsIGFuZFxuICAgKiBza2lwcGluZyB0aGUgZ2F0ZSB0aGVyZSBpcyB3aGF0IGxlZnQgYSBydW4gcG9sbGluZyBhIGNodXJuaW5nIGd1ZXN0IHVudGlsXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gcmFuIG91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgY29uc29sZSB3aW5kb3cgaXMgc2hvd24uXG4gICAqXG4gICAqIFdoZW4gYGZhbHNlYCAodGhlIGRlZmF1bHQpLCB0aGUgYG5weCBhcHBpdW1gIHNlcnZlciBwcm9jZXNzIGlzIHNwYXduZWQgd2l0aFxuICAgKiBpdHMgY29uc29sZSB3aW5kb3cgaGlkZGVuIChgd2luZG93c0hpZGVgKSBhbmQgaXRzIG91dHB1dCBkaXNjYXJkZWQsIHNvIGl0XG4gICAqIG5laXRoZXIgc3RlYWxzIGZvY3VzIG5vciB3cml0ZXMgdG8gdGhlIGludm9raW5nIHRlcm1pbmFsLiBJZ25vcmVkIHdoZW5cbiAgICogYXR0YWNoaW5nIHRvIGFuIGFscmVhZHktcnVubmluZyBBcHBpdW0gc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfVxuICAgKiBgZmFsc2VgLCBvciB0aGUgc2VydmVyIGFscmVhZHkgcmVhY2hhYmxlKS4gU2V0IGB0cnVlYCB0byBzZWUgdGhlIHNlcnZlciBsb2cgd2luZG93XG4gICAqIGFuZCBpdHMgbGl2ZSBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBhdXRvLXN0YXJ0ZWQgQW5kcm9pZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLlxuICAgKlxuICAgKiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aCBgLW5vLXdpbmRvd2BcbiAgICogKGhlYWRsZXNzKSwgc28gaXQgbmV2ZXIgc3RlYWxzIGZvY3VzLiBJZ25vcmVkIHdoZW4gcmV1c2luZyBhbiBhbHJlYWR5LXJ1bm5pbmdcbiAgICogZGV2aWNlIChub3RoaW5nIGlzIGxhdW5jaGVkIHRvIGhpZGUpLiBTZXQgYHRydWVgIHRvIHdhdGNoIHRoZSBlbXVsYXRvciBVSS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXVsYXRvclZpc2libGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90XG4gICAqIGZyb20gdGhlIHJlbG9hZC5cbiAgICpcbiAgICogVGhlIHNlY29uZCBvZiB0aGUgdHdvIGJ1ZGdldHMgdGhlIHRyYW5zcG9ydCBzcGVuZHMgYWZ0ZXIgYGxvY2F0aW9uLnJlbG9hZCgpYC5cbiAgICogSXQgY292ZXJzIG9ubHkgT2JzaWRpYW4ncyBvd24gd29yayBcdTIwMTQgb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmcgZXZlcnlcbiAgICogcGx1Z2luIFx1MjAxNCBvbmNlIHRoZSBhcHAgaXRzZWxmIGlzIHVwLCB3aGljaCBpcyB3aHkgaXQgY2FuIHN0YXkgdGlnaHQ6IG1lYXN1cmVkXG4gICAqIGF0IH4xcywgYW5kIFx1MjI2NDguNHMgdW5kZXIgMTItY29yZSArIGRpc2sgKyBtZW1vcnkgc3RyZXNzLlxuICAgKlxuICAgKiBCbG93aW5nIGl0IHRoZXJlZm9yZSBtZWFucyBPYnNpZGlhbiBnZW51aW5lbHkgc3RhbGxlZCwgKipvcioqIHRoYXQgZWFjaCBwcm9iZVxuICAgKiByb3VuZC10cmlwIGlzIGJlaW5nIGluZmxhdGVkIGJ5IGEgYnVzeSBndWVzdC4gVGhlIHRpbWVvdXQgZXJyb3IgbmFtZXMgd2hpY2gsXG4gICAqIGJ5IHJlcG9ydGluZyB0aGUgcHJvYmUgY291bnQgYW5kIHNsb3dlc3Qgcm91bmQtdHJpcCBhbG9uZ3NpZGUgdGhlIGZ1cnRoZXN0XG4gICAqIHN0YXJ0dXAgbWlsZXN0b25lIHJlYWNoZWQ6IGEgaGFuZGZ1bCBvZiBwcm9iZXMgZWFjaCB0YWtpbmcgdGVucyBvZiBzZWNvbmRzIGlzXG4gICAqIGEgY29udGVuZGVkIGd1ZXN0LCBhbmQgdGhlIGtub2IgZm9yIHRoYXQgaXNcbiAgICoge0BsaW5rIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LCBub3QgdGhpcyBvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA5MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgbGVmdG92ZXIgKipob3N0KiogZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlXG4gICAqIHtAbGluayBzaG91bGRTd2VlcExlZnRvdmVyc30gcmVtb3ZlcyBpdC5cbiAgICpcbiAgICogR292ZXJucyB0aGUgaG9zdC1zaWRlIHN3ZWVwIG9ubHkgKHRoZSBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzXG4gICAqIHRoaXMgcnVuJ3MgbWFjaGluZSBhY2N1bXVsYXRlcyBpbiBpdHMgdGVtcCBkaXIpLiBUaGUgKipkZXZpY2UqKiBzd2VlcCBpc1xuICAgKiB1bmNvbmRpdGlvbmFsOiBBbmRyb2lkIHJ1bnMgaG9sZCB0aGUgZXhjbHVzaXZlIGBhbmRyb2lkYCBzZXR1cCBsb2NrLCBzbyBub1xuICAgKiBjb25jdXJyZW50IHJ1biBjYW4gb3duIGEgZGV2aWNlIHZhdWx0LCBhbmQgYW4gYWdlIGdhdGUgdGhlcmUgd291bGQgbGV0IGFcbiAgICogdmF1bHQgbGVha2VkIG1pbnV0ZXMgYWdvIHN1cnZpdmUgaW50byB0aGUgbmV4dCBydW4gXHUyMDE0IHdoaWNoIGlzIHRoZSBmYWlsdXJlXG4gICAqIGxvb3AgdGhlIHN3ZWVwIGV4aXN0cyB0byBicmVhay4gU2V0IGAwYCB0byByZW1vdmUgZXZlcnkgaG9zdCBtYXRjaCB0b28uXG4gICAqXG4gICAqIEBkZWZhdWx0IGA3MjAwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcsIGFmdGVyIHRoZSBkZXZpY2UtaWRsZSBnYXRlLCBmb3IgdGhlXG4gICAqIGVtdWxhdG9yIHRvIHJlcG9ydCBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZSB0aGUgQXBwaXVtIHNlc3Npb25cbiAgICogaXMgZXN0YWJsaXNoZWQuXG4gICAqXG4gICAqIEEgZGV2aWNlIGNhbiBiZSBpZGxlLCBmdWxseSBwYWNrYWdlZCBhbmQgYW5zd2VyaW5nIGBhZGJgIHdoaWxlIHN0aWxsIGhhdmluZ1xuICAgKiBubyByb3V0ZTogdGhlIHR3byB7QGxpbmsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gc2lnbmFscyBhcmVcbiAgICogc2F0aXNmaWVkIHdlbGwgYmVmb3JlIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkLCB3aGljaFxuICAgKiBsYW5kcyB+ODBzIGludG8gZ3Vlc3QgdXB0aW1lLiBUaGF0IGdhcCBpcyBkYW5nZXJvdXMgcmF0aGVyIHRoYW4gbWVyZWx5IHNsb3dcbiAgICogXHUyMDE0IGEgdGVzdCB0aGF0IHJlYWNoZXMgdGhlIG5ldHdvcmsgdGhlcmUgcnVucyB0byBjb21wbGV0aW9uIGFnYWluc3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5IHJlc3VsdCoqLCB3aGljaCBubyBhc3NlcnRpb24gaW5zaWRlIHRoZSBzdWl0ZSBjYW4gdGVsbFxuICAgKiBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGUgZmFjdG9yeSBwb2xscyBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHVudGlsIGFuIGFjdGl2ZSBkZWZhdWx0IG5ldHdvcmtcbiAgICogcmVwb3J0cyB2YWxpZGF0aW9uLCBwcm9jZWVkaW5nIGVhcmx5IG9uY2UgaXQgZG9lcyBvciBhZnRlciB0aGlzIGJ1ZGdldFxuICAgKiAoYmVzdC1lZmZvcnQgXHUyMDE0IGEgdGltZW91dCBsb2dzIGEgd2FybmluZyBuYW1pbmcgdGhlIG1pc3NpbmcgbmV0d29yayBhbmRcbiAgICogcHJvY2VlZHMpLiBTZXQgYDBgIHRvIHNraXAgdGhlIHdhaXQsIGUuZy4gZm9yIGEgZGVsaWJlcmF0ZWx5IG9mZmxpbmUgQVZEIG9yXG4gICAqIGEgc3VpdGUgdGhhdCBuZXZlciB0b3VjaGVzIHRoZSBuZXR3b3JrLlxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGEgKipyZXVzZWQqKiBkZXZpY2UgYXMgd2VsbCBhcyBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUsIGZvciB0aGVcbiAgICogc2FtZSByZWFzb24gdGhlIGlkbGUgZ2F0ZSBkb2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZXh0cmEgYXR0ZW1wdHMgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQsIG9uIHRvcFxuICAgKiBvZiB0aGUgZmlyc3QgYXR0ZW1wdC5cbiAgICpcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHRoZSBoYXJuZXNzIGVuYWJsZXMgdGhlIHBsdWdpbiwgc28gdGhlIGVuYWJsZSBsYW5kcyBpbiB0aGUgZW5hYmxlZCBzZXRcbiAgICogYnV0IHRoZSBsb2FkIHJhY2VzIGFuZCBmYWlscyAoYFwiPGlkPlwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZGApLlxuICAgKiBEZXZpY2UtaWRsZSBhbmQgYGxheW91dFJlYWR5YCBhcmUgYWxyZWFkeSBhd2FpdGVkLCBzbyB0aGlzIGlzIHRoZSBuYXJyb3dcbiAgICogcmVzaWR1YWwgcmFjZTogdGhlIGhhcm5lc3MgcmV0cmllcyB0aGUgZW5hYmxlICsgbG9hZC12ZXJpZmljYXRpb24gdGhpcyBtYW55XG4gICAqIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiAoc2VlXG4gICAqIHtAbGluayBwbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHN9KSwgZm9yY2luZyBhIGdlbnVpbmUgcmVsb2FkIGVhY2hcbiAgICogYXR0ZW1wdC4gQSBjYXB0dXJlZCBwbHVnaW4gbG9hZCBlcnJvciBpcyB0cmVhdGVkIGFzIGEgZGV0ZXJtaW5pc3RpYyBidWcgYW5kXG4gICAqIGlzICoqbm90KiogcmV0cmllZC4gU2V0IGAwYCB0byBkaXNhYmxlIHJldHJ5IChhIHNpbmdsZSBhdHRlbXB0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDNgXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5FbmFibGVSZXRyeUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBsdWdpbi1lbmFibGUgYXR0ZW1wdHMgKHNlZVxuICAgKiB7QGxpbmsgcGx1Z2luRW5hYmxlUmV0cnlDb3VudH0pLlxuICAgKlxuICAgKiBUaGUgZGVsYXkgZ3Jvd3MgZXhwb25lbnRpYWxseSBwZXIgcmV0cnk6IHRoZSBmaXJzdCByZXRyeSB3YWl0cyB0aGlzIGxvbmcsXG4gICAqIHRoZSBzZWNvbmQgdHdpY2UgYXMgbG9uZywgdGhlIHRoaXJkIGZvdXIgdGltZXMsIGFuZCBzbyBvbiBcdTIwMTQgZ2l2aW5nIGFcbiAgICogc3RpbGwtc2V0dGxpbmcgY29sZCBndWVzdCBwcm9ncmVzc2l2ZWx5IG1vcmUgdGltZSB0byBiZWNvbWUgcmVhZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luRW5hYmxlUmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgZXN0YWJsaXNoaW5nIHRoZSBBcHBpdW0gc2Vzc2lvbiAoV2ViRHJpdmVySU9cbiAgICogYHJlbW90ZSgpYCBcdTIwMTQgVWlBdXRvbWF0b3IyIHNlcnZlciBpbnN0YWxsICsgYXBwIGxhdW5jaCkuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgbG9hZC1zZW5zaXRpdmUgc3RlcCBvZiB0aGUgQW5kcm9pZCBzZXR1cDpcbiAgICogb24gYSBjb2xkIG9yIGNvbnRlbmRlZCBlbXVsYXRvciBpdCBkb21pbmF0ZXMgc3RhcnR1cCBhbmQgY2FuIHRha2UgYSBmZXdcbiAgICogbWludXRlcy4gUmFpc2UgaXQgaWYgc2Vzc2lvbiBlc3RhYmxpc2htZW50IHRpbWVzIG91dCB1bmRlciBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gSUQgdG8gcmVhdHRhY2ggdG8uXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2Vyc1xuICAgKiB2aWEgdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLlxuICAgKiBXaGVuIHByZXNlbnQsIHRoZSB0cmFuc3BvcnQgZmFjdG9yeSB1c2VzIFdlYkRyaXZlcklPJ3MgYGF0dGFjaCgpYCBpbnN0ZWFkXG4gICAqIG9mIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24sIGF2b2lkaW5nIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBtaXNzaW5nIEFwcGl1bSBkZXBlbmRlbmNpZXMgKHRoZVxuICAgKiBgdWlhdXRvbWF0b3IyYCBkcml2ZXIsIGFuZCBBcHBpdW0gaXRzZWxmKSBiZWZvcmUgYXV0by1zdGFydGluZyB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGFuZCB0aGUgaGFybmVzcyBpcyBhYm91dCB0byBhdXRvLXN0YXJ0IHRoZSBBcHBpdW1cbiAgICogc2VydmVyICh7QGxpbmsgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtfSksIHRoZSBmYWN0b3J5IGZpcnN0IGVuc3VyZXMgQXBwaXVtIGlzXG4gICAqIGluc3RhbGxlZCAoZ2xvYmFsbHksIHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYCkgYW5kIHRoYXQgdGhlXG4gICAqIGB1aWF1dG9tYXRvcjJgIGRyaXZlciBpcyBpbnN0YWxsZWQgKGBhcHBpdW0gZHJpdmVyIGluc3RhbGwgdWlhdXRvbWF0b3IyYCksXG4gICAqIGluc3RhbGxpbmcgd2hpY2hldmVyIGlzIG1pc3NpbmcuIElnbm9yZWQgd2hlbiBhdHRhY2hpbmcgdG8gYW5cbiAgICogYWxyZWFkeS1ydW5uaW5nIHNlcnZlciAobm90aGluZyBpcyBhdXRvLXN0YXJ0ZWQsIHNvIG5vdGhpbmcgaXMgaW5zdGFsbGVkKSBvclxuICAgKiB3aGVuIHtAbGluayBzaG91bGRBdXRvU3RhcnRBcHBpdW19IGlzIGBmYWxzZWAuIFNldCBpdCB0byBgZmFsc2VgIHRvIG1hbmFnZVxuICAgKiB0aGUgQXBwaXVtIHRvb2xjaGFpbiB5b3Vyc2VsZiBhbmQgc2tpcCB0aGUgbWFjaGluZS1tdXRhdGluZyBnbG9iYWwgaW5zdGFsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdGFydCB0aGUgQXBwaXVtIHNlcnZlciBpZiBpdCBpcyBub3QgcmVhY2hhYmxlLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3Bhd25zIGBucHggYXBwaXVtYFxuICAgKiBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyB3aGVuIHRoZSBwcmVmbGlnaHQgY2hlY2sgZmFpbHMsIGFuZCBraWxscyBpdFxuICAgKiBvbiB0cmFuc3BvcnQgZGlzcG9zYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgXHUyMDE0IGFuZCByZWZyZXNoIFx1MjAxNCB0aGUgQVZEJ3NcbiAgICogc2F2ZWQgYm9vdCBzbmFwc2hvdC5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgdGhlIGVtdWxhdG9yIGlzIHN0YXJ0ZWQgd2l0aFxuICAgKiBgLW5vLXNuYXBzaG90LWxvYWQgLW5vLXNuYXBzaG90LXNhdmVgLCBzbyBldmVyeSBydW4gY29sZC1ib290cyBhIGd1ZXN0IHdob3NlXG4gICAqIHN0YXRlIG5vdGhpbmcgY2FycmllZCBvdmVyLiBUaGF0IGlzIHRoZSBoZXJtZXRpYyBkZWZhdWx0IGEgdGVzdCBoYXJuZXNzXG4gICAqIG93ZXMgaXRzIGNhbGxlcnMsIGFuZCBpdCBpcyBhbHNvIHRoZSBzYWZlIG9uZTogYSBzbmFwc2hvdCB0aGUgaGFybmVzcyBsb2Fkc1xuICAgKiBidXQgbmV2ZXIgd3JpdGVzIHJvdHMgdW5ub3RpY2VkLCBhbmQgdGhlIGZhaWx1cmUgaXQgZXZlbnR1YWxseSBwcm9kdWNlcyBcdTIwMTQgYVxuICAgKiBkZXZpY2UgdGhhdCBzZXJ2ZXMgYWRiLCBhY2NlcHRzIGEgc2Vzc2lvbiwgdGhlbiBkcm9wcyBgb2ZmbGluZWAgYWJvdXQgaGFsZiBhXG4gICAqIG1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gTWVhc3VyZWQgb24gb25lXG4gICAqIEFWRCBiYWNrIHRvIGJhY2ssIGEgcmVzdW1lZCBzbmFwc2hvdCBraWxsZWQgdGhlIGd1ZXN0IH45MHMgaW4gKmV2ZXJ5KiB0aW1lLFxuICAgKiB3aGlsZSB0aGUgc2FtZSBBVkQgY29sZC1ib290ZWQgaW4gNTBzIGFuZCBzdGF5ZWQgdXAuXG4gICAqXG4gICAqIFNldCBpdCB0byBgdHJ1ZWAgb24gYSAqKnBlcnNpc3RlbnQgcnVubmVyKiogd2hvc2UgQVZEIGlzIG5vdCBzaGFyZWQgd2l0aFxuICAgKiBhbnl0aGluZyBlbHNlOiB0aGUgZW11bGF0b3IgdGhlbiBib3RoIGxvYWRzIGFuZCBzYXZlcyBgZGVmYXVsdF9ib290YCwgc28gdGhlXG4gICAqIHNuYXBzaG90IGVhY2ggcnVuIHJlc3VtZXMgaXMgb25lIGEgcHJldmlvdXMgcnVuIHdyb3RlLCBhbmQgdGhlIH4xMTJzIGNvbGRcbiAgICogYm9vdCBpcyBsYXJnZWx5IGJvdWdodCBiYWNrLiBUaGUgdHJhZGUgaXMgdGVzdCBpc29sYXRpb24gXHUyMDE0IGEgZ3Vlc3QgdGhhdFxuICAgKiBjYXJyaWVzIHN0YXRlIGJldHdlZW4gcnVucyBcdTIwMTQgc28gaXQgaXMgb3B0LWluIHBlciBwcm9qZWN0LCBuZXZlciBhIGRlZmF1bHQuXG4gICAqIElnbm9yZWQgd2hlbiByZXVzaW5nIGFuIGFscmVhZHktcnVubmluZyBkZXZpY2UgKG5vdGhpbmcgaXMgbGF1bmNoZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBoYXJuZXNzIHJlbW92ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVha2VkLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBlYWNoIHJ1biBzd2VlcHMgYXQgc3RhcnQgKiphbmQqKiBhdCBlbmQ6IG9uIHRoZVxuICAgKiBkZXZpY2UsIGV2ZXJ5IGB0ZW1wLXZhdWx0LSpgIGRpcmVjdG9yeSB1bmRlciB7QGxpbmsgdmF1bHRCYXNlUGF0aH0gKHBsdXMgdGhlXG4gICAqIHN0YWxlIHZhdWx0IHJlZ2lzdHJhdGlvbnMgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWApOyBvbiB0aGUgaG9zdCxcbiAgICogdGhlIGxlZnRvdmVyIGB0ZW1wLXZhdWx0LSpgIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgZGlyZWN0b3JpZXMgb2xkZXIgdGhhblxuICAgKiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uXG4gICAqXG4gICAqIEEgcnVuIHRoYXQgZGllcyBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmIFx1MjAxNCBpdHMgdGVhcmRvd24gZ29lcyB0aHJvdWdoIHRoZVxuICAgKiBXZWJWaWV3LCBhbmQgYSBkZWFkIFdlYlZpZXcgaXMgd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlIFx1MjAxNCBzbyB0aGVcbiAgICogcmVzaWR1ZSBhY2N1bXVsYXRlcyBhbmQgc2xvd3MgdGhlIG5leHQgcnVuJ3Mgc3RhcnR1cCBlbnVtZXJhdGlvbiB1bnRpbCBpdFxuICAgKiBtaXNzZXMgdGhlIFdlYlZpZXctcmVhZGluZXNzIGJ1ZGdldC4gVGhlIHN0YXJ0IHN3ZWVwIGlzIHRoZSBoYWxmIHRoYXQgYnJlYWtzXG4gICAqIHRoYXQgbG9vcCwgYmVjYXVzZSBpdCBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQgZm9yIHRoZSB0cmFuc3BvcnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bSc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBPbiBzbG93IGVtdWxhdG9ycywgdGhlIENocm9tZURyaXZlciBwcm94eSB0aGF0IGhhbmRsZXMgV2ViVmlldyBjb21tYW5kc1xuICAgKiBtYXkgbm90IGJlIHJlYWR5IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBBcHBpdW0gc2Vzc2lvbiBzdGFydHMuIFRoaXMgdGltZW91dFxuICAgKiBjb250cm9scyBob3cgbG9uZyB0byBwb2xsIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IG9wdGlvbnMgZm9yIGRlc2t0b3AgdGVzdGluZyB2aWEgQ2hyb21lIERldlRvb2xzIFByb3RvY29sLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVza3RvcCB0cmFuc3BvcnQuIEJ5IGRlZmF1bHQgdGhlIGhhcm5lc3MgKipsYXVuY2hlcyBhbmRcbiAqIG93bnMgYW4gaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UqKiBpbiBhIHRlbXBvcmFyeSB1c2VyLWRhdGEgZGlyIChuZXZlclxuICogdG91Y2hpbmcgdGhlIHVzZXIncyBPYnNpZGlhbiksIGNvbm5lY3RlZCBvdmVyIGEgZnJlZSBDRFAgcG9ydC4gUHJvdmlkZVxuICoge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucy5wb3J0fSB0byBpbnN0ZWFkIGF0dGFjaCB0byBhblxuICogYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgaW5kaXZpZHVhbCBDRFAgY29tbWFuZHMuXG4gICAqIERlZmF1bHRzIHRvIDMwMDAwXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQncyAqKmNvbmZpZyBmb2xkZXIqKiBcdTIwMTQgT2JzaWRpYW4ncyBwZXItdmF1bHQgKk92ZXJyaWRlIGNvbmZpZ1xuICAgKiBmb2xkZXIqIHNldHRpbmcsIGUuZy4gYCcub2JzaWRpYW4tZGVza3RvcCdgLiBNdXN0IHN0YXJ0IHdpdGggYSBkb3QsIG11c3Qgbm90XG4gICAqIGJlIHRoZSBiYXJlIGRvdCwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYSBwYXRoIHNlcGFyYXRvcjsgYW55dGhpbmcgZWxzZSB0aHJvd3NcbiAgICogYmVmb3JlIE9ic2lkaWFuIGlzIGxhdW5jaGVkLCBiZWNhdXNlIE9ic2lkaWFuIGl0c2VsZiB3b3VsZCBzaWxlbnRseVxuICAgKiBzdWJzdGl0dXRlIGAub2JzaWRpYW5gLlxuICAgKlxuICAgKiBOZWVkZWQgdG8gb3BlbiBhIHZhdWx0IHRoYXQga2VlcHMgaXRzIHNldHRpbmdzIHNvbWV3aGVyZSBvdGhlciB0aGFuXG4gICAqIGAub2JzaWRpYW5gIFx1MjAxNCBhIHZhdWx0IHdpdGggYSBzdGFsZSBgLm9ic2lkaWFuYCBiZXNpZGUgdGhlIHJlYWwgZm9sZGVyIHdvdWxkXG4gICAqIG90aGVyd2lzZSBvcGVuIHN1Y2Nlc3NmdWxseSBhZ2FpbnN0IHRoZSB3cm9uZyBzZXR0aW5ncyBhbmQgcmVwb3J0IHN1Y2Nlc3MuXG4gICAqIFRoZSBvdmVycmlkZSBsaXZlcyBpbiBgbG9jYWxTdG9yYWdlYCwga2V5ZWQgYnkgdmF1bHQgaWQsIGFuZCBzbyBpcyBzY29wZWQgdG9cbiAgICogYSB1c2VyLWRhdGEgZGlyZWN0b3J5OiBhbiBvd25lZCBpbnN0YW5jZSBnZXRzIGEgZnJlc2ggdGVtcCBvbmUgYW5kIHRoZXJlZm9yZVxuICAgKiBpbmhlcml0cyBub3RoaW5nIGZyb20gdGhlIHVzZXIncyBPYnNpZGlhbiwgaG93ZXZlciB0aGF0IHZhdWx0IGlzIGNvbmZpZ3VyZWRcbiAgICogdGhlcmUuXG4gICAqXG4gICAqIFNldHRpbmcgaXQgY29zdHMgb25lIGV4dHJhIGJvb3QgcGhhc2U6IHRoZSBpbnN0YW5jZSBpcyBsYXVuY2hlZCB0byB0aGVcbiAgICogc3RhcnRlciBzY3JlZW4sIHRoZSBvdmVycmlkZSBpcyB3cml0dGVuIGluIHRoYXQgcmVuZGVyZXIsIGFuZCB0aGUgdmF1bHQgaXNcbiAgICogdGhlbiBvcGVuZWQgb3ZlciBJUEMuIEFmdGVyIHRoZSB2YXVsdCBpcyByZWFkeSBpdHMgYWN0dWFsXG4gICAqIGBhcHAudmF1bHQuY29uZmlnRGlyYCBpcyByZWFkIGJhY2sgYW5kIGFueSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYENvbmZpZ0RpcmVjdG9yeUZhbGxiYWNrRXJyb3JgIFx1MjAxNCB0aGVyZSBpcyBubyBrbm9iIHRvIGRvd25ncmFkZSB0aGF0LCBiZWNhdXNlIGFcbiAgICogdmF1bHQgb3BlbmVkIGFnYWluc3QgdGhlIHdyb25nIGNvbmZpZyBmb2xkZXIgaXMgc2lsZW50bHkgdGhlIHdyb25nIHZhdWx0LlxuICAgKlxuICAgKiBPbmx5IG1lYW5pbmdmdWwgaW4gb3duZWQgbW9kZTsgKippZ25vcmVkIGluIGF0dGFjaCBtb2RlKiogKHtAbGluayBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMucG9ydH1cbiAgICogc2V0KSwgd2hlcmUgdGhlIHZhdWx0IGlzIG9wZW5lZCBieSB0aGUgdXNlcidzIG93biBPYnNpZGlhbiB1bmRlciBpdHMgb3duXG4gICAqIGNvbmZpZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGAgKE9ic2lkaWFuJ3Mgb3duIGRlZmF1bHQsIGAub2JzaWRpYW5gKVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSAqKmRlYWQgYm9vdCoqIG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZS5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGNhbm5vdCBydW4gb24gdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsICh0aGUgaW5zdGFsbGVyXG4gICAqIHZlcnNpb24gaXMgdG9vIG9sZCBmb3IgdGhlIGFwcCB2ZXJzaW9uKSwgdGhlIHJlbmRlcmVyIGxvYWRzIGJ1dCBuZXZlclxuICAgKiBib290c3RyYXBzOiBgZG9jdW1lbnQuYm9keWAgc3RheXMgZW1wdHkgYW5kIGB3aW5kb3cuYXBwYCByZW1haW5zXG4gICAqIGB1bmRlZmluZWRgIFx1MjAxNCBhIGJsYWNrIHNjcmVlbi4gUmF0aGVyIHRoYW4gd2FpdGluZyBvdXQgdGhlIGZ1bGwgcmVhZGluZXNzXG4gICAqIHRpbWVvdXQsIHRoZSBvd25lZC12YXVsdCByZWFkaW5lc3MgcG9sbCBjb25jbHVkZXMgdGhlIGJvb3QgaXMgZGVhZCBvbmNlIHRoZVxuICAgKiByZW5kZXJlciBoYXMgYmVlbiBgZG9jdW1lbnQucmVhZHlTdGF0ZWAgYCdjb21wbGV0ZSdgIGZvciB0aGlzIGxvbmcgd2l0aCBub1xuICAgKiBgd2luZG93LmFwcGAgYW5kIGFuIGVtcHR5IGA8Ym9keT5gLCBhbmQgdGhyb3dzIGFcbiAgICogYFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3JgLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2VcbiAgICogKGlnbm9yZWQgaW4gYXR0YWNoIG1vZGUsIHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvIGRpc2FibGUgZmFzdC1mYWlsIGFuZFxuICAgKiByZXN0b3JlIHRoZSBwbGFpbiB3YWl0LW91dC10aGUtcmVhZGluZXNzLXRpbWVvdXQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqIERlZmF1bHRzIHRvIGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1hcmtzIHtAbGluayBwb3J0fSBhcyB0aGUgQ0RQIHBvcnQgb2YgYSAqKmhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlKipcbiAgICogdGhhdCB0aGUgZ2xvYmFsIHNldHVwIGFscmVhZHkgbGF1bmNoZWQgYW5kIHByZXBhcmVkICh2YXVsdCByZWdpc3RlcmVkLFxuICAgKiBwbHVnaW4gZW5hYmxlZCkuXG4gICAqXG4gICAqIFBvcHVsYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBnbG9iYWwgc2V0dXAgYW5kIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2VycyB2aWFcbiAgICogdGhlIGZyYW1ld29yaydzIGNvbnRleHQgbWVjaGFuaXNtIChlLmcuIFZpdGVzdCBgcHJvdmlkZWAvYGluamVjdGApLiBXaGVuIHNldCxcbiAgICogdGhlIHdvcmtlciAqKmF0dGFjaGVzKiogdG8gdGhlIG93bmVkIGluc3RhbmNlIG9uIHtAbGluayBwb3J0fSBpbnN0ZWFkIG9mXG4gICAqIGxhdW5jaGluZyBpdHMgb3duLCBhbmQgc2tpcHMgdGhlIHVzZXItc2NvcGUgdmF1bHQtcmVnaXN0cmF0aW9uIHByZWZsaWdodCBcdTIwMTRcbiAgICogdGhlIG93bmVkIGluc3RhbmNlJ3MgdmF1bHQgbGl2ZXMgaW4gYW4gaXNvbGF0ZWQgdXNlci1kYXRhIGNvbmZpZywgbm90IHRoZVxuICAgKiB1c2VyLXNjb3BlIHJlZ2lzdHJ5LiBEbyBub3Qgc2V0IHRoaXMgbWFudWFsbHk7IGZvciBwbGFpbiBhdHRhY2ggbW9kZSB1c2VcbiAgICoge0BsaW5rIHBvcnR9IGFsb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkIGRlc2t0b3AgT2JzaWRpYW4gd2luZG93IGlzIHNob3duIG9uIHNjcmVlbi5cbiAgICpcbiAgICogV2hlbiBgZmFsc2VgLCB0aGUgaGFybmVzcyBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aFxuICAgKiBrZWVwLWFsaXZlIENocm9taXVtIGZsYWdzIGFuZCBtb3ZlcyBpdHMgd2luZG93ICoqb2ZmLXNjcmVlbioqIG9uY2UgRWxlY3Ryb24nc1xuICAgKiByZW1vdGUgYnJpZGdlIGlzIGF2YWlsYWJsZSwgc28gdGhlIHJ1biBuZXZlciBzdGVhbHMgZm9jdXMgb3IgcG9wcyBhIHdpbmRvdyBpblxuICAgKiBmcm9udCBvZiB5b3UuIE9mZi1zY3JlZW4gKG5vdCBtaW5pbWl6ZWQpIGtlZXBzIHRoZSByZW5kZXJlciBsaXZlLCBzb1xuICAgKiBgc2V0VGltZW91dGAsIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLCBgOmhvdmVyYCwgYW5kIHRydXN0ZWQgaW5wdXQgYmVoYXZlXG4gICAqIGlkZW50aWNhbGx5IHRvIGEgdmlzaWJsZSB3aW5kb3cuIERlZmF1bHRzIHRvIGB0cnVlYDsgaW50ZWdyYXRpb24gc2V0dXBcbiAgICogZXhwbGljaXRseSBwYXNzZXMgYGZhbHNlYCB0byBhdm9pZCBzdGVhbGluZyBmb2N1cy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZVxuICAgKiAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIG1vdmVzIHRoZSB1c2VyJ3Mgb3duIHJ1bm5pbmcgd2luZG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSG93IG9sZCBhIGxlZnRvdmVyIGRpcmVjdG9yeSBtdXN0IGJlIGJlZm9yZSB7QGxpbmsgc2hvdWxkU3dlZXBMZWZ0b3ZlcnN9XG4gICAqIHJlbW92ZXMgaXQuXG4gICAqXG4gICAqIFRoZSBnYXRlIG1hdHRlcnMgbW9zdCBvbiBkZXNrdG9wOiBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKipub3QqKiBzZXJpYWxpemVkXG4gICAqIChlYWNoIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UpLCBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXNcbiAgICogb25lIHRlbXAgZGlyZWN0b3J5LCBzbyBhIHlvdW5nIGB0ZW1wLXZhdWx0LSpgIC8gYHVzZXJkYXRhLSpgIGRpcmVjdG9yeSBtYXlcbiAgICogd2VsbCBiZWxvbmcgdG8gYSBydW4gdGhhdCBpcyBzdGlsbCBpbiBmbGlnaHQuIFJhaXNlIGl0IGlmIGEgcnVuIG9mIHlvdXJzIGNhblxuICAgKiBvdXRsaXZlIHRoZSBkZWZhdWx0OyBzZXQgYDBgIHRvIHJlbW92ZSBldmVyeSBtYXRjaCByZWdhcmRsZXNzIG9mIGFnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDcyMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKkVsZWN0cm9uIHNoZWxsKiogKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuXG4gICAqXG4gICAqIEFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogVGhlIG1hdGNoaW5nIEdpdEh1YiByZWxlYXNlIGluc3RhbGxlciBpcyBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWQgdG8gYVxuICAgKiBwb3J0YWJsZSBzaGVsbCAoY2FjaGVkIGZvciByZXVzZSkuIFB1YmxpYyByZWxlYXNlcyBvbmx5IFx1MjAxNCBjYXRhbHlzdCBidWlsZHNcbiAgICogaGF2ZSBubyBwdWJsaWMgaW5zdGFsbGVyLiBJZ25vcmVkIHdoZW4ge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSAqKk9ic2lkaWFuIGFwcCB2ZXJzaW9uKiogKGFzYXIpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLlxuICAgKlxuICAgKiBBY2NlcHRzIGFuIGV4cGxpY2l0IGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuXG4gICAqIFZlcnNpb25zIGF0IG9yIGFib3ZlIHRoZSBzaGVsbCB2ZXJzaW9uIGFyZSBhcHBsaWVkIGFzIGEgY2hlYXAgYXNhciBzd2FwO1xuICAgKiBvbGRlciB2ZXJzaW9ucyB0cmFuc3BhcmVudGx5IHVzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsLiBXaGVuIG9taXR0ZWQsXG4gICAqIHRoZSB1c2VyJ3MgY3VycmVudGx5LWluc3RhbGxlZCB2ZXJzaW9uIGlzIHVzZWQuIElnbm9yZWQgd2hlbiB7QGxpbmsgcG9ydH1cbiAgICogKGF0dGFjaCBtb2RlKSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhblZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENEUCBwb3J0IG9mIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiB0byAqKmF0dGFjaCoqIHRvICh0aGVcbiAgICogYC0tcmVtb3RlLWRlYnVnZ2luZy1wb3J0YCBpdCB3YXMgbGF1bmNoZWQgd2l0aCkuIFdoZW4gc2V0LCB0aGUgaGFybmVzc1xuICAgKiBhdHRhY2hlcyBpbnN0ZWFkIG9mIG93bmluZyBhbiBpbnN0YW5jZSwgYW5kIHRoZSB2ZXJzaW9uIGtub2JzIGFyZSBpZ25vcmVkLlxuICAgKiBXaGVuIG9taXR0ZWQsIGFuIG93bmVkIGlzb2xhdGVkIGluc3RhbmNlIGlzIGxhdW5jaGVkIG9uIGFuIGF1dG9tYXRpY2FsbHlcbiAgICogY2hvc2VuIGZyZWUgcG9ydCAobm8gcG9ydCBpcyBoYXJkY29kZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IGFuIG93bmVkIGluc3RhbmNlIG9uIExpbnV4IHdoZW4gdGhlcmUgaXMgbm9cbiAgICogY29ycmVjdGx5LWNvbmZpZ3VyZWQgc2V0dWlkIGBjaHJvbWUtc2FuZGJveGAgaGVscGVyIFx1MjAxNCBlLmcuIGEgcG9ydGFibGUgc2hlbGxcbiAgICogZXh0cmFjdGVkIGZyb20gYW4gaW5zdGFsbGVyLCBvciBhIENJIHJ1bm5lciBsYXVuY2hpbmcgYXMgYSBub24tcm9vdCB1c2VyLCBpblxuICAgKiB3aGljaCBjYXNlIHRoZSByZW5kZXJlciBvdGhlcndpc2UgcmVmdXNlcyB0byBzdGFydC4gSGFybWxlc3Mgb25cbiAgICogV2luZG93cy9tYWNPUy4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgXHUyMDE0IHRoZSBoYXJuZXNzIG5ldmVyXG4gICAqIHJlbGF1bmNoZXMgdGhlIHVzZXIncyBydW5uaW5nIGluc3RhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhhcm5lc3MgcmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQuXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGVhY2ggcnVuIHN3ZWVwcyBhdCBzdGFydCBhbmQgYXQgZW5kIGZvclxuICAgKiBgdGVtcC12YXVsdC0qYCBzdGFnaW5nIGRpcmVjdG9yaWVzIGFuZCBvd25lZCBgdXNlcmRhdGEtKmAgaW5zdGFuY2UgcHJvZmlsZXNcbiAgICogb2xkZXIgdGhhbiB7QGxpbmsgbGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kc30uIEEgcnVuIGtpbGxlZCBtaWQtZmxpZ2h0XG4gICAqIG5ldmVyIHJlYWNoZXMgaXRzIG93biBjbGVhbnVwLCBzbyB3aXRob3V0IHRoaXMgdGhlIHRlbXAgZGlyZWN0b3J5IGdyb3dzXG4gICAqIHdpdGhvdXQgYm91bmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciAodGhlXG4gICAqIG9sZGVzdCBpbnN0YWxsZXIgdGhlIGFwcCdzIGFzYXIgY2FuIGJvb3Qgb24pIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiwgYmVmb3JlIGFueXRoaW5nXG4gICAqIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoXG4gICAqIGluc3RlYWQgXHUyMDE0IHdoZXJlIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsXG4gICAqIChgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAsIHNlZSB7QGxpbmsgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzfSlcbiAgICogc3RpbGwgY2F0Y2hlcyB0aGUgYmxhY2stc2NyZWVuIGJvb3QsIGFuZCB0aGUgYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCBpc1xuICAgKiBzdXJmYWNlZCBhcyBkYXRhIHJhdGhlciB0aGFuIHRocm93bi4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkIGluc3RhbmNlXG4gICAqIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhICoqc2lsZW50IGFzYXIgZmFsbGJhY2sqKiBmYWlscyBmYXN0IGFmdGVyIGJvb3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IG5vdCBkZWFkLWJvb3QgXHUyMDE0IGl0IGNhbiBzaWxlbnRseSByZXZlcnQgdG8gdGhlIGluc3RhbGxlcidzIG93biBidW5kbGVkXG4gICAqIGFzYXIgYW5kIHJ1biB0aGUgKip3cm9uZyAob2xkZXIpKiogdmVyc2lvbiBiZWhpbmQgYSBoZWFsdGh5IFVJLiBXaGVuIGB0cnVlYFxuICAgKiAodGhlIGRlZmF1bHQpLCB0aGUgdHJhbnNwb3J0IHZlcmlmaWVzIHRoZSBydW5uaW5nIGFwcCB2ZXJzaW9uIGFnYWluc3QgdGhlIHBpblxuICAgKiBwb3N0LWJvb3QgYW5kIHRocm93cyBgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JgIG9uIGEgbWlzbWF0Y2guIFNldCBgZmFsc2VgIHRvXG4gICAqIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2ggaXMgdGhlbiBzdXJmYWNlZCBhcyBkYXRhICh0aGUgZmFsbGJhY2tcbiAgICogdmVyZGljdCkgcmF0aGVyIHRoYW4gdGhyb3duLiBPbmx5IGFwcGxpZXMgdG8gYW4gb3duZWQgaW5zdGFuY2UgcnVubmluZyBhXG4gICAqIHN3YXBwZWQtaW4gYXNhciAoaWdub3JlZCBpbiBhdHRhY2ggbW9kZSwge0BsaW5rIHBvcnR9IHNldCwgYW5kIHdoZW4gbm8gYXNhciBpc1xuICAgKiBzd2FwcGVkIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHZlcmlmeSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzICoqYm90aCoqIGNvbXBhdGliaWxpdHkgbmFnczogdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgKGFcbiAgICogcnVubmFibGUgaW5zdGFsbGVyIGJlbG93IHRoZSByZWNvbW1lbmRlZCBmbG9vcikgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nIChhIGxpdmUgRWxlY3Ryb24gYmVsb3cgdGhlIGFwcCdzIHJlY29tbWVuZGVkXG4gICAqIG1pbmltdW0pLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzIGxvZzsgc2V0XG4gICAqIGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIGNvbXB1dGVkIGFuZCBzdXJmYWNlZCBhc1xuICAgKiBkYXRhIChgY29tcGF0aWJpbGl0eWAgLyBgZWxlY3Ryb25Db21wYXRpYmlsaXR5YCksIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLlxuICAgKiBEb2VzIG5vdCBhZmZlY3QgdGhlIGAndW5ydW5uYWJsZSdgIHRocm93IChzZWVcbiAgICoge0BsaW5rIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9KS4gT25seSBhcHBsaWVzIHRvIGFuIG93bmVkXG4gICAqIGluc3RhbmNlIChpZ25vcmVkIGluIGF0dGFjaCBtb2RlLCB7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzY3JpbWluYW50IGZvciB0aGUgdHJhbnNwb3J0IHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnb2JzaWRpYW4tY2RwJztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIHVuaW9uIG9mIGFsbCBzdXBwb3J0ZWQgdHJhbnNwb3J0IGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIFVzZWQgaW4gdml0ZXN0IGBlbnZpcm9ubWVudE9wdGlvbnMub2JzaWRpYW5UcmFuc3BvcnRgIHRvIHNlbGVjdCBhbmRcbiAqIGNvbmZpZ3VyZSB0aGUgdHJhbnNwb3J0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zID1cbiAgfCBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gIHwgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlc2Ugb3B0aW9ucyBkZXNjcmliZSBhIG1vYmlsZSB0cmFuc3BvcnQuXG4gKlxuICogVGhlIHNhbWUgZmFjdCBhcyB7QGxpbmsgT2JzaWRpYW5UcmFuc3BvcnQuaXNNb2JpbGV9LCBidXQga25vd2FibGUgZnJvbSB0aGUgb3B0aW9ucyBhbG9uZSBcdTIwMTQgc28gYSBjYWxsZXJcbiAqIGNhbiBhY3Qgb24gaXQgYmVmb3JlIHBheWluZyBmb3IgYSBkZXZpY2UuIFJlYWRpbmcgaXQgb2ZmIGEgbGl2ZSB0cmFuc3BvcnQgbWVhbnMgYm9vdGluZyB0aGUgZW11bGF0b3JcbiAqIGFuZCB0aGUgQXBwaXVtIHNlc3Npb24gZmlyc3QsIHdoaWNoIGlzIH43MCBzIHRvIGxlYXJuIHNvbWV0aGluZyB0aGUgZGlzY3JpbWluYW50IGFscmVhZHkgc2F5cy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIGB0cnVlYCBmb3IgYSBtb2JpbGUgdHJhbnNwb3J0LCBgZmFsc2VgIGZvciBkZXNrdG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJc01vYmlsZVRyYW5zcG9ydChvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJztcbn1cblxuLyoqXG4gKiBUaGUgY29uZmlnIGZvbGRlciBhIHZhdWx0IHRoZSBoYXJuZXNzICoqb3ducyoqIHdpbGwgYWN0dWFsbHkgcmVhZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpc1xuICogT2JzaWRpYW4ncyBvd24gZGVmYXVsdC5cbiAqXG4gKiB7QGxpbmsgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLmNvbmZpZ0RpcmVjdG9yeX0gaXMgdGhlIG9ubHkga25vYiB0aGF0IG1vdmVzIGl0LCBhbmQgaXQgaXNcbiAqIG1lYW5pbmdmdWwgb25seSBpbiBvd25lZCBtb2RlOiBpbiBhdHRhY2ggbW9kZSB0aGUgdmF1bHQgaXMgb3BlbmVkIGJ5IHRoZSB1c2VyJ3Mgb3duIE9ic2lkaWFuIHVuZGVyXG4gKiBpdHMgb3duIGNvbmZpZywgYW5kIG9uIEFuZHJvaWQgdGhlcmUgaXMgbm8gb3ZlcnJpZGUgYXQgYWxsLiBBbnl0aGluZyB0aGUgaGFybmVzcyB3cml0ZXMgaW50byBhIHZhdWx0XG4gKiBiZWZvcmUgaXQgaXMgb3BlbmVkIGhhcyB0byBnbyB3aGVyZSB0aGF0IHZhdWx0IHdpbGwgbG9vaywgc28gdGhpcyBpcyB0aGUgYW5zd2VyIGV2ZXJ5IHN1Y2ggd3JpdGVyXG4gKiBuZWVkcyBcdTIwMTQgc2VlIGBlbnN1cmVIZWFkbGVzc1ZhdWx0Q29uZmlnYC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBvdmVycmlkZGVuIGNvbmZpZyBmb2xkZXIgbmFtZSwgb3IgYHVuZGVmaW5lZGAgZm9yIE9ic2lkaWFuJ3MgZGVmYXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeShvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucy50eXBlICE9PSAnb2JzaWRpYW4tY2RwJyB8fCBvcHRpb25zLnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucy5jb25maWdEaXJlY3Rvcnk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEra0JPLFNBQVMsdUJBQXVCLFNBQTRDO0FBQ2pGLFNBQU8sUUFBUSxTQUFTO0FBQzFCO0FBZU8sU0FBUyw0QkFBNEIsU0FBdUQ7QUFDakcsTUFBSSxRQUFRLFNBQVMsa0JBQWtCLFFBQVEsU0FBUyxRQUFXO0FBQ2pFLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRO0FBQ2pCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -120,7 +120,13 @@ export interface ObsidianTransport {
120
120
  * Registers a vault path so Obsidian can target it.
121
121
  *
122
122
  * On desktop: uses Electron IPC to open the vault and polls for readiness.
123
- * On mobile: pushes vault files to the device and restarts the app.
123
+ * On mobile: pushes only a minimal `.obsidian` marker so the folder is recognized as a vault,
124
+ * points the app's `localStorage` at it, and reloads.
125
+ *
126
+ * It does **not** carry the vault's contents across on either platform — that is
127
+ * {@link ObsidianTransport.pushFiles}' job, which `TemporaryVault.register` runs first. A caller
128
+ * driving a transport directly has to push before registering, or the app opens an empty vault
129
+ * with nothing raised to say so.
124
130
  *
125
131
  * @param vaultPath - The absolute path to the vault folder.
126
132
  */
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Installs a built plugin into a **harness-owned** vault's config folder, before
5
+ * that vault is ever opened: the build output into
6
+ * `<configDirectory>/plugins/<pluginId>/`, and the id into
7
+ * `<configDirectory>/community-plugins.json` so Obsidian enables it on load.
8
+ *
9
+ * Carved out of `global-setup-core`'s `copyPluginIntoVault` for the same reason
10
+ * `ensureHeadlessVaultConfig` was carved out of the `app.json` write: the write
11
+ * has to go where the vault will actually look, and a `configDirectory` override
12
+ * moves that. `copyPluginIntoVault` still owns the parts around it — resolving
13
+ * `dist/dev` vs `dist/build`, reading the manifest, and refusing a desktop-only
14
+ * plugin on a mobile transport — and delegates only the write here, which is
15
+ * what makes the override path reachable from a unit test.
16
+ *
17
+ * Writing into `.obsidian` while the vault reads `.obsidian-desktop` installs the
18
+ * plugin into a folder nothing looks at, and the enable that follows fails with
19
+ * the generic "enabled but not loaded" shape, naming nothing about a config
20
+ * folder. `resolveOwnedConfigDirectory` (`transport-options.ts`) is the one
21
+ * answer to "which folder will this vault read"; every caller here takes its
22
+ * result.
23
+ */
24
+ /**
25
+ * Parameters for {@link installPluginIntoVault}.
26
+ */
27
+ export interface InstallPluginIntoVaultParams {
28
+ /**
29
+ * The vault's config folder name, when it is overridden away from
30
+ * {@link DEFAULT_CONFIG_DIRECTORY}. Installing into `.obsidian` while the vault
31
+ * reads `.obsidian-desktop` leaves the plugin where nothing looks for it, so
32
+ * the override has to reach this far.
33
+ *
34
+ * @default `'.obsidian'`
35
+ */
36
+ readonly configDirectory?: string | undefined;
37
+ /**
38
+ * The directory holding the built plugin (`main.js`, `manifest.json`, …) —
39
+ * the resolved `dist/dev` or `dist/build`.
40
+ */
41
+ readonly distPath: string;
42
+ /**
43
+ * The plugin's id, which names both its folder and its
44
+ * `community-plugins.json` entry.
45
+ */
46
+ readonly pluginId: string;
47
+ /**
48
+ * The absolute path of the harness-owned vault to install into.
49
+ */
50
+ readonly vaultPath: string;
51
+ }
52
+ /**
53
+ * Copies the built plugin into the vault's config folder and marks it as an
54
+ * enabled community plugin.
55
+ *
56
+ * Only ever call this on a vault the harness owns: it overwrites
57
+ * `community-plugins.json` outright, because the harness is the one that decides
58
+ * what a throwaway vault has enabled. Extra community plugins are seeded through
59
+ * `populate` and enabled after open instead, so they do not need to survive this
60
+ * write.
61
+ *
62
+ * @param params - The vault to install into, its config folder, and the build to install.
63
+ */
64
+ export declare function installPluginIntoVault(params: InstallPluginIntoVaultParams): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import {
2
+ cp,
3
+ mkdir,
4
+ writeFile
5
+ } from "node:fs/promises";
6
+ import { join } from "node:path";
7
+ import { DEFAULT_CONFIG_DIRECTORY } from "./config-directory.mjs";
8
+ const PLUGINS_DIR = "plugins";
9
+ const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
10
+ async function installPluginIntoVault(params) {
11
+ const { configDirectory = DEFAULT_CONFIG_DIRECTORY, distPath, pluginId, vaultPath } = params;
12
+ const pluginDirectory = join(vaultPath, configDirectory, PLUGINS_DIR, pluginId);
13
+ await mkdir(pluginDirectory, { recursive: true });
14
+ await cp(distPath, pluginDirectory, { recursive: true });
15
+ await writeFile(join(vaultPath, configDirectory, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
16
+ }
17
+ export {
18
+ installPluginIntoVault
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXBsdWdpbi1pbnN0YWxsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBidWlsdCBwbHVnaW4gaW50byBhICoqaGFybmVzcy1vd25lZCoqIHZhdWx0J3MgY29uZmlnIGZvbGRlciwgYmVmb3JlXG4gKiB0aGF0IHZhdWx0IGlzIGV2ZXIgb3BlbmVkOiB0aGUgYnVpbGQgb3V0cHV0IGludG9cbiAqIGA8Y29uZmlnRGlyZWN0b3J5Pi9wbHVnaW5zLzxwbHVnaW5JZD4vYCwgYW5kIHRoZSBpZCBpbnRvXG4gKiBgPGNvbmZpZ0RpcmVjdG9yeT4vY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgc28gT2JzaWRpYW4gZW5hYmxlcyBpdCBvbiBsb2FkLlxuICpcbiAqIENhcnZlZCBvdXQgb2YgYGdsb2JhbC1zZXR1cC1jb3JlYCdzIGBjb3B5UGx1Z2luSW50b1ZhdWx0YCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiBgZW5zdXJlSGVhZGxlc3NWYXVsdENvbmZpZ2Agd2FzIGNhcnZlZCBvdXQgb2YgdGhlIGBhcHAuanNvbmAgd3JpdGU6IHRoZSB3cml0ZVxuICogaGFzIHRvIGdvIHdoZXJlIHRoZSB2YXVsdCB3aWxsIGFjdHVhbGx5IGxvb2ssIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlXG4gKiBtb3ZlcyB0aGF0LiBgY29weVBsdWdpbkludG9WYXVsdGAgc3RpbGwgb3ducyB0aGUgcGFydHMgYXJvdW5kIGl0IFx1MjAxNCByZXNvbHZpbmdcbiAqIGBkaXN0L2RldmAgdnMgYGRpc3QvYnVpbGRgLCByZWFkaW5nIHRoZSBtYW5pZmVzdCwgYW5kIHJlZnVzaW5nIGEgZGVza3RvcC1vbmx5XG4gKiBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0IFx1MjAxNCBhbmQgZGVsZWdhdGVzIG9ubHkgdGhlIHdyaXRlIGhlcmUsIHdoaWNoIGlzXG4gKiB3aGF0IG1ha2VzIHRoZSBvdmVycmlkZSBwYXRoIHJlYWNoYWJsZSBmcm9tIGEgdW5pdCB0ZXN0LlxuICpcbiAqIFdyaXRpbmcgaW50byBgLm9ic2lkaWFuYCB3aGlsZSB0aGUgdmF1bHQgcmVhZHMgYC5vYnNpZGlhbi1kZXNrdG9wYCBpbnN0YWxscyB0aGVcbiAqIHBsdWdpbiBpbnRvIGEgZm9sZGVyIG5vdGhpbmcgbG9va3MgYXQsIGFuZCB0aGUgZW5hYmxlIHRoYXQgZm9sbG93cyBmYWlscyB3aXRoXG4gKiB0aGUgZ2VuZXJpYyBcImVuYWJsZWQgYnV0IG5vdCBsb2FkZWRcIiBzaGFwZSwgbmFtaW5nIG5vdGhpbmcgYWJvdXQgYSBjb25maWdcbiAqIGZvbGRlci4gYHJlc29sdmVPd25lZENvbmZpZ0RpcmVjdG9yeWAgKGB0cmFuc3BvcnQtb3B0aW9ucy50c2ApIGlzIHRoZSBvbmVcbiAqIGFuc3dlciB0byBcIndoaWNoIGZvbGRlciB3aWxsIHRoaXMgdmF1bHQgcmVhZFwiOyBldmVyeSBjYWxsZXIgaGVyZSB0YWtlcyBpdHNcbiAqIHJlc3VsdC5cbiAqL1xuXG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcblxuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnN0YWxsUGx1Z2luSW50b1ZhdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsUGx1Z2luSW50b1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgbmFtZSwgd2hlbiBpdCBpcyBvdmVycmlkZGVuIGF3YXkgZnJvbVxuICAgKiB7QGxpbmsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZfS4gSW5zdGFsbGluZyBpbnRvIGAub2JzaWRpYW5gIHdoaWxlIHRoZSB2YXVsdFxuICAgKiByZWFkcyBgLm9ic2lkaWFuLWRlc2t0b3BgIGxlYXZlcyB0aGUgcGx1Z2luIHdoZXJlIG5vdGhpbmcgbG9va3MgZm9yIGl0LCBzb1xuICAgKiB0aGUgb3ZlcnJpZGUgaGFzIHRvIHJlYWNoIHRoaXMgZmFyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy5vYnNpZGlhbidgXG4gICAqL1xuICByZWFkb25seSBjb25maWdEaXJlY3Rvcnk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RvcnkgaG9sZGluZyB0aGUgYnVpbHQgcGx1Z2luIChgbWFpbi5qc2AsIGBtYW5pZmVzdC5qc29uYCwgXHUyMDI2KSBcdTIwMTRcbiAgICogdGhlIHJlc29sdmVkIGBkaXN0L2RldmAgb3IgYGRpc3QvYnVpbGRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdFBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbidzIGlkLCB3aGljaCBuYW1lcyBib3RoIGl0cyBmb2xkZXIgYW5kIGl0c1xuICAgKiBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgZW50cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgaGFybmVzcy1vd25lZCB2YXVsdCB0byBpbnN0YWxsIGludG8uXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB2YXVsdCdzIGNvbmZpZyBmb2xkZXIgYW5kIG1hcmtzIGl0IGFzIGFuXG4gKiBlbmFibGVkIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogT25seSBldmVyIGNhbGwgdGhpcyBvbiBhIHZhdWx0IHRoZSBoYXJuZXNzIG93bnM6IGl0IG92ZXJ3cml0ZXNcbiAqIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCBvdXRyaWdodCwgYmVjYXVzZSB0aGUgaGFybmVzcyBpcyB0aGUgb25lIHRoYXQgZGVjaWRlc1xuICogd2hhdCBhIHRocm93YXdheSB2YXVsdCBoYXMgZW5hYmxlZC4gRXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgYXJlIHNlZWRlZCB0aHJvdWdoXG4gKiBgcG9wdWxhdGVgIGFuZCBlbmFibGVkIGFmdGVyIG9wZW4gaW5zdGVhZCwgc28gdGhleSBkbyBub3QgbmVlZCB0byBzdXJ2aXZlIHRoaXNcbiAqIHdyaXRlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgdmF1bHQgdG8gaW5zdGFsbCBpbnRvLCBpdHMgY29uZmlnIGZvbGRlciwgYW5kIHRoZSBidWlsZCB0byBpbnN0YWxsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdpbkludG9WYXVsdChwYXJhbXM6IEluc3RhbGxQbHVnaW5JbnRvVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBjb25maWdEaXJlY3RvcnkgPSBERUZBVUxUX0NPTkZJR19ESVJFQ1RPUlksIGRpc3RQYXRoLCBwbHVnaW5JZCwgdmF1bHRQYXRoIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgcGx1Z2luRGlyZWN0b3J5ID0gam9pbih2YXVsdFBhdGgsIGNvbmZpZ0RpcmVjdG9yeSwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgYXdhaXQgbWtkaXIocGx1Z2luRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IHdyaXRlRmlsZShqb2luKHZhdWx0UGF0aCwgY29uZmlnRGlyZWN0b3J5LCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBd0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUVyQixTQUFTLGdDQUFnQztBQUV6QyxNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUE4Qy9CLGVBQXNCLHVCQUF1QixRQUFxRDtBQUNoRyxRQUFNLEVBQUUsa0JBQWtCLDBCQUEwQixVQUFVLFVBQVUsVUFBVSxJQUFJO0FBRXRGLFFBQU0sa0JBQWtCLEtBQUssV0FBVyxpQkFBaUIsYUFBYSxRQUFRO0FBQzlFLFFBQU0sTUFBTSxpQkFBaUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxRQUFNLEdBQUcsVUFBVSxpQkFBaUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUN2RCxRQUFNLFVBQVUsS0FBSyxXQUFXLGlCQUFpQixzQkFBc0IsR0FBRyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN0RzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure decision for whether unregistering a vault may tear its window down.
5
+ *
6
+ * The desktop CDP transport used to answer this with a single flag. Its
7
+ * readiness guard asks `ownedConfig || isHarnessOwnedInstance` — the two ways
8
+ * "the harness owns this instance" can be true — while its teardown guard asked
9
+ * only `ownedConfig`. A **worker** attached to a harness-owned instance has
10
+ * `isHarnessOwnedInstance: true` and no `ownedConfig` at all (the global setup
11
+ * owns the config; the worker was handed only the port), so it fell straight
12
+ * through the teardown guard and ran `destroyCurrentWindow()` against the vault
13
+ * it was asked to unregister. When that vault is the one the whole run shares,
14
+ * its window is the only one — destroying it quits the app, and every later file
15
+ * fails with `ECONNREFUSED` on a closed CDP port, which reads as a harness
16
+ * outage rather than as a teardown that overreached.
17
+ *
18
+ * Making the two guards identical would fix that and break something else: an
19
+ * attached worker that registers its **own** `TemporaryVault` does need that
20
+ * window closed, and a blanket early-return leaks one stale window per temp
21
+ * vault for the life of the run — each pointing at a directory the disposal has
22
+ * already deleted. Since every worker in a `createSetup` run is an attached one,
23
+ * that is the common path, not an edge case.
24
+ *
25
+ * So the invariant is narrower than either guard expressed: **a worker attached
26
+ * to a harness-owned instance may tear down only a vault it registered itself.**
27
+ * Everything else in that instance belongs to the global setup that launched it.
28
+ *
29
+ * Kept out of the integration-only transport module (excluded from unit tests,
30
+ * `LF:0` in coverage) for the same reason `vault-path-match.ts` is — so the
31
+ * decision is unit-testable while the transport keeps only the plumbing.
32
+ */
33
+ /**
34
+ * Parameters for {@link shouldTearDownVaultWindow}.
35
+ */
36
+ export interface ShouldTearDownVaultWindowParams {
37
+ /**
38
+ Whether this transport is a worker attached to an instance the harness launched elsewhere.
39
+ */
40
+ readonly isHarnessOwnedInstance: boolean;
41
+ /**
42
+ Whether this transport launched and owns the instance itself.
43
+ */
44
+ readonly isOwnedInstance: boolean;
45
+ /**
46
+ Whether this transport is the one that registered the vault being unregistered.
47
+ */
48
+ readonly isSelfRegistered: boolean;
49
+ }
50
+ /**
51
+ * Whether unregistering a vault may destroy its window and remove it from the
52
+ * registry, or must leave the instance untouched.
53
+ *
54
+ * @param params - Who owns the instance, and who registered the vault.
55
+ * @returns `true` when the window may be torn down.
56
+ */
57
+ export declare function shouldTearDownVaultWindow(params: ShouldTearDownVaultWindowParams): boolean;
@@ -0,0 +1,18 @@
1
+ function shouldTearDownVaultWindow(params) {
2
+ const {
3
+ isHarnessOwnedInstance,
4
+ isOwnedInstance,
5
+ isSelfRegistered
6
+ } = params;
7
+ if (isOwnedInstance) {
8
+ return false;
9
+ }
10
+ if (isHarnessOwnedInstance) {
11
+ return isSelfRegistered;
12
+ }
13
+ return true;
14
+ }
15
+ export {
16
+ shouldTearDownVaultWindow
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZhdWx0LXRlYXJkb3duLXZlcmRpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGRlY2lzaW9uIGZvciB3aGV0aGVyIHVucmVnaXN0ZXJpbmcgYSB2YXVsdCBtYXkgdGVhciBpdHMgd2luZG93IGRvd24uXG4gKlxuICogVGhlIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydCB1c2VkIHRvIGFuc3dlciB0aGlzIHdpdGggYSBzaW5nbGUgZmxhZy4gSXRzXG4gKiByZWFkaW5lc3MgZ3VhcmQgYXNrcyBgb3duZWRDb25maWcgfHwgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgXHUyMDE0IHRoZSB0d28gd2F5c1xuICogXCJ0aGUgaGFybmVzcyBvd25zIHRoaXMgaW5zdGFuY2VcIiBjYW4gYmUgdHJ1ZSBcdTIwMTQgd2hpbGUgaXRzIHRlYXJkb3duIGd1YXJkIGFza2VkXG4gKiBvbmx5IGBvd25lZENvbmZpZ2AuIEEgKip3b3JrZXIqKiBhdHRhY2hlZCB0byBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgaGFzXG4gKiBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZWAgYW5kIG5vIGBvd25lZENvbmZpZ2AgYXQgYWxsICh0aGUgZ2xvYmFsIHNldHVwXG4gKiBvd25zIHRoZSBjb25maWc7IHRoZSB3b3JrZXIgd2FzIGhhbmRlZCBvbmx5IHRoZSBwb3J0KSwgc28gaXQgZmVsbCBzdHJhaWdodFxuICogdGhyb3VnaCB0aGUgdGVhcmRvd24gZ3VhcmQgYW5kIHJhbiBgZGVzdHJveUN1cnJlbnRXaW5kb3coKWAgYWdhaW5zdCB0aGUgdmF1bHRcbiAqIGl0IHdhcyBhc2tlZCB0byB1bnJlZ2lzdGVyLiBXaGVuIHRoYXQgdmF1bHQgaXMgdGhlIG9uZSB0aGUgd2hvbGUgcnVuIHNoYXJlcyxcbiAqIGl0cyB3aW5kb3cgaXMgdGhlIG9ubHkgb25lIFx1MjAxNCBkZXN0cm95aW5nIGl0IHF1aXRzIHRoZSBhcHAsIGFuZCBldmVyeSBsYXRlciBmaWxlXG4gKiBmYWlscyB3aXRoIGBFQ09OTlJFRlVTRURgIG9uIGEgY2xvc2VkIENEUCBwb3J0LCB3aGljaCByZWFkcyBhcyBhIGhhcm5lc3NcbiAqIG91dGFnZSByYXRoZXIgdGhhbiBhcyBhIHRlYXJkb3duIHRoYXQgb3ZlcnJlYWNoZWQuXG4gKlxuICogTWFraW5nIHRoZSB0d28gZ3VhcmRzIGlkZW50aWNhbCB3b3VsZCBmaXggdGhhdCBhbmQgYnJlYWsgc29tZXRoaW5nIGVsc2U6IGFuXG4gKiBhdHRhY2hlZCB3b3JrZXIgdGhhdCByZWdpc3RlcnMgaXRzICoqb3duKiogYFRlbXBvcmFyeVZhdWx0YCBkb2VzIG5lZWQgdGhhdFxuICogd2luZG93IGNsb3NlZCwgYW5kIGEgYmxhbmtldCBlYXJseS1yZXR1cm4gbGVha3Mgb25lIHN0YWxlIHdpbmRvdyBwZXIgdGVtcFxuICogdmF1bHQgZm9yIHRoZSBsaWZlIG9mIHRoZSBydW4gXHUyMDE0IGVhY2ggcG9pbnRpbmcgYXQgYSBkaXJlY3RvcnkgdGhlIGRpc3Bvc2FsIGhhc1xuICogYWxyZWFkeSBkZWxldGVkLiBTaW5jZSBldmVyeSB3b3JrZXIgaW4gYSBgY3JlYXRlU2V0dXBgIHJ1biBpcyBhbiBhdHRhY2hlZCBvbmUsXG4gKiB0aGF0IGlzIHRoZSBjb21tb24gcGF0aCwgbm90IGFuIGVkZ2UgY2FzZS5cbiAqXG4gKiBTbyB0aGUgaW52YXJpYW50IGlzIG5hcnJvd2VyIHRoYW4gZWl0aGVyIGd1YXJkIGV4cHJlc3NlZDogKiphIHdvcmtlciBhdHRhY2hlZFxuICogdG8gYSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIG1heSB0ZWFyIGRvd24gb25seSBhIHZhdWx0IGl0IHJlZ2lzdGVyZWQgaXRzZWxmLioqXG4gKiBFdmVyeXRoaW5nIGVsc2UgaW4gdGhhdCBpbnN0YW5jZSBiZWxvbmdzIHRvIHRoZSBnbG9iYWwgc2V0dXAgdGhhdCBsYXVuY2hlZCBpdC5cbiAqXG4gKiBLZXB0IG91dCBvZiB0aGUgaW50ZWdyYXRpb24tb25seSB0cmFuc3BvcnQgbW9kdWxlIChleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMsXG4gKiBgTEY6MGAgaW4gY292ZXJhZ2UpIGZvciB0aGUgc2FtZSByZWFzb24gYHZhdWx0LXBhdGgtbWF0Y2gudHNgIGlzIFx1MjAxNCBzbyB0aGVcbiAqIGRlY2lzaW9uIGlzIHVuaXQtdGVzdGFibGUgd2hpbGUgdGhlIHRyYW5zcG9ydCBrZWVwcyBvbmx5IHRoZSBwbHVtYmluZy5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzaG91bGRUZWFyRG93blZhdWx0V2luZG93fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRUZWFyRG93blZhdWx0V2luZG93UGFyYW1zIHtcbiAgLyoqXG4gIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgYSB3b3JrZXIgYXR0YWNoZWQgdG8gYW4gaW5zdGFuY2UgdGhlIGhhcm5lc3MgbGF1bmNoZWQgZWxzZXdoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciB0aGlzIHRyYW5zcG9ydCBsYXVuY2hlZCBhbmQgb3ducyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNPd25lZEluc3RhbmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIHRoZSBvbmUgdGhhdCByZWdpc3RlcmVkIHRoZSB2YXVsdCBiZWluZyB1bnJlZ2lzdGVyZWQuXG4gICAqL1xuICByZWFkb25seSBpc1NlbGZSZWdpc3RlcmVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdW5yZWdpc3RlcmluZyBhIHZhdWx0IG1heSBkZXN0cm95IGl0cyB3aW5kb3cgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZVxuICogcmVnaXN0cnksIG9yIG11c3QgbGVhdmUgdGhlIGluc3RhbmNlIHVudG91Y2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gV2hvIG93bnMgdGhlIGluc3RhbmNlLCBhbmQgd2hvIHJlZ2lzdGVyZWQgdGhlIHZhdWx0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHdpbmRvdyBtYXkgYmUgdG9ybiBkb3duLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVGVhckRvd25WYXVsdFdpbmRvdyhwYXJhbXM6IFNob3VsZFRlYXJEb3duVmF1bHRXaW5kb3dQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2UsXG4gICAgaXNPd25lZEluc3RhbmNlLFxuICAgIGlzU2VsZlJlZ2lzdGVyZWRcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNPd25lZEluc3RhbmNlKSB7XG4gICAgLy8gVGhlIG93bmVkIGluc3RhbmNlIGlzIGtpbGxlZCB3aG9sZXNhbGUgb24gZGlzcG9zZSwgYW5kIGl0cyByZWdpc3RyeSBsaXZlc1xuICAgIC8vIEluIHRoZSBpc29sYXRlZCB1c2VyLWRhdGEgY29uZmlnIFx1MjAxNCB0aGVyZSBpcyBub3RoaW5nIHRvIHVucmVnaXN0ZXIgZnJvbS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgIC8vIEF0dGFjaGVkIHRvIHNvbWVvbmUgZWxzZSdzIGluc3RhbmNlOiBvbmx5IHRoaXMgdHJhbnNwb3J0J3Mgb3duIHZhdWx0cy5cbiAgICByZXR1cm4gaXNTZWxmUmVnaXN0ZXJlZDtcbiAgfVxuXG4gIC8vIFBsYWluIGF0dGFjaCBtb2RlIFx1MjAxNCBhIGZvcmVpZ24gT2JzaWRpYW4gdGhlIGhhcm5lc3Mgb3BlbmVkIGEgdmF1bHQgaW4sIHdoaWNoXG4gIC8vIE91dGxpdmVzIHRoZSBydW4gYW5kIG11c3QgYmUgbGVmdCBhcyBpdCB3YXMgZm91bmQuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNERPLFNBQVMsMEJBQTBCLFFBQWtEO0FBQzFGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixNQUFJLGlCQUFpQjtBQUduQixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksd0JBQXdCO0FBRTFCLFdBQU87QUFBQSxFQUNUO0FBSUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -5,7 +5,7 @@
5
5
  * version.
6
6
  *
7
7
  * Support is the range `[latest public, latest catalyst]` and both ends must be
8
- * verified (G99). The two ends are moving targets, and they periodically
8
+ * verified. The two ends are moving targets, and they periodically
9
9
  * **coincide** — when public catches up to catalyst, both specifiers provision
10
10
  * the same build, so running the suites twice re-runs the same build and buys
11
11
  * nothing. Worse, a consumer that ran both still reports "green on public AND
@@ -23,7 +23,7 @@
23
23
  import type { DesktopReleasesManifest } from './obsidian-version.mjs';
24
24
  /**
25
25
  * The version specifiers a matrix run defaults to: both ends of the supported
26
- * range (G99). They are de-duplicated on their resolved versions, so when public
26
+ * range. They are de-duplicated on their resolved versions, so when public
27
27
  * has caught up to catalyst this yields a single run.
28
28
  */
29
29
  export declare const DEFAULT_OBSIDIAN_VERSION_SPECS: readonly string[];