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
@@ -20,9 +20,19 @@
20
20
  * The concrete JS runtime versions an installer's Electron shell ships — the
21
21
  * **entire** `process.versions` object, read empirically by booting that
22
22
  * installer over CDP (see `scripts/collect-runtime-versions.ts`). Absent for
23
- * versions not yet collected (or that could not be booted). Electron bundles the
24
- * same runtime on every OS for a given Electron version, so these are
25
- * platform-invariant.
23
+ * versions not yet collected (or that could not be booted).
24
+ *
25
+ * **These are the WINDOWS (`.exe`) values, and that matters.** A given Electron
26
+ * version does bundle the same Node / V8 / Chromium everywhere — but the Electron
27
+ * version itself is a property of the *installer*, not of the release, and two
28
+ * installers of the same Obsidian version can differ: `1.12.4` shipped Electron
29
+ * `39.6.0` in its `.exe` and `39.7.0` in every other installer, and `1.8.10`
30
+ * shipped `34.2.0` vs `34.5.2`. This field carries one flat value, measured on
31
+ * the `.exe` — the installer that, with the `.dmg`, is published for all 106
32
+ * installer-bearing releases. So a consumer pinning a macOS or Linux installer
33
+ * should treat `electron` as accurate to the patch only for the 104 releases
34
+ * where the platforms agree. The collection workflow boots all three platforms
35
+ * and reports any new divergence.
26
36
  *
27
37
  * The index signature carries every key `process.versions` exposes for that
28
38
  * Electron build — beyond the four well-known ones below, that typically includes
@@ -90,8 +100,9 @@ export interface ObsidianVersionChangelogUrls {
90
100
  }
91
101
  /**
92
102
  * The pre-resolved asset download URLs for a version, baked into `metadata.json`
93
- * from the upstream `obsidian-versions.json` catalog (see the `metadata.json`
94
- * section in `CLAUDE.md`).
103
+ * from the `obsidianmd/obsidian-releases` release assets plus, for catalyst
104
+ * builds, the `releases.obsidian.md` CDN, which publishes no listing and so is
105
+ * probed (see the `metadata.json` section in `CLAUDE.md`).
95
106
  *
96
107
  * These are the exact URLs the version's assets are published at, so the
97
108
  * integration-time download paths can skip the GitHub release-API lookup and the
@@ -156,7 +167,7 @@ export interface ObsidianVersionMetadata {
156
167
  readonly channel?: string;
157
168
  /**
158
169
  * The pre-resolved asset download URLs for the version, baked from the
159
- * upstream `obsidian-versions.json` catalog. Absent for versions not present
170
+ * `obsidianmd/obsidian-releases` release assets. Absent for versions not present
160
171
  * in the catalog (the caller then falls back to hand-rolled resolution).
161
172
  */
162
173
  readonly downloads?: ObsidianVersionDownloads;
@@ -33,9 +33,9 @@ var import_node_zlib = require("node:zlib");
33
33
  var import_log = require("./log.cjs");
34
34
  var import_obsidian_metadata = require("./obsidian-metadata.cjs");
35
35
  var import_obsidian_version = require("./obsidian-version.cjs");
36
+ var import_release_catalog = require("./release-catalog.cjs");
36
37
  const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
37
38
  const PUBLIC_ASAR_RELEASE_BASE_URL = "https://github.com/obsidianmd/obsidian-releases/releases/download";
38
- const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
39
39
  const CACHE_ROOT = (0, import_node_path.join)((0, import_node_os.tmpdir)(), "obsidian-integration-testing");
40
40
  const ASAR_CACHE_DIR = (0, import_node_path.join)(CACHE_ROOT, "asar-cache");
41
41
  const ASAR_FILE_PATTERN = /^obsidian-(?<version>\d+\.\d+\.\d+)\.asar$/;
@@ -119,7 +119,7 @@ function getAsarDownloadUrls(version) {
119
119
  const asarGzFileName = `${(0, import_obsidian_version.getVersionAsarFileName)(version)}.gz`;
120
120
  const fallbackUrls = [
121
121
  `${PUBLIC_ASAR_RELEASE_BASE_URL}/v${version}/${asarGzFileName}`,
122
- `${CATALYST_ASAR_RELEASE_BASE_URL}/${asarGzFileName}`
122
+ (0, import_release_catalog.buildCatalystAsarUrl)(version)
123
123
  ];
124
124
  const bakedUrl = (0, import_obsidian_metadata.getVersionMetadata)(version)?.downloads?.asar;
125
125
  return bakedUrl ? [bakedUrl, ...fallbackUrls] : fallbackUrls;
@@ -133,4 +133,4 @@ function getAsarDownloadUrls(version) {
133
133
  getCachedAsarPath,
134
134
  resolveConcreteVersion
135
135
  });
