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
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for building the repo-root `metadata.json` catalog from Obsidian's
5
+ * **own** publication endpoints, with no third-party catalog in the loop.
6
+ *
7
+ * `scripts/refresh-metadata.ts` drives the network side (the
8
+ * `obsidianmd/obsidian-releases` GitHub Releases API, `obsidian.md/changelog.xml`
9
+ * and `desktop-releases.json`); everything decidable without the network lives
10
+ * here so it stays unit-tested.
11
+ *
12
+ * Three decisions are encoded:
13
+ *
14
+ * - **Which release assets become `downloads` keys.** A release's real asset list
15
+ * is matched rather than templated, reusing {@link selectInstallerAssetName} for
16
+ * the desktop installers so the historical dot-vs-hyphen separator rename (and
17
+ * the `-universal` dmg infix) is handled in exactly one place. The 32-bit,
18
+ * arm64, AppImage, deb and snap siblings are deliberately not carried — this
19
+ * harness downloads only the x64 installer, the app asar and the Android apk.
20
+ * - **Which channel a version belongs to**, derived from which changelog pages
21
+ * the feed published for it (see {@link resolveReleaseChannel}).
22
+ * - **Where a catalyst asar lives** ({@link buildCatalystAsarUrl}) — the one asset
23
+ * with no listing API behind it, so its URL must be constructed and probed.
24
+ */
25
+ import type { ObsidianVersionDownloads } from './obsidian-metadata.mjs';
26
+ /**
27
+ * Base URL for **catalyst** (early access / insider) release asars, served from
28
+ * the Obsidian CDN as `.../release/obsidian-<version>.asar.gz`. Public versions
29
+ * are NOT hosted here (the CDN returns an empty body for them), and the endpoint
30
+ * is Cloudflare-gated against non-browser clients, so a probe needs a browser
31
+ * `User-Agent`.
32
+ */
33
+ export declare const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
34
+ /**
35
+ * One asset of a GitHub release, reduced to what the catalog needs.
36
+ */
37
+ export interface ReleaseAsset {
38
+ /**
39
+ The published asset file name, e.g. `Obsidian-1.13.7.exe`.
40
+ */
41
+ readonly name: string;
42
+ /**
43
+ The asset's direct download URL (`browser_download_url`).
44
+ */
45
+ readonly url: string;
46
+ }
47
+ /**
48
+ * Parameters for {@link resolveReleaseChannel}.
49
+ */
50
+ export interface ResolveReleaseChannelParams {
51
+ /**
52
+ Whether the changelog feed published a catalyst ("Early access") desktop page.
53
+ */
54
+ readonly hasCatalystPage: boolean;
55
+ /**
56
+ Whether the changelog feed published a public desktop page.
57
+ */
58
+ readonly hasPublicPage: boolean;
59
+ /**
60
+ * Whether the version was published as a GitHub release — the evidence that it
61
+ * shipped on the public channel, since catalyst builds are served only from
62
+ * the `releases.obsidian.md` CDN.
63
+ */
64
+ readonly hasPublicRelease: boolean;
65
+ }
66
+ /**
67
+ * Parameters for {@link selectReleaseDownloads}.
68
+ */
69
+ export interface SelectReleaseDownloadsParams {
70
+ /**
71
+ The release's published assets.
72
+ */
73
+ readonly assets: readonly ReleaseAsset[];
74
+ /**
75
+ The concrete `x.y.z` version the release publishes.
76
+ */
77
+ readonly version: string;
78
+ }
79
+ /**
80
+ * Builds the catalyst asar URL for a version.
81
+ *
82
+ * Catalyst builds are not published as GitHub release assets, and the CDN that
83
+ * serves them has no listing API, so this URL is constructed rather than
84
+ * discovered — the caller probes it before recording it.
85
+ *
86
+ * @param version - The concrete `x.y.z` version.
87
+ * @returns The `releases.obsidian.md` asar URL for the version.
88
+ */
89
+ export declare function buildCatalystAsarUrl(version: string): string;
90
+ /**
91
+ * Derives a version's release channel from where it was published and which
92
+ * changelog pages the feed carries for it.
93
+ *
94
+ * **Publication is the primary evidence, not the feed's title marker.** The feed
95
+ * tags each entry `(Public)` or `(Early access)`, but through the pre-1.0 era it
96
+ * tagged *everything* early-access — the whole app was — so 61 versions that
97
+ * shipped as ordinary GitHub releases carry only a catalyst page. Trusting the
98
+ * marker alone therefore relabels a large slice of public history as catalyst.
99
+ * A GitHub release is unambiguous the other way round: catalyst builds are
100
+ * served only from the `releases.obsidian.md` CDN, never as release assets.
101
+ *
102
+ * So a version that was published on GitHub is public, and it is recorded as the
103
+ * combined `'public+catalyst'` only when the feed carries *both* desktop pages —
104
+ * the shape every version already labelled `'public+catalyst'` has.
105
+ *
106
+ * @param params - The publication evidence and the desktop pages the feed published.
107
+ * @returns The channel, or `undefined` when there is no evidence either way (the
108
+ * caller then keeps whatever the version already carries).
109
+ */
110
+ export declare function resolveReleaseChannel(params: ResolveReleaseChannelParams): string | undefined;
111
+ /**
112
+ * Picks the assets this harness downloads out of a GitHub release's real asset
113
+ * list: the x64 desktop installers, the app asar and the Android apk.
114
+ *
115
+ * Assets are matched against the **release's own version**, so an early-access
116
+ * tag whose assets carry the base version instead (`v1.1.8-E21` publishing
117
+ * `Obsidian.1.1.8.exe`, `v1.6.3-e30` publishing `Obsidian.1.6.3.exe`) matches
118
+ * nothing and is skipped — deliberately, since those assets are the base
119
+ * version's, not the tag's.
120
+ *
121
+ * @param params - The release's assets and its version.
122
+ * @returns The distilled download URLs, or `undefined` when the release
123
+ * publishes none of them.
124
+ */
125
+ export declare function selectReleaseDownloads(params: SelectReleaseDownloadsParams): ObsidianVersionDownloads | undefined;
@@ -0,0 +1,46 @@
1
+ import { selectInstallerAssetName } from "./installer-asset.mjs";
2
+ import { getVersionAsarFileName } from "./obsidian-version.mjs";
3
+ const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
4
+ const INSTALLER_KEYS_BY_PLATFORM = [
5
+ ["dmg", "darwin"],
6
+ ["exe", "win32"],
7
+ ["tar", "linux"]
8
+ ];
9
+ function buildCatalystAsarUrl(version) {
10
+ return `${CATALYST_ASAR_RELEASE_BASE_URL}/${getVersionAsarFileName(version)}.gz`;
11
+ }
12
+ function resolveReleaseChannel(params) {
13
+ if (params.hasPublicRelease) {
14
+ return params.hasPublicPage && params.hasCatalystPage ? "public+catalyst" : "public";
15
+ }
16
+ return params.hasCatalystPage ? "catalyst" : void 0;
17
+ }
18
+ function selectReleaseDownloads(params) {
19
+ const { assets, version } = params;
20
+ const assetNames = assets.map((asset) => asset.name);
21
+ const urlByName = new Map(assets.map((asset) => [asset.name, asset.url]));
22
+ const downloads = {};
23
+ const apkUrl = urlByName.get(`Obsidian-${version}.apk`);
24
+ if (apkUrl !== void 0) {
25
+ downloads["apk"] = apkUrl;
26
+ }
27
+ const asarUrl = urlByName.get(`${getVersionAsarFileName(version)}.gz`);
28
+ if (asarUrl !== void 0) {
29
+ downloads["asar"] = asarUrl;
30
+ }
31
+ for (const [key, platform] of INSTALLER_KEYS_BY_PLATFORM) {
32
+ const assetName = selectInstallerAssetName({ assetNames, platform, version });
33
+ const url = assetName === void 0 ? void 0 : urlByName.get(assetName);
34
+ if (url !== void 0) {
35
+ downloads[key] = url;
36
+ }
37
+ }
38
+ return Object.keys(downloads).length > 0 ? downloads : void 0;
39
+ }
40
+ export {
41
+ CATALYST_ASAR_RELEASE_BASE_URL,
42
+ buildCatalystAsarUrl,
43
+ resolveReleaseChannel,
44
+ selectReleaseDownloads
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlbGVhc2UtY2F0YWxvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFB1cmUgaGVscGVycyBmb3IgYnVpbGRpbmcgdGhlIHJlcG8tcm9vdCBgbWV0YWRhdGEuanNvbmAgY2F0YWxvZyBmcm9tIE9ic2lkaWFuJ3NcbiAqICoqb3duKiogcHVibGljYXRpb24gZW5kcG9pbnRzLCB3aXRoIG5vIHRoaXJkLXBhcnR5IGNhdGFsb2cgaW4gdGhlIGxvb3AuXG4gKlxuICogYHNjcmlwdHMvcmVmcmVzaC1tZXRhZGF0YS50c2AgZHJpdmVzIHRoZSBuZXR3b3JrIHNpZGUgKHRoZVxuICogYG9ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXNgIEdpdEh1YiBSZWxlYXNlcyBBUEksIGBvYnNpZGlhbi5tZC9jaGFuZ2Vsb2cueG1sYFxuICogYW5kIGBkZXNrdG9wLXJlbGVhc2VzLmpzb25gKTsgZXZlcnl0aGluZyBkZWNpZGFibGUgd2l0aG91dCB0aGUgbmV0d29yayBsaXZlc1xuICogaGVyZSBzbyBpdCBzdGF5cyB1bml0LXRlc3RlZC5cbiAqXG4gKiBUaHJlZSBkZWNpc2lvbnMgYXJlIGVuY29kZWQ6XG4gKlxuICogLSAqKldoaWNoIHJlbGVhc2UgYXNzZXRzIGJlY29tZSBgZG93bmxvYWRzYCBrZXlzLioqIEEgcmVsZWFzZSdzIHJlYWwgYXNzZXQgbGlzdFxuICogICBpcyBtYXRjaGVkIHJhdGhlciB0aGFuIHRlbXBsYXRlZCwgcmV1c2luZyB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lfSBmb3JcbiAqICAgdGhlIGRlc2t0b3AgaW5zdGFsbGVycyBzbyB0aGUgaGlzdG9yaWNhbCBkb3QtdnMtaHlwaGVuIHNlcGFyYXRvciByZW5hbWUgKGFuZFxuICogICB0aGUgYC11bml2ZXJzYWxgIGRtZyBpbmZpeCkgaXMgaGFuZGxlZCBpbiBleGFjdGx5IG9uZSBwbGFjZS4gVGhlIDMyLWJpdCxcbiAqICAgYXJtNjQsIEFwcEltYWdlLCBkZWIgYW5kIHNuYXAgc2libGluZ3MgYXJlIGRlbGliZXJhdGVseSBub3QgY2FycmllZCBcdTIwMTQgdGhpc1xuICogICBoYXJuZXNzIGRvd25sb2FkcyBvbmx5IHRoZSB4NjQgaW5zdGFsbGVyLCB0aGUgYXBwIGFzYXIgYW5kIHRoZSBBbmRyb2lkIGFway5cbiAqIC0gKipXaGljaCBjaGFubmVsIGEgdmVyc2lvbiBiZWxvbmdzIHRvKiosIGRlcml2ZWQgZnJvbSB3aGljaCBjaGFuZ2Vsb2cgcGFnZXNcbiAqICAgdGhlIGZlZWQgcHVibGlzaGVkIGZvciBpdCAoc2VlIHtAbGluayByZXNvbHZlUmVsZWFzZUNoYW5uZWx9KS5cbiAqIC0gKipXaGVyZSBhIGNhdGFseXN0IGFzYXIgbGl2ZXMqKiAoe0BsaW5rIGJ1aWxkQ2F0YWx5c3RBc2FyVXJsfSkgXHUyMDE0IHRoZSBvbmUgYXNzZXRcbiAqICAgd2l0aCBubyBsaXN0aW5nIEFQSSBiZWhpbmQgaXQsIHNvIGl0cyBVUkwgbXVzdCBiZSBjb25zdHJ1Y3RlZCBhbmQgcHJvYmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5WZXJzaW9uRG93bmxvYWRzIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuXG5pbXBvcnQgeyBzZWxlY3RJbnN0YWxsZXJBc3NldE5hbWUgfSBmcm9tICcuL2luc3RhbGxlci1hc3NldC5tanMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbkFzYXJGaWxlTmFtZSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG4vKipcbiAqIEJhc2UgVVJMIGZvciAqKmNhdGFseXN0KiogKGVhcmx5IGFjY2VzcyAvIGluc2lkZXIpIHJlbGVhc2UgYXNhcnMsIHNlcnZlZCBmcm9tXG4gKiB0aGUgT2JzaWRpYW4gQ0ROIGFzIGAuLi4vcmVsZWFzZS9vYnNpZGlhbi08dmVyc2lvbj4uYXNhci5nemAuIFB1YmxpYyB2ZXJzaW9uc1xuICogYXJlIE5PVCBob3N0ZWQgaGVyZSAodGhlIENETiByZXR1cm5zIGFuIGVtcHR5IGJvZHkgZm9yIHRoZW0pLCBhbmQgdGhlIGVuZHBvaW50XG4gKiBpcyBDbG91ZGZsYXJlLWdhdGVkIGFnYWluc3Qgbm9uLWJyb3dzZXIgY2xpZW50cywgc28gYSBwcm9iZSBuZWVkcyBhIGJyb3dzZXJcbiAqIGBVc2VyLUFnZW50YC5cbiAqL1xuZXhwb3J0IGNvbnN0IENBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTCA9ICdodHRwczovL3JlbGVhc2VzLm9ic2lkaWFuLm1kL3JlbGVhc2UnO1xuXG4vKipcbiAqIE9uZSBhc3NldCBvZiBhIEdpdEh1YiByZWxlYXNlLCByZWR1Y2VkIHRvIHdoYXQgdGhlIGNhdGFsb2cgbmVlZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsZWFzZUFzc2V0IHtcbiAgLyoqXG4gIFRoZSBwdWJsaXNoZWQgYXNzZXQgZmlsZSBuYW1lLCBlLmcuIGBPYnNpZGlhbi0xLjEzLjcuZXhlYC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGFzc2V0J3MgZGlyZWN0IGRvd25sb2FkIFVSTCAoYGJyb3dzZXJfZG93bmxvYWRfdXJsYCkuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZVJlbGVhc2VDaGFubmVsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVsZWFzZUNoYW5uZWxQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgY2hhbmdlbG9nIGZlZWQgcHVibGlzaGVkIGEgY2F0YWx5c3QgKFwiRWFybHkgYWNjZXNzXCIpIGRlc2t0b3AgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0NhdGFseXN0UGFnZTogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciB0aGUgY2hhbmdlbG9nIGZlZWQgcHVibGlzaGVkIGEgcHVibGljIGRlc2t0b3AgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1B1YmxpY1BhZ2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZlcnNpb24gd2FzIHB1Ymxpc2hlZCBhcyBhIEdpdEh1YiByZWxlYXNlIFx1MjAxNCB0aGUgZXZpZGVuY2UgdGhhdCBpdFxuICAgKiBzaGlwcGVkIG9uIHRoZSBwdWJsaWMgY2hhbm5lbCwgc2luY2UgY2F0YWx5c3QgYnVpbGRzIGFyZSBzZXJ2ZWQgb25seSBmcm9tXG4gICAqIHRoZSBgcmVsZWFzZXMub2JzaWRpYW4ubWRgIENETi5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1B1YmxpY1JlbGVhc2U6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdFJlbGVhc2VEb3dubG9hZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdFJlbGVhc2VEb3dubG9hZHNQYXJhbXMge1xuICAvKipcbiAgVGhlIHJlbGVhc2UncyBwdWJsaXNoZWQgYXNzZXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBSZWxlYXNlQXNzZXRbXTtcblxuICAvKipcbiAgVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbiB0aGUgcmVsZWFzZSBwdWJsaXNoZXMuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlc2t0b3AtaW5zdGFsbGVyIGBkb3dubG9hZHNgIGtleXMsIHBhaXJlZCB3aXRoIHRoZSBwbGF0Zm9ybSB3aG9zZSBhc3NldFxuICogc2hhcGUge0BsaW5rIHNlbGVjdEluc3RhbGxlckFzc2V0TmFtZX0gcmVzb2x2ZXMgZm9yIHRoZW0uXG4gKi9cbmNvbnN0IElOU1RBTExFUl9LRVlTX0JZX1BMQVRGT1JNOiByZWFkb25seSAocmVhZG9ubHkgW2tleTogJ2RtZycgfCAnZXhlJyB8ICd0YXInLCBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtXSlbXSA9IFtcbiAgWydkbWcnLCAnZGFyd2luJ10sXG4gIFsnZXhlJywgJ3dpbjMyJ10sXG4gIFsndGFyJywgJ2xpbnV4J11cbl07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjYXRhbHlzdCBhc2FyIFVSTCBmb3IgYSB2ZXJzaW9uLlxuICpcbiAqIENhdGFseXN0IGJ1aWxkcyBhcmUgbm90IHB1Ymxpc2hlZCBhcyBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGFuZCB0aGUgQ0ROIHRoYXRcbiAqIHNlcnZlcyB0aGVtIGhhcyBubyBsaXN0aW5nIEFQSSwgc28gdGhpcyBVUkwgaXMgY29uc3RydWN0ZWQgcmF0aGVyIHRoYW5cbiAqIGRpc2NvdmVyZWQgXHUyMDE0IHRoZSBjYWxsZXIgcHJvYmVzIGl0IGJlZm9yZSByZWNvcmRpbmcgaXQuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGByZWxlYXNlcy5vYnNpZGlhbi5tZGAgYXNhciBVUkwgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYXRhbHlzdEFzYXJVcmwodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHtnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pfS5nemA7XG59XG5cbi8qKlxuICogRGVyaXZlcyBhIHZlcnNpb24ncyByZWxlYXNlIGNoYW5uZWwgZnJvbSB3aGVyZSBpdCB3YXMgcHVibGlzaGVkIGFuZCB3aGljaFxuICogY2hhbmdlbG9nIHBhZ2VzIHRoZSBmZWVkIGNhcnJpZXMgZm9yIGl0LlxuICpcbiAqICoqUHVibGljYXRpb24gaXMgdGhlIHByaW1hcnkgZXZpZGVuY2UsIG5vdCB0aGUgZmVlZCdzIHRpdGxlIG1hcmtlci4qKiBUaGUgZmVlZFxuICogdGFncyBlYWNoIGVudHJ5IGAoUHVibGljKWAgb3IgYChFYXJseSBhY2Nlc3MpYCwgYnV0IHRocm91Z2ggdGhlIHByZS0xLjAgZXJhIGl0XG4gKiB0YWdnZWQgKmV2ZXJ5dGhpbmcqIGVhcmx5LWFjY2VzcyBcdTIwMTQgdGhlIHdob2xlIGFwcCB3YXMgXHUyMDE0IHNvIDYxIHZlcnNpb25zIHRoYXRcbiAqIHNoaXBwZWQgYXMgb3JkaW5hcnkgR2l0SHViIHJlbGVhc2VzIGNhcnJ5IG9ubHkgYSBjYXRhbHlzdCBwYWdlLiBUcnVzdGluZyB0aGVcbiAqIG1hcmtlciBhbG9uZSB0aGVyZWZvcmUgcmVsYWJlbHMgYSBsYXJnZSBzbGljZSBvZiBwdWJsaWMgaGlzdG9yeSBhcyBjYXRhbHlzdC5cbiAqIEEgR2l0SHViIHJlbGVhc2UgaXMgdW5hbWJpZ3VvdXMgdGhlIG90aGVyIHdheSByb3VuZDogY2F0YWx5c3QgYnVpbGRzIGFyZVxuICogc2VydmVkIG9ubHkgZnJvbSB0aGUgYHJlbGVhc2VzLm9ic2lkaWFuLm1kYCBDRE4sIG5ldmVyIGFzIHJlbGVhc2UgYXNzZXRzLlxuICpcbiAqIFNvIGEgdmVyc2lvbiB0aGF0IHdhcyBwdWJsaXNoZWQgb24gR2l0SHViIGlzIHB1YmxpYywgYW5kIGl0IGlzIHJlY29yZGVkIGFzIHRoZVxuICogY29tYmluZWQgYCdwdWJsaWMrY2F0YWx5c3QnYCBvbmx5IHdoZW4gdGhlIGZlZWQgY2FycmllcyAqYm90aCogZGVza3RvcCBwYWdlcyBcdTIwMTRcbiAqIHRoZSBzaGFwZSBldmVyeSB2ZXJzaW9uIGFscmVhZHkgbGFiZWxsZWQgYCdwdWJsaWMrY2F0YWx5c3QnYCBoYXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwdWJsaWNhdGlvbiBldmlkZW5jZSBhbmQgdGhlIGRlc2t0b3AgcGFnZXMgdGhlIGZlZWQgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIGNoYW5uZWwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gZXZpZGVuY2UgZWl0aGVyIHdheSAodGhlXG4gKiAgIGNhbGxlciB0aGVuIGtlZXBzIHdoYXRldmVyIHRoZSB2ZXJzaW9uIGFscmVhZHkgY2FycmllcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsZWFzZUNoYW5uZWwocGFyYW1zOiBSZXNvbHZlUmVsZWFzZUNoYW5uZWxQYXJhbXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocGFyYW1zLmhhc1B1YmxpY1JlbGVhc2UpIHtcbiAgICByZXR1cm4gcGFyYW1zLmhhc1B1YmxpY1BhZ2UgJiYgcGFyYW1zLmhhc0NhdGFseXN0UGFnZSA/ICdwdWJsaWMrY2F0YWx5c3QnIDogJ3B1YmxpYyc7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zLmhhc0NhdGFseXN0UGFnZSA/ICdjYXRhbHlzdCcgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGFzc2V0cyB0aGlzIGhhcm5lc3MgZG93bmxvYWRzIG91dCBvZiBhIEdpdEh1YiByZWxlYXNlJ3MgcmVhbCBhc3NldFxuICogbGlzdDogdGhlIHg2NCBkZXNrdG9wIGluc3RhbGxlcnMsIHRoZSBhcHAgYXNhciBhbmQgdGhlIEFuZHJvaWQgYXBrLlxuICpcbiAqIEFzc2V0cyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSAqKnJlbGVhc2UncyBvd24gdmVyc2lvbioqLCBzbyBhbiBlYXJseS1hY2Nlc3NcbiAqIHRhZyB3aG9zZSBhc3NldHMgY2FycnkgdGhlIGJhc2UgdmVyc2lvbiBpbnN0ZWFkIChgdjEuMS44LUUyMWAgcHVibGlzaGluZ1xuICogYE9ic2lkaWFuLjEuMS44LmV4ZWAsIGB2MS42LjMtZTMwYCBwdWJsaXNoaW5nIGBPYnNpZGlhbi4xLjYuMy5leGVgKSBtYXRjaGVzXG4gKiBub3RoaW5nIGFuZCBpcyBza2lwcGVkIFx1MjAxNCBkZWxpYmVyYXRlbHksIHNpbmNlIHRob3NlIGFzc2V0cyBhcmUgdGhlIGJhc2VcbiAqIHZlcnNpb24ncywgbm90IHRoZSB0YWcncy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlbGVhc2UncyBhc3NldHMgYW5kIGl0cyB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGRpc3RpbGxlZCBkb3dubG9hZCBVUkxzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSByZWxlYXNlXG4gKiAgIHB1Ymxpc2hlcyBub25lIG9mIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSZWxlYXNlRG93bmxvYWRzKHBhcmFtczogU2VsZWN0UmVsZWFzZURvd25sb2Fkc1BhcmFtcyk6IE9ic2lkaWFuVmVyc2lvbkRvd25sb2FkcyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYXNzZXRzLCB2ZXJzaW9uIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhc3NldHMubWFwKChhc3NldCkgPT4gYXNzZXQubmFtZSk7XG4gIGNvbnN0IHVybEJ5TmFtZSA9IG5ldyBNYXAoYXNzZXRzLm1hcCgoYXNzZXQpID0+IFthc3NldC5uYW1lLCBhc3NldC51cmxdKSk7XG4gIGNvbnN0IGRvd25sb2FkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGNvbnN0IGFwa1VybCA9IHVybEJ5TmFtZS5nZXQoYE9ic2lkaWFuLSR7dmVyc2lvbn0uYXBrYCk7XG4gIGlmIChhcGtVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGRvd25sb2Fkc1snYXBrJ10gPSBhcGtVcmw7XG4gIH1cblxuICBjb25zdCBhc2FyVXJsID0gdXJsQnlOYW1lLmdldChgJHtnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pfS5nemApO1xuICBpZiAoYXNhclVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZG93bmxvYWRzWydhc2FyJ10gPSBhc2FyVXJsO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCBwbGF0Zm9ybV0gb2YgSU5TVEFMTEVSX0tFWVNfQllfUExBVEZPUk0pIHtcbiAgICBjb25zdCBhc3NldE5hbWUgPSBzZWxlY3RJbnN0YWxsZXJBc3NldE5hbWUoeyBhc3NldE5hbWVzLCBwbGF0Zm9ybSwgdmVyc2lvbiB9KTtcbiAgICBjb25zdCB1cmwgPSBhc3NldE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVybEJ5TmFtZS5nZXQoYXNzZXROYW1lKTtcbiAgICBpZiAodXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRvd25sb2Fkc1trZXldID0gdXJsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhkb3dubG9hZHMpLmxlbmd0aCA+IDAgPyBkb3dubG9hZHMgOiB1bmRlZmluZWQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkEsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyw4QkFBOEI7QUFTaEMsTUFBTSxpQ0FBaUM7QUEwRDlDLE1BQU0sNkJBQTRHO0FBQUEsRUFDaEgsQ0FBQyxPQUFPLFFBQVE7QUFBQSxFQUNoQixDQUFDLE9BQU8sT0FBTztBQUFBLEVBQ2YsQ0FBQyxPQUFPLE9BQU87QUFDakI7QUFZTyxTQUFTLHFCQUFxQixTQUF5QjtBQUM1RCxTQUFPLEdBQUcsOEJBQThCLElBQUksdUJBQXVCLE9BQU8sQ0FBQztBQUM3RTtBQXNCTyxTQUFTLHNCQUFzQixRQUF5RDtBQUM3RixNQUFJLE9BQU8sa0JBQWtCO0FBQzNCLFdBQU8sT0FBTyxpQkFBaUIsT0FBTyxrQkFBa0Isb0JBQW9CO0FBQUEsRUFDOUU7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLGFBQWE7QUFDL0M7QUFnQk8sU0FBUyx1QkFBdUIsUUFBNEU7QUFDakgsUUFBTSxFQUFFLFFBQVEsUUFBUSxJQUFJO0FBQzVCLFFBQU0sYUFBYSxPQUFPLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSTtBQUNuRCxRQUFNLFlBQVksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN4RSxRQUFNLFlBQW9DLENBQUM7QUFFM0MsUUFBTSxTQUFTLFVBQVUsSUFBSSxZQUFZLE9BQU8sTUFBTTtBQUN0RCxNQUFJLFdBQVcsUUFBVztBQUN4QixjQUFVLEtBQUssSUFBSTtBQUFBLEVBQ3JCO0FBRUEsUUFBTSxVQUFVLFVBQVUsSUFBSSxHQUFHLHVCQUF1QixPQUFPLENBQUMsS0FBSztBQUNyRSxNQUFJLFlBQVksUUFBVztBQUN6QixjQUFVLE1BQU0sSUFBSTtBQUFBLEVBQ3RCO0FBRUEsYUFBVyxDQUFDLEtBQUssUUFBUSxLQUFLLDRCQUE0QjtBQUN4RCxVQUFNLFlBQVkseUJBQXlCLEVBQUUsWUFBWSxVQUFVLFFBQVEsQ0FBQztBQUM1RSxVQUFNLE1BQU0sY0FBYyxTQUFZLFNBQVksVUFBVSxJQUFJLFNBQVM7QUFDekUsUUFBSSxRQUFRLFFBQVc7QUFDckIsZ0JBQVUsR0FBRyxJQUFJO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBRUEsU0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFLFNBQVMsSUFBSSxZQUFZO0FBQ3pEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -32,7 +32,7 @@ export interface RunObsidianVersionMatrixParams {
32
32
  * so an env var can be passed straight through.
33
33
  *
34
34
  * Each accepts an explicit `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`.
35
- * Defaults to both ends of the supported range (G99) when omitted or empty, and
35
+ * Defaults to both ends of the supported range when omitted or empty, and
36
36
  * the list is always de-duplicated on the **resolved** version — so when public
37
37
  * has caught up to catalyst, the suites run once.
38
38
  */
@@ -45,4 +45,4 @@ function logPlan(resolvedSpecs, entries) {
45
45
  export {
46
46
  runObsidianVersionMatrix
47
47
  };
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3J1bi12ZXJzaW9uLW1hdHJpeC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgcnVubmVyIHRoYXQgZXhlY3V0ZXMgYSBzdWl0ZSBvbmNlIHBlciAqKmRpc3RpbmN0Kiogc3VwcG9ydGVkXG4gKiBPYnNpZGlhbiB2ZXJzaW9uLlxuICpcbiAqIFRoaW4gZ2x1ZSBvdmVyIHRoZSBwdXJlIGB2ZXJzaW9uLW1hdHJpeC50c2AgZGVjaXNpb24gbGF5ZXI6IHRoZSBvbmx5IHRoaW5nc1xuICogdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIHNpbmdsZSBtYW5pZmVzdCBmZXRjaCBhbmQgdGhlIGxvZ2dpbmcuIEV2ZXJ5dGhpbmdcbiAqIHRoYXQgZGVjaWRlcyBcdTIwMTQgbm9ybWFsaXppbmcgdGhlIHJlcXVlc3RlZCBzcGVjaWZpZXJzLCByZXNvbHZpbmcgdGhlbSxcbiAqIGRlLWR1cGxpY2F0aW5nIG9uIHRoZSByZXNvbHZlZCB2ZXJzaW9uLCBzZXF1ZW5jaW5nIHRoZSBydW5zLCBhbmQgYnVpbGRpbmcgdGhlXG4gKiBmYWlsdXJlIHN1bW1hcnkgXHUyMDE0IGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkIG5leHQgZG9vci5cbiAqXG4gKiBUaGUgbG9vcCBsaXZlcyBhYm92ZSB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIGluc2lkZSBpdCBiZWNhdXNlIGEgdGVzdFxuICogZnJhbWV3b3JrJ3MgZ2xvYmFsIHNldHVwIGNhbm5vdCByZS1ydW4gaXRzIG93biB0ZXN0IGZpbGVzOiBpdCBsYXVuY2hlcyBvbmVcbiAqIGluc3RhbmNlIGZvciBvbmUgcnVuLiBLZWVwaW5nIHRoZSBsb29wIGZyYW1ld29yay1hZ25vc3RpYyAodGhlIGNhbGxlciBzdXBwbGllc1xuICogYHJ1bmApIGlzIHdoYXQgbGV0cyBWaXRlc3QsIEplc3QsIGFuZCBtYW51YWwgY29uc3VtZXJzIGFsbCBpbmhlcml0IGl0IChMNikuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZ2x1ZSAobmV0d29yayBmZXRjaCArIGxvZ2dpbmcpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5LFxuICBSZXNvbHZlZFZlcnNpb25TcGVjXG59IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFZlcnNpb25NYXRyaXgsXG4gIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFuLFxuICBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyLFxuICBoYXNDaGFubmVsU3BlYyxcbiAgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzLFxuICByZXNvbHZlVmVyc2lvblNwZWNzLFxuICBydW5WZXJzaW9uTWF0cml4RW50cmllc1xufSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IG9uZSBjb25jcmV0ZSBPYnNpZGlhbiB2ZXJzaW9uLCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBUaGUgZW50cnkncyBgdmVyc2lvbmAgaXMgdGhlIGNvbmNyZXRlIGB4LnkuemAgdG8gcGluIFx1MjAxNCB0eXBpY2FsbHkgZm9yd2FyZGVkIHRvXG4gICAqIHRoZSB0ZXN0LXJ1bm5lciBjaGlsZCBhcyBgT0JTSURJQU5fVkVSU0lPTmAuXG4gICAqL1xuICByZWFkb25seSBydW46IChlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXJzIHRvIHJ1biBhZ2FpbnN0OiBhbiBhcnJheSwgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAqIHNvIGFuIGVudiB2YXIgY2FuIGJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoLlxuICAgKlxuICAgKiBFYWNoIGFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogRGVmYXVsdHMgdG8gYm90aCBlbmRzIG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2UgKEc5OSkgd2hlbiBvbWl0dGVkIG9yIGVtcHR5LCBhbmRcbiAgICogdGhlIGxpc3QgaXMgYWx3YXlzIGRlLWR1cGxpY2F0ZWQgb24gdGhlICoqcmVzb2x2ZWQqKiB2ZXJzaW9uIFx1MjAxNCBzbyB3aGVuIHB1YmxpY1xuICAgKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0LCB0aGUgc3VpdGVzIHJ1biBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3VpdGUgb25jZSBwZXIgZGlzdGluY3Qgc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwZXItdmVyc2lvbiBydW5uZXIgYW5kIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgdmVyc2lvbiBoYXMgcnVuIHN1Y2Nlc3NmdWxseS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdmVyc2lvbiBjb3VsZCBiZSByZXNvbHZlZCwgb3IgYW4ge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfVxuICogICBuYW1pbmcgZXZlcnkgdmVyc2lvbiB3aG9zZSBydW4gZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4KHBhcmFtczogUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVuLCB2ZXJzaW9ucyB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHsgaXNEZWZhdWx0LCBzcGVjcyB9ID0gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBoYXNDaGFubmVsU3BlYyhzcGVjcykgPyBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgZHJvcHBlZFNwZWNzLCByZXNvbHZlZFNwZWNzIH0gPSByZXNvbHZlVmVyc2lvblNwZWNzKHtcbiAgICBtYW5pZmVzdCxcbiAgICAvLyBUaGUgZGVmYXVsdCBsaXN0IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSB3aGVuIGEgY2hhbm5lbCBpc1xuICAgIC8vIE1vbWVudGFyaWx5IGFic2VudCBmcm9tIHRoZSBtYW5pZmVzdDsgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgc3BlY2lmaWVyXG4gICAgLy8gVGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWwgZXJyb3IuXG4gICAgc2hvdWxkVG9sZXJhdGVVbnJlc29sdmFibGVTcGVjczogaXNEZWZhdWx0LFxuICAgIHNwZWNzXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgeyByZWFzb24sIHNwZWMgfSBvZiBkcm9wcGVkU3BlY3MpIHtcbiAgICBsb2dNYXRyaXgoYFNraXBwaW5nIFwiJHtzcGVjfVwiOiAke3JlYXNvbn1gKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjcyk7XG4gIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjcywgZW50cmllcyk7XG5cbiAgYXdhaXQgcnVuVmVyc2lvbk1hdHJpeEVudHJpZXMoe1xuICAgIGVudHJpZXMsXG4gICAgb25FbnRyeVN0YXJ0OiAoaGVhZGVyUGFyYW1zKSA9PiB7XG4gICAgICBsb2dNYXRyaXgoZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcihoZWFkZXJQYXJhbXMpKTtcbiAgICB9LFxuICAgIHJ1blxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dzIGEgbWF0cml4IG1lc3NhZ2UgdW5kZXIgYSBjb25zaXN0ZW50IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAqL1xuZnVuY3Rpb24gbG9nTWF0cml4KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBsb2coYFt2ZXJzaW9uLW1hdHJpeF0gJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIExvZ3Mgd2hhdCB0aGUgc3BlY2lmaWVycyByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyB0aGF0IGltcGxpZXMuXG4gKlxuICogQHBhcmFtIHJlc29sdmVkU3BlY3MgLSBUaGUgcmVzb2x2ZWQgc3BlY2lmaWVycywgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXguXG4gKi9cbmZ1bmN0aW9uIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdLCBlbnRyaWVzOiByZWFkb25seSBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbih7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSkpIHtcbiAgICBsb2dNYXRyaXgobGluZSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQSxTQUFTLFdBQVc7QUFDcEIsU0FBUyxvQ0FBb0M7QUFDN0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBRTFCLFFBQU0sRUFBRSxXQUFXLE1BQU0sSUFBSSxzQkFBc0IsUUFBUTtBQUMzRCxRQUFNLFdBQVcsZUFBZSxLQUFLLElBQUksTUFBTSw2QkFBNkIsSUFBSTtBQUNoRixRQUFNLEVBQUUsY0FBYyxjQUFjLElBQUksb0JBQW9CO0FBQUEsSUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLGlDQUFpQztBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsYUFBVyxFQUFFLFFBQVEsS0FBSyxLQUFLLGNBQWM7QUFDM0MsY0FBVSxhQUFhLElBQUksTUFBTSxNQUFNLEVBQUU7QUFBQSxFQUMzQztBQUVBLFFBQU0sVUFBVSxtQkFBbUIsYUFBYTtBQUNoRCxVQUFRLGVBQWUsT0FBTztBQUU5QixRQUFNLHdCQUF3QjtBQUFBLElBQzVCO0FBQUEsSUFDQSxjQUFjLENBQUMsaUJBQWlCO0FBQzlCLGdCQUFVLDZCQUE2QixZQUFZLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQU9BLFNBQVMsVUFBVSxTQUF1QjtBQUN4QyxNQUFJLG9CQUFvQixPQUFPLEVBQUU7QUFDbkM7QUFRQSxTQUFTLFFBQVEsZUFBK0MsU0FBc0Q7QUFDcEgsYUFBVyxRQUFRLHdCQUF3QixFQUFFLFNBQVMsY0FBYyxDQUFDLEdBQUc7QUFDdEUsY0FBVSxJQUFJO0FBQUEsRUFDaEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3J1bi12ZXJzaW9uLW1hdHJpeC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgcnVubmVyIHRoYXQgZXhlY3V0ZXMgYSBzdWl0ZSBvbmNlIHBlciAqKmRpc3RpbmN0Kiogc3VwcG9ydGVkXG4gKiBPYnNpZGlhbiB2ZXJzaW9uLlxuICpcbiAqIFRoaW4gZ2x1ZSBvdmVyIHRoZSBwdXJlIGB2ZXJzaW9uLW1hdHJpeC50c2AgZGVjaXNpb24gbGF5ZXI6IHRoZSBvbmx5IHRoaW5nc1xuICogdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIHNpbmdsZSBtYW5pZmVzdCBmZXRjaCBhbmQgdGhlIGxvZ2dpbmcuIEV2ZXJ5dGhpbmdcbiAqIHRoYXQgZGVjaWRlcyBcdTIwMTQgbm9ybWFsaXppbmcgdGhlIHJlcXVlc3RlZCBzcGVjaWZpZXJzLCByZXNvbHZpbmcgdGhlbSxcbiAqIGRlLWR1cGxpY2F0aW5nIG9uIHRoZSByZXNvbHZlZCB2ZXJzaW9uLCBzZXF1ZW5jaW5nIHRoZSBydW5zLCBhbmQgYnVpbGRpbmcgdGhlXG4gKiBmYWlsdXJlIHN1bW1hcnkgXHUyMDE0IGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkIG5leHQgZG9vci5cbiAqXG4gKiBUaGUgbG9vcCBsaXZlcyBhYm92ZSB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIGluc2lkZSBpdCBiZWNhdXNlIGEgdGVzdFxuICogZnJhbWV3b3JrJ3MgZ2xvYmFsIHNldHVwIGNhbm5vdCByZS1ydW4gaXRzIG93biB0ZXN0IGZpbGVzOiBpdCBsYXVuY2hlcyBvbmVcbiAqIGluc3RhbmNlIGZvciBvbmUgcnVuLiBLZWVwaW5nIHRoZSBsb29wIGZyYW1ld29yay1hZ25vc3RpYyAodGhlIGNhbGxlciBzdXBwbGllc1xuICogYHJ1bmApIGlzIHdoYXQgbGV0cyBWaXRlc3QsIEplc3QsIGFuZCBtYW51YWwgY29uc3VtZXJzIGFsbCBpbmhlcml0IGl0IChMNikuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZ2x1ZSAobmV0d29yayBmZXRjaCArIGxvZ2dpbmcpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5LFxuICBSZXNvbHZlZFZlcnNpb25TcGVjXG59IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFZlcnNpb25NYXRyaXgsXG4gIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFuLFxuICBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyLFxuICBoYXNDaGFubmVsU3BlYyxcbiAgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzLFxuICByZXNvbHZlVmVyc2lvblNwZWNzLFxuICBydW5WZXJzaW9uTWF0cml4RW50cmllc1xufSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IG9uZSBjb25jcmV0ZSBPYnNpZGlhbiB2ZXJzaW9uLCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBUaGUgZW50cnkncyBgdmVyc2lvbmAgaXMgdGhlIGNvbmNyZXRlIGB4LnkuemAgdG8gcGluIFx1MjAxNCB0eXBpY2FsbHkgZm9yd2FyZGVkIHRvXG4gICAqIHRoZSB0ZXN0LXJ1bm5lciBjaGlsZCBhcyBgT0JTSURJQU5fVkVSU0lPTmAuXG4gICAqL1xuICByZWFkb25seSBydW46IChlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXJzIHRvIHJ1biBhZ2FpbnN0OiBhbiBhcnJheSwgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAqIHNvIGFuIGVudiB2YXIgY2FuIGJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoLlxuICAgKlxuICAgKiBFYWNoIGFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogRGVmYXVsdHMgdG8gYm90aCBlbmRzIG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2Ugd2hlbiBvbWl0dGVkIG9yIGVtcHR5LCBhbmRcbiAgICogdGhlIGxpc3QgaXMgYWx3YXlzIGRlLWR1cGxpY2F0ZWQgb24gdGhlICoqcmVzb2x2ZWQqKiB2ZXJzaW9uIFx1MjAxNCBzbyB3aGVuIHB1YmxpY1xuICAgKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0LCB0aGUgc3VpdGVzIHJ1biBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3VpdGUgb25jZSBwZXIgZGlzdGluY3Qgc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwZXItdmVyc2lvbiBydW5uZXIgYW5kIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgdmVyc2lvbiBoYXMgcnVuIHN1Y2Nlc3NmdWxseS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdmVyc2lvbiBjb3VsZCBiZSByZXNvbHZlZCwgb3IgYW4ge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfVxuICogICBuYW1pbmcgZXZlcnkgdmVyc2lvbiB3aG9zZSBydW4gZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4KHBhcmFtczogUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVuLCB2ZXJzaW9ucyB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHsgaXNEZWZhdWx0LCBzcGVjcyB9ID0gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBoYXNDaGFubmVsU3BlYyhzcGVjcykgPyBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgZHJvcHBlZFNwZWNzLCByZXNvbHZlZFNwZWNzIH0gPSByZXNvbHZlVmVyc2lvblNwZWNzKHtcbiAgICBtYW5pZmVzdCxcbiAgICAvLyBUaGUgZGVmYXVsdCBsaXN0IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSB3aGVuIGEgY2hhbm5lbCBpc1xuICAgIC8vIE1vbWVudGFyaWx5IGFic2VudCBmcm9tIHRoZSBtYW5pZmVzdDsgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgc3BlY2lmaWVyXG4gICAgLy8gVGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWwgZXJyb3IuXG4gICAgc2hvdWxkVG9sZXJhdGVVbnJlc29sdmFibGVTcGVjczogaXNEZWZhdWx0LFxuICAgIHNwZWNzXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgeyByZWFzb24sIHNwZWMgfSBvZiBkcm9wcGVkU3BlY3MpIHtcbiAgICBsb2dNYXRyaXgoYFNraXBwaW5nIFwiJHtzcGVjfVwiOiAke3JlYXNvbn1gKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjcyk7XG4gIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjcywgZW50cmllcyk7XG5cbiAgYXdhaXQgcnVuVmVyc2lvbk1hdHJpeEVudHJpZXMoe1xuICAgIGVudHJpZXMsXG4gICAgb25FbnRyeVN0YXJ0OiAoaGVhZGVyUGFyYW1zKSA9PiB7XG4gICAgICBsb2dNYXRyaXgoZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcihoZWFkZXJQYXJhbXMpKTtcbiAgICB9LFxuICAgIHJ1blxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dzIGEgbWF0cml4IG1lc3NhZ2UgdW5kZXIgYSBjb25zaXN0ZW50IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAqL1xuZnVuY3Rpb24gbG9nTWF0cml4KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBsb2coYFt2ZXJzaW9uLW1hdHJpeF0gJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIExvZ3Mgd2hhdCB0aGUgc3BlY2lmaWVycyByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyB0aGF0IGltcGxpZXMuXG4gKlxuICogQHBhcmFtIHJlc29sdmVkU3BlY3MgLSBUaGUgcmVzb2x2ZWQgc3BlY2lmaWVycywgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXguXG4gKi9cbmZ1bmN0aW9uIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdLCBlbnRyaWVzOiByZWFkb25seSBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbih7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSkpIHtcbiAgICBsb2dNYXRyaXgobGluZSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQSxTQUFTLFdBQVc7QUFDcEIsU0FBUyxvQ0FBb0M7QUFDN0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBRTFCLFFBQU0sRUFBRSxXQUFXLE1BQU0sSUFBSSxzQkFBc0IsUUFBUTtBQUMzRCxRQUFNLFdBQVcsZUFBZSxLQUFLLElBQUksTUFBTSw2QkFBNkIsSUFBSTtBQUNoRixRQUFNLEVBQUUsY0FBYyxjQUFjLElBQUksb0JBQW9CO0FBQUEsSUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLGlDQUFpQztBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsYUFBVyxFQUFFLFFBQVEsS0FBSyxLQUFLLGNBQWM7QUFDM0MsY0FBVSxhQUFhLElBQUksTUFBTSxNQUFNLEVBQUU7QUFBQSxFQUMzQztBQUVBLFFBQU0sVUFBVSxtQkFBbUIsYUFBYTtBQUNoRCxVQUFRLGVBQWUsT0FBTztBQUU5QixRQUFNLHdCQUF3QjtBQUFBLElBQzVCO0FBQUEsSUFDQSxjQUFjLENBQUMsaUJBQWlCO0FBQzlCLGdCQUFVLDZCQUE2QixZQUFZLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQU9BLFNBQVMsVUFBVSxTQUF1QjtBQUN4QyxNQUFJLG9CQUFvQixPQUFPLEVBQUU7QUFDbkM7QUFRQSxTQUFTLFFBQVEsZUFBK0MsU0FBc0Q7QUFDcEgsYUFBVyxRQUFRLHdCQUF3QixFQUFFLFNBQVMsY0FBYyxDQUFDLEdBQUc7QUFDdEUsY0FBVSxJQUFJO0FBQUEsRUFDaEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure verdict + message building for the auto-started-process teardown.
5
+ *
6
+ * The teardown used to log `Auto-started Appium server stopped.` on the
7
+ * **attempt** — printed unconditionally right after the kill was issued, with
8
+ * nothing asserting the process had actually exited. On 2026-09-02 both the
9
+ * server and the emulator were still serving ten minutes after that line was
10
+ * written, and the next run adopted them and died two seconds into its session
11
+ * as they finally finished dying. A log that says the machine is clean when it
12
+ * is not does not merely fail to help — it sends the next reader away from the
13
+ * cause.
14
+ *
15
+ * So a stop is a claim that has to be earned: only {@link resolveTeardownOutcome}
16
+ * may decide one was, and only the `stopped` outcomes are allowed to say so.
17
+ */
18
+ /**
19
+ * Parameters for {@link buildTeardownMessage}.
20
+ */
21
+ export interface BuildTeardownMessageParams {
22
+ /**
23
+ What was checked, as a noun phrase — e.g. `port 4723`, `AVD "obsidian_test" on device emulator-5554`.
24
+ */
25
+ readonly evidence: string;
26
+ /**
27
+ The verdict from {@link resolveTeardownOutcome}.
28
+ */
29
+ readonly outcome: TeardownOutcome;
30
+ /**
31
+ What was being stopped — e.g. `Auto-started Appium server`.
32
+ */
33
+ readonly subject: string;
34
+ /**
35
+ The budget the stop was given, in milliseconds.
36
+ */
37
+ readonly timeoutInMilliseconds: number;
38
+ }
39
+ /**
40
+ * Parameters for {@link resolveTeardownOutcome}.
41
+ */
42
+ export interface ResolveTeardownOutcomeParams {
43
+ /**
44
+ Whether the first kill was followed by a second, harder one.
45
+ */
46
+ readonly hasEscalated: boolean;
47
+ /**
48
+ Whether the process was **observed** to be gone, rather than merely asked to go.
49
+ */
50
+ readonly isStopped: boolean;
51
+ }
52
+ /**
53
+ * What the teardown actually achieved.
54
+ */
55
+ export type TeardownOutcome = 'still-running' | 'stopped-after-escalation' | 'stopped';
56
+ /**
57
+ * Builds the line the teardown logs for an outcome.
58
+ *
59
+ * @param params - The outcome plus what was being stopped and what proved it.
60
+ * @returns The log line.
61
+ */
62
+ export declare function buildTeardownMessage(params: BuildTeardownMessageParams): string;
63
+ /**
64
+ * Decides what the teardown achieved, from what was observed after the kill.
65
+ *
66
+ * @param params - Whether the process is gone, and whether it took an escalation.
67
+ * @returns The outcome.
68
+ */
69
+ export declare function resolveTeardownOutcome(params: ResolveTeardownOutcomeParams): TeardownOutcome;
@@ -0,0 +1,28 @@
1
+ import { assertNever } from "./type-guards.mjs";
2
+ function buildTeardownMessage(params) {
3
+ switch (params.outcome) {
4
+ case "still-running": {
5
+ return `WARNING: ${params.subject} did not exit within ${String(params.timeoutInMilliseconds)}ms and still holds ${params.evidence}; a later run may adopt it. Kill it before the next Android run.`;
6
+ }
7
+ case "stopped": {
8
+ return `${params.subject} stopped (verified: ${params.evidence} released).`;
9
+ }
10
+ case "stopped-after-escalation": {
11
+ return `${params.subject} stopped after escalation (verified: ${params.evidence} released).`;
12
+ }
13
+ default: {
14
+ return assertNever(params.outcome);
15
+ }
16
+ }
17
+ }
18
+ function resolveTeardownOutcome(params) {
19
+ if (!params.isStopped) {
20
+ return "still-running";
21
+ }
22
+ return params.hasEscalated ? "stopped-after-escalation" : "stopped";
23
+ }
24
+ export {
25
+ buildTeardownMessage,
26
+ resolveTeardownOutcome
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlYXJkb3duLXZlcmRpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIHZlcmRpY3QgKyBtZXNzYWdlIGJ1aWxkaW5nIGZvciB0aGUgYXV0by1zdGFydGVkLXByb2Nlc3MgdGVhcmRvd24uXG4gKlxuICogVGhlIHRlYXJkb3duIHVzZWQgdG8gbG9nIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmAgb24gdGhlXG4gKiAqKmF0dGVtcHQqKiBcdTIwMTQgcHJpbnRlZCB1bmNvbmRpdGlvbmFsbHkgcmlnaHQgYWZ0ZXIgdGhlIGtpbGwgd2FzIGlzc3VlZCwgd2l0aFxuICogbm90aGluZyBhc3NlcnRpbmcgdGhlIHByb2Nlc3MgaGFkIGFjdHVhbGx5IGV4aXRlZC4gT24gMjAyNi0wOS0wMiBib3RoIHRoZVxuICogc2VydmVyIGFuZCB0aGUgZW11bGF0b3Igd2VyZSBzdGlsbCBzZXJ2aW5nIHRlbiBtaW51dGVzIGFmdGVyIHRoYXQgbGluZSB3YXNcbiAqIHdyaXR0ZW4sIGFuZCB0aGUgbmV4dCBydW4gYWRvcHRlZCB0aGVtIGFuZCBkaWVkIHR3byBzZWNvbmRzIGludG8gaXRzIHNlc3Npb25cbiAqIGFzIHRoZXkgZmluYWxseSBmaW5pc2hlZCBkeWluZy4gQSBsb2cgdGhhdCBzYXlzIHRoZSBtYWNoaW5lIGlzIGNsZWFuIHdoZW4gaXRcbiAqIGlzIG5vdCBkb2VzIG5vdCBtZXJlbHkgZmFpbCB0byBoZWxwIFx1MjAxNCBpdCBzZW5kcyB0aGUgbmV4dCByZWFkZXIgYXdheSBmcm9tIHRoZVxuICogY2F1c2UuXG4gKlxuICogU28gYSBzdG9wIGlzIGEgY2xhaW0gdGhhdCBoYXMgdG8gYmUgZWFybmVkOiBvbmx5IHtAbGluayByZXNvbHZlVGVhcmRvd25PdXRjb21lfVxuICogbWF5IGRlY2lkZSBvbmUgd2FzLCBhbmQgb25seSB0aGUgYHN0b3BwZWRgIG91dGNvbWVzIGFyZSBhbGxvd2VkIHRvIHNheSBzby5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRUZWFyZG93bk1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkVGVhcmRvd25NZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFdoYXQgd2FzIGNoZWNrZWQsIGFzIGEgbm91biBwaHJhc2UgXHUyMDE0IGUuZy4gYHBvcnQgNDcyM2AsIGBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgb24gZGV2aWNlIGVtdWxhdG9yLTU1NTRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZpZGVuY2U6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHZlcmRpY3QgZnJvbSB7QGxpbmsgcmVzb2x2ZVRlYXJkb3duT3V0Y29tZX0uXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiBUZWFyZG93bk91dGNvbWU7XG5cbiAgLyoqXG4gIFdoYXQgd2FzIGJlaW5nIHN0b3BwZWQgXHUyMDE0IGUuZy4gYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyYC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGJ1ZGdldCB0aGUgc3RvcCB3YXMgZ2l2ZW4sIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlVGVhcmRvd25PdXRjb21lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVGVhcmRvd25PdXRjb21lUGFyYW1zIHtcbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGZpcnN0IGtpbGwgd2FzIGZvbGxvd2VkIGJ5IGEgc2Vjb25kLCBoYXJkZXIgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzRXNjYWxhdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoZSBwcm9jZXNzIHdhcyAqKm9ic2VydmVkKiogdG8gYmUgZ29uZSwgcmF0aGVyIHRoYW4gbWVyZWx5IGFza2VkIHRvIGdvLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTdG9wcGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHRlYXJkb3duIGFjdHVhbGx5IGFjaGlldmVkLlxuICovXG5leHBvcnQgdHlwZSBUZWFyZG93bk91dGNvbWUgPSAnc3RpbGwtcnVubmluZycgfCAnc3RvcHBlZC1hZnRlci1lc2NhbGF0aW9uJyB8ICdzdG9wcGVkJztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGxpbmUgdGhlIHRlYXJkb3duIGxvZ3MgZm9yIGFuIG91dGNvbWUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBvdXRjb21lIHBsdXMgd2hhdCB3YXMgYmVpbmcgc3RvcHBlZCBhbmQgd2hhdCBwcm92ZWQgaXQuXG4gKiBAcmV0dXJucyBUaGUgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRlYXJkb3duTWVzc2FnZShwYXJhbXM6IEJ1aWxkVGVhcmRvd25NZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYXJhbXMub3V0Y29tZSkge1xuICAgIGNhc2UgJ3N0aWxsLXJ1bm5pbmcnOiB7XG4gICAgICByZXR1cm4gYFdBUk5JTkc6ICR7cGFyYW1zLnN1YmplY3R9IGRpZCBub3QgZXhpdCB3aXRoaW4gJHtTdHJpbmcocGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgYW5kIHN0aWxsIGhvbGRzICR7cGFyYW1zLmV2aWRlbmNlfTsgYSBsYXRlciBydW4gbWF5IGFkb3B0IGl0LiBLaWxsIGl0IGJlZm9yZSB0aGUgbmV4dCBBbmRyb2lkIHJ1bi5gO1xuICAgIH1cbiAgICBjYXNlICdzdG9wcGVkJzoge1xuICAgICAgcmV0dXJuIGAke3BhcmFtcy5zdWJqZWN0fSBzdG9wcGVkICh2ZXJpZmllZDogJHtwYXJhbXMuZXZpZGVuY2V9IHJlbGVhc2VkKS5gO1xuICAgIH1cbiAgICBjYXNlICdzdG9wcGVkLWFmdGVyLWVzY2FsYXRpb24nOiB7XG4gICAgICByZXR1cm4gYCR7cGFyYW1zLnN1YmplY3R9IHN0b3BwZWQgYWZ0ZXIgZXNjYWxhdGlvbiAodmVyaWZpZWQ6ICR7cGFyYW1zLmV2aWRlbmNlfSByZWxlYXNlZCkuYDtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKHBhcmFtcy5vdXRjb21lKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoYXQgdGhlIHRlYXJkb3duIGFjaGlldmVkLCBmcm9tIHdoYXQgd2FzIG9ic2VydmVkIGFmdGVyIHRoZSBraWxsLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBXaGV0aGVyIHRoZSBwcm9jZXNzIGlzIGdvbmUsIGFuZCB3aGV0aGVyIGl0IHRvb2sgYW4gZXNjYWxhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRjb21lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlYXJkb3duT3V0Y29tZShwYXJhbXM6IFJlc29sdmVUZWFyZG93bk91dGNvbWVQYXJhbXMpOiBUZWFyZG93bk91dGNvbWUge1xuICBpZiAoIXBhcmFtcy5pc1N0b3BwZWQpIHtcbiAgICByZXR1cm4gJ3N0aWxsLXJ1bm5pbmcnO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5oYXNFc2NhbGF0ZWQgPyAnc3RvcHBlZC1hZnRlci1lc2NhbGF0aW9uJyA6ICdzdG9wcGVkJztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWtCQSxTQUFTLG1CQUFtQjtBQXFEckIsU0FBUyxxQkFBcUIsUUFBNEM7QUFDL0UsVUFBUSxPQUFPLFNBQVM7QUFBQSxJQUN0QixLQUFLLGlCQUFpQjtBQUNwQixhQUFPLFlBQVksT0FBTyxPQUFPLHdCQUF3QixPQUFPLE9BQU8scUJBQXFCLENBQUMsc0JBQXNCLE9BQU8sUUFBUTtBQUFBLElBQ3BJO0FBQUEsSUFDQSxLQUFLLFdBQVc7QUFDZCxhQUFPLEdBQUcsT0FBTyxPQUFPLHVCQUF1QixPQUFPLFFBQVE7QUFBQSxJQUNoRTtBQUFBLElBQ0EsS0FBSyw0QkFBNEI7QUFDL0IsYUFBTyxHQUFHLE9BQU8sT0FBTyx3Q0FBd0MsT0FBTyxRQUFRO0FBQUEsSUFDakY7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLFlBQVksT0FBTyxPQUFPO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLHVCQUF1QixRQUF1RDtBQUM1RixNQUFJLENBQUMsT0FBTyxXQUFXO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLGVBQWUsNkJBQTZCO0FBQzVEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -21,13 +21,32 @@ export type PopulateFileContent = string | Uint8Array | undefined;
21
21
  * All other paths are written as files.
22
22
  */
23
23
  export type PopulateFilesParams = Record<string, PopulateFileContent>;
24
+ /**
25
+ * Options for the {@link TemporaryVault} constructor.
26
+ */
27
+ export interface TemporaryVaultOptions {
28
+ /**
29
+ * Whether {@link TemporaryVault.dispose} removes the vault **directory**.
30
+ *
31
+ * When omitted, defaults to whether this instance created that directory — `true` for a temp
32
+ * directory the constructor made (no `path` argument), `false` for a directory handed to it as an
33
+ * explicit `path`. A handle over somebody else's directory unregisters the vault but leaves the
34
+ * files alone, so wrapping a directory cannot destroy it. Set explicitly to override.
35
+ */
36
+ readonly shouldRemoveDirectoryOnDispose?: boolean;
37
+ }
24
38
  /**
25
39
  * A temporary Obsidian vault for integration tests.
26
40
  *
27
41
  * Creates a temp directory and registers it in the running Obsidian instance
28
42
  * so that the Obsidian CLI can target it via `cwd`.
43
+ *
44
+ * A handle **owns** the directory only when it created it. {@link TemporaryVault.dispose} deletes an
45
+ * owned directory and leaves a borrowed one in place — see
46
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose}, which overrides that default.
29
47
  */
30
48
  export declare class TemporaryVault {
49
+ #private;
31
50
  /**
32
51
  * The absolute path to the temporary vault.
33
52
  */
@@ -36,29 +55,50 @@ export declare class TemporaryVault {
36
55
  * Creates a new temp vault.
37
56
  *
38
57
  * @param path - An explicit vault path. If omitted, a temp directory is created.
58
+ * @param options - Vault options.
39
59
  */
40
- constructor(path?: string);
60
+ constructor(path?: string, options?: TemporaryVaultOptions);
41
61
  /**
42
- * Unregisters the vault from Obsidian and deletes the temp directory.
62
+ * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
63
+ *
64
+ * The directory is removed only when this instance created it, or when
65
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
66
+ * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
67
+ * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
43
68
  *
44
69
  * @param transportOverride - An explicit transport to use when unregistering.
45
70
  * When omitted, falls back to the transport configured via the context provider.
46
71
  */
47
72
  dispose(transportOverride?: ObsidianTransport): Promise<void>;
48
73
  /**
49
- * Writes files and folders into the vault directory.
74
+ * Writes files and folders into the vault directory **on the host**.
50
75
  * Parent directories are created automatically.
51
76
  *
52
77
  * - `string` values are written as UTF-8 text files.
53
78
  * - `Uint8Array` values (including `Buffer`) are written as binary files.
54
79
  * - Paths ending with `/` are treated as empty folders (value must be `undefined`).
55
80
  *
81
+ * The write is always host-local — {@link TemporaryVault.path} is a host path, and on a mobile
82
+ * transport the vault the app opens lives on the device instead. {@link TemporaryVault.register}
83
+ * carries the directory across before it registers, so populate-then-register is all a caller
84
+ * needs; {@link TemporaryVault.syncToDevice} is the seam that does the carrying.
85
+ *
56
86
  * @param files - Map of file/folder paths to content.
57
87
  */
58
88
  populate(files: PopulateFilesParams): void;
59
89
  /**
60
90
  * Registers this vault in the running Obsidian instance so the CLI can target it.
61
91
  *
92
+ * Pushes the vault directory to the target device first, via
93
+ * {@link TemporaryVault.syncToDevice} — a no-op on a transport whose app already reads the host
94
+ * filesystem. That ordering used to be the caller's to remember, and a caller who forgot got a
95
+ * silently **empty** vault rather than an error: every pre-registration
96
+ * {@link TemporaryVault.populate} write stayed on the host while the app opened the device's copy.
97
+ * Folding it in here makes populate-then-register correct on every transport.
98
+ *
99
+ * The transport is resolved once and handed to both steps, so a push and the registration that
100
+ * follows it can never land on two different transports.
101
+ *
62
102
  * @param transportOverride - An explicit transport to use. When omitted,
63
103
  * falls back to the transport configured via the context provider.
64
104
  */
@@ -76,8 +116,10 @@ export declare class TemporaryVault {
76
116
  * On desktop transports this is a no-op (files are already local).
77
117
  * On mobile transports (Appium) this pushes files to the device.
78
118
  *
79
- * Call this after {@link populate} and before {@link register} when using
80
- * a mobile transport.
119
+ * {@link TemporaryVault.register} calls this itself, so a populate-then-register sequence needs
120
+ * nothing extra. Call it directly only to carry across files written **after** registration: the
121
+ * host directory is not mirrored, so a later write into {@link TemporaryVault.path} stays on the
122
+ * host until this runs again.
81
123
  *
82
124
  * @param transportOverride - An explicit transport to use. When omitted,
83
125
  * falls back to the transport configured via the context provider.
@@ -16,6 +16,7 @@ import {
16
16
  } from "node:path";
17
17
  import { getTransportOptions } from "./context-provider.mjs";
18
18
  import { TEMP_VAULT_DIR_PREFIX } from "./leftover-cleanup.mjs";
19
+ import { log } from "./log.mjs";
19
20
  import { getOrCreateTransport } from "./transport-factory.mjs";
20
21
  import {
21
22
  registerVault,
@@ -28,16 +29,27 @@ class TemporaryVault {
28
29
  * The absolute path to the temporary vault.
29
30
  */
30
31
  path;
32
+ /**
33
+ * Whether {@link TemporaryVault.dispose} removes {@link TemporaryVault.path} from disk.
34
+ */
35
+ #shouldRemoveDirectoryOnDispose;
31
36
  /**
32
37
  * Creates a new temp vault.
33
38
  *
34
39
  * @param path - An explicit vault path. If omitted, a temp directory is created.
40
+ * @param options - Vault options.
35
41
  */
36
- constructor(path) {
42
+ constructor(path, options) {
37
43
  this.path = path ?? mkdtempSync(join(tmpdir(), TEMP_VAULT_DIR_PREFIX));
44
+ this.#shouldRemoveDirectoryOnDispose = options?.shouldRemoveDirectoryOnDispose ?? path === void 0;
38
45
  }
39
46
  /**
40
- * Unregisters the vault from Obsidian and deletes the temp directory.
47
+ * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
48
+ *
49
+ * The directory is removed only when this instance created it, or when
50
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
51
+ * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
52
+ * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
41
53
  *
42
54
  * @param transportOverride - An explicit transport to use when unregistering.
43
55
  * When omitted, falls back to the transport configured via the context provider.
@@ -46,17 +58,26 @@ class TemporaryVault {
46
58
  try {
47
59
  await unregisterVault(this.path, transportOverride);
48
60
  } finally {
49
- await retryRm(this.path);
61
+ if (this.#shouldRemoveDirectoryOnDispose) {
62
+ await retryRm(this.path);
63
+ } else {
64
+ log(`[temporary-vault] Unregistered but kept the vault directory, which this handle does not own: ${this.path}`);
65
+ }
50
66
  }
51
67
  }
52
68
  /**
53
- * Writes files and folders into the vault directory.
69
+ * Writes files and folders into the vault directory **on the host**.
54
70
  * Parent directories are created automatically.
55
71
  *
56
72
  * - `string` values are written as UTF-8 text files.
57
73
  * - `Uint8Array` values (including `Buffer`) are written as binary files.
58
74
  * - Paths ending with `/` are treated as empty folders (value must be `undefined`).
59
75
  *
76
+ * The write is always host-local — {@link TemporaryVault.path} is a host path, and on a mobile
77
+ * transport the vault the app opens lives on the device instead. {@link TemporaryVault.register}
78
+ * carries the directory across before it registers, so populate-then-register is all a caller
79
+ * needs; {@link TemporaryVault.syncToDevice} is the seam that does the carrying.
80
+ *
60
81
  * @param files - Map of file/folder paths to content.
61
82
  */
62
83
  populate(files) {
@@ -79,11 +100,23 @@ class TemporaryVault {
79
100
  /**
80
101
  * Registers this vault in the running Obsidian instance so the CLI can target it.
81
102
  *
103
+ * Pushes the vault directory to the target device first, via
104
+ * {@link TemporaryVault.syncToDevice} — a no-op on a transport whose app already reads the host
105
+ * filesystem. That ordering used to be the caller's to remember, and a caller who forgot got a
106
+ * silently **empty** vault rather than an error: every pre-registration
107
+ * {@link TemporaryVault.populate} write stayed on the host while the app opened the device's copy.
108
+ * Folding it in here makes populate-then-register correct on every transport.
109
+ *
110
+ * The transport is resolved once and handed to both steps, so a push and the registration that
111
+ * follows it can never land on two different transports.
112
+ *
82
113
  * @param transportOverride - An explicit transport to use. When omitted,
83
114
  * falls back to the transport configured via the context provider.
84
115
  */
85
116
  async register(transportOverride) {
86
- await registerVault(this.path, transportOverride);
117
+ const transport = transportOverride ?? await getOrCreateTransport(getTransportOptions());
118
+ await this.syncToDevice(transport);
119
+ await registerVault(this.path, transport);
87
120
  }
88
121
  /**
89
122
  * Async disposable support for `await using`.
@@ -101,8 +134,10 @@ class TemporaryVault {
101
134
  * On desktop transports this is a no-op (files are already local).
102
135
  * On mobile transports (Appium) this pushes files to the device.
103
136
  *
104
- * Call this after {@link populate} and before {@link register} when using
105
- * a mobile transport.
137
+ * {@link TemporaryVault.register} calls this itself, so a populate-then-register sequence needs
138
+ * nothing extra. Call it directly only to carry across files written **after** registration: the
139
+ * host directory is not mirrored, so a later write into {@link TemporaryVault.path} stays on the
140
+ * host until this runs again.
106
141
  *
107
142
  * @param transportOverride - An explicit transport to use. When omitted,
108
143
  * falls back to the transport configured via the context provider.
@@ -154,4 +189,4 @@ async function retryRm(path) {
154
189
  export {
155
190
  TemporaryVault
156
191
  };
157
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5pbXBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuXG4vKipcbiAqIENvbnRlbnQgdmFsdWUgZm9yIGEgc2luZ2xlIGVudHJ5IGluIGEge0BsaW5rIFBvcHVsYXRlRmlsZXN9IG1hcC5cbiAqXG4gKiAtIGBzdHJpbmdgIFx1MjAxNCB0ZXh0IGZpbGUgKHdyaXR0ZW4gYXMgVVRGLTgpLlxuICogLSBgVWludDhBcnJheWAgXHUyMDE0IGJpbmFyeSBmaWxlICh3cml0dGVuIGFzIHJhdyBieXRlczsgYEJ1ZmZlcmAgaXMgYWNjZXB0ZWRcbiAqICAgYmVjYXVzZSBgQnVmZmVyIGV4dGVuZHMgVWludDhBcnJheWApLlxuICogLSBgdW5kZWZpbmVkYCBcdTIwMTQgZW1wdHkgZm9sZGVyICh0aGUga2V5ICoqbXVzdCoqIGVuZCB3aXRoIGAvYCkuXG4gKi9cbmV4cG9ydCB0eXBlIFBvcHVsYXRlRmlsZUNvbnRlbnQgPSBzdHJpbmcgfCBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbWFwIG9mIHZhdWx0LXJlbGF0aXZlIHBhdGhzIHRvIHRoZWlyIGNvbnRlbnQsIHVzZWQgYnlcbiAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKlxuICogUGF0aHMgZW5kaW5nIHdpdGggYC9gIGRlbm90ZSBmb2xkZXJzIGFuZCAqKm11c3QqKiBoYXZlIGFuIGB1bmRlZmluZWRgIHZhbHVlLlxuICogQWxsIG90aGVyIHBhdGhzIGFyZSB3cml0dGVuIGFzIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVzUGFyYW1zID0gUmVjb3JkPHN0cmluZywgUG9wdWxhdGVGaWxlQ29udGVudD47XG5cbmNvbnN0IFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEEgdGVtcG9yYXJ5IE9ic2lkaWFuIHZhdWx0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBDcmVhdGVzIGEgdGVtcCBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogc28gdGhhdCB0aGUgT2JzaWRpYW4gQ0xJIGNhbiB0YXJnZXQgaXQgdmlhIGBjd2RgLlxuICovXG5leHBvcnQgY2xhc3MgVGVtcG9yYXJ5VmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBbiBleHBsaWNpdCB2YXVsdCBwYXRoLiBJZiBvbWl0dGVkLCBhIHRlbXAgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aD86IHN0cmluZykge1xuICAgIHRoaXMucGF0aCA9IHBhdGggPz8gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgVEVNUF9WQVVMVF9ESVJfUFJFRklYKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kIGRlbGV0ZXMgdGhlIHRlbXAgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlIHdoZW4gdW5yZWdpc3RlcmluZy5cbiAgICogICBXaGVuIG9taXR0ZWQsIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdW5yZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0T3ZlcnJpZGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBmaWxlcyBhbmQgZm9sZGVycyBpbnRvIHRoZSB2YXVsdCBkaXJlY3RvcnkuXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiAtIGBzdHJpbmdgIHZhbHVlcyBhcmUgd3JpdHRlbiBhcyBVVEYtOCB0ZXh0IGZpbGVzLlxuICAgKiAtIGBVaW50OEFycmF5YCB2YWx1ZXMgKGluY2x1ZGluZyBgQnVmZmVyYCkgYXJlIHdyaXR0ZW4gYXMgYmluYXJ5IGZpbGVzLlxuICAgKiAtIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBhcmUgdHJlYXRlZCBhcyBlbXB0eSBmb2xkZXJzICh2YWx1ZSBtdXN0IGJlIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcG9wdWxhdGUoZmlsZXM6IFBvcHVsYXRlRmlsZXNQYXJhbXMpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZmlsZXMpKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odGhpcy5wYXRoLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb2xkZXIgcGF0aCBcIiR7ZmlsZVBhdGh9XCIgbXVzdCBoYXZlIHVuZGVmaW5lZCBjb250ZW50YCk7XG4gICAgICAgIH1cbiAgICAgICAgbWtkaXJTeW5jKGZ1bGxQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgcGF0aCBcIiR7ZmlsZVBhdGh9XCIgbXVzdCBoYXZlIGRlZmluZWQgY29udGVudDsgdXNlIGEgdHJhaWxpbmcgXCIvXCIgZm9yIGZvbGRlcnNgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoaXMgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2Ugc28gdGhlIENMSSBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlLiBXaGVuIG9taXR0ZWQsXG4gICAqICAgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0T3ZlcnJpZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGRpc3Bvc2FibGUgc3VwcG9ydCBmb3IgYGF3YWl0IHVzaW5nYC5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmF1bHQgaXMgZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgdGhhdCByZXF1aXJlcyBhIHJ1bm5pbmcgdHJhbnNwb3J0LiAqL1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgYWxsIGZpbGVzIGZyb20gdGhlIGxvY2FsIHN0YWdpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlXG4gICAqIHZpYSB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIGBwdXNoRmlsZXMoKWAuXG4gICAqXG4gICAqIE9uIGRlc2t0b3AgdHJhbnNwb3J0cyB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSBhbHJlYWR5IGxvY2FsKS5cbiAgICogT24gbW9iaWxlIHRyYW5zcG9ydHMgKEFwcGl1bSkgdGhpcyBwdXNoZXMgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICogQ2FsbCB0aGlzIGFmdGVyIHtAbGluayBwb3B1bGF0ZX0gYW5kIGJlZm9yZSB7QGxpbmsgcmVnaXN0ZXJ9IHdoZW4gdXNpbmdcbiAgICogYSBtb2JpbGUgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlLiBXaGVuIG9taXR0ZWQsXG4gICAqICAgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bmNUb0RldmljZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcbiAgICBpZiAoIXRyYW5zcG9ydC5wdXNoRmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKHRoaXMucGF0aCk7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnB1c2hGaWxlcyh0aGlzLnBhdGgsIGZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSByZWFkcyBhbGwgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBpbnRvIGEgZmxhdCBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqIEByZXR1cm5zIEEgbWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0RmlsZXMoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHRoaXMucGF0aCwgZnVsbFBhdGgpO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoZnVsbFBhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtyZWxhdGl2ZVBhdGhdID0gYXdhaXQgcmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbn1cblxuLyoqXG4gKiBSZXRyaWVzIGBybWAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGltZXMgb3V0LlxuICogT2JzaWRpYW4gbWF5IGhvbGQgZmlsZSBsb2NrcyBicmllZmx5IGFmdGVyIGEgd2luZG93IGlzIGRlc3Ryb3llZC5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5Um0ocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgUk1fUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbCBhdHRlbXB0IFx1MjAxNCBsZXQgaXQgdGhyb3cuXG4gIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQU1BO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLDRCQUE0QjtBQUNyQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFCUCxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLG1DQUFtQztBQVFsQyxNQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxNQUFlO0FBQ2hDLFNBQUssT0FBTyxRQUFRLFlBQVksS0FBSyxPQUFPLEdBQUcscUJBQXFCLENBQUM7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxRQUFRLG1CQUFzRDtBQUN6RSxRQUFJO0FBQ0YsWUFBTSxnQkFBZ0IsS0FBSyxNQUFNLGlCQUFpQjtBQUFBLElBQ3BELFVBQUU7QUFDQSxZQUFNLFFBQVEsS0FBSyxJQUFJO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLFNBQVMsT0FBa0M7QUFDaEQsZUFBVyxDQUFDLFVBQVUsT0FBTyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDdkQsWUFBTSxXQUFXLEtBQUssS0FBSyxNQUFNLFFBQVE7QUFDekMsVUFBSSxTQUFTLFNBQVMsR0FBRyxHQUFHO0FBQzFCLFlBQUksWUFBWSxRQUFXO0FBQ3pCLGdCQUFNLElBQUksTUFBTSxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFBQSxRQUN6RTtBQUNBLGtCQUFVLFVBQVUsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ3pDLE9BQU87QUFDTCxZQUFJLFlBQVksUUFBVztBQUN6QixnQkFBTSxJQUFJLE1BQU0sY0FBYyxRQUFRLDZEQUE2RDtBQUFBLFFBQ3JHO0FBQ0Esa0JBQVUsUUFBUSxRQUFRLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxzQkFBYyxVQUFVLE9BQU87QUFBQSxNQUNqQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQVMsbUJBQXNEO0FBQzFFLFVBQU0sY0FBYyxLQUFLLE1BQU0saUJBQWlCO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUJBLE1BQWEsYUFBYSxtQkFBc0Q7QUFDOUUsVUFBTSxZQUFZLHFCQUFxQixNQUFNLHFCQUFxQixvQkFBb0IsQ0FBQztBQUN2RixRQUFJLENBQUMsVUFBVSxXQUFXO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxNQUFNLEtBQUssYUFBYSxLQUFLLElBQUk7QUFDL0MsVUFBTSxVQUFVLFVBQVUsS0FBSyxNQUFNLEtBQUs7QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYyxhQUFhLFdBQXdEO0FBQ2pGLFVBQU0sU0FBcUMsQ0FBQztBQUM1QyxVQUFNLFVBQVUsTUFBTSxRQUFRLFdBQVcsRUFBRSxlQUFlLEtBQUssQ0FBQztBQUVoRSxlQUFXLFNBQVMsU0FBUztBQUMzQixZQUFNLFdBQVcsS0FBSyxXQUFXLE1BQU0sSUFBSTtBQUMzQyxZQUFNLGVBQWUsU0FBUyxLQUFLLE1BQU0sUUFBUTtBQUVqRCxVQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLGVBQU8sT0FBTyxRQUFRLE1BQU0sS0FBSyxhQUFhLFFBQVEsQ0FBQztBQUFBLE1BQ3pELE9BQU87QUFDTCxlQUFPLFlBQVksSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUFBLE1BQ2hEO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFFRjtBQVNBLGVBQWUsUUFBUSxNQUE2QjtBQUNsRCxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUk7QUFDRixZQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUMvQztBQUFBLElBQ0YsUUFBUTtBQUNOLFlBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixtQkFBVyxTQUFTLDhCQUE4QjtBQUFBLE1BQ3BELENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLFFBQU0sR0FBRyxNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQ2pEOyIsCiAgIm5hbWVzIjogW10KfQo=
192
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSByZW1vdmVzIHRoZSB2YXVsdCAqKmRpcmVjdG9yeSoqLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBjcmVhdGVkIHRoYXQgZGlyZWN0b3J5IFx1MjAxNCBgdHJ1ZWAgZm9yIGEgdGVtcFxuICAgKiBkaXJlY3RvcnkgdGhlIGNvbnN0cnVjdG9yIG1hZGUgKG5vIGBwYXRoYCBhcmd1bWVudCksIGBmYWxzZWAgZm9yIGEgZGlyZWN0b3J5IGhhbmRlZCB0byBpdCBhcyBhblxuICAgKiBleHBsaWNpdCBgcGF0aGAuIEEgaGFuZGxlIG92ZXIgc29tZWJvZHkgZWxzZSdzIGRpcmVjdG9yeSB1bnJlZ2lzdGVycyB0aGUgdmF1bHQgYnV0IGxlYXZlcyB0aGVcbiAgICogZmlsZXMgYWxvbmUsIHNvIHdyYXBwaW5nIGEgZGlyZWN0b3J5IGNhbm5vdCBkZXN0cm95IGl0LiBTZXQgZXhwbGljaXRseSB0byBvdmVycmlkZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEEgdGVtcG9yYXJ5IE9ic2lkaWFuIHZhdWx0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBDcmVhdGVzIGEgdGVtcCBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogc28gdGhhdCB0aGUgT2JzaWRpYW4gQ0xJIGNhbiB0YXJnZXQgaXQgdmlhIGBjd2RgLlxuICpcbiAqIEEgaGFuZGxlICoqb3ducyoqIHRoZSBkaXJlY3Rvcnkgb25seSB3aGVuIGl0IGNyZWF0ZWQgaXQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSBkZWxldGVzIGFuXG4gKiBvd25lZCBkaXJlY3RvcnkgYW5kIGxlYXZlcyBhIGJvcnJvd2VkIG9uZSBpbiBwbGFjZSBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHRPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0sIHdoaWNoIG92ZXJyaWRlcyB0aGF0IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wb3JhcnlWYXVsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5IHZhdWx0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQuZGlzcG9zZX0gcmVtb3ZlcyB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucGF0aH0gZnJvbSBkaXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0ZW1wIHZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEFuIGV4cGxpY2l0IHZhdWx0IHBhdGguIElmIG9taXR0ZWQsIGEgdGVtcCBkaXJlY3RvcnkgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBWYXVsdCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg/OiBzdHJpbmcsIG9wdGlvbnM/OiBUZW1wb3JhcnlWYXVsdE9wdGlvbnMpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFRFTVBfVkFVTFRfRElSX1BSRUZJWCkpO1xuICAgIHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA/PyBwYXRoID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kLCB3aGVuIHRoaXMgaGFuZGxlIG93bnMgdGhlIGRpcmVjdG9yeSwgZGVsZXRlcyBpdC5cbiAgICpcbiAgICogVGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgaXQsIG9yIHdoZW5cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0T3B0aW9ucy5zaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2V9IHNhaWQgc28gZXhwbGljaXRseS4gVGhhdCBpcyB3aGF0XG4gICAqIG1ha2VzIGEgaGFuZGxlIG92ZXIgYSBkaXJlY3Rvcnkgc29tZWJvZHkgZWxzZSBvd25zIFx1MjAxNCB0aGUgcnVuJ3Mgc2hhcmVkIHNldHVwIHZhdWx0LCBzYXksIHdoaWNoXG4gICAqIGBnZXRUZW1wb3JhcnlWYXVsdCgpYCB3cmFwcyBcdTIwMTQgc2FmZSB0byBkaXNwb3NlIGZyb20gYSBjb25zdW1lcidzIGBhZnRlckFsbGAuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2Ugd2hlbiB1bnJlZ2lzdGVyaW5nLlxuICAgKiAgIFdoZW4gb21pdHRlZCwgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bnJlZ2lzdGVyVmF1bHQodGhpcy5wYXRoLCB0cmFuc3BvcnRPdmVycmlkZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLiNzaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2UpIHtcbiAgICAgICAgYXdhaXQgcmV0cnlSbSh0aGlzLnBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBbdGVtcG9yYXJ5LXZhdWx0XSBVbnJlZ2lzdGVyZWQgYnV0IGtlcHQgdGhlIHZhdWx0IGRpcmVjdG9yeSwgd2hpY2ggdGhpcyBoYW5kbGUgZG9lcyBub3Qgb3duOiAke3RoaXMucGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGZpbGVzIGFuZCBmb2xkZXJzIGludG8gdGhlIHZhdWx0IGRpcmVjdG9yeSAqKm9uIHRoZSBob3N0KiouXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiAtIGBzdHJpbmdgIHZhbHVlcyBhcmUgd3JpdHRlbiBhcyBVVEYtOCB0ZXh0IGZpbGVzLlxuICAgKiAtIGBVaW50OEFycmF5YCB2YWx1ZXMgKGluY2x1ZGluZyBgQnVmZmVyYCkgYXJlIHdyaXR0ZW4gYXMgYmluYXJ5IGZpbGVzLlxuICAgKiAtIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBhcmUgdHJlYXRlZCBhcyBlbXB0eSBmb2xkZXJzICh2YWx1ZSBtdXN0IGJlIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogVGhlIHdyaXRlIGlzIGFsd2F5cyBob3N0LWxvY2FsIFx1MjAxNCB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucGF0aH0gaXMgYSBob3N0IHBhdGgsIGFuZCBvbiBhIG1vYmlsZVxuICAgKiB0cmFuc3BvcnQgdGhlIHZhdWx0IHRoZSBhcHAgb3BlbnMgbGl2ZXMgb24gdGhlIGRldmljZSBpbnN0ZWFkLiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucmVnaXN0ZXJ9XG4gICAqIGNhcnJpZXMgdGhlIGRpcmVjdG9yeSBhY3Jvc3MgYmVmb3JlIGl0IHJlZ2lzdGVycywgc28gcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBpcyBhbGwgYSBjYWxsZXJcbiAgICogbmVlZHM7IHtAbGluayBUZW1wb3JhcnlWYXVsdC5zeW5jVG9EZXZpY2V9IGlzIHRoZSBzZWFtIHRoYXQgZG9lcyB0aGUgY2FycnlpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlcyAtIE1hcCBvZiBmaWxlL2ZvbGRlciBwYXRocyB0byBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHBvcHVsYXRlKGZpbGVzOiBQb3B1bGF0ZUZpbGVzUGFyYW1zKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVzKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKHRoaXMucGF0aCwgZmlsZVBhdGgpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9sZGVyIHBhdGggXCIke2ZpbGVQYXRofVwiIG11c3QgaGF2ZSB1bmRlZmluZWQgY29udGVudGApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHBhdGggXCIke2ZpbGVQYXRofVwiIG11c3QgaGF2ZSBkZWZpbmVkIGNvbnRlbnQ7IHVzZSBhIHRyYWlsaW5nIFwiL1wiIGZvciBmb2xkZXJzYCk7XG4gICAgICAgIH1cbiAgICAgICAgbWtkaXJTeW5jKGRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGlzIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHNvIHRoZSBDTEkgY2FuIHRhcmdldCBpdC5cbiAgICpcbiAgICogUHVzaGVzIHRoZSB2YXVsdCBkaXJlY3RvcnkgdG8gdGhlIHRhcmdldCBkZXZpY2UgZmlyc3QsIHZpYVxuICAgKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQuc3luY1RvRGV2aWNlfSBcdTIwMTQgYSBuby1vcCBvbiBhIHRyYW5zcG9ydCB3aG9zZSBhcHAgYWxyZWFkeSByZWFkcyB0aGUgaG9zdFxuICAgKiBmaWxlc3lzdGVtLiBUaGF0IG9yZGVyaW5nIHVzZWQgdG8gYmUgdGhlIGNhbGxlcidzIHRvIHJlbWVtYmVyLCBhbmQgYSBjYWxsZXIgd2hvIGZvcmdvdCBnb3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5KiogdmF1bHQgcmF0aGVyIHRoYW4gYW4gZXJyb3I6IGV2ZXJ5IHByZS1yZWdpc3RyYXRpb25cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBvcHVsYXRlfSB3cml0ZSBzdGF5ZWQgb24gdGhlIGhvc3Qgd2hpbGUgdGhlIGFwcCBvcGVuZWQgdGhlIGRldmljZSdzIGNvcHkuXG4gICAqIEZvbGRpbmcgaXQgaW4gaGVyZSBtYWtlcyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGNvcnJlY3Qgb24gZXZlcnkgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGlzIHJlc29sdmVkIG9uY2UgYW5kIGhhbmRlZCB0byBib3RoIHN0ZXBzLCBzbyBhIHB1c2ggYW5kIHRoZSByZWdpc3RyYXRpb24gdGhhdFxuICAgKiBmb2xsb3dzIGl0IGNhbiBuZXZlciBsYW5kIG9uIHR3byBkaWZmZXJlbnQgdHJhbnNwb3J0cy5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZS4gV2hlbiBvbWl0dGVkLFxuICAgKiAgIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3Rlcih0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGF3YWl0IHJlZ2lzdGVyVmF1bHQodGhpcy5wYXRoLCB0cmFuc3BvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGRpc3Bvc2FibGUgc3VwcG9ydCBmb3IgYGF3YWl0IHVzaW5nYC5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmF1bHQgaXMgZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgdGhhdCByZXF1aXJlcyBhIHJ1bm5pbmcgdHJhbnNwb3J0LiAqL1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgYWxsIGZpbGVzIGZyb20gdGhlIGxvY2FsIHN0YWdpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlXG4gICAqIHZpYSB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIGBwdXNoRmlsZXMoKWAuXG4gICAqXG4gICAqIE9uIGRlc2t0b3AgdHJhbnNwb3J0cyB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSBhbHJlYWR5IGxvY2FsKS5cbiAgICogT24gbW9iaWxlIHRyYW5zcG9ydHMgKEFwcGl1bSkgdGhpcyBwdXNoZXMgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyfSBjYWxscyB0aGlzIGl0c2VsZiwgc28gYSBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIHNlcXVlbmNlIG5lZWRzXG4gICAqIG5vdGhpbmcgZXh0cmEuIENhbGwgaXQgZGlyZWN0bHkgb25seSB0byBjYXJyeSBhY3Jvc3MgZmlsZXMgd3JpdHRlbiAqKmFmdGVyKiogcmVnaXN0cmF0aW9uOiB0aGVcbiAgICogaG9zdCBkaXJlY3RvcnkgaXMgbm90IG1pcnJvcmVkLCBzbyBhIGxhdGVyIHdyaXRlIGludG8ge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBhdGh9IHN0YXlzIG9uIHRoZVxuICAgKiBob3N0IHVudGlsIHRoaXMgcnVucyBhZ2Fpbi5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZS4gV2hlbiBvbWl0dGVkLFxuICAgKiAgIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jVG9EZXZpY2UodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgaWYgKCF0cmFuc3BvcnQucHVzaEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyh0aGlzLnBhdGgpO1xuICAgIGF3YWl0IHRyYW5zcG9ydC5wdXNoRmlsZXModGhpcy5wYXRoLCBmaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgcmVhZHMgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgaW50byBhIGZsYXQgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZWFkLlxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzIHRvIGNvbnRlbnQgYnVmZmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZSh0aGlzLnBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGZ1bGxQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbcmVsYXRpdmVQYXRoXSA9IGF3YWl0IHJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogUmV0cmllcyBgcm1gIHVudGlsIGl0IHN1Y2NlZWRzIG9yIHRpbWVzIG91dC5cbiAqIE9ic2lkaWFuIG1heSBob2xkIGZpbGUgbG9ja3MgYnJpZWZseSBhZnRlciBhIHdpbmRvdyBpcyBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXRyeVJtKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSTV9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWwgYXR0ZW1wdCBcdTIwMTQgbGV0IGl0IHRocm93LlxuICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBb0NQLE1BQU0saUNBQWlDO0FBQ3ZDLE1BQU0sbUNBQW1DO0FBWWxDLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRRixZQUFZLE1BQWUsU0FBaUM7QUFDakUsU0FBSyxPQUFPLFFBQVEsWUFBWSxLQUFLLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztBQUNyRSxTQUFLLGtDQUFrQyxTQUFTLGtDQUFrQyxTQUFTO0FBQUEsRUFDN0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhQSxNQUFhLFFBQVEsbUJBQXNEO0FBQ3pFLFFBQUk7QUFDRixZQUFNLGdCQUFnQixLQUFLLE1BQU0saUJBQWlCO0FBQUEsSUFDcEQsVUFBRTtBQUNBLFVBQUksS0FBSyxpQ0FBaUM7QUFDeEMsY0FBTSxRQUFRLEtBQUssSUFBSTtBQUFBLE1BQ3pCLE9BQU87QUFDTCxZQUFJLGdHQUFnRyxLQUFLLElBQUksRUFBRTtBQUFBLE1BQ2pIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCTyxTQUFTLE9BQWtDO0FBQ2hELGVBQVcsQ0FBQyxVQUFVLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ3ZELFlBQU0sV0FBVyxLQUFLLEtBQUssTUFBTSxRQUFRO0FBQ3pDLFVBQUksU0FBUyxTQUFTLEdBQUcsR0FBRztBQUMxQixZQUFJLFlBQVksUUFBVztBQUN6QixnQkFBTSxJQUFJLE1BQU0sZ0JBQWdCLFFBQVEsK0JBQStCO0FBQUEsUUFDekU7QUFDQSxrQkFBVSxVQUFVLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxNQUN6QyxPQUFPO0FBQ0wsWUFBSSxZQUFZLFFBQVc7QUFDekIsZ0JBQU0sSUFBSSxNQUFNLGNBQWMsUUFBUSw2REFBNkQ7QUFBQSxRQUNyRztBQUNBLGtCQUFVLFFBQVEsUUFBUSxHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDaEQsc0JBQWMsVUFBVSxPQUFPO0FBQUEsTUFDakM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFrQkEsTUFBYSxTQUFTLG1CQUFzRDtBQUMxRSxVQUFNLFlBQVkscUJBQXFCLE1BQU0scUJBQXFCLG9CQUFvQixDQUFDO0FBQ3ZGLFVBQU0sS0FBSyxhQUFhLFNBQVM7QUFDakMsVUFBTSxjQUFjLEtBQUssTUFBTSxTQUFTO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CQSxNQUFhLGFBQWEsbUJBQXNEO0FBQzlFLFVBQU0sWUFBWSxxQkFBcUIsTUFBTSxxQkFBcUIsb0JBQW9CLENBQUM7QUFDdkYsUUFBSSxDQUFDLFVBQVUsV0FBVztBQUN4QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsTUFBTSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQy9DLFVBQU0sVUFBVSxVQUFVLEtBQUssTUFBTSxLQUFLO0FBQUEsRUFDNUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWMsYUFBYSxXQUF3RDtBQUNqRixVQUFNLFNBQXFDLENBQUM7QUFDNUMsVUFBTSxVQUFVLE1BQU0sUUFBUSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUM7QUFFaEUsZUFBVyxTQUFTLFNBQVM7QUFDM0IsWUFBTSxXQUFXLEtBQUssV0FBVyxNQUFNLElBQUk7QUFDM0MsWUFBTSxlQUFlLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFFakQsVUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixlQUFPLE9BQU8sUUFBUSxNQUFNLEtBQUssYUFBYSxRQUFRLENBQUM7QUFBQSxNQUN6RCxPQUFPO0FBQ0wsZUFBTyxZQUFZLElBQUksTUFBTSxTQUFTLFFBQVE7QUFBQSxNQUNoRDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBRUY7QUFTQSxlQUFlLFFBQVEsTUFBNkI7QUFDbEQsUUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixRQUFJO0FBQ0YsWUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDL0M7QUFBQSxJQUNGLFFBQVE7QUFDTixZQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsbUJBQVcsU0FBUyw4QkFBOEI7QUFBQSxNQUNwRCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUNqRDsiLAogICJuYW1lcyI6IFtdCn0K