136
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYHgueS56YCB2ZXJzaW9uIHBhcnNlZCBmcm9tIHRoZSBmaWxlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29waWVzIGFuIGFzYXIgZmlsZSBpbnRvIGEgdXNlci1kYXRhIGRpcmVjdG9yeSB1bmRlciBpdHMgY2Fub25pY2FsXG4gKiBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIG5hbWUuXG4gKlxuICogQHBhcmFtIGFzYXJQYXRoIC0gU291cmNlIGFzYXIgcGF0aC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGFzYXIncyB2ZXJzaW9uICh1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lKS5cbiAqIEBwYXJhbSB1c2VyRGF0YURpcmVjdG9yeSAtIERlc3RpbmF0aW9uIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXNhckludG9Vc2VyRGF0YShhc2FyUGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKHVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBqb2luKHVzZXJEYXRhRGlyZWN0b3J5LCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0aW5hdGlvbik7XG4gIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBQcm92aXNpb25lZCAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9IGludG8gJHt1c2VyRGF0YURpcmVjdG9yeX0uYCk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYXNhciBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gdGhlIGxvY2FsIGNhY2hlLFxuICogZG93bmxvYWRpbmcgYW5kIGRlY29tcHJlc3NpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkIGFzYXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFzYXJDYWNoZWQodmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbWtkaXJTeW5jKEFTQVJfQ0FDSEVfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb24pO1xuICBpZiAoZXhpc3RzU3luYyhjYWNoZWRQYXRoKSkge1xuICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBVc2luZyBjYWNoZWQgYXNhciBmb3IgJHt2ZXJzaW9ufS5gKTtcbiAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgfVxuXG4gIC8vIEEgdmVyc2lvbidzIGFzYXIuZ3ogbGl2ZXMgb24gZXhhY3RseSBvbmUgaG9zdCBkZXBlbmRpbmcgb24gaXRzIGNoYW5uZWxcbiAgLy8gKHB1YmxpYyBcdTIxOTIgR2l0SHViIHJlbGVhc2UgYXNzZXRzLCBjYXRhbHlzdCBcdTIxOTIgdGhlIE9ic2lkaWFuIENETikuIFRoZSBjb25jcmV0ZVxuICAvLyBWZXJzaW9uIGFsb25lIGRvZXMgbm90IHRlbGwgdXMgd2hpY2gsIHNvIHRyeSBib3RoIGFuZCB1c2UgdGhlIGZpcnN0IHRoYXRcbiAgLy8gUmV0dXJucyBhIHZhbGlkIGFyY2hpdmUuXG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB1cmwgb2YgZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc2FyID0gYXdhaXQgZG93bmxvYWRBbmREZWNvbXByZXNzQXNhcih1cmwpO1xuICAgICAgd3JpdGVGaWxlU3luYyhjYWNoZWRQYXRoLCBhc2FyKTtcbiAgICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBDYWNoZWQgYXNhciAke3ZlcnNpb259ICgke1N0cmluZyhhc2FyLmxlbmd0aCl9IGJ5dGVzKSAtPiAke2NhY2hlZFBhdGh9YCk7XG4gICAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goYCR7dXJsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgT2JzaWRpYW4gYXNhciAke3ZlcnNpb259LiBBdHRlbXB0czogJHtlcnJvcnMuam9pbignOyAnKX1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbWFuaWZlc3QuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgZmV0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QoKTogUHJvbWlzZTxEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3Q6IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERlc2t0b3BSZWxlYXNlc01hbmlmZXN0O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXdlc3QgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBpbiBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBzY2FuIChlLmcuIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnIGRpcmVjdG9yeSkuXG4gKiBAcmV0dXJucyBUaGUgbmV3ZXN0IGRpc2NvdmVyZWQgYXNhciwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSAvIHRoZSBkaXJlY3RvcnkgaXMgdW5yZWFkYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmROZXdlc3RBc2FyKGRpcmVjdG9yeTogc3RyaW5nKTogRGlzY292ZXJlZEFzYXIgfCB1bmRlZmluZWQge1xuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgbmV3ZXN0OiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBBU0FSX0ZJTEVfUEFUVEVSTi5leGVjKGVudHJ5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbiA9IG1hdGNoLmdyb3Vwcz8uWyd2ZXJzaW9uJ10gPz8gJyc7XG4gICAgaWYgKCFuZXdlc3QgfHwgY29tcGFyZVZlcnNpb25zKHZlcnNpb24sIG5ld2VzdC52ZXJzaW9uKSA+IDApIHtcbiAgICAgIG5ld2VzdCA9IHsgcGF0aDogam9pbihkaXJlY3RvcnksIGVudHJ5KSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3ZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsIGNhY2hlIHBhdGggZm9yIGEgY29uY3JldGUgdmVyc2lvbidzIGFzYXIgKHRoZSBmaWxlIG1heSBub3RcbiAqIHlldCBleGlzdCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRoZSBhc2FyIGlzIGNhY2hlZCBhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKEFTQVJfQ0FDSEVfRElSLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHZlcnNpb24gc3BlY2lmaWVyIChleHBsaWNpdCBvciBjaGFubmVsIGFsaWFzKSB0byBhIGNvbmNyZXRlXG4gKiBgeC55LnpgIHZlcnNpb24sIGZldGNoaW5nIHRoZSBtYW5pZmVzdCBvbmx5IHdoZW4gYSBjaGFubmVsIGFsaWFzIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHNwZWMgLSBUaGUgdmVyc2lvbiBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyBUaGUgY29uY3JldGUgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb25jcmV0ZVZlcnNpb24oc3BlYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpO1xuICByZXR1cm4gcmVzb2x2ZVZlcnNpb25Gcm9tTWFuaWZlc3QobWFuaWZlc3QsIHBhcnNlZC5jaGFubmVsKTtcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgYSBnemlwLWNvbXByZXNzZWQgYXNhciBmcm9tIGEgVVJMIGFuZCBkZWNvbXByZXNzZXMgaXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBgLmFzYXIuZ3pgIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgYXNhciBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMsIHRoZSBib2R5IGlzIGVtcHR5LCBvciBkZWNvbXByZXNzaW9uIGZhaWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIERvd25sb2FkaW5nIGFzYXIgZnJvbSAke3VybH0gLi4uYCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiBET1dOTE9BRF9VU0VSX0FHRU5UIH0gfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGd6ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChnei5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IHJlc3BvbnNlIGJvZHknKTtcbiAgfVxuICByZXR1cm4gZ3VuemlwU3luYyhneik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FuZGlkYXRlIGAuYXNhci5nemAgZG93bmxvYWQgVVJMcyBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uLlxuICpcbiAqIFRoZSB2ZXJzaW9uJ3MgZXhhY3QgVVJMIGJha2VkIGludG8gdGhlIGBtZXRhZGF0YS5qc29uYCBjYXRhbG9nIChmcm9tIHVwc3RyZWFtXG4gKiBgb2JzaWRpYW4tdmVyc2lvbnMuanNvbmApIGlzIHRyaWVkIGZpcnN0IHdoZW4gcHJlc2VudDsgdGhlIGhhbmQtcm9sbGVkIHB1YmxpY1xuICogKEdpdEh1YikgYW5kIGNhdGFseXN0IChDRE4pIGd1ZXNzZXMgZm9sbG93IGFzIGEgZmFsbGJhY2sgZm9yIHZlcnNpb25zIGFic2VudFxuICogZnJvbSB0aGUgY2F0YWxvZyAob3IgYSBzdGFsZSBjYXRhbG9nKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIFVSTHMgdG8gdHJ5LCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzYXJHekZpbGVOYW1lID0gYCR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0uZ3pgO1xuICBjb25zdCBmYWxsYmFja1VybHMgPSBbXG4gICAgYCR7UFVCTElDX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHthc2FyR3pGaWxlTmFtZX1gLFxuICAgIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHthc2FyR3pGaWxlTmFtZX1gXG4gIF07XG5cbiAgY29uc3QgYmFrZWRVcmwgPSBnZXRWZXJzaW9uTWV0YWRhdGEodmVyc2lvbik/LmRvd25sb2Fkcz8uYXNhcjtcbiAgcmV0dXJuIGJha2VkVXJsID8gW2Jha2VkVXJsLCAuLi5mYWxsYmFja1VybHNdIDogZmFsbGJhY2tVcmxzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEscUJBTU87QUFDUCxxQkFBdUI7QUFDdkIsdUJBQXFCO0FBQ3JCLHVCQUEyQjtBQUkzQixpQkFBb0I7QUFDcEIsK0JBQW1DO0FBQ25DLDhCQU1PO0FBT1AsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSwrQkFBK0I7QUFPckMsTUFBTSxpQ0FBaUM7QUFFdkMsTUFBTSxpQkFBYSwyQkFBSyx1QkFBTyxHQUFHLDhCQUE4QjtBQUNoRSxNQUFNLHFCQUFpQix1QkFBSyxZQUFZLFlBQVk7QUFDcEQsTUFBTSxvQkFBb0I7QUF5Qm5CLFNBQVMscUJBQXFCLFVBQWtCLFNBQWlCLG1CQUFpQztBQUN2RyxnQ0FBVSxtQkFBbUIsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxRQUFNLGtCQUFjLHVCQUFLLHVCQUFtQixnREFBdUIsT0FBTyxDQUFDO0FBQzNFLG1DQUFhLFVBQVUsV0FBVztBQUNsQyxzQkFBSSxvQ0FBZ0MsZ0RBQXVCLE9BQU8sQ0FBQyxTQUFTLGlCQUFpQixHQUFHO0FBQ2xHO0FBVUEsZUFBc0IsaUJBQWlCLFNBQWtDO0FBQ3ZFLGdDQUFVLGdCQUFnQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQzdDLFFBQU0sYUFBYSxrQkFBa0IsT0FBTztBQUM1QyxVQUFJLDJCQUFXLFVBQVUsR0FBRztBQUMxQix3QkFBSSwwQ0FBMEMsT0FBTyxHQUFHO0FBQ3hELFdBQU87QUFBQSxFQUNUO0FBTUEsUUFBTSxTQUFtQixDQUFDO0FBQzFCLGFBQVcsT0FBTyxvQkFBb0IsT0FBTyxHQUFHO0FBQzlDLFFBQUk7QUFDRixZQUFNLE9BQU8sTUFBTSwwQkFBMEIsR0FBRztBQUNoRCx3Q0FBYyxZQUFZLElBQUk7QUFDOUIsMEJBQUksZ0NBQWdDLE9BQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxDQUFDLGNBQWMsVUFBVSxFQUFFO0FBQzdGLGFBQU87QUFBQSxJQUNULFNBQVMsT0FBTztBQUNkLGFBQU8sS0FBSyxHQUFHLEdBQUcsS0FBSyxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLElBQ2pGO0FBQUEsRUFDRjtBQUVBLFFBQU0sSUFBSSxNQUFNLG9DQUFvQyxPQUFPLGVBQWUsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQy9GO0FBUUEsZUFBc0IsK0JBQWlFO0FBQ3JGLFFBQU0sV0FBVyxNQUFNLE1BQU0scURBQTZCO0FBQzFELE1BQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsVUFBTSxJQUFJLE1BQU0sbURBQW1ELE9BQU8sU0FBUyxNQUFNLENBQUMsRUFBRTtBQUFBLEVBQzlGO0FBQ0EsU0FBTyxNQUFNLFNBQVMsS0FBSztBQUM3QjtBQVFPLFNBQVMsZUFBZSxXQUErQztBQUM1RSxNQUFJO0FBQ0osTUFBSTtBQUNGLGtCQUFVLDRCQUFZLFNBQVM7QUFBQSxFQUNqQyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osYUFBVyxTQUFTLFNBQVM7QUFDM0IsVUFBTSxRQUFRLGtCQUFrQixLQUFLLEtBQUs7QUFDMUMsUUFBSSxDQUFDLE9BQU87QUFDVjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFVBQVUsTUFBTSxTQUFTLFNBQVMsS0FBSztBQUM3QyxRQUFJLENBQUMsY0FBVSx5Q0FBZ0IsU0FBUyxPQUFPLE9BQU8sSUFBSSxHQUFHO0FBQzNELGVBQVMsRUFBRSxVQUFNLHVCQUFLLFdBQVcsS0FBSyxHQUFHLFFBQVE7QUFBQSxJQUNuRDtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLGtCQUFrQixTQUF5QjtBQUN6RCxhQUFPLHVCQUFLLG9CQUFnQixnREFBdUIsT0FBTyxDQUFDO0FBQzdEO0FBU0EsZUFBc0IsdUJBQXVCLE1BQStCO0FBQzFFLFFBQU0sYUFBUywwQ0FBaUIsSUFBSTtBQUNwQyxNQUFJLE9BQU8sU0FBUyxZQUFZO0FBQzlCLFdBQU8sT0FBTztBQUFBLEVBQ2hCO0FBQ0EsUUFBTSxXQUFXLE1BQU0sNkJBQTZCO0FBQ3BELGFBQU8sb0RBQTJCLFVBQVUsT0FBTyxPQUFPO0FBQzVEO0FBU0EsZUFBZSwwQkFBMEIsS0FBOEI7QUFDckUsc0JBQUksMENBQTBDLEdBQUcsTUFBTTtBQUN2RCxRQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUssRUFBRSxTQUFTLEVBQUUsY0FBYyxvQkFBb0IsRUFBRSxDQUFDO0FBQ3BGLE1BQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsVUFBTSxJQUFJLE1BQU0sUUFBUSxPQUFPLFNBQVMsTUFBTSxDQUFDLEVBQUU7QUFBQSxFQUNuRDtBQUVBLFFBQU0sS0FBSyxPQUFPLEtBQUssTUFBTSxTQUFTLFlBQVksQ0FBQztBQUNuRCxNQUFJLEdBQUcsV0FBVyxHQUFHO0FBQ25CLFVBQU0sSUFBSSxNQUFNLHFCQUFxQjtBQUFBLEVBQ3ZDO0FBQ0EsYUFBTyw2QkFBVyxFQUFFO0FBQ3RCO0FBYUEsU0FBUyxvQkFBb0IsU0FBMkI7QUFDdEQsUUFBTSxpQkFBaUIsT0FBRyxnREFBdUIsT0FBTyxDQUFDO0FBQ3pELFFBQU0sZUFBZTtBQUFBLElBQ25CLEdBQUcsNEJBQTRCLEtBQUssT0FBTyxJQUFJLGNBQWM7QUFBQSxJQUM3RCxHQUFHLDhCQUE4QixJQUFJLGNBQWM7QUFBQSxFQUNyRDtBQUVBLFFBQU0sZUFBVyw2Q0FBbUIsT0FBTyxHQUFHLFdBQVc7QUFDekQsU0FBTyxXQUFXLENBQUMsVUFBVSxHQUFHLFlBQVksSUFBSTtBQUNsRDsiLAogICJuYW1lcyI6IFtdCn0K
136
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLmNqcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLmNqcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24uY2pzJztcbmltcG9ydCB7IGJ1aWxkQ2F0YWx5c3RBc2FyVXJsIH0gZnJvbSAnLi9yZWxlYXNlLWNhdGFsb2cuY2pzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gVGhlIHNhbWUgVUEgdGhlIGNhdGFsb2cgcmVmcmVzaCBzZW5kcyB3aGVuIHByb2JpbmcgdGhlIENETi5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBBU0FSX0NBQ0hFX0RJUiA9IGpvaW4oQ0FDSEVfUk9PVCwgJ2FzYXItY2FjaGUnKTtcbmNvbnN0IEFTQVJfRklMRV9QQVRURVJOID0gL15vYnNpZGlhbi0oPzx2ZXJzaW9uPlxcZCtcXC5cXGQrXFwuXFxkKylcXC5hc2FyJC87XG5cbi8qKlxuICogQSBkaXNjb3ZlcmVkIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgYW4gYXNhciBmaWxlIGludG8gYSB1c2VyLWRhdGEgZGlyZWN0b3J5IHVuZGVyIGl0cyBjYW5vbmljYWxcbiAqIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgbmFtZS5cbiAqXG4gKiBAcGFyYW0gYXNhclBhdGggLSBTb3VyY2UgYXNhciBwYXRoLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgYXNhcidzIHZlcnNpb24gKHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUpLlxuICogQHBhcmFtIHVzZXJEYXRhRGlyZWN0b3J5IC0gRGVzdGluYXRpb24gdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBc2FySW50b1VzZXJEYXRhKGFzYXJQYXRoOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBta2RpclN5bmModXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IGpvaW4odXNlckRhdGFEaXJlY3RvcnksIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xuICBjb3B5RmlsZVN5bmMoYXNhclBhdGgsIGRlc3RpbmF0aW9uKTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyZWN0b3J5fS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyZWN0b3J5KS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpcmVjdG9yeSBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyZWN0b3J5OiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpcmVjdG9yeSwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24uXG4gKlxuICogVGhlIHZlcnNpb24ncyBleGFjdCBVUkwgYmFrZWQgaW50byB0aGUgYG1ldGFkYXRhLmpzb25gIGNhdGFsb2cgKGZyb20gdGhlXG4gKiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AgYXNzZXRzKSBpcyB0cmllZCBmaXJzdCB3aGVuIHByZXNlbnQ7IHRoZSBoYW5kLXJvbGxlZCBwdWJsaWNcbiAqIChHaXRIdWIpIGFuZCBjYXRhbHlzdCAoQ0ROKSBndWVzc2VzIGZvbGxvdyBhcyBhIGZhbGxiYWNrIGZvciB2ZXJzaW9ucyBhYnNlbnRcbiAqIGZyb20gdGhlIGNhdGFsb2cgKG9yIGEgc3RhbGUgY2F0YWxvZykuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBVUkxzIHRvIHRyeSwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEFzYXJEb3dubG9hZFVybHModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhc2FyR3pGaWxlTmFtZSA9IGAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9Lmd6YDtcbiAgY29uc3QgZmFsbGJhY2tVcmxzID0gW1xuICAgIGAke1BVQkxJQ19BU0FSX1JFTEVBU0VfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7YXNhckd6RmlsZU5hbWV9YCxcbiAgICBidWlsZENhdGFseXN0QXNhclVybCh2ZXJzaW9uKVxuICBdO1xuXG4gIGNvbnN0IGJha2VkVXJsID0gZ2V0VmVyc2lvbk1ldGFkYXRhKHZlcnNpb24pPy5kb3dubG9hZHM/LmFzYXI7XG4gIHJldHVybiBiYWtlZFVybCA/IFtiYWtlZFVybCwgLi4uZmFsbGJhY2tVcmxzXSA6IGZhbGxiYWNrVXJscztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLHFCQU1PO0FBQ1AscUJBQXVCO0FBQ3ZCLHVCQUFxQjtBQUNyQix1QkFBMkI7QUFJM0IsaUJBQW9CO0FBQ3BCLCtCQUFtQztBQUNuQyw4QkFNTztBQUNQLDZCQUFxQztBQU9yQyxNQUFNLHNCQUFzQjtBQU01QixNQUFNLCtCQUErQjtBQUVyQyxNQUFNLGlCQUFhLDJCQUFLLHVCQUFPLEdBQUcsOEJBQThCO0FBQ2hFLE1BQU0scUJBQWlCLHVCQUFLLFlBQVksWUFBWTtBQUNwRCxNQUFNLG9CQUFvQjtBQXlCbkIsU0FBUyxxQkFBcUIsVUFBa0IsU0FBaUIsbUJBQWlDO0FBQ3ZHLGdDQUFVLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2hELFFBQU0sa0JBQWMsdUJBQUssdUJBQW1CLGdEQUF1QixPQUFPLENBQUM7QUFDM0UsbUNBQWEsVUFBVSxXQUFXO0FBQ2xDLHNCQUFJLG9DQUFnQyxnREFBdUIsT0FBTyxDQUFDLFNBQVMsaUJBQWlCLEdBQUc7QUFDbEc7QUFVQSxlQUFzQixpQkFBaUIsU0FBa0M7QUFDdkUsZ0NBQVUsZ0JBQWdCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDN0MsUUFBTSxhQUFhLGtCQUFrQixPQUFPO0FBQzVDLFVBQUksMkJBQVcsVUFBVSxHQUFHO0FBQzFCLHdCQUFJLDBDQUEwQyxPQUFPLEdBQUc7QUFDeEQsV0FBTztBQUFBLEVBQ1Q7QUFNQSxRQUFNLFNBQW1CLENBQUM7QUFDMUIsYUFBVyxPQUFPLG9CQUFvQixPQUFPLEdBQUc7QUFDOUMsUUFBSTtBQUNGLFlBQU0sT0FBTyxNQUFNLDBCQUEwQixHQUFHO0FBQ2hELHdDQUFjLFlBQVksSUFBSTtBQUM5QiwwQkFBSSxnQ0FBZ0MsT0FBTyxLQUFLLE9BQU8sS0FBSyxNQUFNLENBQUMsY0FBYyxVQUFVLEVBQUU7QUFDN0YsYUFBTztBQUFBLElBQ1QsU0FBUyxPQUFPO0FBQ2QsYUFBTyxLQUFLLEdBQUcsR0FBRyxLQUFLLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsSUFDakY7QUFBQSxFQUNGO0FBRUEsUUFBTSxJQUFJLE1BQU0sb0NBQW9DLE9BQU8sZUFBZSxPQUFPLEtBQUssSUFBSSxDQUFDLEVBQUU7QUFDL0Y7QUFRQSxlQUFzQiwrQkFBaUU7QUFDckYsUUFBTSxXQUFXLE1BQU0sTUFBTSxxREFBNkI7QUFDMUQsTUFBSSxDQUFDLFNBQVMsSUFBSTtBQUNoQixVQUFNLElBQUksTUFBTSxtREFBbUQsT0FBTyxTQUFTLE1BQU0sQ0FBQyxFQUFFO0FBQUEsRUFDOUY7QUFDQSxTQUFPLE1BQU0sU0FBUyxLQUFLO0FBQzdCO0FBUU8sU0FBUyxlQUFlLFdBQStDO0FBQzVFLE1BQUk7QUFDSixNQUFJO0FBQ0Ysa0JBQVUsNEJBQVksU0FBUztBQUFBLEVBQ2pDLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDSixhQUFXLFNBQVMsU0FBUztBQUMzQixVQUFNLFFBQVEsa0JBQWtCLEtBQUssS0FBSztBQUMxQyxRQUFJLENBQUMsT0FBTztBQUNWO0FBQUEsSUFDRjtBQUNBLFVBQU0sVUFBVSxNQUFNLFNBQVMsU0FBUyxLQUFLO0FBQzdDLFFBQUksQ0FBQyxjQUFVLHlDQUFnQixTQUFTLE9BQU8sT0FBTyxJQUFJLEdBQUc7QUFDM0QsZUFBUyxFQUFFLFVBQU0sdUJBQUssV0FBVyxLQUFLLEdBQUcsUUFBUTtBQUFBLElBQ25EO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQVNPLFNBQVMsa0JBQWtCLFNBQXlCO0FBQ3pELGFBQU8sdUJBQUssb0JBQWdCLGdEQUF1QixPQUFPLENBQUM7QUFDN0Q7QUFTQSxlQUFzQix1QkFBdUIsTUFBK0I7QUFDMUUsUUFBTSxhQUFTLDBDQUFpQixJQUFJO0FBQ3BDLE1BQUksT0FBTyxTQUFTLFlBQVk7QUFDOUIsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFDQSxRQUFNLFdBQVcsTUFBTSw2QkFBNkI7QUFDcEQsYUFBTyxvREFBMkIsVUFBVSxPQUFPLE9BQU87QUFDNUQ7QUFTQSxlQUFlLDBCQUEwQixLQUE4QjtBQUNyRSxzQkFBSSwwQ0FBMEMsR0FBRyxNQUFNO0FBQ3ZELFFBQU0sV0FBVyxNQUFNLE1BQU0sS0FBSyxFQUFFLFNBQVMsRUFBRSxjQUFjLG9CQUFvQixFQUFFLENBQUM7QUFDcEYsTUFBSSxDQUFDLFNBQVMsSUFBSTtBQUNoQixVQUFNLElBQUksTUFBTSxRQUFRLE9BQU8sU0FBUyxNQUFNLENBQUMsRUFBRTtBQUFBLEVBQ25EO0FBRUEsUUFBTSxLQUFLLE9BQU8sS0FBSyxNQUFNLFNBQVMsWUFBWSxDQUFDO0FBQ25ELE1BQUksR0FBRyxXQUFXLEdBQUc7QUFDbkIsVUFBTSxJQUFJLE1BQU0scUJBQXFCO0FBQUEsRUFDdkM7QUFDQSxhQUFPLDZCQUFXLEVBQUU7QUFDdEI7QUFhQSxTQUFTLG9CQUFvQixTQUEyQjtBQUN0RCxRQUFNLGlCQUFpQixPQUFHLGdEQUF1QixPQUFPLENBQUM7QUFDekQsUUFBTSxlQUFlO0FBQUEsSUFDbkIsR0FBRyw0QkFBNEIsS0FBSyxPQUFPLElBQUksY0FBYztBQUFBLFFBQzdELDZDQUFxQixPQUFPO0FBQUEsRUFDOUI7QUFFQSxRQUFNLGVBQVcsNkNBQW1CLE9BQU8sR0FBRyxXQUFXO0FBQ3pELFNBQU8sV0FBVyxDQUFDLFVBQVUsR0FBRyxZQUFZLElBQUk7QUFDbEQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -48,4 +48,4 @@ async function openObsidianSettingsTab(options) {
48
48
  0 && (module.exports = {
49
49
  openObsidianSettingsTab
50
50
  });
51
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5janMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+O1xuXG4vKipcbiAqIE9wZW5zIE9ic2lkaWFuJ3Mgc2V0dGluZ3MgbW9kYWwgb24gYSBnaXZlbiB0YWIgYW5kIHdhaXRzIHVudGlsIHRoYXQgdGFiIGhhc1xuICogYWN0dWFsbHkgcmVuZGVyZWQsIHJlc29sdmluZyB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBmcm9tIHRoZSBjdXJyZW50IHRlc3RcbiAqIGNvbnRleHQuXG4gKlxuICogU2VlIHtAbGluayBMaWIub3BlblNldHRpbmdzVGFifSBmb3Igd2h5IHNpbXBseSBjYWxsaW5nIGBhcHAuc2V0dGluZy5vcGVuKClgXG4gKiByZW5kZXJzIG5vdGhpbmcsIGFuZCB3aHkgdGhlIGNvbnRhaW5lciBtdXN0IGJlIGF0dGFjaGVkICoqYmVmb3JlKiogaXQuXG4gKlxuICogQ2xvc2UgaXQgYWdhaW4gZnJvbSBhIGNhbGxiYWNrIHdpdGggYGFwcC5zZXR0aW5nLmNsb3NlKClgOyByZS1vcGVuaW5nIHdvcmtzLFxuICogYmVjYXVzZSB0aGUgYXR0YWNoIGlzIGlkZW1wb3RlbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgdGFiIHRvIG9wZW4sIGhvdyBsb25nIHRvIHdhaXQsIGFuZCB0cmFuc3BvcnQgLyB2YXVsdFxuICogICBvdmVycmlkZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIG5hbWVzIG9mIHRoZSBzZXR0aW5nIHJvd3MgdGhlIHRhYlxuICogICByZW5kZXJlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdGFiIGNhcnJpZXMge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtcy50YWJJZH0sIG9yIGlmIHRoZVxuICogICB0YWIgZG9lcyBub3QgcmVuZGVyIHdpdGhpbiB0aGUgdGltZW91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5PYnNpZGlhblNldHRpbmdzVGFiKG9wdGlvbnM6IE9wZW5PYnNpZGlhblNldHRpbmdzVGFiT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qge1xuICAgIHRhYklkLFxuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RXZhbEluT2JzaWRpYW5QYXJhbXM8T3BlblNldHRpbmdzVGFiSW5wdXQsIHN0cmluZ1tdPj4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgbGliLCBvcGVuUGFyYW1zIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICByZXR1cm4gYXdhaXQgbGliLm9wZW5TZXR0aW5nc1RhYihvcGVuUGFyYW1zKTtcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBvcGVuUGFyYW1zOiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8T3BlblNldHRpbmdzVGFiUGFyYW1zPih7XG4gICAgICAgIHRhYklkLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgIH0pXG4gICAgfSxcbiAgICB0cmFuc3BvcnQsXG4gICAgdmF1bHRQYXRoXG4gIH0pKTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQkEsOEJBQStCO0FBQy9CLDJDQUE0QztBQTJDNUMsZUFBc0Isd0JBQXdCLFNBQTREO0FBQ3hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosU0FBTyxVQUFNLDRDQUFlLGtFQUFrRjtBQUFBLElBQzVHLE1BQU0sU0FBUyxFQUFFLEtBQUssV0FBVyxHQUFzQjtBQUNyRCxhQUFPLE1BQU0sSUFBSSxnQkFBZ0IsVUFBVTtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxnQkFBWSxrRUFBbUQ7QUFBQSxRQUM3RDtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUMsQ0FBQztBQUNKOyIsCiAgIm5hbWVzIjogW10KfQo=
51
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5janMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+O1xuXG4vKipcbiAqIE9wZW5zIE9ic2lkaWFuJ3Mgc2V0dGluZ3MgbW9kYWwgb24gYSBnaXZlbiB0YWIgYW5kIHdhaXRzIHVudGlsIHRoYXQgdGFiIGhhc1xuICogYWN0dWFsbHkgcmVuZGVyZWQsIHJlc29sdmluZyB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBmcm9tIHRoZSBjdXJyZW50IHRlc3RcbiAqIGNvbnRleHQuXG4gKlxuICogU2VlIHtAbGluayBMaWIub3BlblNldHRpbmdzVGFifSBmb3Igd2h5IGBhcHAuc2V0dGluZy5vcGVuKClgIGNhbiBwdXQgdGhlIG1vZGFsXG4gKiBpbiBhIHNlY29uZCBFbGVjdHJvbiB3aW5kb3csIGFuZCB3aHkgdGhlIGNvbnRhaW5lciBpcyBhdHRhY2hlZCAqKmJlZm9yZSoqIGl0IG9uXG4gKiBhIHZhdWx0IHRoYXQgbGFja3MgdGhlIGhhcm5lc3MncyBgc2V0dGluZ3NQb3BvdXRXaW5kb3c6IGZhbHNlYCBkZWZhdWx0LlxuICpcbiAqIENsb3NlIGl0IGFnYWluIGZyb20gYSBjYWxsYmFjayB3aXRoIGBhcHAuc2V0dGluZy5jbG9zZSgpYDsgcmUtb3BlbmluZyB3b3JrcyxcbiAqIGJlY2F1c2UgdGhlIGF0dGFjaCBpcyBpZGVtcG90ZW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRhYiB0byBvcGVuLCBob3cgbG9uZyB0byB3YWl0LCBhbmQgdHJhbnNwb3J0IC8gdmF1bHRcbiAqICAgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBuYW1lcyBvZiB0aGUgc2V0dGluZyByb3dzIHRoZSB0YWJcbiAqICAgcmVuZGVyZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIHRhYiBjYXJyaWVzIHtAbGluayBPcGVuU2V0dGluZ3NUYWJQYXJhbXMudGFiSWR9LCBvciBpZiB0aGVcbiAqICAgdGFiIGRvZXMgbm90IHJlbmRlciB3aXRoaW4gdGhlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYihvcHRpb25zOiBPcGVuT2JzaWRpYW5TZXR0aW5nc1RhYk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHtcbiAgICB0YWJJZCxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEV2YWxJbk9ic2lkaWFuUGFyYW1zPE9wZW5TZXR0aW5nc1RhYklucHV0LCBzdHJpbmdbXT4+KHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGxpYiwgb3BlblBhcmFtcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IGxpYi5vcGVuU2V0dGluZ3NUYWIob3BlblBhcmFtcyk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgb3BlblBhcmFtczogbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPE9wZW5TZXR0aW5nc1RhYlBhcmFtcz4oe1xuICAgICAgICB0YWJJZCxcbiAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICB9KVxuICAgIH0sXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBc0JBLDhCQUErQjtBQUMvQiwyQ0FBNEM7QUE0QzVDLGVBQXNCLHdCQUF3QixTQUE0RDtBQUN4RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFNBQU8sVUFBTSw0Q0FBZSxrRUFBa0Y7QUFBQSxJQUM1RyxNQUFNLFNBQVMsRUFBRSxLQUFLLFdBQVcsR0FBc0I7QUFDckQsYUFBTyxNQUFNLElBQUksZ0JBQWdCLFVBQVU7QUFBQSxJQUM3QztBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsZ0JBQVksa0VBQW1EO0FBQUEsUUFDN0Q7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDLENBQUM7QUFDSjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -33,8 +33,9 @@ export interface OpenObsidianSettingsTabOptions extends OpenSettingsTabParams {
33
33
  * actually rendered, resolving the transport and vault from the current test
34
34
  * context.
35
35
  *
36
- * See {@link Lib.openSettingsTab} for why simply calling `app.setting.open()`
37
- * renders nothing, and why the container must be attached **before** it.
36
+ * See {@link Lib.openSettingsTab} for why `app.setting.open()` can put the modal
37
+ * in a second Electron window, and why the container is attached **before** it on
38
+ * a vault that lacks the harness's `settingsPopoutWindow: false` default.
38
39
  *
39
40
  * Close it again from a callback with `app.setting.close()`; re-opening works,
40
41
  * because the attach is idempotent.
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var owned_instance_exit_marker_exports = {};
20
+ __export(owned_instance_exit_marker_exports, {
21
+ clearOwnedInstanceExitMarker: () => clearOwnedInstanceExitMarker,
22
+ readOwnedInstanceExitMarker: () => readOwnedInstanceExitMarker,
23
+ writeOwnedInstanceExitMarker: () => writeOwnedInstanceExitMarker
24
+ });
25
+ module.exports = __toCommonJS(owned_instance_exit_marker_exports);
26
+ var import_node_fs = require("node:fs");
27
+ var import_node_os = require("node:os");
28
+ var import_node_path = require("node:path");
29
+ var import_log = require("./log.cjs");
30
+ const MARKER_DIR_NAME = "obsidian-integration-testing";
31
+ const MARKER_FILE_SUFFIX = ".owned-instance-exit.json";
32
+ function clearOwnedInstanceExitMarker(port) {
33
+ try {
34
+ (0, import_node_fs.rmSync)(getMarkerFilePath(port), { force: true });
35
+ } catch (error) {
36
+ (0, import_log.log)(`[owned-instance-exit-marker] Could not remove the marker for port ${String(port)}: ${getErrorMessage(error)}`);
37
+ }
38
+ }
39
+ function readOwnedInstanceExitMarker(port) {
40
+ let parsed;
41
+ try {
42
+ parsed = JSON.parse((0, import_node_fs.readFileSync)(getMarkerFilePath(port), "utf-8"));
43
+ } catch {
44
+ return void 0;
45
+ }
46
+ return parseMarker(parsed, port);
47
+ }
48
+ function writeOwnedInstanceExitMarker(params) {
49
+ const marker = {
50
+ code: params.code,
51
+ exitedAtInMilliseconds: Date.now(),
52
+ outputTail: params.outputTail,
53
+ pid: params.pid,
54
+ port: params.port,
55
+ signal: params.signal,
56
+ ...params.spawnError !== void 0 && { spawnError: params.spawnError }
57
+ };
58
+ try {
59
+ (0, import_node_fs.mkdirSync)(getMarkerDirectory(), { recursive: true });
60
+ (0, import_node_fs.writeFileSync)(getMarkerFilePath(marker.port), JSON.stringify(marker));
61
+ } catch (error) {
62
+ (0, import_log.log)(`[owned-instance-exit-marker] Could not record the exit on port ${String(marker.port)}: ${getErrorMessage(error)}`);
63
+ }
64
+ }
65
+ function getErrorMessage(error) {
66
+ return error instanceof Error ? error.message : String(error);
67
+ }
68
+ function getMarkerDirectory() {
69
+ return (0, import_node_path.join)((0, import_node_os.tmpdir)(), MARKER_DIR_NAME);
70
+ }
71
+ function getMarkerFilePath(port) {
72
+ return (0, import_node_path.join)(getMarkerDirectory(), `${String(port)}${MARKER_FILE_SUFFIX}`);
73
+ }
74
+ function parseMarker(parsed, port) {
75
+ if (typeof parsed !== "object" || parsed === null) {
76
+ return void 0;
77
+ }
78
+ const record = parsed;
79
+ const { code, exitedAtInMilliseconds, outputTail, pid, port: markedPort, signal, spawnError } = record;
80
+ if (typeof exitedAtInMilliseconds !== "number" || markedPort !== port) {
81
+ return void 0;
82
+ }
83
+ return {
84
+ code: typeof code === "number" ? code : null,
85
+ exitedAtInMilliseconds,
86
+ outputTail: typeof outputTail === "string" ? outputTail : "",
87
+ pid: typeof pid === "number" ? pid : void 0,
88
+ port,
89
+ signal: typeof signal === "string" ? signal : null,
90
+ ...typeof spawnError === "string" && { spawnError }
91
+ };
92
+ }
93
+ // Annotate the CommonJS export names for ESM import in node:
94
+ 0 && (module.exports = {
95
+ clearOwnedInstanceExitMarker,
96
+ readOwnedInstanceExitMarker,
97
+ writeOwnedInstanceExitMarker
98
+ });
99
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVjb3JkcyB0aGF0IHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIG9uIGEgQ0RQIHBvcnQgZGllZCwgc28gYVxuICogcHJvY2VzcyB0aGF0IGRpZCBub3Qgc3Bhd24gaXQgY2FuIHN0aWxsIHNheSAqKndoeSoqIGl0IGlzIHVucmVhY2hhYmxlLlxuICpcbiAqIE9ubHkgdGhlIHByb2Nlc3MgdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UgaG9sZHMgdGhlIGNoaWxkIGhhbmRsZSBhbmQgc2Vlc1xuICogYGV4aXRgOyB0aGUgdGVzdCB3b3JrZXJzIGdldCBub3RoaW5nIGJ1dCB0aGUgcG9ydCAoc2VlIHRoZSByZXBvJ3MgTDkpLiBTbyB0aGVcbiAqIG9uZSBmYWN0IHdvcnRoIGhhdmluZyBcdTIwMTQgdGhlIGV4aXQgY29kZSBcdTIwMTQgaGFzIHRvIGNyb3NzIGEgcHJvY2VzcyBib3VuZGFyeSwgYW5kXG4gKiB0aGlzIGlzIHRoZSBjaGFubmVsOiBhIHNtYWxsIEpTT04gc2VudGluZWwgbmV4dCB0byB0aGUgc2V0dXAgbG9ja1xuICogKGBzZXR1cC1sb2NrLnRzYCkgYW5kIHRoZSBBcHBpdW0gc2VydmVyIG1hcmtlciAoYGFwcGl1bS1zZXJ2ZXItbWFya2VyLnRzYCksXG4gKiBrZXllZCBieSBwb3J0LlxuICpcbiAqIFdyaXR0ZW4gKipvbmx5IGZvciBhIGRlYXRoIHRoZSBoYXJuZXNzIGRpZCBub3Qgb3JkZXIuKiogQSBkZWxpYmVyYXRlIGtpbGxcbiAqICh0ZWFyZG93biwgb3IgdGhlIHJlbGF1bmNoIGxvb3Aga2lsbGluZyBhbiBpbnN0YW5jZSBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQpXG4gKiBjbGVhcnMgdGhlIG1hcmtlciBpbnN0ZWFkLCBiZWNhdXNlIGEgbWFya2VyIGxlZnQgYmVoaW5kIGJ5IGEgY2xlYW4gcnVuIHdvdWxkXG4gKiBjb252aWN0IHRoZSBuZXh0IHJ1bidzIGhlYWx0aHkgaW5zdGFuY2Ugb2YgYW4gZXhpdCB0aGF0IG5ldmVyIGhhcHBlbmVkLlxuICpcbiAqIFJlYWRzIGFyZSBkZWxpYmVyYXRlbHkgdG9sZXJhbnQsIGV4YWN0bHkgYXMgdGhlIEFwcGl1bSBtYXJrZXIncyBhcmU6IG1pc3NpbmcsXG4gKiB1bnJlYWRhYmxlLCBvciBkZXNjcmliaW5nIGFub3RoZXIgcG9ydCBhbGwgcmVhZCBhcyBcIm5vIG1hcmtlclwiLCBhbmQgdGhlXG4gKiBjYWxsZXIgZmFsbHMgYmFjayB0byBzYXlpbmcgb25seSB0aGF0IHRoZSBpbnN0YW5jZSBpcyBnb25lLlxuICovXG5cbmltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuXG5jb25zdCBNQVJLRVJfRElSX05BTUUgPSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5jb25zdCBNQVJLRVJfRklMRV9TVUZGSVggPSAnLm93bmVkLWluc3RhbmNlLWV4aXQuanNvbic7XG5cbi8qKlxuICogUmVjb3JkcyB0aGUgZGVhdGggb2YgdGhlIG93bmVkIGluc3RhbmNlIHRoYXQgd2FzIHNlcnZpbmcgQ0RQIG9uIGEgcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB7XG4gIC8qKlxuICBFeGl0IGNvZGUsIG9yIGBudWxsYCB3aGVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3Igd2hlbiBpdCBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICBXaGVuIHRoZSBpbnN0YW5jZSBleGl0ZWQgKGBEYXRlLm5vdygpYCBlcG9jaCBtaWxsaXNlY29uZHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgdGFpbCBvZiBldmVyeXRoaW5nIHRoZSBpbnN0YW5jZSB3cm90ZSB0byBzdGRvdXQvc3RkZXJyIChlbXB0eSB3aGVuIGl0IHdyb3RlIG5vdGhpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0VGFpbDogc3RyaW5nO1xuXG4gIC8qKlxuICBQSUQgb2YgdGhlIGluc3RhbmNlJ3MgcHJvY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZXZlciBnb3Qgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBDRFAgcG9ydCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCBvciBgbnVsbGAgd2hlbiBpdCBleGl0ZWQgbm9ybWFsbHkgb3IgZmFpbGVkIHRvIHNwYXduLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG5cbiAgLyoqXG4gIFRoZSBzcGF3bi1mYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgaW5zdGFuY2UgbmV2ZXIgc3RhcnRlZCAoZS5nLiBgRU5PRU5UYCksIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3cml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyUGFyYW1zIHtcbiAgLyoqXG4gIEV4aXQgY29kZSwgb3IgYG51bGxgIHdoZW4gdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciB3aGVuIGl0IGZhaWxlZCB0byBzcGF3bi5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIGV2ZXJ5dGhpbmcgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRUYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgaW5zdGFuY2UncyBwcm9jZXNzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IG5ldmVyIGdvdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBwaWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIENEUCBwb3J0IHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCB3aGVuIGl0IGV4aXRlZCBub3JtYWxseSBvciBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgVGhlIHNwYXduLWZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBpbnN0YW5jZSBuZXZlciBzdGFydGVkLCBvdGhlcndpc2UgYWJzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc3Bhd25FcnJvcj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBtYXJrZXIgZm9yIGEgcG9ydC4gQ2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gaXQgKGFcbiAqIHJlY3ljbGVkIHBvcnQgbXVzdCBub3QgaW5oZXJpdCBhbiBvbGRlciBpbnN0YW5jZSdzIGRlYXRoKSBhbmQgd2hlbmV2ZXIgdGhlXG4gKiBoYXJuZXNzIGtpbGxzIGFuIGluc3RhbmNlIG9uIHB1cnBvc2UuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJtU3luYyhnZXRNYXJrZXJGaWxlUGF0aChwb3J0KSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtvd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlcl0gQ291bGQgbm90IHJlbW92ZSB0aGUgbWFya2VyIGZvciBwb3J0ICR7U3RyaW5nKHBvcnQpfTogJHtnZXRFcnJvck1lc3NhZ2UoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIG1hcmtlciBmb3IgYSBwb3J0LlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0LlxuICogQHJldHVybnMgVGhlIG1hcmtlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCBkb2VzIG5vdCBkZXNjcmliZSB0aGlzIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydDogbnVtYmVyKTogT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKHBvcnQpLCAndXRmLTgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcGFyc2VNYXJrZXIocGFyc2VkLCBwb3J0KTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoYXQgdGhlIGluc3RhbmNlIHNlcnZpbmcgYSBwb3J0IGhhcyBkaWVkLCBzdGFtcGluZyBpdCB3aXRoIHRoZVxuICogY3VycmVudCB0aW1lIHNvIGEgcmVhZGVyIGNhbiByZXBvcnQgaG93IGxvbmcgYWdvIGl0IGhhcHBlbmVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVhZCBpbnN0YW5jZSdzIHBvcnQsIGV4aXQgZGV0YWlscywgYW5kIG91dHB1dCB0YWlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPd25lZEluc3RhbmNlRXhpdE1hcmtlcihwYXJhbXM6IFdyaXRlT3duZWRJbnN0YW5jZUV4aXRNYXJrZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciA9IHtcbiAgICBjb2RlOiBwYXJhbXMuY29kZSxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpLFxuICAgIG91dHB1dFRhaWw6IHBhcmFtcy5vdXRwdXRUYWlsLFxuICAgIHBpZDogcGFyYW1zLnBpZCxcbiAgICBwb3J0OiBwYXJhbXMucG9ydCxcbiAgICBzaWduYWw6IHBhcmFtcy5zaWduYWwsXG4gICAgLi4uKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQgJiYgeyBzcGF3bkVycm9yOiBwYXJhbXMuc3Bhd25FcnJvciB9KVxuICB9O1xuXG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGdldE1hcmtlckRpcmVjdG9yeSgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKG1hcmtlci5wb3J0KSwgSlNPTi5zdHJpbmdpZnkobWFya2VyKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXJdIENvdWxkIG5vdCByZWNvcmQgdGhlIGV4aXQgb24gcG9ydCAke1N0cmluZyhtYXJrZXIucG9ydCl9OiAke2dldEVycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFya2VyRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHRtcGRpcigpLCBNQVJLRVJfRElSX05BTUUpO1xufVxuXG5mdW5jdGlvbiBnZXRNYXJrZXJGaWxlUGF0aChwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihnZXRNYXJrZXJEaXJlY3RvcnkoKSwgYCR7U3RyaW5nKHBvcnQpfSR7TUFSS0VSX0ZJTEVfU1VGRklYfWApO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1hcmtlcihwYXJzZWQ6IHVua25vd24sIHBvcnQ6IG51bWJlcik6IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHsgY29kZSwgZXhpdGVkQXRJbk1pbGxpc2Vjb25kcywgb3V0cHV0VGFpbCwgcGlkLCBwb3J0OiBtYXJrZWRQb3J0LCBzaWduYWwsIHNwYXduRXJyb3IgfSA9IHJlY29yZDtcblxuICBpZiAodHlwZW9mIGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgIT09ICdudW1iZXInIHx8IG1hcmtlZFBvcnQgIT09IHBvcnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiB0eXBlb2YgY29kZSA9PT0gJ251bWJlcicgPyBjb2RlIDogbnVsbCxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IHR5cGVvZiBvdXRwdXRUYWlsID09PSAnc3RyaW5nJyA/IG91dHB1dFRhaWwgOiAnJyxcbiAgICBwaWQ6IHR5cGVvZiBwaWQgPT09ICdudW1iZXInID8gcGlkIDogdW5kZWZpbmVkLFxuICAgIHBvcnQsXG4gICAgc2lnbmFsOiB0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyA/IHNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscyA6IG51bGwsXG4gICAgLi4uKHR5cGVvZiBzcGF3bkVycm9yID09PSAnc3RyaW5nJyAmJiB7IHNwYXduRXJyb3IgfSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBLHFCQUtPO0FBQ1AscUJBQXVCO0FBQ3ZCLHVCQUFxQjtBQUVyQixpQkFBb0I7QUFFcEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxxQkFBcUI7QUFvRnBCLFNBQVMsNkJBQTZCLE1BQW9CO0FBQy9ELE1BQUk7QUFDRiwrQkFBTyxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxFQUNqRCxTQUFTLE9BQWdCO0FBQ3ZCLHdCQUFJLHFFQUFxRSxPQUFPLElBQUksQ0FBQyxLQUFLLGdCQUFnQixLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3BIO0FBQ0Y7QUFRTyxTQUFTLDRCQUE0QixNQUFtRDtBQUM3RixNQUFJO0FBQ0osTUFBSTtBQUNGLGFBQVMsS0FBSyxVQUFNLDZCQUFhLGtCQUFrQixJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQUEsRUFDcEUsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxZQUFZLFFBQVEsSUFBSTtBQUNqQztBQVFPLFNBQVMsNkJBQTZCLFFBQWtEO0FBQzdGLFFBQU0sU0FBa0M7QUFBQSxJQUN0QyxNQUFNLE9BQU87QUFBQSxJQUNiLHdCQUF3QixLQUFLLElBQUk7QUFBQSxJQUNqQyxZQUFZLE9BQU87QUFBQSxJQUNuQixLQUFLLE9BQU87QUFBQSxJQUNaLE1BQU0sT0FBTztBQUFBLElBQ2IsUUFBUSxPQUFPO0FBQUEsSUFDZixHQUFJLE9BQU8sZUFBZSxVQUFhLEVBQUUsWUFBWSxPQUFPLFdBQVc7QUFBQSxFQUN6RTtBQUVBLE1BQUk7QUFDRixrQ0FBVSxtQkFBbUIsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ25ELHNDQUFjLGtCQUFrQixPQUFPLElBQUksR0FBRyxLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQUEsRUFDdEUsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxrRUFBa0UsT0FBTyxPQUFPLElBQUksQ0FBQyxLQUFLLGdCQUFnQixLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3hIO0FBQ0Y7QUFFQSxTQUFTLGdCQUFnQixPQUF3QjtBQUMvQyxTQUFPLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDOUQ7QUFFQSxTQUFTLHFCQUE2QjtBQUNwQyxhQUFPLDJCQUFLLHVCQUFPLEdBQUcsZUFBZTtBQUN2QztBQUVBLFNBQVMsa0JBQWtCLE1BQXNCO0FBQy9DLGFBQU8sdUJBQUssbUJBQW1CLEdBQUcsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLGtCQUFrQixFQUFFO0FBQzFFO0FBRUEsU0FBUyxZQUFZLFFBQWlCLE1BQW1EO0FBQ3ZGLE1BQUksT0FBTyxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQ2pELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxTQUFTO0FBQ2YsUUFBTSxFQUFFLE1BQU0sd0JBQXdCLFlBQVksS0FBSyxNQUFNLFlBQVksUUFBUSxXQUFXLElBQUk7QUFFaEcsTUFBSSxPQUFPLDJCQUEyQixZQUFZLGVBQWUsTUFBTTtBQUNyRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFBQSxJQUNMLE1BQU0sT0FBTyxTQUFTLFdBQVcsT0FBTztBQUFBLElBQ3hDO0FBQUEsSUFDQSxZQUFZLE9BQU8sZUFBZSxXQUFXLGFBQWE7QUFBQSxJQUMxRCxLQUFLLE9BQU8sUUFBUSxXQUFXLE1BQU07QUFBQSxJQUNyQztBQUFBLElBQ0EsUUFBUSxPQUFPLFdBQVcsV0FBVyxTQUEyQjtBQUFBLElBQ2hFLEdBQUksT0FBTyxlQUFlLFlBQVksRUFBRSxXQUFXO0FBQUEsRUFDckQ7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Records that the harness-owned Obsidian instance on a CDP port died, so a
5
+ * process that did not spawn it can still say **why** it is unreachable.
6
+ *
7
+ * Only the process that launched the instance holds the child handle and sees
8
+ * `exit`; the test workers get nothing but the port (see the repo's L9). So the
9
+ * one fact worth having — the exit code — has to cross a process boundary, and
10
+ * this is the channel: a small JSON sentinel next to the setup lock
11
+ * (`setup-lock.ts`) and the Appium server marker (`appium-server-marker.ts`),
12
+ * keyed by port.
13
+ *
14
+ * Written **only for a death the harness did not order.** A deliberate kill
15
+ * (teardown, or the relaunch loop killing an instance before starting the next)
16
+ * clears the marker instead, because a marker left behind by a clean run would
17
+ * convict the next run's healthy instance of an exit that never happened.
18
+ *
19
+ * Reads are deliberately tolerant, exactly as the Appium marker's are: missing,
20
+ * unreadable, or describing another port all read as "no marker", and the
21
+ * caller falls back to saying only that the instance is gone.
22
+ */
23
+ /**
24
+ * Records the death of the owned instance that was serving CDP on a port.
25
+ */
26
+ export interface OwnedInstanceExitMarker {
27
+ /**
28
+ Exit code, or `null` when terminated by a signal or when it failed to spawn.
29
+ */
30
+ readonly code: null | number;
31
+ /**
32
+ When the instance exited (`Date.now()` epoch milliseconds).
33
+ */
34
+ readonly exitedAtInMilliseconds: number;
35
+ /**
36
+ The tail of everything the instance wrote to stdout/stderr (empty when it wrote nothing).
37
+ */
38
+ readonly outputTail: string;
39
+ /**
40
+ PID of the instance's process, or `undefined` when it never got one.
41
+ */
42
+ readonly pid: number | undefined;
43
+ /**
44
+ The CDP port the dead instance was serving.
45
+ */
46
+ readonly port: number;
47
+ /**
48
+ Terminating signal, or `null` when it exited normally or failed to spawn.
49
+ */
50
+ readonly signal: NodeJS.Signals | null;
51
+ /**
52
+ The spawn-failure message when the instance never started (e.g. `ENOENT`), otherwise absent.
53
+ */
54
+ readonly spawnError?: string | undefined;
55
+ }
56
+ /**
57
+ * Parameters for {@link writeOwnedInstanceExitMarker}.
58
+ */
59
+ export interface WriteOwnedInstanceExitMarkerParams {
60
+ /**
61
+ Exit code, or `null` when terminated by a signal or when it failed to spawn.
62
+ */
63
+ readonly code: null | number;
64
+ /**
65
+ The tail of everything the instance wrote to stdout/stderr.
66
+ */
67
+ readonly outputTail: string;
68
+ /**
69
+ PID of the instance's process, or `undefined` when it never got one.
70
+ */
71
+ readonly pid: number | undefined;
72
+ /**
73
+ The CDP port the dead instance was serving.
74
+ */
75
+ readonly port: number;
76
+ /**
77
+ Terminating signal, or `null` when it exited normally or failed to spawn.
78
+ */
79
+ readonly signal: NodeJS.Signals | null;
80
+ /**
81
+ The spawn-failure message when the instance never started, otherwise absent.
82
+ */
83
+ readonly spawnError?: string | undefined;
84
+ }
85
+ /**
86
+ * Removes the marker for a port. Called when an instance is launched on it (a
87
+ * recycled port must not inherit an older instance's death) and whenever the
88
+ * harness kills an instance on purpose.
89
+ *
90
+ * @param port - The CDP port.
91
+ */
92
+ export declare function clearOwnedInstanceExitMarker(port: number): void;
93
+ /**
94
+ * Reads the marker for a port.
95
+ *
96
+ * @param port - The CDP port.
97
+ * @returns The marker, or `undefined` when there is none, it is unreadable, or it does not describe this port.
98
+ */
99
+ export declare function readOwnedInstanceExitMarker(port: number): OwnedInstanceExitMarker | undefined;
100
+ /**
101
+ * Records that the instance serving a port has died, stamping it with the
102
+ * current time so a reader can report how long ago it happened.
103
+ *
104
+ * @param params - The dead instance's port, exit details, and output tail.
105
+ */
106
+ export declare function writeOwnedInstanceExitMarker(params: WriteOwnedInstanceExitMarkerParams): void;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var owned_instance_exited_error_exports = {};
20
+ __export(owned_instance_exited_error_exports, {
21
+ OwnedInstanceExitedError: () => OwnedInstanceExitedError,
22
+ buildOwnedInstanceExitedErrorFromMarker: () => buildOwnedInstanceExitedErrorFromMarker
23
+ });
24
+ module.exports = __toCommonJS(owned_instance_exited_error_exports);
25
+ var import_process_exit_message = require("./process-exit-message.cjs");
26
+ const MILLISECONDS_PER_SECOND = 1e3;
27
+ class OwnedInstanceExitedError extends Error {
28
+ /**
29
+ The CDP URL the dead instance was serving.
30
+ */
31
+ cdpUrl;
32
+ /**
33
+ Exit code, when known.
34
+ */
35
+ code;
36
+ /**
37
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
38
+ */
39
+ exitedAtInMilliseconds;
40
+ /**
41
+ Terminating signal, when known.
42
+ */
43
+ signal;
44
+ /**
45
+ * Creates the error from whatever is known about the instance's death.
46
+ *
47
+ * @param params - The CDP URL, and the exit details when they are available.
48
+ */
49
+ constructor(params) {
50
+ super(buildMessage(params));
51
+ this.name = "OwnedInstanceExitedError";
52
+ this.cdpUrl = params.cdpUrl;
53
+ this.code = params.code;
54
+ this.exitedAtInMilliseconds = params.exitedAtInMilliseconds;
55
+ this.signal = params.signal;
56
+ }
57
+ }
58
+ function buildOwnedInstanceExitedErrorFromMarker(cdpUrl, marker) {
59
+ if (!marker) {
60
+ return new OwnedInstanceExitedError({ cdpUrl });
61
+ }
62
+ return new OwnedInstanceExitedError({
63
+ cdpUrl,
64
+ code: marker.code,
65
+ exitedAtInMilliseconds: marker.exitedAtInMilliseconds,
66
+ outputTail: marker.outputTail,
67
+ pid: marker.pid,
68
+ signal: marker.signal,
69
+ spawnError: marker.spawnError
70
+ });
71
+ }
72
+ function buildMessage(params) {
73
+ const message = `The harness-owned Obsidian instance at ${params.cdpUrl} is gone: ${describeExit(params)}. Whatever ran after it had no app to talk to, so these failures are not test results \u2014 look for the \`!!! OWNED OBSIDIAN EXITED\` line in the run log for the moment it happened.`;
74
+ return (0, import_process_exit_message.appendProcessOutputTail)(message, { output: params.outputTail ?? "", outputLabel: "Obsidian output" });
75
+ }
76
+ function describeExit(params) {
77
+ if (params.spawnError !== void 0) {
78
+ return `it failed to start (${params.spawnError})`;
79
+ }
80
+ if (params.code === void 0 && params.signal === void 0) {
81
+ return "it exited at some point during this run, and the harness recorded nothing about how (the run that owns it logs the exit code; a worker sees only what the exit marker preserved)";
82
+ }
83
+ return `${describeProcess(params)} ${describeReason(params)}${describeWhen(params.exitedAtInMilliseconds)}`;
84
+ }
85
+ function describeProcess(params) {
86
+ return params.pid === void 0 ? "it" : `its process (pid ${String(params.pid)})`;
87
+ }
88
+ function describeReason(params) {
89
+ if (params.signal !== void 0 && params.signal !== null) {
90
+ return `was terminated by signal ${params.signal}`;
91
+ }
92
+ return params.code === void 0 || params.code === null ? "exited with no exit code" : `exited with code ${String(params.code)}`;
93
+ }
94
+ function describeWhen(exitedAtInMilliseconds) {
95
+ if (exitedAtInMilliseconds === void 0) {
96
+ return "";
97
+ }
98
+ const elapsedInSeconds = Math.max(0, Math.round((Date.now() - exitedAtInMilliseconds) / MILLISECONDS_PER_SECOND));
99
+ return ` ${String(elapsedInSeconds)}s ago, at ${new Date(exitedAtInMilliseconds).toISOString()}`;
100
+ }
101
+ // Annotate the CommonJS export names for ESM import in node:
102
+ 0 && (module.exports = {
103
+ OwnedInstanceExitedError,
104
+ buildOwnedInstanceExitedErrorFromMarker
105
+ });
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiB0aGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBnb25lIFx1MjAxNFxuICogaXQgZXhpdGVkLCBhbmQgdGhlIENEUCBlbmRwb2ludCBpdCB3YXMgc2VydmluZyBhbnN3ZXJzIG5vdGhpbmcuXG4gKlxuICogSXQgZXhpc3RzIHRvIHJlcGxhY2UgYW4gYW5vbnltb3VzIGNhc2NhZGUgd2l0aCBvbmUgbmFtZWQgY2F1c2UuIEJlZm9yZSBpdCxcbiAqIGV2ZXJ5IHRlc3QgZmlsZSBzY2hlZHVsZWQgYWZ0ZXIgYSBtaWQtcnVuIGRlYXRoIGZhaWxlZCBpbiB+NjBcdTIwMTM5MCBtcyB3aXRoXG4gKiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgIHdyYXBwaW5nIGBjb25uZWN0IEVDT05OUkVGVVNFRCAxMjcuMC4wLjE6PHBvcnQ+YCBcdTIwMTRcbiAqIG1lYXN1cmVkIGF0ICoqMTU2IHN1Y2ggZmFpbHVyZXMgYWNyb3NzIDIxIGZpbGVzKiogaW4gYG9ic2lkaWFuLXBhdHRlcm5zYCBvblxuICogMjAyNi0wOS0wNSwgbm90IG9uZSBvZiB0aGVtIGEgdGVzdCByZXN1bHQuIFRoZSBhYnNlbmNlIG9mIGFuIGFwcCBpcyBub3QgYSB0ZXN0XG4gKiBvdXRjb21lLCBhbmQgdGhpcyBlcnJvciBzYXlzIHNvIGluIHRoZSB3b3JkcyBhIHJlYWRlciBuZWVkczogdGhlIGluc3RhbmNlXG4gKiBkaWVkLCBoZXJlIGlzIGl0cyBleGl0IGNvZGUsIGFuZCB0aGVzZSBmYWlsdXJlcyBhcmUgbm90IGFib3V0IHlvdXIgY29kZS5cbiAqXG4gKiBFeHBvcnRlZCBzbyBjYWxsZXJzIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggaXQsIGxpa2UgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYFxuICogYW5kIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5janMnO1xuXG5pbXBvcnQgeyBhcHBlbmRQcm9jZXNzT3V0cHV0VGFpbCB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UuY2pzJztcblxuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBFdmVyeXRoaW5nIGJ1dCB0aGUgVVJMIGlzIG9wdGlvbmFsOiB0aGUgZXhpdCBkZXRhaWxzIGNvbWUgZnJvbSB0aGUgcHJvY2Vzc1xuICogdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UsIGFuZCBhIGNhbGxlciBpbiBhbm90aGVyIHByb2Nlc3MgaGFzIHRoZW0gb25seVxuICogd2hlbiB0aGUgZXhpdCBtYXJrZXIgc3Vydml2ZWQgKHNlZSBgb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIudHNgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlPzogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRlZEF0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIHdoYXQgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIsIHdoZW4gYW55IHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRhaWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgZGVhZCBpbnN0YW5jZSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IHBpZD86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCB3aGVuIGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogTm9kZUpTLlNpZ25hbHMgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgc3Bhd24tZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIGluc3RhbmNlIG5ldmVyIHN0YXJ0ZWQsIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGhhcyBleGl0ZWQgYW5kIGl0cyBDRFBcbiAqIGVuZHBvaW50IGlzIHRoZXJlZm9yZSB1bnJlYWNoYWJsZS4gQ2FycmllcyB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgZGVhdGhcbiAqIFx1MjAxNCBleGl0IGNvZGUsIHNpZ25hbCwgd2hlbiBpdCBoYXBwZW5lZCwgYW5kIHRoZSBvdXRwdXQgdGFpbCBcdTIwMTQgc28gdGhlIGZhaWx1cmVcbiAqIG5hbWVzIGl0cyBvd24gY2F1c2UgaW5zdGVhZCBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFRoZSBDRFAgVVJMIHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRlcm1pbmF0aW5nIHNpZ25hbCwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgaW5zdGFuY2UncyBkZWF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgVVJMLCBhbmQgdGhlIGV4aXQgZGV0YWlscyB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoYnVpbGRNZXNzYWdlKHBhcmFtcykpO1xuICAgIHRoaXMubmFtZSA9ICdPd25lZEluc3RhbmNlRXhpdGVkRXJyb3InO1xuICAgIHRoaXMuY2RwVXJsID0gcGFyYW1zLmNkcFVybDtcbiAgICB0aGlzLmNvZGUgPSBwYXJhbXMuY29kZTtcbiAgICB0aGlzLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMuZXhpdGVkQXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLnNpZ25hbCA9IHBhcmFtcy5zaWduYWw7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIGZyb20gYW4gZXhpdCBtYXJrZXIsIGZvciBhIHByb2Nlc3MgdGhhdCBkaWQgbm90IGxhdW5jaCB0aGVcbiAqIGluc3RhbmNlIGFuZCBzbyBoYXMgbm90aGluZyBlbHNlIHRvIGdvIG9uLlxuICpcbiAqIEEgbWlzc2luZyBtYXJrZXIgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gZXhjZXB0aW9uYWwgXHUyMDE0IGl0IGlzIGNsZWFyZWQgb24gZXZlcnlcbiAqIGRlbGliZXJhdGUga2lsbCwgYW5kIGEgaGFyZCBlbm91Z2gga2lsbCByZWNvcmRzIG5vdGhpbmcgXHUyMDE0IHNvIHRoZSBlcnJvciBpc1xuICogc3RpbGwgYnVpbHQsIG5hbWluZyB0aGUgaW5zdGFuY2Ugd2l0aG91dCBjbGFpbWluZyB0byBrbm93IGhvdyBpdCBkaWVkLlxuICpcbiAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgZXhpdCBtYXJrZXIgcmVhZCBmb3IgaXRzIHBvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdyBpbiBwbGFjZSBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcihjZHBVcmw6IHN0cmluZywgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB8IHVuZGVmaW5lZCk6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB7XG4gIGlmICghbWFya2VyKSB7XG4gICAgcmV0dXJuIG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoeyBjZHBVcmwgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcih7XG4gICAgY2RwVXJsLFxuICAgIGNvZGU6IG1hcmtlci5jb2RlLFxuICAgIGV4aXRlZEF0SW5NaWxsaXNlY29uZHM6IG1hcmtlci5leGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IG1hcmtlci5vdXRwdXRUYWlsLFxuICAgIHBpZDogbWFya2VyLnBpZCxcbiAgICBzaWduYWw6IG1hcmtlci5zaWduYWwsXG4gICAgc3Bhd25FcnJvcjogbWFya2VyLnNwYXduRXJyb3JcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVzc2FnZShwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBUaGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBhdCAke3BhcmFtcy5jZHBVcmx9IGlzIGdvbmU6ICR7ZGVzY3JpYmVFeGl0KHBhcmFtcyl9LiBgXG4gICAgKyAnV2hhdGV2ZXIgcmFuIGFmdGVyIGl0IGhhZCBubyBhcHAgdG8gdGFsayB0bywgc28gdGhlc2UgZmFpbHVyZXMgYXJlIG5vdCB0ZXN0IHJlc3VsdHMgXHUyMDE0ICdcbiAgICArICdsb29rIGZvciB0aGUgYCEhISBPV05FRCBPQlNJRElBTiBFWElURURgIGxpbmUgaW4gdGhlIHJ1biBsb2cgZm9yIHRoZSBtb21lbnQgaXQgaGFwcGVuZWQuJztcblxuICByZXR1cm4gYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwobWVzc2FnZSwgeyBvdXRwdXQ6IHBhcmFtcy5vdXRwdXRUYWlsID8/ICcnLCBvdXRwdXRMYWJlbDogJ09ic2lkaWFuIG91dHB1dCcgfSk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdChwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgaWYgKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYGl0IGZhaWxlZCB0byBzdGFydCAoJHtwYXJhbXMuc3Bhd25FcnJvcn0pYDtcbiAgfVxuXG4gIGlmIChwYXJhbXMuY29kZSA9PT0gdW5kZWZpbmVkICYmIHBhcmFtcy5zaWduYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnaXQgZXhpdGVkIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoaXMgcnVuLCBhbmQgdGhlIGhhcm5lc3MgcmVjb3JkZWQgbm90aGluZyBhYm91dCBob3cgJ1xuICAgICAgKyAnKHRoZSBydW4gdGhhdCBvd25zIGl0IGxvZ3MgdGhlIGV4aXQgY29kZTsgYSB3b3JrZXIgc2VlcyBvbmx5IHdoYXQgdGhlIGV4aXQgbWFya2VyIHByZXNlcnZlZCknO1xuICB9XG5cbiAgcmV0dXJuIGAke2Rlc2NyaWJlUHJvY2VzcyhwYXJhbXMpfSAke2Rlc2NyaWJlUmVhc29uKHBhcmFtcyl9JHtkZXNjcmliZVdoZW4ocGFyYW1zLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMpfWA7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUHJvY2VzcyhwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtcy5waWQgPT09IHVuZGVmaW5lZCA/ICdpdCcgOiBgaXRzIHByb2Nlc3MgKHBpZCAke1N0cmluZyhwYXJhbXMucGlkKX0pYDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24ocGFyYW1zOiBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyk6IHN0cmluZyB7XG4gIGlmIChwYXJhbXMuc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnNpZ25hbCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7cGFyYW1zLnNpZ25hbH1gO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5jb2RlID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvZGUgPT09IG51bGwgPyAnZXhpdGVkIHdpdGggbm8gZXhpdCBjb2RlJyA6IGBleGl0ZWQgd2l0aCBjb2RlICR7U3RyaW5nKHBhcmFtcy5jb2RlKX1gO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdoZW4oZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGVsYXBzZWRJblNlY29uZHMgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gZXhpdGVkQXRJbk1pbGxpc2Vjb25kcykgLyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCkpO1xuICByZXR1cm4gYCAke1N0cmluZyhlbGFwc2VkSW5TZWNvbmRzKX1zIGFnbywgYXQgJHtuZXcgRGF0ZShleGl0ZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfWA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkEsa0NBQXdDO0FBRXhDLE1BQU0sMEJBQTBCO0FBb0R6QixNQUFNLGlDQUFpQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQW1EO0FBQ3BFLFVBQU0sYUFBYSxNQUFNLENBQUM7QUFDMUIsU0FBSyxPQUFPO0FBQ1osU0FBSyxTQUFTLE9BQU87QUFDckIsU0FBSyxPQUFPLE9BQU87QUFDbkIsU0FBSyx5QkFBeUIsT0FBTztBQUNyQyxTQUFLLFNBQVMsT0FBTztBQUFBLEVBQ3ZCO0FBQ0Y7QUFjTyxTQUFTLHdDQUF3QyxRQUFnQixRQUF1RTtBQUM3SSxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU8sSUFBSSx5QkFBeUIsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUNoRDtBQUVBLFNBQU8sSUFBSSx5QkFBeUI7QUFBQSxJQUNsQztBQUFBLElBQ0EsTUFBTSxPQUFPO0FBQUEsSUFDYix3QkFBd0IsT0FBTztBQUFBLElBQy9CLFlBQVksT0FBTztBQUFBLElBQ25CLEtBQUssT0FBTztBQUFBLElBQ1osUUFBUSxPQUFPO0FBQUEsSUFDZixZQUFZLE9BQU87QUFBQSxFQUNyQixDQUFDO0FBQ0g7QUFFQSxTQUFTLGFBQWEsUUFBMkQ7QUFDL0UsUUFBTSxVQUFVLDBDQUEwQyxPQUFPLE1BQU0sYUFBYSxhQUFhLE1BQU0sQ0FBQztBQUl4RyxhQUFPLHFEQUF3QixTQUFTLEVBQUUsUUFBUSxPQUFPLGNBQWMsSUFBSSxhQUFhLGtCQUFrQixDQUFDO0FBQzdHO0FBRUEsU0FBUyxhQUFhLFFBQTJEO0FBQy9FLE1BQUksT0FBTyxlQUFlLFFBQVc7QUFDbkMsV0FBTyx1QkFBdUIsT0FBTyxVQUFVO0FBQUEsRUFDakQ7QUFFQSxNQUFJLE9BQU8sU0FBUyxVQUFhLE9BQU8sV0FBVyxRQUFXO0FBQzVELFdBQU87QUFBQSxFQUVUO0FBRUEsU0FBTyxHQUFHLGdCQUFnQixNQUFNLENBQUMsSUFBSSxlQUFlLE1BQU0sQ0FBQyxHQUFHLGFBQWEsT0FBTyxzQkFBc0IsQ0FBQztBQUMzRztBQUVBLFNBQVMsZ0JBQWdCLFFBQTJEO0FBQ2xGLFNBQU8sT0FBTyxRQUFRLFNBQVksT0FBTyxvQkFBb0IsT0FBTyxPQUFPLEdBQUcsQ0FBQztBQUNqRjtBQUVBLFNBQVMsZUFBZSxRQUEyRDtBQUNqRixNQUFJLE9BQU8sV0FBVyxVQUFhLE9BQU8sV0FBVyxNQUFNO0FBQ3pELFdBQU8sNEJBQTRCLE9BQU8sTUFBTTtBQUFBLEVBQ2xEO0FBRUEsU0FBTyxPQUFPLFNBQVMsVUFBYSxPQUFPLFNBQVMsT0FBTyw2QkFBNkIsb0JBQW9CLE9BQU8sT0FBTyxJQUFJLENBQUM7QUFDakk7QUFFQSxTQUFTLGFBQWEsd0JBQW9EO0FBQ3hFLE1BQUksMkJBQTJCLFFBQVc7QUFDeEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sS0FBSyxJQUFJLElBQUksMEJBQTBCLHVCQUF1QixDQUFDO0FBQ2hILFNBQU8sSUFBSSxPQUFPLGdCQUFnQixDQUFDLGFBQWEsSUFBSSxLQUFLLHNCQUFzQixFQUFFLFlBQVksQ0FBQztBQUNoRzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when the harness-owned Obsidian instance is gone —
5
+ * it exited, and the CDP endpoint it was serving answers nothing.
6
+ *
7
+ * It exists to replace an anonymous cascade with one named cause. Before it,
8
+ * every test file scheduled after a mid-run death failed in ~60–90 ms with
9
+ * `TypeError: fetch failed` wrapping `connect ECONNREFUSED 127.0.0.1:<port>` —
10
+ * measured at **156 such failures across 21 files** in `obsidian-patterns` on
11
+ * 2026-09-05, not one of them a test result. The absence of an app is not a test
12
+ * outcome, and this error says so in the words a reader needs: the instance
13
+ * died, here is its exit code, and these failures are not about your code.
14
+ *
15
+ * Exported so callers can `instanceof`-match it, like `SilentAsarFallbackError`
16
+ * and `RendererFailedToInitializeError`.
17
+ */
18
+ import type { OwnedInstanceExitMarker } from './owned-instance-exit-marker.cjs';
19
+ /**
20
+ * Parameters for the {@link OwnedInstanceExitedError} constructor.
21
+ *
22
+ * Everything but the URL is optional: the exit details come from the process
23
+ * that launched the instance, and a caller in another process has them only
24
+ * when the exit marker survived (see `owned-instance-exit-marker.ts`).
25
+ */
26
+ export interface OwnedInstanceExitedErrorConstructorParams {
27
+ /**
28
+ The CDP URL the dead instance was serving.
29
+ */
30
+ readonly cdpUrl: string;
31
+ /**
32
+ Exit code, when known.
33
+ */
34
+ readonly code?: null | number | undefined;
35
+ /**
36
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
37
+ */
38
+ readonly exitedAtInMilliseconds?: number | undefined;
39
+ /**
40
+ The tail of what the instance wrote to stdout/stderr, when any was captured.
41
+ */
42
+ readonly outputTail?: string | undefined;
43
+ /**
44
+ PID of the dead instance, when known.
45
+ */
46
+ readonly pid?: number | undefined;
47
+ /**
48
+ Terminating signal, when known.
49
+ */
50
+ readonly signal?: NodeJS.Signals | null | undefined;
51
+ /**
52
+ The spawn-failure message when the instance never started, otherwise absent.
53
+ */
54
+ readonly spawnError?: string | undefined;
55
+ }
56
+ /**
57
+ * Thrown when the harness-owned Obsidian instance has exited and its CDP
58
+ * endpoint is therefore unreachable. Carries whatever is known about the death
59
+ * — exit code, signal, when it happened, and the output tail — so the failure
60
+ * names its own cause instead of a refused connection.
61
+ */
62
+ export declare class OwnedInstanceExitedError extends Error {
63
+ /**
64
+ The CDP URL the dead instance was serving.
65
+ */
66
+ readonly cdpUrl: string;
67
+ /**
68
+ Exit code, when known.
69
+ */
70
+ readonly code: null | number | undefined;
71
+ /**
72
+ When the instance exited (`Date.now()` epoch milliseconds), when known.
73
+ */
74
+ readonly exitedAtInMilliseconds: number | undefined;
75
+ /**
76
+ Terminating signal, when known.
77
+ */
78
+ readonly signal: NodeJS.Signals | null | undefined;
79
+ /**
80
+ * Creates the error from whatever is known about the instance's death.
81
+ *
82
+ * @param params - The CDP URL, and the exit details when they are available.
83
+ */
84
+ constructor(params: OwnedInstanceExitedErrorConstructorParams);
85
+ }
86
+ /**
87
+ * Builds the error from an exit marker, for a process that did not launch the
88
+ * instance and so has nothing else to go on.
89
+ *
90
+ * A missing marker is expected rather than exceptional — it is cleared on every
91
+ * deliberate kill, and a hard enough kill records nothing — so the error is
92
+ * still built, naming the instance without claiming to know how it died.
93
+ *
94
+ * @param cdpUrl - The CDP URL the dead instance was serving.
95
+ * @param marker - The exit marker read for its port, or `undefined` when there is none.
96
+ * @returns The error to throw in place of a refused connection.
97
+ */
98
+ export declare function buildOwnedInstanceExitedErrorFromMarker(cdpUrl: string, marker: OwnedInstanceExitMarker | undefined): OwnedInstanceExitedError;