@mnaoumov/obsidian-lib 10.12.0 → 11.0.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 (399) hide show
  1. package/components/worker-component/package.json +6 -0
  2. package/components/worker-pool-component/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +409 -292
  4. package/dist/lib/cjs/__merged.d.cts +17 -8
  5. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  6. package/dist/lib/cjs/app.cjs +2 -2
  7. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  8. package/dist/lib/cjs/attachment-path.cjs +9 -9
  9. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  10. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  11. package/dist/lib/cjs/backlink-index.cjs +5 -5
  12. package/dist/lib/cjs/backlink.cjs +7 -7
  13. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  14. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  15. package/dist/lib/cjs/bug-report.cjs +3 -3
  16. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  17. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  18. package/dist/lib/cjs/callout.cjs +6 -6
  19. package/dist/lib/cjs/canvas.cjs +11 -9
  20. package/dist/lib/cjs/canvas.d.cts +13 -0
  21. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  22. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  23. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  24. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  25. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  26. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  27. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  28. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  29. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  30. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  31. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  32. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  33. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  34. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  35. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  36. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  37. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  38. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  39. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +6 -6
  40. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  41. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  42. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  43. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  44. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  46. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  47. package/dist/lib/cjs/community-plugins.cjs +3 -3
  48. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  49. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  50. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +3 -3
  51. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  52. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  53. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  54. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  55. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  56. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  57. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  58. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  59. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  60. package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -1
  61. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +8 -8
  62. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  63. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  64. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  65. package/dist/lib/cjs/components/index.cjs +46 -40
  66. package/dist/lib/cjs/components/index.d.cts +2 -0
  67. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  68. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  69. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  70. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  71. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  72. package/dist/lib/cjs/components/plugin-gate-component.cjs +68 -28
  73. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  74. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  75. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  76. package/dist/lib/cjs/components/plugin-settings-component.cjs +113 -17
  77. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  78. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  79. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  80. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  81. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  82. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  83. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  84. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  85. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  86. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  87. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  88. package/dist/lib/cjs/components/shared-component-pool-component.cjs +6 -6
  89. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  90. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  91. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  92. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  93. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  94. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  95. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  96. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +7 -7
  97. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  98. package/dist/lib/cjs/constructors/index.cjs +1 -1
  99. package/dist/lib/cjs/data-handler.cjs +111 -4
  100. package/dist/lib/cjs/data-handler.d.cts +92 -1
  101. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  102. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  103. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  104. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  105. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  106. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  107. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  108. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  109. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  110. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  111. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  112. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  113. package/dist/lib/cjs/dataview-link.cjs +2 -2
  114. package/dist/lib/cjs/dataview.cjs +27 -7
  115. package/dist/lib/cjs/dataview.d.cts +14 -0
  116. package/dist/lib/cjs/debug.cjs +3 -3
  117. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  118. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  119. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  120. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  121. package/dist/lib/cjs/desktop-git-runner.cjs +2 -2
  122. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  123. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  124. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  125. package/dist/lib/cjs/disposable.cjs +150 -0
  126. package/dist/lib/cjs/disposable.d.cts +39 -0
  127. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  128. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  129. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  130. package/dist/lib/cjs/editor.cjs +6 -6
  131. package/dist/lib/cjs/events.cjs +2 -2
  132. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  133. package/dist/lib/cjs/feature-request.cjs +1 -1
  134. package/dist/lib/cjs/file-change.cjs +10 -10
  135. package/dist/lib/cjs/file-explorer.cjs +2 -2
  136. package/dist/lib/cjs/file-manager.cjs +5 -5
  137. package/dist/lib/cjs/file-system.cjs +10 -10
  138. package/dist/lib/cjs/folder-note.cjs +4 -4
  139. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  140. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  141. package/dist/lib/cjs/frontmatter.cjs +5 -5
  142. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  143. package/dist/lib/cjs/hotkey.cjs +1 -1
  144. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  145. package/dist/lib/cjs/html-element.cjs +2 -2
  146. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  147. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  148. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  149. package/dist/lib/cjs/i18n/index.cjs +4 -4
  150. package/dist/lib/cjs/i18n/locales/en.cjs +5 -1
  151. package/dist/lib/cjs/i18n/locales/en.d.cts +4 -0
  152. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  153. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  154. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -0
  155. package/dist/lib/cjs/index.cjs +145 -127
  156. package/dist/lib/cjs/index.d.cts +6 -0
  157. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  158. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  159. package/dist/lib/cjs/library-styles.cjs +3 -3
  160. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  161. package/dist/lib/cjs/link.cjs +76 -56
  162. package/dist/lib/cjs/link.d.cts +20 -14
  163. package/dist/lib/cjs/logger.cjs +4 -4
  164. package/dist/lib/cjs/loop.cjs +10 -16
  165. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  166. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  167. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  168. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  169. package/dist/lib/cjs/markdown-view.cjs +3 -3
  170. package/dist/lib/cjs/markdown.cjs +12 -12
  171. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  172. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  173. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  174. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  175. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  176. package/dist/lib/cjs/modals/alert.cjs +4 -4
  177. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  178. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  179. package/dist/lib/cjs/modals/copy-text-manually.cjs +4 -4
  180. package/dist/lib/cjs/modals/index.cjs +12 -12
  181. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  182. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  183. package/dist/lib/cjs/modals/modal.cjs +3 -3
  184. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  185. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  186. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +5 -5
  187. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  188. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  189. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  190. package/dist/lib/cjs/note-priority.cjs +2 -2
  191. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  192. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  193. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  194. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  195. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  196. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  197. package/dist/lib/cjs/parse-link.cjs +14 -14
  198. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  199. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  200. package/dist/lib/cjs/path-settings.cjs +3 -3
  201. package/dist/lib/cjs/pdf.cjs +2 -2
  202. package/dist/lib/cjs/plugin/index.cjs +16 -13
  203. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  204. package/dist/lib/cjs/plugin/plugin-api.cjs +8 -8
  205. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  206. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  207. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  208. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  209. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  210. package/dist/lib/cjs/plugin/plugin-install-state.cjs +4 -4
  211. package/dist/lib/cjs/plugin/plugin-instance.cjs +14 -12
  212. package/dist/lib/cjs/plugin/plugin-instance.d.cts +7 -0
  213. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  214. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  215. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  216. package/dist/lib/cjs/plugin/plugin.cjs +118 -34
  217. package/dist/lib/cjs/plugin/plugin.d.cts +28 -5
  218. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  219. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  220. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  221. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  222. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  223. package/dist/lib/cjs/popovers/index.cjs +3 -3
  224. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  225. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  226. package/dist/lib/cjs/queue.cjs +8 -8
  227. package/dist/lib/cjs/react/app-context.cjs +3 -3
  228. package/dist/lib/cjs/react/index.cjs +1 -1
  229. package/dist/lib/cjs/reference-definition.cjs +1 -1
  230. package/dist/lib/cjs/reference.cjs +3 -3
  231. package/dist/lib/cjs/release-asset.cjs +5 -5
  232. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  233. package/dist/lib/cjs/request-url.cjs +4 -4
  234. package/dist/lib/cjs/resource-lock.cjs +46 -42
  235. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  236. package/dist/lib/cjs/resource-url.cjs +3 -3
  237. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  238. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  239. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  240. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  241. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  242. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  243. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  244. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  245. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  246. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  247. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  248. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  249. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  250. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  251. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  252. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  253. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  254. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  255. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  256. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  257. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  258. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  259. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  260. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  261. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  262. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  264. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  265. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  266. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  268. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  269. package/dist/lib/cjs/setting-ex.cjs +26 -26
  270. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  271. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  272. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  273. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  274. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  275. package/dist/lib/cjs/templater.cjs +14 -4
  276. package/dist/lib/cjs/templater.d.cts +6 -0
  277. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  278. package/dist/lib/cjs/transformers/index.cjs +1 -1
  279. package/dist/lib/cjs/trusted-input.cjs +1 -1
  280. package/dist/lib/cjs/validation.cjs +4 -4
  281. package/dist/lib/cjs/vault-delete.cjs +6 -6
  282. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  283. package/dist/lib/cjs/vault.cjs +12 -12
  284. package/dist/lib/cjs/view-registrar.cjs +1 -1
  285. package/dist/lib/cjs/virtual-file.cjs +16 -14
  286. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  287. package/dist/lib/cjs/wasm.cjs +119 -0
  288. package/dist/lib/cjs/wasm.d.cts +54 -0
  289. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  290. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  291. package/dist/lib/cjs/workspace.cjs +1 -1
  292. package/dist/lib/esm/__merged.d.mts +17 -8
  293. package/dist/lib/esm/__merged.mjs +133 -3
  294. package/dist/lib/esm/app.mjs +2 -2
  295. package/dist/lib/esm/attachment-path.d.mts +3 -3
  296. package/dist/lib/esm/attachment-path.mjs +2 -2
  297. package/dist/lib/esm/backlink-index.mjs +2 -2
  298. package/dist/lib/esm/canvas.d.mts +13 -0
  299. package/dist/lib/esm/canvas.mjs +6 -5
  300. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  301. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  302. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  303. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  304. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  305. package/dist/lib/esm/components/component-ex.mjs +19 -6
  306. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  307. package/dist/lib/esm/components/index.d.mts +2 -0
  308. package/dist/lib/esm/components/index.mjs +5 -1
  309. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  310. package/dist/lib/esm/components/plugin-gate-component.mjs +57 -14
  311. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  312. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  313. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  314. package/dist/lib/esm/components/plugin-settings-component.mjs +99 -3
  315. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  316. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  317. package/dist/lib/esm/components/worker-component.mjs +279 -0
  318. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  319. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  320. package/dist/lib/esm/components/workspace-layout-state-component.mjs +1 -1
  321. package/dist/lib/esm/data-handler.d.mts +92 -1
  322. package/dist/lib/esm/data-handler.mjs +112 -3
  323. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  324. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  325. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  326. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  327. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  328. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  329. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  330. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  331. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  332. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  333. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  334. package/dist/lib/esm/dataview.d.mts +14 -0
  335. package/dist/lib/esm/dataview.mjs +19 -1
  336. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  337. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  338. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  339. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  340. package/dist/lib/esm/disposable.d.mts +39 -0
  341. package/dist/lib/esm/disposable.mjs +64 -0
  342. package/dist/lib/esm/file-system.mjs +2 -2
  343. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  344. package/dist/lib/esm/generated-during-build.mjs +1 -1
  345. package/dist/lib/esm/i18n/locales/en.d.mts +4 -0
  346. package/dist/lib/esm/i18n/locales/en.mjs +5 -1
  347. package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -0
  348. package/dist/lib/esm/index.d.mts +6 -0
  349. package/dist/lib/esm/index.mjs +13 -1
  350. package/dist/lib/esm/link.d.mts +20 -14
  351. package/dist/lib/esm/link.mjs +57 -38
  352. package/dist/lib/esm/loop.mjs +2 -8
  353. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  354. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  355. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  356. package/dist/lib/esm/metadata-cache.mjs +6 -6
  357. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  358. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  359. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  360. package/dist/lib/esm/modals/prompt.mjs +1 -1
  361. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  362. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  363. package/dist/lib/esm/parse-link.mjs +4 -4
  364. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  365. package/dist/lib/esm/path-compatibility.mjs +277 -0
  366. package/dist/lib/esm/plugin/index.d.mts +1 -0
  367. package/dist/lib/esm/plugin/index.mjs +4 -2
  368. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  369. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  370. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  371. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  372. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  373. package/dist/lib/esm/plugin/plugin-instance.d.mts +7 -0
  374. package/dist/lib/esm/plugin/plugin-instance.mjs +2 -1
  375. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  376. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  377. package/dist/lib/esm/plugin/plugin.d.mts +28 -5
  378. package/dist/lib/esm/plugin/plugin.mjs +103 -9
  379. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  380. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  381. package/dist/lib/esm/release-asset.mjs +1 -1
  382. package/dist/lib/esm/resource-lock.d.mts +8 -7
  383. package/dist/lib/esm/resource-lock.mjs +31 -26
  384. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  385. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  386. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  387. package/dist/lib/esm/settings-recovery.mjs +125 -0
  388. package/dist/lib/esm/settings-tabs.mjs +2 -2
  389. package/dist/lib/esm/templater.d.mts +6 -0
  390. package/dist/lib/esm/templater.mjs +11 -2
  391. package/dist/lib/esm/vault.mjs +1 -1
  392. package/dist/lib/esm/virtual-file.d.mts +2 -1
  393. package/dist/lib/esm/virtual-file.mjs +7 -5
  394. package/dist/lib/esm/wasm.d.mts +54 -0
  395. package/dist/lib/esm/wasm.mjs +30 -0
  396. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  397. package/dist/lib/esm/worker-protocol.mjs +113 -0
  398. package/package.json +9 -8
  399. package/plugin/third-party-plugin/package.json +6 -0
@@ -2,7 +2,35 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
5
32
 
33
+ import { ensureNonNullable } from "@mnaoumov/typescript-lib/type-guards";
6
34
  class DataStoreReplica {
7
35
  /**
8
36
  * Creates an empty replica.
@@ -31,7 +59,7 @@ class DataStoreReplica {
31
59
  return;
32
60
  }
33
61
  const previous = this.registers.get(operation.key);
34
- if (this.kind !== "last-write-wins" && (operation.deleted || rankOf(operation.value) === void 0)) {
62
+ if (this.kind !== "last-write-wins" && (operation.deleted || rankOf(operation.value) === null)) {
35
63
  throw new Error("Min/max stores accept finite numbers or ranked JSON values and do not support deletion");
36
64
  }
37
65
  if (!previous || this.wins(operation, previous)) {
@@ -107,9 +135,9 @@ class DataStoreReplica {
107
135
  const nextRank = rankOf(next.value);
108
136
  const previousRank = rankOf(previous.value);
109
137
  if (this.kind === "minimum" && nextRank !== previousRank) {
110
- return Number(nextRank) < Number(previousRank);
138
+ return ensureNonNullable(nextRank) < ensureNonNullable(previousRank);
111
139
  }
112
- return this.kind === "maximum" && nextRank !== previousRank ? Number(nextRank) > Number(previousRank) : next.time > previous.time || next.time === previous.time && (next.counter > previous.counter || next.counter === previous.counter && next.device > previous.device);
140
+ return this.kind === "maximum" && nextRank !== previousRank ? ensureNonNullable(nextRank) > ensureNonNullable(previousRank) : next.time > previous.time || next.time === previous.time && (next.counter > previous.counter || next.counter === previous.counter && next.device > previous.device);
113
141
  }
114
142
  }
115
143
  function isDataStoreJsonValue(value) {
@@ -147,7 +175,7 @@ function rankOf(value) {
147
175
  if (typeof value === "number" && Number.isFinite(value)) {
148
176
  return value;
149
177
  }
150
- return typeof value === "object" && value !== null && "rank" in value && "value" in value && typeof value.rank === "number" && Number.isFinite(value.rank) ? value.rank : void 0;
178
+ return typeof value === "object" && value !== null && "rank" in value && "value" in value && typeof value.rank === "number" && Number.isFinite(value.rank) ? value.rank : null;
151
179
  }
152
180
  function tag(operation) {
153
181
  return `${operation.device}:${String(operation.sequence)}`;
@@ -170,4 +198,4 @@ export {
170
198
  isDataStoreJsonValue,
171
199
  isDataStoreOperation
172
200
  };
173
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2RhdGEtc3RvcmUtcmVwbGljYS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogZXNsaW50LWRpc2FibGUgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRoZXNlIGFyZSBPYnNpZGlhbiByZW5kZXJlciBXZWIgQVBJcywgbm90IE5vZGUgYnVpbHRpbnMuICovXG4vKipcbiAqIEBmaWxlXG4gKlxuICogTWVyZ2Utc2FmZSByZWdpc3RlcnMgYW5kIG9ic2VydmVkLXJlbW92ZSBzZXRzIHVzZWQgYnkgc2hhcmVkIGRhdGEgc3RvcmVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuLyoqXG4gKiBBIHN0b3JlIGZpeGVzIGl0cyBtZXJnZSBydWxlIGZvciBpdHMgZW50aXJlIGxpZmV0aW1lIGFuZCBzY2hlbWEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YVN0b3JlTWVyZ2VLaW5kID0gJ2xhc3Qtd3JpdGUtd2lucycgfCAnbWF4aW11bScgfCAnbWluaW11bScgfCAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCc7XG5cbi8qKlxuICogQSB2ZXJzaW9uLW9uZSBqb3VybmFsIG9wZXJhdGlvbi4gVGhlc2UgZmllbGRzIGZvcm0gYSBwdWJsaXNoZWQgd2lyZSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgY291bnRlciB3aXRoaW4gdGhlIHdhbGwtY2xvY2sgbWlsbGlzZWNvbmQuXG4gICAqL1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZW1vdmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVuaXF1ZSB3cml0ZXIgaW5jYXJuYXRpb24sIHN0b3JlZCBsb2NhbGx5IHJhdGhlciB0aGFuIGluIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZTogc3RyaW5nO1xuICAvKipcbiAgICogUmVjb3JkIGtleSwgb3Igc2V0IG1lbWJlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKipcbiAgICogU3RyaWN0bHkgaW5jcmVhc2luZyB3cml0ZXIgc2VxdWVuY2UsIHN0YXJ0aW5nIGF0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPYnNlcnZlZCBhZGRpdGlvbiB0YWdzIHJlbW92ZWQgYnkgYSBzZXQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogSHlicmlkIGxvZ2ljYWwgY2xvY2sgd2FsbCB0aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHZhbHVlOyBzZXQgbWVtYmVycyB1c2UgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IENSRFQgc3RhdGUuIEV4cG9ydGVkIG9wZXJhdGlvbnMgY2FuIGJlIGpvaW5lZCBpbiBhbnkgb3JkZXIsIHJlcGVhdGVkbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVSZXBsaWNhIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHJlcGxpY2EuXG4gICAqXG4gICAqIEBwYXJhbSBraW5kIC0gSW1tdXRhYmxlIG1lcmdlIHJ1bGUgZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kKSB7fVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGpvaW5zIG9uZSBqb3VybmFsIG9yIHNuYXBzaG90IG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVW50cnVzdGVkIHBhcnNlZCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXBwbHkodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIWlzRGF0YVN0b3JlT3BlcmF0aW9uKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgb3BlcmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHdpbmRvdy5zdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgdGhpcy5hcHBseVNldChvcGVyYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucmVnaXN0ZXJzLmdldChvcGVyYXRpb24ua2V5KTtcbiAgICBpZiAodGhpcy5raW5kICE9PSAnbGFzdC13cml0ZS13aW5zJyAmJiAob3BlcmF0aW9uLmRlbGV0ZWQgfHwgcmFua09mKG9wZXJhdGlvbi52YWx1ZSkgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWluL21heCBzdG9yZXMgYWNjZXB0IGZpbml0ZSBudW1iZXJzIG9yIHJhbmtlZCBKU09OIHZhbHVlcyBhbmQgZG8gbm90IHN1cHBvcnQgZGVsZXRpb24nKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2aW91cyB8fCB0aGlzLndpbnMob3BlcmF0aW9uLCBwcmV2aW91cykpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJzLnNldChvcGVyYXRpb24ua2V5LCBvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB2aXNpYmxlIHJlY29yZHMsIGRldGFjaGVkIGZyb20gaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFBhaXJzIGluIGRldGVybWluaXN0aWMga2V5IG9yZGVyLlxuICAgKi9cbiAgcHVibGljIGVudHJpZXMoKTogW3N0cmluZywgdW5rbm93bl1bXSB7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ29ic2VydmVkLXJlbW92ZS1zZXQnKSB7XG4gICAgICBjb25zdCBrZXlzID0gbmV3IFNldCh0aGlzLmFjdGl2ZUFkZGl0aW9ucygpLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5KSk7XG4gICAgICByZXR1cm4gWy4uLmtleXNdLnNvcnQoKS5tYXAoKGtleSkgPT4gW2tleSwgdHJ1ZV0pO1xuICAgIH1cbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpXS5maWx0ZXIoKG9wZXJhdGlvbikgPT4gIW9wZXJhdGlvbi5kZWxldGVkKVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IGZpcnN0LmtleS5sb2NhbGVDb21wYXJlKHNlY29uZC5rZXkpKVxuICAgICAgLm1hcCgob3BlcmF0aW9uKSA9PiBbb3BlcmF0aW9uLmtleSwgd2luZG93LnN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24udmFsdWUpXSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0cyBtZXJnZWFibGUgc3RhdGUsIHJldGFpbmluZyB0b21ic3RvbmVzIGZvciBsYXRlIG9yIHJldGlyZWQgcmVwbGljYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGVybWluaXN0aWNhbGx5IG9yZGVyZWQgb3BlcmF0aW9ucyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IHRoaXMgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZXhwb3J0KCk6IERhdGFTdG9yZU9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucmVnaXN0ZXJzLnZhbHVlcygpLCAuLi50aGlzLmFjdGl2ZUFkZGl0aW9ucygpLCAuLi50aGlzLnJlbW92YWxzLnZhbHVlcygpXVxuICAgICAgLnNvcnQoKGZpcnN0LCBzZWNvbmQpID0+IHRhZyhmaXJzdCkubG9jYWxlQ29tcGFyZSh0YWcoc2Vjb25kKSkpLm1hcCgob3BlcmF0aW9uKSA9PiB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgcmVnaXN0ZXIgb3Igc2V0IG1lbWJlcnNoaXAgd2l0aG91dCBlbnVtZXJhdGluZyByZWdpc3RlciBrZXlzLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleSBvciBzZXQgbWVtYmVyLlxuICAgKiBAcmV0dXJucyBBIGRldGFjaGVkIHZhbHVlLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudCBvciBkZWxldGVkLlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlQWRkaXRpb25zKCkuc29tZSgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5ID09PSBrZXkpIHx8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdGhpcy5yZWdpc3RlcnMuZ2V0KGtleSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbiAmJiAhb3BlcmF0aW9uLmRlbGV0ZWQgPyB3aW5kb3cuc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbi52YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWRkaXRpb25zIG9ic2VydmVkIGZvciBhIHNldCBtZW1iZXIsIGZvciBhbiBvYnNlcnZlZCByZW1vdmFsLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gU2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQWRkaXRpb24gaWRlbnRpdGllcy4gQ29uY3VycmVudCB1bnNlZW4gYWRkaXRpb25zIHN1cnZpdmUgcmVtb3ZhbC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlZFRhZ3Moa2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IG9wZXJhdGlvbi5rZXkgPT09IGtleSkubWFwKChvcGVyYXRpb24pID0+IHRhZyhvcGVyYXRpb24pKS5zb3J0KCk7XG4gIH1cblxuICBwcml2YXRlIGFjdGl2ZUFkZGl0aW9ucygpOiBEYXRhU3RvcmVPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmFkZGl0aW9ucy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+IHtcbiAgICAgIGNvbnN0IHJlbW92ZWQgPSB0YWdWZWN0b3IodGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk/LnRhZ3MgPz8gW10pO1xuICAgICAgcmV0dXJuIG9wZXJhdGlvbi5zZXF1ZW5jZSA+IChyZW1vdmVkLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTZXQob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAob3BlcmF0aW9uLmRlbGV0ZWQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5yZW1vdmFscy5nZXQob3BlcmF0aW9uLmtleSk7XG4gICAgICBjb25zdCB2ZWN0b3IgPSB0YWdWZWN0b3IoWy4uLihwcmV2aW91cz8udGFncyA/PyBbXSksIC4uLihvcGVyYXRpb24udGFncyA/PyBbXSldKTtcbiAgICAgIGNvbnN0IHdpbm5lciA9IHByZXZpb3VzICYmIHRoaXMud2lucyhwcmV2aW91cywgb3BlcmF0aW9uKSA/IHByZXZpb3VzIDogb3BlcmF0aW9uO1xuICAgICAgdGhpcy5yZW1vdmFscy5zZXQob3BlcmF0aW9uLmtleSwgeyAuLi53aW5uZXIsIHRhZ3M6IFsuLi52ZWN0b3JdLnNvcnQoKFtmaXJzdF0sIFtzZWNvbmRdKSA9PiBmaXJzdC5sb2NhbGVDb21wYXJlKHNlY29uZCkpLm1hcCgoW2RldmljZSwgc2VxdWVuY2VdKSA9PiBgJHtkZXZpY2V9OiR7U3RyaW5nKHNlcXVlbmNlKX1gKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wZXJhdGlvbi52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldCBhZGRpdGlvbnMgdXNlIHRydWUgYXMgdGhlaXIgdmFsdWUnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleSA9IGAke29wZXJhdGlvbi5rZXl9OiR7b3BlcmF0aW9uLmRldmljZX1gO1xuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmFkZGl0aW9ucy5nZXQoa2V5KTtcbiAgICAgIGlmICghcHJldmlvdXMgfHwgb3BlcmF0aW9uLnNlcXVlbmNlID4gcHJldmlvdXMuc2VxdWVuY2UpIHtcbiAgICAgICAgdGhpcy5hZGRpdGlvbnMuc2V0KGtleSwgb3BlcmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdpbnMobmV4dDogRGF0YVN0b3JlT3BlcmF0aW9uLCBwcmV2aW91czogRGF0YVN0b3JlT3BlcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmV4dFJhbmsgPSByYW5rT2YobmV4dC52YWx1ZSk7XG4gICAgY29uc3QgcHJldmlvdXNSYW5rID0gcmFua09mKHByZXZpb3VzLnZhbHVlKTtcbiAgICBpZiAodGhpcy5raW5kID09PSAnbWluaW11bScgJiYgbmV4dFJhbmsgIT09IHByZXZpb3VzUmFuaykge1xuICAgICAgcmV0dXJuIE51bWJlcihuZXh0UmFuaykgPCBOdW1iZXIocHJldmlvdXNSYW5rKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMua2luZCA9PT0gJ21heGltdW0nICYmIG5leHRSYW5rICE9PSBwcmV2aW91c1JhbmsgPyBOdW1iZXIobmV4dFJhbmspID4gTnVtYmVyKHByZXZpb3VzUmFuaykgOiBuZXh0LnRpbWUgPiBwcmV2aW91cy50aW1lIHx8IChuZXh0LnRpbWUgPT09IHByZXZpb3VzLnRpbWUgJiYgKG5leHQuY291bnRlciA+IHByZXZpb3VzLmNvdW50ZXJcbiAgICAgIHx8IChuZXh0LmNvdW50ZXIgPT09IHByZXZpb3VzLmNvdW50ZXIgJiYgbmV4dC5kZXZpY2UgPiBwcmV2aW91cy5kZXZpY2UpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhIHZhbHVlIHN1cnZpdmVzIEpTT04gdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQ2FuZGlkYXRlIGRhdGEtc3RvcmUgdmFsdWUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGZpbml0ZSwgYWN5Y2xpYyBKU09OIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25WYWx1ZSB7XG4gIHJldHVybiBpc0pzb25WYWx1ZSh2YWx1ZSwgbmV3IFNldCgpKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHZlcnNpb24tb25lIG9wZXJhdGlvbiB3aXJlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFBhcnNlZCBKU09OLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyB2YWxpZCBpZGVudGl0eSBhbmQgY2xvY2sgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhU3RvcmVPcGVyYXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRhU3RvcmVPcGVyYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAna2V5JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUua2V5ID09PSAnc3RyaW5nJ1xuICAgICYmICdkZXZpY2UnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZXZpY2UgPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QodmFsdWUuZGV2aWNlKVxuICAgICYmICdzZXF1ZW5jZScgaW4gdmFsdWUgJiYgaXNQb3NpdGl2ZUludGVnZXIodmFsdWUuc2VxdWVuY2UpXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLnRpbWUpXG4gICAgJiYgJ2NvdW50ZXInIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLmNvdW50ZXIpXG4gICAgJiYgJ2RlbGV0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZWxldGVkID09PSAnYm9vbGVhbicgJiYgJ3ZhbHVlJyBpbiB2YWx1ZSAmJiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZS52YWx1ZSlcbiAgICAmJiAoISgndGFncycgaW4gdmFsdWUpIHx8IChBcnJheS5pc0FycmF5KHZhbHVlLnRhZ3MpICYmIHZhbHVlLnRhZ3MuZXZlcnkoKGl0ZW06IHVua25vd24pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpKTtcbn1cblxuZnVuY3Rpb24gaXNKc29uVmFsdWUodmFsdWU6IHVua25vd24sIGFuY2VzdG9yczogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGFuY2VzdG9ycy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSk7XG4gIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKGNoaWxkKSA9PiBpc0pzb25WYWx1ZShjaGlsZCwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gaXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gaXNOb25OZWdhdGl2ZUludGVnZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID49IDA7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbmZ1bmN0aW9uIHJhbmtPZih2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ3JhbmsnIGluIHZhbHVlICYmICd2YWx1ZScgaW4gdmFsdWVcbiAgICAgICYmIHR5cGVvZiB2YWx1ZS5yYW5rID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUucmFuaylcbiAgICA/IHZhbHVlLnJhbmtcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdGFnKG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YDtcbn1cblxuZnVuY3Rpb24gdGFnVmVjdG9yKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IHZlY3RvciA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdGFncykge1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IHZhbHVlLmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgZGV2aWNlID0gdmFsdWUuc2xpY2UoMCwgc2VwYXJhdG9yKTtcbiAgICBjb25zdCBzZXF1ZW5jZSA9IE51bWJlcih2YWx1ZS5zbGljZShzZXBhcmF0b3IgKyAxKSk7XG4gICAgaWYgKCFkZXZpY2UgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHNlcXVlbmNlKSB8fCBzZXF1ZW5jZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgb2JzZXJ2ZWQtcmVtb3ZlIHRhZycpO1xuICAgIH1cbiAgICB2ZWN0b3Iuc2V0KGRldmljZSwgTWF0aC5tYXgoc2VxdWVuY2UsIHZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gIH1cbiAgcmV0dXJuIHZlY3Rvcjtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLAog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O0FBQ0EsTUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixXQUFPLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFDOUI7QUFDQSxNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsSUFBSSxLQUFLLEdBQUc7QUFDckQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLENBQUMsTUFBTSxRQUFRLEtBQUssS0FBSyxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQUssTUFBTSxtQkFBbUI7QUFDeEYsV0FBTztBQUFBLEVBQ1Q7QUFDQSxZQUFVLElBQUksS0FBSztBQUNuQixRQUFNLFNBQW9CLE1BQU0sUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxPQUFPLE9BQU8sS0FBSztBQUNqRixRQUFNLFVBQVUsT0FBTyxNQUFNLENBQUMsVUFBVSxZQUFZLE9BQU8sU0FBUyxDQUFDO0FBQ3JFLFlBQVUsT0FBTyxLQUFLO0FBQ3RCLFNBQU87QUFDVDtBQUVBLFNBQVMscUJBQXFCLE9BQXlCO0FBQ3JELFNBQU8sT0FBTyxjQUFjLEtBQUssS0FBSyxPQUFPLEtBQUssS0FBSztBQUN6RDtBQUVBLFNBQVMsa0JBQWtCLE9BQXlCO0FBQ2xELFNBQU8sT0FBTyxjQUFjLEtBQUssS0FBSyxPQUFPLEtBQUssSUFBSTtBQUN4RDtBQUVBLFNBQVMsT0FBTyxPQUFvQztBQUNsRCxNQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFDdkQsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxVQUFVLFNBQVMsV0FBVyxTQUM3RSxPQUFPLE1BQU0sU0FBUyxZQUFZLE9BQU8sU0FBUyxNQUFNLElBQUksSUFDL0QsTUFBTSxPQUNOO0FBQ047QUFFQSxTQUFTLElBQUksV0FBdUM7QUFDbEQsU0FBTyxHQUFHLFVBQVUsTUFBTSxJQUFJLE9BQU8sVUFBVSxRQUFRLENBQUM7QUFDMUQ7QUFFQSxTQUFTLFVBQVUsTUFBOEM7QUFDL0QsUUFBTSxTQUFTLG9CQUFJLElBQW9CO0FBQ3ZDLGFBQVcsU0FBUyxNQUFNO0FBQ3hCLFVBQU0sWUFBWSxNQUFNLFlBQVksR0FBRztBQUN2QyxVQUFNLFNBQVMsTUFBTSxNQUFNLEdBQUcsU0FBUztBQUN2QyxVQUFNLFdBQVcsT0FBTyxNQUFNLE1BQU0sWUFBWSxDQUFDLENBQUM7QUFDbEQsUUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLGNBQWMsUUFBUSxLQUFLLFlBQVksR0FBRztBQUMvRCxZQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQSxJQUMvQztBQUNBLFdBQU8sSUFBSSxRQUFRLEtBQUssSUFBSSxVQUFVLE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQUEsRUFDaEU7QUFDQSxTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbIm9wZXJhdGlvbiJdCn0K
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXJlcGxpY2EudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1lcmdlLXNhZmUgcmVnaXN0ZXJzIGFuZCBvYnNlcnZlZC1yZW1vdmUgc2V0cyB1c2VkIGJ5IHNoYXJlZCBkYXRhIHN0b3Jlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuLyoqXG4gKiBBIHN0b3JlIGZpeGVzIGl0cyBtZXJnZSBydWxlIGZvciBpdHMgZW50aXJlIGxpZmV0aW1lIGFuZCBzY2hlbWEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGF0YVN0b3JlTWVyZ2VLaW5kID0gJ2xhc3Qtd3JpdGUtd2lucycgfCAnbWF4aW11bScgfCAnbWluaW11bScgfCAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCc7XG5cbi8qKlxuICogQSB2ZXJzaW9uLW9uZSBqb3VybmFsIG9wZXJhdGlvbi4gVGhlc2UgZmllbGRzIGZvcm0gYSBwdWJsaXNoZWQgd2lyZSBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIExvZ2ljYWwgY291bnRlciB3aXRoaW4gdGhlIHdhbGwtY2xvY2sgbWlsbGlzZWNvbmQuXG4gICAqL1xuICByZWFkb25seSBjb3VudGVyOiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZW1vdmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFVuaXF1ZSB3cml0ZXIgaW5jYXJuYXRpb24sIHN0b3JlZCBsb2NhbGx5IHJhdGhlciB0aGFuIGluIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZTogc3RyaW5nO1xuICAvKipcbiAgICogUmVjb3JkIGtleSwgb3Igc2V0IG1lbWJlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKipcbiAgICogU3RyaWN0bHkgaW5jcmVhc2luZyB3cml0ZXIgc2VxdWVuY2UsIHN0YXJ0aW5nIGF0IG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNlcXVlbmNlOiBudW1iZXI7XG4gIC8qKlxuICAgKiBPYnNlcnZlZCBhZGRpdGlvbiB0YWdzIHJlbW92ZWQgYnkgYSBzZXQgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogSHlicmlkIGxvZ2ljYWwgY2xvY2sgd2FsbCB0aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHZhbHVlOyBzZXQgbWVtYmVycyB1c2UgYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSW4tbWVtb3J5IENSRFQgc3RhdGUuIEV4cG9ydGVkIG9wZXJhdGlvbnMgY2FuIGJlIGpvaW5lZCBpbiBhbnkgb3JkZXIsIHJlcGVhdGVkbHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVSZXBsaWNhIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRpdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVycyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVtcHR5IHJlcGxpY2EuXG4gICAqXG4gICAqIEBwYXJhbSBraW5kIC0gSW1tdXRhYmxlIG1lcmdlIHJ1bGUgZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkga2luZDogRGF0YVN0b3JlTWVyZ2VLaW5kKSB7fVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIGpvaW5zIG9uZSBqb3VybmFsIG9yIHNuYXBzaG90IG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVW50cnVzdGVkIHBhcnNlZCBvcGVyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgYXBwbHkodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIWlzRGF0YVN0b3JlT3BlcmF0aW9uKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgb3BlcmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHdpbmRvdy5zdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgdGhpcy5hcHBseVNldChvcGVyYXRpb24pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucmVnaXN0ZXJzLmdldChvcGVyYXRpb24ua2V5KTtcbiAgICBpZiAodGhpcy5raW5kICE9PSAnbGFzdC13cml0ZS13aW5zJyAmJiAob3BlcmF0aW9uLmRlbGV0ZWQgfHwgcmFua09mKG9wZXJhdGlvbi52YWx1ZSkgPT09IG51bGwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pbi9tYXggc3RvcmVzIGFjY2VwdCBmaW5pdGUgbnVtYmVycyBvciByYW5rZWQgSlNPTiB2YWx1ZXMgYW5kIGRvIG5vdCBzdXBwb3J0IGRlbGV0aW9uJyk7XG4gICAgfVxuICAgIGlmICghcHJldmlvdXMgfHwgdGhpcy53aW5zKG9wZXJhdGlvbiwgcHJldmlvdXMpKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVycy5zZXQob3BlcmF0aW9uLmtleSwgb3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdmlzaWJsZSByZWNvcmRzLCBkZXRhY2hlZCBmcm9tIGludGVybmFsIHN0YXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQYWlycyBpbiBkZXRlcm1pbmlzdGljIGtleSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzKCk6IFtzdHJpbmcsIHVua25vd25dW10ge1xuICAgIGlmICh0aGlzLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0Jykge1xuICAgICAgY29uc3Qga2V5cyA9IG5ldyBTZXQodGhpcy5hY3RpdmVBZGRpdGlvbnMoKS5tYXAoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmtleSkpO1xuICAgICAgcmV0dXJuIFsuLi5rZXlzXS5zb3J0KCkubWFwKChrZXkpID0+IFtrZXksIHRydWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIFsuLi50aGlzLnJlZ2lzdGVycy52YWx1ZXMoKV0uZmlsdGVyKChvcGVyYXRpb24pID0+ICFvcGVyYXRpb24uZGVsZXRlZClcbiAgICAgIC5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5rZXkubG9jYWxlQ29tcGFyZShzZWNvbmQua2V5KSlcbiAgICAgIC5tYXAoKG9wZXJhdGlvbikgPT4gW29wZXJhdGlvbi5rZXksIHdpbmRvdy5zdHJ1Y3R1cmVkQ2xvbmUob3BlcmF0aW9uLnZhbHVlKV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgbWVyZ2VhYmxlIHN0YXRlLCByZXRhaW5pbmcgdG9tYnN0b25lcyBmb3IgbGF0ZSBvciByZXRpcmVkIHJlcGxpY2FzLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRlcm1pbmlzdGljYWxseSBvcmRlcmVkIG9wZXJhdGlvbnMgc3VmZmljaWVudCB0byByZWNvbnN0cnVjdCB0aGlzIHN0YXRlLlxuICAgKi9cbiAgcHVibGljIGV4cG9ydCgpOiBEYXRhU3RvcmVPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnJlZ2lzdGVycy52YWx1ZXMoKSwgLi4udGhpcy5hY3RpdmVBZGRpdGlvbnMoKSwgLi4udGhpcy5yZW1vdmFscy52YWx1ZXMoKV1cbiAgICAgIC5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiB0YWcoZmlyc3QpLmxvY2FsZUNvbXBhcmUodGFnKHNlY29uZCkpKS5tYXAoKG9wZXJhdGlvbikgPT4gd2luZG93LnN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIHdpdGhvdXQgZW51bWVyYXRpbmcgcmVnaXN0ZXIga2V5cy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBpZiAodGhpcy5raW5kID09PSAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUFkZGl0aW9ucygpLnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmtleSA9PT0ga2V5KSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMucmVnaXN0ZXJzLmdldChrZXkpO1xuICAgIHJldHVybiBvcGVyYXRpb24gJiYgIW9wZXJhdGlvbi5kZWxldGVkID8gd2luZG93LnN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24udmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFkZGl0aW9ucyBvYnNlcnZlZCBmb3IgYSBzZXQgbWVtYmVyLCBmb3IgYW4gb2JzZXJ2ZWQgcmVtb3ZhbC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFNldCBtZW1iZXIuXG4gICAqIEByZXR1cm5zIEFkZGl0aW9uIGlkZW50aXRpZXMuIENvbmN1cnJlbnQgdW5zZWVuIGFkZGl0aW9ucyBzdXJ2aXZlIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZWRUYWdzKGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5hZGRpdGlvbnMudmFsdWVzKCldLmZpbHRlcigob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24ua2V5ID09PSBrZXkpLm1hcCgob3BlcmF0aW9uKSA9PiB0YWcob3BlcmF0aW9uKSkuc29ydCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmVBZGRpdGlvbnMoKTogRGF0YVN0b3JlT3BlcmF0aW9uW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5hZGRpdGlvbnMudmFsdWVzKCldLmZpbHRlcigob3BlcmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVkID0gdGFnVmVjdG9yKHRoaXMucmVtb3ZhbHMuZ2V0KG9wZXJhdGlvbi5rZXkpPy50YWdzID8/IFtdKTtcbiAgICAgIHJldHVybiBvcGVyYXRpb24uc2VxdWVuY2UgPiAocmVtb3ZlZC5nZXQob3BlcmF0aW9uLmRldmljZSkgPz8gMCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2V0KG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKG9wZXJhdGlvbi5kZWxldGVkKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMucmVtb3ZhbHMuZ2V0KG9wZXJhdGlvbi5rZXkpO1xuICAgICAgY29uc3QgdmVjdG9yID0gdGFnVmVjdG9yKFsuLi4ocHJldmlvdXM/LnRhZ3MgPz8gW10pLCAuLi4ob3BlcmF0aW9uLnRhZ3MgPz8gW10pXSk7XG4gICAgICBjb25zdCB3aW5uZXIgPSBwcmV2aW91cyAmJiB0aGlzLndpbnMocHJldmlvdXMsIG9wZXJhdGlvbikgPyBwcmV2aW91cyA6IG9wZXJhdGlvbjtcbiAgICAgIHRoaXMucmVtb3ZhbHMuc2V0KG9wZXJhdGlvbi5rZXksIHsgLi4ud2lubmVyLCB0YWdzOiBbLi4udmVjdG9yXS5zb3J0KChbZmlyc3RdLCBbc2Vjb25kXSkgPT4gZmlyc3QubG9jYWxlQ29tcGFyZShzZWNvbmQpKS5tYXAoKFtkZXZpY2UsIHNlcXVlbmNlXSkgPT4gYCR7ZGV2aWNlfToke1N0cmluZyhzZXF1ZW5jZSl9YCkgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcGVyYXRpb24udmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZXQgYWRkaXRpb25zIHVzZSB0cnVlIGFzIHRoZWlyIHZhbHVlJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBgJHtvcGVyYXRpb24ua2V5fToke29wZXJhdGlvbi5kZXZpY2V9YDtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5hZGRpdGlvbnMuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXZpb3VzIHx8IG9wZXJhdGlvbi5zZXF1ZW5jZSA+IHByZXZpb3VzLnNlcXVlbmNlKSB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25zLnNldChrZXksIG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3aW5zKG5leHQ6IERhdGFTdG9yZU9wZXJhdGlvbiwgcHJldmlvdXM6IERhdGFTdG9yZU9wZXJhdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5leHRSYW5rID0gcmFua09mKG5leHQudmFsdWUpO1xuICAgIGNvbnN0IHByZXZpb3VzUmFuayA9IHJhbmtPZihwcmV2aW91cy52YWx1ZSk7XG4gICAgLy8gYGFwcGx5YCBhZG1pdHMgb25seSByYW5rZWQgdmFsdWVzIGludG8gYSBtaW5pbXVtIG9yIG1heGltdW0gc3RvcmUsIHNvIGJvdGggcmFua3MgZXhpc3QgdGhlcmUuXG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ21pbmltdW0nICYmIG5leHRSYW5rICE9PSBwcmV2aW91c1JhbmspIHtcbiAgICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZShuZXh0UmFuaykgPCBlbnN1cmVOb25OdWxsYWJsZShwcmV2aW91c1JhbmspO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5raW5kID09PSAnbWF4aW11bScgJiYgbmV4dFJhbmsgIT09IHByZXZpb3VzUmFuayA/IGVuc3VyZU5vbk51bGxhYmxlKG5leHRSYW5rKSA+IGVuc3VyZU5vbk51bGxhYmxlKHByZXZpb3VzUmFuaykgOiBuZXh0LnRpbWUgPiBwcmV2aW91cy50aW1lIHx8IChuZXh0LnRpbWUgPT09IHByZXZpb3VzLnRpbWUgJiYgKG5leHQuY291bnRlciA+IHByZXZpb3VzLmNvdW50ZXJcbiAgICAgIHx8IChuZXh0LmNvdW50ZXIgPT09IHByZXZpb3VzLmNvdW50ZXIgJiYgbmV4dC5kZXZpY2UgPiBwcmV2aW91cy5kZXZpY2UpKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhIHZhbHVlIHN1cnZpdmVzIEpTT04gdHJhbnNwb3J0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQ2FuZGlkYXRlIGRhdGEtc3RvcmUgdmFsdWUuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGl0IGlzIGZpbml0ZSwgYWN5Y2xpYyBKU09OIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEpzb25WYWx1ZSB7XG4gIHJldHVybiBpc0pzb25WYWx1ZSh2YWx1ZSwgbmV3IFNldCgpKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHZlcnNpb24tb25lIG9wZXJhdGlvbiB3aXJlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFBhcnNlZCBKU09OLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgb3BlcmF0aW9uIGhhcyB2YWxpZCBpZGVudGl0eSBhbmQgY2xvY2sgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhU3RvcmVPcGVyYXRpb24odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBEYXRhU3RvcmVPcGVyYXRpb24ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAna2V5JyBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUua2V5ID09PSAnc3RyaW5nJ1xuICAgICYmICdkZXZpY2UnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZXZpY2UgPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QodmFsdWUuZGV2aWNlKVxuICAgICYmICdzZXF1ZW5jZScgaW4gdmFsdWUgJiYgaXNQb3NpdGl2ZUludGVnZXIodmFsdWUuc2VxdWVuY2UpXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLnRpbWUpXG4gICAgJiYgJ2NvdW50ZXInIGluIHZhbHVlICYmIGlzTm9uTmVnYXRpdmVJbnRlZ2VyKHZhbHVlLmNvdW50ZXIpXG4gICAgJiYgJ2RlbGV0ZWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5kZWxldGVkID09PSAnYm9vbGVhbicgJiYgJ3ZhbHVlJyBpbiB2YWx1ZSAmJiBpc0RhdGFTdG9yZUpzb25WYWx1ZSh2YWx1ZS52YWx1ZSlcbiAgICAmJiAoISgndGFncycgaW4gdmFsdWUpIHx8IChBcnJheS5pc0FycmF5KHZhbHVlLnRhZ3MpICYmIHZhbHVlLnRhZ3MuZXZlcnkoKGl0ZW06IHVua25vd24pID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykpKTtcbn1cblxuZnVuY3Rpb24gaXNKc29uVmFsdWUodmFsdWU6IHVua25vd24sIGFuY2VzdG9yczogU2V0PG9iamVjdD4pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IGFuY2VzdG9ycy5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYW5jZXN0b3JzLmFkZCh2YWx1ZSk7XG4gIGNvbnN0IHZhbHVlczogdW5rbm93bltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogT2JqZWN0LnZhbHVlcyh2YWx1ZSk7XG4gIGNvbnN0IGlzVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKGNoaWxkKSA9PiBpc0pzb25WYWx1ZShjaGlsZCwgYW5jZXN0b3JzKSk7XG4gIGFuY2VzdG9ycy5kZWxldGUodmFsdWUpO1xuICByZXR1cm4gaXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gaXNOb25OZWdhdGl2ZUludGVnZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSAmJiBOdW1iZXIodmFsdWUpID49IDA7XG59XG5cbmZ1bmN0aW9uIGlzUG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkgJiYgTnVtYmVyKHZhbHVlKSA+IDA7XG59XG5cbmZ1bmN0aW9uIHJhbmtPZih2YWx1ZTogdW5rbm93bik6IG51bGwgfCBudW1iZXIge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICdyYW5rJyBpbiB2YWx1ZSAmJiAndmFsdWUnIGluIHZhbHVlXG4gICAgICAmJiB0eXBlb2YgdmFsdWUucmFuayA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlLnJhbmspXG4gICAgPyB2YWx1ZS5yYW5rXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB0YWcob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gYCR7b3BlcmF0aW9uLmRldmljZX06JHtTdHJpbmcob3BlcmF0aW9uLnNlcXVlbmNlKX1gO1xufVxuXG5mdW5jdGlvbiB0YWdWZWN0b3IodGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiBNYXA8c3RyaW5nLCBudW1iZXI+IHtcbiAgY29uc3QgdmVjdG9yID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB0YWdzKSB7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gdmFsdWUubGFzdEluZGV4T2YoJzonKTtcbiAgICBjb25zdCBkZXZpY2UgPSB2YWx1ZS5zbGljZSgwLCBzZXBhcmF0b3IpO1xuICAgIGNvbnN0IHNlcXVlbmNlID0gTnVtYmVyKHZhbHVlLnNsaWNlKHNlcGFyYXRvciArIDEpKTtcbiAgICBpZiAoIWRldmljZSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoc2VxdWVuY2UpIHx8IHNlcXVlbmNlIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBvYnNlcnZlZC1yZW1vdmUgdGFnJyk7XG4gICAgfVxuICAgIHZlY3Rvci5zZXQoZGV2aWNlLCBNYXRoLm1heChzZXF1ZW5jZSwgdmVjdG9yLmdldChkZXZpY2UpID8/IDApKTtcbiAgfVxuICByZXR1cm4gdmVjdG9yO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLFNB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
@@ -119,9 +119,9 @@ export declare class DataStoreSeeds {
119
119
  /**
120
120
  * Reads the newest complete seed for this transport's schema.
121
121
  *
122
- * @returns Seed records, or `undefined` if sharing is disabled or no complete seed is available yet.
122
+ * @returns Seed records, or `null` if sharing is disabled or no complete seed is available yet.
123
123
  */
124
- readLatest(): Promise<DataStoreSeedEntry[] | undefined>;
124
+ readLatest(): Promise<DataStoreSeedEntry[] | null>;
125
125
  }
126
126
  /**
127
127
  * Validates a seed using free file statistics first, hashing only size-equal mtime mismatches.
@@ -58,15 +58,15 @@ class DataStoreSeeds {
58
58
  /**
59
59
  * Reads the newest complete seed for this transport's schema.
60
60
  *
61
- * @returns Seed records, or `undefined` if sharing is disabled or no complete seed is available yet.
61
+ * @returns Seed records, or `null` if sharing is disabled or no complete seed is available yet.
62
62
  */
63
63
  async readLatest() {
64
64
  if (!this.share) {
65
- return void 0;
65
+ return null;
66
66
  }
67
67
  const files = await this.transport.list();
68
68
  let newest = -Infinity;
69
- let entries;
69
+ let entries = null;
70
70
  for (const path of files) {
71
71
  if (!/\/seed-[\w-]+-manifest\.(?:md|json)$/.test(path)) {
72
72
  continue;
@@ -112,4 +112,4 @@ export {
112
112
  DataStoreSeeds,
113
113
  validateDataStoreSeed
114
114
  };
115
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2RhdGEtc3RvcmUtc2VlZHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIE9wdGlvbmFsIGNodW5rZWQgc2VlZHMgZm9yIGV4cGVuc2l2ZSBkZXJpdmVkIGNhY2hlcywgd2l0aCBwZXItZmlsZSB2YWxpZGF0aW9uIGJlZm9yZSByZXVzZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBpc0RhdGFTdG9yZUpzb25WYWx1ZSB9IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG4vKipcbiAqIEEgZGVyaXZlZCByZWNvcmQgdGFnZ2VkIHdpdGggYm90aCBjaGVhcCBzdGF0aXN0aWNzIGFuZCBhIGNvbnRlbnQgaGFzaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkRW50cnkgZXh0ZW5kcyBEYXRhU3RvcmVTZWVkRmlsZSB7XG4gIC8qKlxuICAgKiBDb250ZW50IGhhc2gsIHVzaW5nIHRoZSBzYW1lIGFsZ29yaXRobSBvbiBldmVyeSBkZXZpY2UuXG4gICAqL1xuICByZWFkb25seSBoYXNoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25zdW1lci1kZWZpbmVkIEpTT04gY2FjaGUgcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTtcbn1cblxuLyoqXG4gKiBDaGVhcCBmaWxlIGlkZW50aXR5IGFscmVhZHkgYXZhaWxhYmxlIGZyb20gdGhlIHZhdWx0J3MgZmlsZSB0cmVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVNlZWRGaWxlIHtcbiAgLyoqXG4gICAqIExhc3QgbW9kaWZpY2F0aW9uIHRpbWUuXG4gICAqL1xuICByZWFkb25seSBtdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEZpbGUgc2l6ZSBpbiBieXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcHRpb25hbCBjYWNoZS1zZWVkIHNoYXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlU2VlZHNDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBEZWRpY2F0ZWQgZGV2aWNlLWxvY2FsIHN0b3JlIHRoYXQgb3ducyB0aGUgc2VlZCBwdWJsaXNoZXIgaWRlbnRpdHkuXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBQZXItc3RvcmUgdXNlciBzZXR0aW5nLiBEaXNhYmxlZCBtZWFucyBuZWl0aGVyIHB1Ymxpc2hpbmcgbm9yIGFkb3B0aW5nIHNlZWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQsIGJvdW5kZWQgdHJhbnNwb3J0LiBJbmNsdWRlIHRoZSBjb25zdW1lciBzY2hlbWEgdmVyc2lvbiBpbiBpdHMgc3RvcmUgaWQuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IERhdGFTdG9yZVRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBSZXN1bHRzIG9mIHZhbGlkYXRpbmcgYSBzaGFyZWQgY2FjaGUgc2VlZCBhZ2FpbnN0IHRoZSBsb2NhbCB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkVmFsaWRhdGlvbiB7XG4gIC8qKlxuICAgKiBGaWxlcyBhYnNlbnQgZnJvbSB0aGUgc2VlZCwgb3Igd2l0aCBkaWZmZXJlbnQgY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYnVpbGQ6IHN0cmluZ1tdO1xuICAvKipcbiAgICogVmFsaWRhdGVkIHNlZWQgcmVjb3Jkcywgd2l0aCBsb2NhbCBmaWxlIHN0YXRpc3RpY3MuXG4gICAqL1xuICByZWFkb25seSByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgcGVyLWZpbGUgc2VlZCB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBTZWVkIGVudHJpZXMgZnJvbSBhIHJlY29nbml6ZWQgY29uc3VtZXIgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIC8qKlxuICAgKiBDdXJyZW50IGZpbGUgdHJlZSwgYXZhaWxhYmxlIHdpdGhvdXQgcmVhZGluZyBub3RlIHRleHQuXG4gICAqL1xuICByZWFkb25seSBmaWxlczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEZpbGVbXTtcbiAgLyoqXG4gICAqIEhhc2hlcyB0ZXh0IG9ubHkgd2hlbiBzaXplIG1hdGNoZXMgYnV0IG10aW1lIGRpZmZlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSByZXF1aXJpbmcgdmFsaWRhdGlvbi5cbiAgICogQHJldHVybnMgSXRzIGNvbnRlbnQgaGFzaC5cbiAgICovXG4gIHJlYWRvbmx5IGhhc2hGaWxlOiAocGF0aDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBTZWVkIHtcbiAgcmVhZG9ubHkgZW50cmllczogRGF0YVN0b3JlU2VlZEVudHJ5W107XG4gIHJlYWRvbmx5IGZvcm1hdDogMTtcbiAgcmVhZG9ubHkgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbmFsIHBlcmZvcm1hbmNlIGhpbnRzLiBTZWVkcyBhcmUgbmV2ZXIgYXV0aG9yaXRhdGl2ZSBzdGF0ZSBhbmQgbXVzdCBiZSB2YWxpZGF0ZWQgYmVmb3JlIHJldXNlLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlU2VlZHMge1xuICAvKipcbiAgICogRGV2aWNlLWxvY2FsIGlkZW50aXR5IGFuZCBzZXJpYWxpemF0aW9uIGJvdW5kYXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvY2FsOiBMb2NhbERhdGFTdG9yZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdG9yZSBzaGFyZXMgY2FjaGUgc2VlZHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdG9yZS1zY29wZWQgc25hcHNob3QgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0O1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGNhY2hlLXNlZWQgcHVibGlzaGVyIGFuZCByZWFkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBMb2NhbCBpZGVudGl0eSwgdHJhbnNwb3J0IGFuZCB0aGUgcGVyLXN0b3JlIHNoYXJpbmcgc2V0dGluZy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERhdGFTdG9yZVNlZWRzQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmxvY2FsID0gcGFyYW1zLmxvY2FsO1xuICAgIHRoaXMuc2hhcmUgPSBwYXJhbXMuc2hhcmU7XG4gICAgdGhpcy50cmFuc3BvcnQgPSBwYXJhbXMudHJhbnNwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFB1Ymxpc2hlcyBhIGJvdW5kZWQgc2VlZCwgcmVwbGFjaW5nIG9ubHkgdGhpcyBkZXZpY2UncyBlYXJsaWVyIHB1YmxpY2F0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGVudHJpZXMgLSBEZXJpdmVkIHJlY29yZHMgd2l0aCBmaWxlIHN0YXRpc3RpY3MgYW5kIGhhc2hlcy5cbiAgICogQHJldHVybnMgV2hldGhlciBzaGFyaW5nIHdhcyBlbmFibGVkIGFuZCB0aGUgc2VlZCB3YXMgcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2goZW50cmllczogcmVhZG9ubHkgRGF0YVN0b3JlU2VlZEVudHJ5W10pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuc2hhcmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHRoaXMubG9jYWwuZ2V0T3JDcmVhdGUoJ3NlZWQtZGV2aWNlLXYxJywgd2luZG93LmNyeXB0by5yYW5kb21VVUlEKCkpO1xuICAgICAgaWYgKHR5cGVvZiBkZXZpY2UgIT09ICdzdHJpbmcnIHx8ICEvXltcXHctXSskLy50ZXN0KGRldmljZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIHNlZWQgaWRlbnRpdHknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJvb3QgPSBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9zZWVkcy8ke2RldmljZX1gO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7cm9vdH0vc2VlZC0ke3dpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpfS1tYW5pZmVzdGA7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZSwgcGF5bG9hZDogeyBlbnRyaWVzLCBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCkgfSB9KTtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKGAke3Jvb3R9L3NlZWQtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBuZXdlc3QgY29tcGxldGUgc2VlZCBmb3IgdGhpcyB0cmFuc3BvcnQncyBzY2hlbWEuXG4gICAqXG4gICAqIEByZXR1cm5zIFNlZWQgcmVjb3Jkcywgb3IgYHVuZGVmaW5lZGAgaWYgc2hhcmluZyBpcyBkaXNhYmxlZCBvciBubyBjb21wbGV0ZSBzZWVkIGlzIGF2YWlsYWJsZSB5ZXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVhZExhdGVzdCgpOiBQcm9taXNlPERhdGFTdG9yZVNlZWRFbnRyeVtdIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCF0aGlzLnNoYXJlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMudHJhbnNwb3J0Lmxpc3QoKTtcbiAgICBsZXQgbmV3ZXN0ID0gLUluZmluaXR5O1xuICAgIGxldCBlbnRyaWVzOiBEYXRhU3RvcmVTZWVkRW50cnlbXSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghL1xcL3NlZWQtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChwYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWVkOiB1bmtub3duO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoIShpc1NlZWQoc2VlZCkgJiYgc2VlZC50aW1lID4gbmV3ZXN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3ZXN0ID0gc2VlZC50aW1lO1xuICAgICAgZW50cmllcyA9IHNlZWQuZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWVkIHVzaW5nIGZyZWUgZmlsZSBzdGF0aXN0aWNzIGZpcnN0LCBoYXNoaW5nIG9ubHkgc2l6ZS1lcXVhbCBtdGltZSBtaXNtYXRjaGVzLlxuICogRmlsZXMgYWJzZW50IGxvY2FsbHkgYXJlIGRpc2NhcmRlZC4gQ29uc3VtZXJzIGluZGV4IG9ubHkgdGhlIHJldHVybmVkIHJlYnVpbGQgcGF0aHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNlZWQsIGN1cnJlbnQgZmlsZSB0cmVlIGFuZCBjb250ZW50LWhhc2ggcmVhZGVyLlxuICogQHJldHVybnMgUmV1c2FibGUgcmVjb3JkcyBhbmQgdGhlIHBhdGhzIHRoYXQgc3RpbGwgbmVlZCBpbmRleGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YVN0b3JlU2VlZChwYXJhbXM6IFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyk6IFByb21pc2U8RGF0YVN0b3JlU2VlZFZhbGlkYXRpb24+IHtcbiAgY29uc3Qgc2VlZCA9IG5ldyBNYXAocGFyYW1zLmVudHJpZXMubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBhdGgsIGVudHJ5XSkpO1xuICBjb25zdCByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcmVidWlsZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIHBhcmFtcy5maWxlcykge1xuICAgIGNvbnN0IGVudHJ5ID0gc2VlZC5nZXQoZmlsZS5wYXRoKTtcbiAgICBpZiAoZW50cnk/LnNpemUgPT09IGZpbGUuc2l6ZSAmJiAoZW50cnkubXRpbWUgPT09IGZpbGUubXRpbWUgfHwgZW50cnkuaGFzaCA9PT0gYXdhaXQgcGFyYW1zLmhhc2hGaWxlKGZpbGUucGF0aCkpKSB7XG4gICAgICByZXVzYWJsZS5wdXNoKHsgLi4uZW50cnksIC4uLmZpbGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYnVpbGQucHVzaChmaWxlLnBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZWJ1aWxkLCByZXVzYWJsZSB9O1xufVxuXG5mdW5jdGlvbiBpc1NlZWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZWVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aW1lID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUudGltZSlcbiAgICAmJiAnZW50cmllcycgaW4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5lbnRyaWVzKSAmJiB2YWx1ZS5lbnRyaWVzLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3BhdGgnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5wYXRoID09PSAnc3RyaW5nJ1xuICAgICAgJiYgJ210aW1lJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkubXRpbWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShlbnRyeS5tdGltZSlcbiAgICAgICYmICdzaXplJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkuc2l6ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGVudHJ5LnNpemUpXG4gICAgICAmJiAnaGFzaCcgaW4gZW50cnkgJiYgdHlwZW9mIGVudHJ5Lmhhc2ggPT09ICdzdHJpbmcnICYmICd2YWx1ZScgaW4gZW50cnkgJiYgaXNEYXRhU3RvcmVKc29uVmFsdWUoZW50cnkudmFsdWUpXG4gICAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBV0EsU0FBUyw0QkFBNEI7QUFDckMsU0FBUywwQkFBMEI7QUFnRzVCLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVA7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1aLFlBQVksUUFBeUM7QUFDMUQsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxZQUFZLE9BQU87QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxRQUFRLFNBQTBEO0FBQzdFLFFBQUksQ0FBQyxLQUFLLE9BQU87QUFDZixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sTUFBTSxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQzVDLFlBQU0sU0FBUyxNQUFNLEtBQUssTUFBTSxZQUFZLGtCQUFrQixPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQ3hGLFVBQUksT0FBTyxXQUFXLFlBQVksQ0FBQyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzFELGNBQU0s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
115
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2RhdGEtc3RvcmUtc2VlZHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPcHRpb25hbCBjaHVua2VkIHNlZWRzIGZvciBleHBlbnNpdmUgZGVyaXZlZCBjYWNoZXMsIHdpdGggcGVyLWZpbGUgdmFsaWRhdGlvbiBiZWZvcmUgcmV1c2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IExvY2FsRGF0YVN0b3JlIH0gZnJvbSAnLi9sb2NhbC1kYXRhLXN0b3JlLnRzJztcblxuaW1wb3J0IHsgaXNEYXRhU3RvcmVKc29uVmFsdWUgfSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgeyBEYXRhU3RvcmVUcmFuc3BvcnQgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuLyoqXG4gKiBBIGRlcml2ZWQgcmVjb3JkIHRhZ2dlZCB3aXRoIGJvdGggY2hlYXAgc3RhdGlzdGljcyBhbmQgYSBjb250ZW50IGhhc2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlU2VlZEVudHJ5IGV4dGVuZHMgRGF0YVN0b3JlU2VlZEZpbGUge1xuICAvKipcbiAgICogQ29udGVudCBoYXNoLCB1c2luZyB0aGUgc2FtZSBhbGdvcml0aG0gb24gZXZlcnkgZGV2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaDogc3RyaW5nO1xuICAvKipcbiAgICogQ29uc3VtZXItZGVmaW5lZCBKU09OIGNhY2hlIHJlY29yZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbi8qKlxuICogQ2hlYXAgZmlsZSBpZGVudGl0eSBhbHJlYWR5IGF2YWlsYWJsZSBmcm9tIHRoZSB2YXVsdCdzIGZpbGUgdHJlZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVTZWVkRmlsZSB7XG4gIC8qKlxuICAgKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbXRpbWU6IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWxlIHNpemUgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBzaXplOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Igb3B0aW9uYWwgY2FjaGUtc2VlZCBzaGFyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVNlZWRzQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogRGVkaWNhdGVkIGRldmljZS1sb2NhbCBzdG9yZSB0aGF0IG93bnMgdGhlIHNlZWQgcHVibGlzaGVyIGlkZW50aXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWw6IExvY2FsRGF0YVN0b3JlO1xuICAvKipcbiAgICogUGVyLXN0b3JlIHVzZXIgc2V0dGluZy4gRGlzYWJsZWQgbWVhbnMgbmVpdGhlciBwdWJsaXNoaW5nIG5vciBhZG9wdGluZyBzZWVkcy5cbiAgICovXG4gIHJlYWRvbmx5IHNoYXJlOiBib29sZWFuO1xuICAvKipcbiAgICogU3RvcmUtc2NvcGVkLCBib3VuZGVkIHRyYW5zcG9ydC4gSW5jbHVkZSB0aGUgY29uc3VtZXIgc2NoZW1hIHZlcnNpb24gaW4gaXRzIHN0b3JlIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQ7XG59XG5cbi8qKlxuICogUmVzdWx0cyBvZiB2YWxpZGF0aW5nIGEgc2hhcmVkIGNhY2hlIHNlZWQgYWdhaW5zdCB0aGUgbG9jYWwgdmF1bHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlU2VlZFZhbGlkYXRpb24ge1xuICAvKipcbiAgICogRmlsZXMgYWJzZW50IGZyb20gdGhlIHNlZWQsIG9yIHdpdGggZGlmZmVyZW50IGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSByZWJ1aWxkOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFZhbGlkYXRlZCBzZWVkIHJlY29yZHMsIHdpdGggbG9jYWwgZmlsZSBzdGF0aXN0aWNzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV1c2FibGU6IERhdGFTdG9yZVNlZWRFbnRyeVtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHBlci1maWxlIHNlZWQgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0ZURhdGFTdG9yZVNlZWRQYXJhbXMge1xuICAvKipcbiAgICogU2VlZCBlbnRyaWVzIGZyb20gYSByZWNvZ25pemVkIGNvbnN1bWVyIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IERhdGFTdG9yZVNlZWRFbnRyeVtdO1xuICAvKipcbiAgICogQ3VycmVudCBmaWxlIHRyZWUsIGF2YWlsYWJsZSB3aXRob3V0IHJlYWRpbmcgbm90ZSB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZXM6IHJlYWRvbmx5IERhdGFTdG9yZVNlZWRGaWxlW107XG4gIC8qKlxuICAgKiBIYXNoZXMgdGV4dCBvbmx5IHdoZW4gc2l6ZSBtYXRjaGVzIGJ1dCBtdGltZSBkaWZmZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcmVxdWlyaW5nIHZhbGlkYXRpb24uXG4gICAqIEByZXR1cm5zIEl0cyBjb250ZW50IGhhc2guXG4gICAqL1xuICByZWFkb25seSBoYXNoRmlsZTogKHBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgU2VlZCB7XG4gIHJlYWRvbmx5IGVudHJpZXM6IERhdGFTdG9yZVNlZWRFbnRyeVtdO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBwZXJmb3JtYW5jZSBoaW50cy4gU2VlZHMgYXJlIG5ldmVyIGF1dGhvcml0YXRpdmUgc3RhdGUgYW5kIG11c3QgYmUgdmFsaWRhdGVkIGJlZm9yZSByZXVzZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yZVNlZWRzIHtcbiAgLyoqXG4gICAqIERldmljZS1sb2NhbCBpZGVudGl0eSBhbmQgc2VyaWFsaXphdGlvbiBib3VuZGFyeS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RvcmUgc2hhcmVzIGNhY2hlIHNlZWRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNoYXJlOiBib29sZWFuO1xuICAvKipcbiAgICogU3RvcmUtc2NvcGVkIHNuYXBzaG90IHRyYW5zcG9ydC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFuc3BvcnQ6IERhdGFTdG9yZVRyYW5zcG9ydDtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjYWNoZS1zZWVkIHB1Ymxpc2hlciBhbmQgcmVhZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gTG9jYWwgaWRlbnRpdHksIHRyYW5zcG9ydCBhbmQgdGhlIHBlci1zdG9yZSBzaGFyaW5nIHNldHRpbmcuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEYXRhU3RvcmVTZWVkc0NvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5sb2NhbCA9IHBhcmFtcy5sb2NhbDtcbiAgICB0aGlzLnNoYXJlID0gcGFyYW1zLnNoYXJlO1xuICAgIHRoaXMudHJhbnNwb3J0ID0gcGFyYW1zLnRyYW5zcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBib3VuZGVkIHNlZWQsIHJlcGxhY2luZyBvbmx5IHRoaXMgZGV2aWNlJ3MgZWFybGllciBwdWJsaWNhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyaWVzIC0gRGVyaXZlZCByZWNvcmRzIHdpdGggZmlsZSBzdGF0aXN0aWNzIGFuZCBoYXNoZXMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgc2hhcmluZyB3YXMgZW5hYmxlZCBhbmQgdGhlIHNlZWQgd2FzIHB1Ymxpc2hlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdWJsaXNoKGVudHJpZXM6IHJlYWRvbmx5IERhdGFTdG9yZVNlZWRFbnRyeVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnNoYXJlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkZXZpY2UgPSBhd2FpdCB0aGlzLmxvY2FsLmdldE9yQ3JlYXRlKCdzZWVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICAgIGlmICh0eXBlb2YgZGV2aWNlICE9PSAnc3RyaW5nJyB8fCAhL15bXFx3LV0rJC8udGVzdChkZXZpY2UpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBzZWVkIGlkZW50aXR5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCByb290ID0gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vc2VlZHMvJHtkZXZpY2V9YDtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy50cmFuc3BvcnQubGlzdCgpO1xuICAgICAgY29uc3QgYmFzZSA9IGAke3Jvb3R9L3NlZWQtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgO1xuICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGVTbmFwc2hvdCh7IGJhc2UsIHBheWxvYWQ6IHsgZW50cmllcywgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpIH0gfSk7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9zZWVkLWApKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgbmV3ZXN0IGNvbXBsZXRlIHNlZWQgZm9yIHRoaXMgdHJhbnNwb3J0J3Mgc2NoZW1hLlxuICAgKlxuICAgKiBAcmV0dXJucyBTZWVkIHJlY29yZHMsIG9yIGBudWxsYCBpZiBzaGFyaW5nIGlzIGRpc2FibGVkIG9yIG5vIGNvbXBsZXRlIHNlZWQgaXMgYXZhaWxhYmxlIHlldC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkTGF0ZXN0KCk6IFByb21pc2U8RGF0YVN0b3JlU2VlZEVudHJ5W10gfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLnNoYXJlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgbGV0IG5ld2VzdCA9IC1JbmZpbml0eTtcbiAgICBsZXQgZW50cmllczogRGF0YVN0b3JlU2VlZEVudHJ5W10gfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghL1xcL3NlZWQtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChwYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBzZWVkOiB1bmtub3duO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoIShpc1NlZWQoc2VlZCkgJiYgc2VlZC50aW1lID4gbmV3ZXN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbmV3ZXN0ID0gc2VlZC50aW1lO1xuICAgICAgZW50cmllcyA9IHNlZWQuZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWVkIHVzaW5nIGZyZWUgZmlsZSBzdGF0aXN0aWNzIGZpcnN0LCBoYXNoaW5nIG9ubHkgc2l6ZS1lcXVhbCBtdGltZSBtaXNtYXRjaGVzLlxuICogRmlsZXMgYWJzZW50IGxvY2FsbHkgYXJlIGRpc2NhcmRlZC4gQ29uc3VtZXJzIGluZGV4IG9ubHkgdGhlIHJldHVybmVkIHJlYnVpbGQgcGF0aHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNlZWQsIGN1cnJlbnQgZmlsZSB0cmVlIGFuZCBjb250ZW50LWhhc2ggcmVhZGVyLlxuICogQHJldHVybnMgUmV1c2FibGUgcmVjb3JkcyBhbmQgdGhlIHBhdGhzIHRoYXQgc3RpbGwgbmVlZCBpbmRleGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlRGF0YVN0b3JlU2VlZChwYXJhbXM6IFZhbGlkYXRlRGF0YVN0b3JlU2VlZFBhcmFtcyk6IFByb21pc2U8RGF0YVN0b3JlU2VlZFZhbGlkYXRpb24+IHtcbiAgY29uc3Qgc2VlZCA9IG5ldyBNYXAocGFyYW1zLmVudHJpZXMubWFwKChlbnRyeSkgPT4gW2VudHJ5LnBhdGgsIGVudHJ5XSkpO1xuICBjb25zdCByZXVzYWJsZTogRGF0YVN0b3JlU2VlZEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcmVidWlsZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIHBhcmFtcy5maWxlcykge1xuICAgIGNvbnN0IGVudHJ5ID0gc2VlZC5nZXQoZmlsZS5wYXRoKTtcbiAgICBpZiAoZW50cnk/LnNpemUgPT09IGZpbGUuc2l6ZSAmJiAoZW50cnkubXRpbWUgPT09IGZpbGUubXRpbWUgfHwgZW50cnkuaGFzaCA9PT0gYXdhaXQgcGFyYW1zLmhhc2hGaWxlKGZpbGUucGF0aCkpKSB7XG4gICAgICByZXVzYWJsZS5wdXNoKHsgLi4uZW50cnksIC4uLmZpbGUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlYnVpbGQucHVzaChmaWxlLnBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyByZWJ1aWxkLCByZXVzYWJsZSB9O1xufVxuXG5mdW5jdGlvbiBpc1NlZWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZWVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgJ2Zvcm1hdCcgaW4gdmFsdWUgJiYgdmFsdWUuZm9ybWF0ID09PSAxXG4gICAgJiYgJ3RpbWUnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aW1lID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodmFsdWUudGltZSlcbiAgICAmJiAnZW50cmllcycgaW4gdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZS5lbnRyaWVzKSAmJiB2YWx1ZS5lbnRyaWVzLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICAgIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiYgZW50cnkgIT09IG51bGwgJiYgJ3BhdGgnIGluIGVudHJ5ICYmIHR5cGVvZiBlbnRyeS5wYXRoID09PSAnc3RyaW5nJ1xuICAgICAgJiYgJ210aW1lJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkubXRpbWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShlbnRyeS5tdGltZSlcbiAgICAgICYmICdzaXplJyBpbiBlbnRyeSAmJiB0eXBlb2YgZW50cnkuc2l6ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGVudHJ5LnNpemUpXG4gICAgICAmJiAnaGFzaCcgaW4gZW50cnkgJiYgdHlwZW9mIGVudHJ5Lmhhc2ggPT09ICdzdHJpbmcnICYmICd2YWx1ZScgaW4gZW50cnkgJiYgaXNEYXRhU3RvcmVKc29uVmFsdWUoZW50cnkudmFsdWUpXG4gICAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBVUEsU0FBUyw0QkFBNEI7QUFDckMsU0FBUywwQkFBMEI7QUFnRzVCLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVA7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1aLFlBQVksUUFBeUM7QUFDMUQsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxRQUFRLE9BQU87QUFDcEIsU0FBSyxZQUFZLE9BQU87QUFBQSxFQUMxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxRQUFRLFNBQTBEO0FBQzdFLFFBQUksQ0FBQyxLQUFLLE9BQU87QUFDZixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sTUFBTSxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQzVDLFlBQU0sU0FBUyxNQUFNLEtBQUssTUFBTSxZQUFZLGtCQUFrQixPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQ3hGLFVBQUksT0FBTyxXQUFXLFlBQVksQ0FBQyxXQUFXLEtBQUssTUFBTSxHQUFHO0FBQzFELGNBQU0sSUFBSSxNQUFNLDZCQUE2QjtBQUFBLE1BQy9DO0FBQ0EsWUFBTSxPQUFPLEdBQUcsS0FBSyxVQUFVLElBQUksVUFBVSxNQUFNO0FBQ25ELFlBQU0sUUFBUSxNQUFNLEtBQUssVUFBVSxLQUFLO0FBQ3hDLFlBQU0sT0FBTyxHQUFHLElBQUksU0FBUyxPQUFPLE9BQU8sV0FBVyxDQUFDO0FBQ3ZELFlBQU0sS0FBSyxVQUFVLGNBQWMsRUFBRSxNQUFNLFNBQVMsRUFBRSxTQUFTLFFBQVEsR0FBRyxNQUFNLEtBQUssSUFBSSxFQUFFLEVBQUUsQ0FBQztBQUM5Rixp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
@@ -60,7 +60,8 @@ export interface DataStoreTransportWriteSnapshotParams {
60
60
  readonly payload: unknown;
61
61
  }
62
62
  /**
63
- * A store-scoped transport. Every published document is immutable except device acknowledgements.
63
+ * A store-scoped transport. Every published document is immutable except device acknowledgements and append-only
64
+ * journal segments, which only their own device rewrites and only by extending them.
64
65
  */
65
66
  export declare class DataStoreTransport {
66
67
  protected readonly params: DataStoreTransportConstructorParams;
@@ -108,6 +109,13 @@ export declare class DataStoreTransport {
108
109
  * @returns Vault-relative paths.
109
110
  */
110
111
  list(): Promise<string[]>;
112
+ /**
113
+ * Measures the complete encoded size of a new document without writing.
114
+ *
115
+ * @param value - JSON payload.
116
+ * @returns UTF-8 bytes, encoding wrapper included.
117
+ */
118
+ measure(value: unknown): number;
111
119
  /**
112
120
  * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
113
121
  *
@@ -137,6 +145,15 @@ export declare class DataStoreTransport {
137
145
  * @returns A promise that resolves once the adapter finishes writing.
138
146
  */
139
147
  write(path: string, value: unknown): Promise<void>;
148
+ /**
149
+ * Publishes an append-only document: an occupied path is rewritten only when the new list strictly extends the stored one.
150
+ * A reader that sees an older copy sees a prefix, so it applies fewer entries and never a different one.
151
+ *
152
+ * @param path - Vault-relative destination within this store.
153
+ * @param values - JSON-compatible entries; the stored entries must be their prefix.
154
+ * @returns A promise that resolves after publication, or at once when the stored list is already identical.
155
+ */
156
+ writeAppendOnly(path: string, values: readonly unknown[]): Promise<void>;
140
157
  /**
141
158
  * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
142
159
  *
@@ -154,6 +171,18 @@ export declare class DataStoreTransport {
154
171
  writeSnapshot(params: DataStoreTransportWriteSnapshotParams): Promise<void>;
155
172
  private checkPath;
156
173
  private checkSize;
174
+ /**
175
+ * Reconciles a destination whose bytes differ from the source. Only a journal segment may differ, because it grows
176
+ * while its device writes it, so either copy may be the older prefix of the other; anything else is a conflict.
177
+ *
178
+ * @param target - Destination transport.
179
+ * @param path - Source path.
180
+ * @param destination - Destination path.
181
+ * @param text - Source bytes.
182
+ * @returns Whether the source was written over the destination, which must then be verified.
183
+ */
184
+ private copyOverDifferentHistory;
157
185
  private encode;
158
186
  private ensureParent;
187
+ private readStoredList;
159
188
  }
@@ -42,6 +42,7 @@ const DOCUMENT_SUFFIX = "\n```\n";
42
42
  const BISECTION_DIVISOR = 2;
43
43
  const HEX_RADIX = 16;
44
44
  const HEX_BYTE_LENGTH = 2;
45
+ const JOURNAL_SEGMENT_REG_EXP = /\/log-\d+\.(?:md|json)$/;
45
46
  class DataStoreTransport {
46
47
  /**
47
48
  * Creates a bounded vault transport.
@@ -99,7 +100,7 @@ class DataStoreTransport {
99
100
  const files = allFiles.filter((path) => path.startsWith(`${this.root}/devices/`));
100
101
  const complete = /* @__PURE__ */ new Set();
101
102
  for (const path of files) {
102
- if (/\/log-\d+\.(?:md|json)$/.test(path) && await this.read(path) !== void 0) {
103
+ if (JOURNAL_SEGMENT_REG_EXP.test(path) && await this.read(path) !== void 0) {
103
104
  complete.add(path);
104
105
  }
105
106
  if (!/\/snapshot-[\w-]+-manifest\.(?:md|json)$/.test(path) || await this.readSnapshot(path) === void 0) {
@@ -122,8 +123,8 @@ class DataStoreTransport {
122
123
  const destination = target.root + path.slice(this.root.length);
123
124
  target.checkPath(destination);
124
125
  if (await target.adapter.exists(destination)) {
125
- if (await target.adapter.read(destination) !== text) {
126
- throw new Error("Conflicting immutable data-store history");
126
+ if (await target.adapter.read(destination) !== text && !await this.copyOverDifferentHistory(target, path, destination, text)) {
127
+ continue;
127
128
  }
128
129
  } else {
129
130
  await target.ensureParent(destination);
@@ -141,7 +142,7 @@ class DataStoreTransport {
141
142
  * @returns Whether its document fits the configured cap.
142
143
  */
143
144
  fits(value) {
144
- return new TextEncoder().encode(this.encode(value)).length <= this.maxFileBytes;
145
+ return this.measure(value) <= this.maxFileBytes;
145
146
  }
146
147
  /**
147
148
  * Lists the store's files recursively, never leaving its folder.
@@ -162,6 +163,15 @@ class DataStoreTransport {
162
163
  }
163
164
  return files.sort();
164
165
  }
166
+ /**
167
+ * Measures the complete encoded size of a new document without writing.
168
+ *
169
+ * @param value - JSON payload.
170
+ * @returns UTF-8 bytes, encoding wrapper included.
171
+ */
172
+ measure(value) {
173
+ return new TextEncoder().encode(this.encode(value)).length;
174
+ }
165
175
  /**
166
176
  * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
167
177
  *
@@ -253,6 +263,32 @@ class DataStoreTransport {
253
263
  await this.ensureParent(path);
254
264
  await this.adapter.write(path, text);
255
265
  }
266
+ /**
267
+ * Publishes an append-only document: an occupied path is rewritten only when the new list strictly extends the stored one.
268
+ * A reader that sees an older copy sees a prefix, so it applies fewer entries and never a different one.
269
+ *
270
+ * @param path - Vault-relative destination within this store.
271
+ * @param values - JSON-compatible entries; the stored entries must be their prefix.
272
+ * @returns A promise that resolves after publication, or at once when the stored list is already identical.
273
+ */
274
+ async writeAppendOnly(path, values) {
275
+ this.checkPath(path);
276
+ const text = this.encode(values, path.endsWith(".json"));
277
+ this.checkSize(text);
278
+ if (await this.adapter.exists(path)) {
279
+ const stored = await this.readStoredList(path);
280
+ if (stored === null || !isListPrefix(stored, values)) {
281
+ throw new Error("Conflicting immutable data-store document");
282
+ }
283
+ if (stored.length === values.length) {
284
+ return;
285
+ }
286
+ await this.adapter.write(path, text);
287
+ return;
288
+ }
289
+ await this.ensureParent(path);
290
+ await this.adapter.write(path, text);
291
+ }
256
292
  /**
257
293
  * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
258
294
  *
@@ -329,6 +365,31 @@ class DataStoreTransport {
329
365
  getObsidianLibDebugger("DataStore")(message);
330
366
  throw new Error(message);
331
367
  }
368
+ /**
369
+ * Reconciles a destination whose bytes differ from the source. Only a journal segment may differ, because it grows
370
+ * while its device writes it, so either copy may be the older prefix of the other; anything else is a conflict.
371
+ *
372
+ * @param target - Destination transport.
373
+ * @param path - Source path.
374
+ * @param destination - Destination path.
375
+ * @param text - Source bytes.
376
+ * @returns Whether the source was written over the destination, which must then be verified.
377
+ */
378
+ async copyOverDifferentHistory(target, path, destination, text) {
379
+ const source = JOURNAL_SEGMENT_REG_EXP.test(path) ? await this.readStoredList(path) : null;
380
+ const copied = source === null ? null : await target.readStoredList(destination);
381
+ if (source === null || copied === null) {
382
+ throw new Error("Conflicting immutable data-store history");
383
+ }
384
+ if (isListPrefix(source, copied)) {
385
+ return false;
386
+ }
387
+ if (!isListPrefix(copied, source)) {
388
+ throw new Error("Conflicting immutable data-store history");
389
+ }
390
+ await target.adapter.write(destination, text);
391
+ return true;
392
+ }
332
393
  encode(value, isJson = this.extension === ".json") {
333
394
  const json = JSON.stringify(value);
334
395
  if (json === void 0) {
@@ -353,15 +414,27 @@ class DataStoreTransport {
353
414
  }
354
415
  }
355
416
  }
417
+ async readStoredList(path) {
418
+ let value;
419
+ try {
420
+ value = await this.read(path);
421
+ } catch {
422
+ return null;
423
+ }
424
+ return Array.isArray(value) ? value : null;
425
+ }
356
426
  }
357
427
  async function digest(text) {
358
428
  const hash = await window.crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
359
429
  return [...new Uint8Array(hash)].map((byte) => byte.toString(HEX_RADIX).padStart(HEX_BYTE_LENGTH, "0")).join("");
360
430
  }
431
+ function isListPrefix(prefix, list) {
432
+ return prefix.length <= list.length && prefix.every((value, index) => JSON.stringify(value) === JSON.stringify(list[index]));
433
+ }
361
434
  function isSafeVaultPath(path) {
362
435
  return path.split("/").every((part) => part.length > 0 && part !== "." && part !== ".." && !/[<>:"\\|?*\p{Control}]|[. ]$/u.test(part));
363
436
  }
364
437
  export {
365
438
  DataStoreTransport
366
439
  };
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaXplLWJvdW5kZWQgTWFya2Rvd24gb3IgSlNPTiB0cmFuc3BvcnQsIHdpdGggdmVyaWZpZWQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuXG5jb25zdCBERUZBVUxUX01BWF9GSUxFX0JZVEVTID0gMV8wMDBfMDAwO1xuY29uc3QgTUlOX0ZJTEVfQllURVMgPSAyNTY7XG5jb25zdCBNQVhfRklMRV9CWVRFUyA9IDRfMDAwXzAwMDtcbmNvbnN0IE1BWF9TTkFQU0hPVF9CWVRFUyA9IDY0XzAwMF8wMDA7XG5jb25zdCBET0NVTUVOVF9QUkVGSVggPSAnYGBganNvblxcbic7XG5jb25zdCBET0NVTUVOVF9TVUZGSVggPSAnXFxuYGBgXFxuJztcbmNvbnN0IEJJU0VDVElPTl9ESVZJU09SID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUgc2hhcmVkLXN0b3JlIHZhdWx0IHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyOyBubyBkZXNrdG9wIGZpbGVzeXN0ZW0gQVBJcyBhcmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEb2N1bWVudCBlbmNvZGluZy4gSlNPTiByZXF1aXJlcyBhIHN5bmMgdG9vbCBjb25maWd1cmVkIHRvIGNhcnJ5IGFyYml0cmFyeSBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBpbiBhbnkgZmlsZSwgaW5jbHVkaW5nIGl0cyBlbmNvZGluZyB3cmFwcGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gdGhlIHJlY29uc3RydWN0ZWQgc25hcHNob3QsIGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcgYSBjaHVua2VkIHNuYXBzaG90LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVRyYW5zcG9ydFdyaXRlU25hcHNob3RQYXJhbXMge1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgYmFzZSBwYXRoIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi4gVXNlIGEgZnJlc2ggdW5pcXVlIG5hbWUgZm9yIGV2ZXJ5IHB1YmxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogc3RyaW5nO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHNuYXBzaG90LCBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSBhbmQgY292ZXJhZ2UgbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgc3RvcmUtc2NvcGVkIHRyYW5zcG9ydC4gRXZlcnkgcHVibGlzaGVkIGRvY3VtZW50IGlzIGltbXV0YWJsZSBleGNlcHQgZGV2aWNlIGFja25vd2xlZGdlbWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAvKipcbiAgRmlsZSBleHRlbnNpb24gZm9yIG5ldyBkb2N1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGVuY29kZWQgYnl0ZXMgcGVyIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heEZpbGVCeXRlczogbnVtYmVyO1xuICAvKipcbiAgICogRnVsbCB2YXVsdC1yZWxhdGl2ZSBzdG9yZSByb290LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIgdXNlZCBieSB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTbmFwc2hvdEJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBib3VuZGVkIHZhdWx0IHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkYXB0ZXIsIGlkZW50aXR5IGFuZCBmaWxlIGJvdW5kcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWRhcHRlciA9IHBhcmFtcy5hZGFwdGVyO1xuICAgIHRoaXMuZXh0ZW5zaW9uID0gcGFyYW1zLmZvcm1hdCA9PT0gJ2pzb24nID8gJy5qc29uJyA6ICcubWQnO1xuICAgIGNvbnN0IGZvbGRlciA9IHBhcmFtcy5mb2xkZXIgPz8gJ1BsdWdpbiBkYXRhJztcbiAgICBpZiAoXG4gICAgICAhaXNTYWZlVmF1bHRQYXRoKGZvbGRlcilcbiAgICAgIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5wbHVnaW5JZCkgfHwgIS9eW1xcdy1dKyQvLnRlc3QocGFyYW1zLnN0b3JlSWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3RvcmUgcmVxdWlyZXMgYSBzYWZlIHZhdWx0LXJlbGF0aXZlIGZvbGRlciBhbmQgc2FmZSBwbHVnaW4vc3RvcmUgaWRzJyk7XG4gICAgfVxuICAgIHRoaXMucm9vdCA9IGAke2ZvbGRlcn0vJHtwYXJhbXMucGx1Z2luSWR9LyR7cGFyYW1zLnN0b3JlSWR9YDtcbiAgICB0aGlzLm1heEZpbGVCeXRlcyA9IHBhcmFtcy5tYXhGaWxlQnl0ZXMgPz8gREVGQVVMVF9NQVhfRklMRV9CWVRFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHRoaXMubWF4RmlsZUJ5dGVzKSB8fCB0aGlzLm1heEZpbGVCeXRlcyA8IE1JTl9GSUxFX0JZVEVTIHx8IHRoaXMubWF4RmlsZUJ5dGVzID4gTUFYX0ZJTEVfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBmaWxlIGxpbWl0IG11c3QgYmUgYmV0d2VlbiAyNTYgYW5kIDQwMDAwMDAgYnl0ZXMnKTtcbiAgICB9XG4gICAgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzID0gcGFyYW1zLm1heFNuYXBzaG90Qnl0ZXMgPz8gTUFYX1NOQVBTSE9UX0JZVEVTO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPiBNQVhfU05BUFNIT1RfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBzbmFwc2hvdCBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA2NDAwMDAwMCBieXRlcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgaGlzdG9yeSBieXRlIGZvciBieXRlLCBwcmVzZXJ2aW5nIHNvdXJjZSBmaWxlcyBhbmQgcmVmdXNpbmcgY29uZmxpY3RpbmcgaW1tdXRhYmxlIGRlc3RpbmF0aW9ucy5cbiAgICogQWNrbm93bGVkZ2VtZW50cyBhcmUgbG9jYWwgdG8gZWFjaCBsb2NhdGlvbiBhbmQgYXJlIG5vdCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBEZXN0aW5hdGlvbiBmb3IgdGhpcyBzYW1lIHBsdWdpbiBhbmQgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGV2ZXJ5IGNvcGllZCBmaWxlIGhhcyBiZWVuIHZlcmlmaWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvcHlIaXN0b3J5VG8odGFyZ2V0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wYXJhbXMucGx1Z2luSWQgIT09IHRhcmdldC5wYXJhbXMucGx1Z2luSWQgfHwgdGhpcy5wYXJhbXMuc3RvcmVJZCAhPT0gdGFyZ2V0LnBhcmFtcy5zdG9yZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb3B5IGRhdGEtc3RvcmUgaGlzdG9yeSB0byBhIGRpZmZlcmVudCBzdG9yZScpO1xuICAgIH1cbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5yb290fS9kZXZpY2VzL2ApKTtcbiAgICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgaWYgKC9cXC9sb2ctXFxkK1xcLig/Om1kfGpzb24pJC8udGVzdChwYXRoKSAmJiBhd2FpdCB0aGlzLnJlYWQocGF0aCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21wbGV0ZS5hZGQocGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAoIS9cXC9zbmFwc2hvdC1bXFx3LV0rLW1hbmlmZXN0XFwuKD86bWR8anNvbikkLy50ZXN0KHBhdGgpIHx8IGF3YWl0IHRoaXMucmVhZFNuYXBzaG90KHBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmVuZHNXaXRoKCcuanNvbicpID8gJy5qc29uJyA6ICcubWQnO1xuICAgICAgY29uc3QgYmFzZSA9IHBhdGguc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBmaWxlcykge1xuICAgICAgICBpZiAoY2h1bmsuc3RhcnRzV2l0aChgJHtiYXNlfS1gKSAmJiBjaHVuay5lbmRzV2l0aChleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29tcGxldGUuYWRkKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcGxldGUuYWRkKHBhdGgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgY29tcGxldGUpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHBhdGgpO1xuICAgICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgICB0YXJnZXQuY2hlY2tTaXplKHRleHQpO1xuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQucm9vdCArIHBhdGguc2xpY2UodGhpcy5yb290Lmxlbmd0aCk7XG4gICAgICB0YXJnZXQuY2hlY2tQYXRoKGRlc3RpbmF0aW9uKTtcbiAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5leGlzdHMoZGVzdGluYXRpb24pKSB7XG4gICAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5yZWFkKGRlc3RpbmF0aW9uKSAhPT0gdGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0YXJnZXQuZW5zdXJlUGFyZW50KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmFkYXB0ZXIud3JpdGUoZGVzdGluYXRpb24sIHRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBoaXN0b3J5IGNvcHkgZmFpbGVkIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGl0cyBkb2N1bWVudCBmaXRzIHRoZSBjb25maWd1cmVkIGNhcC5cbiAgICovXG4gIHB1YmxpYyBmaXRzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0aGlzLmVuY29kZSh2YWx1ZSkpLmxlbmd0aCA8PSB0aGlzLm1heEZpbGVCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgc3RvcmUncyBmaWxlcyByZWN1cnNpdmVseSwgbmV2ZXIgbGVhdmluZyBpdHMgZm9sZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBWYXVsdC1yZWxhdGl2ZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHModGhpcy5yb290KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMucm9vdF07XG4gICAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm9sZGVyID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZy5zaGlmdCgpKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5hZGFwdGVyLmxpc3QoZm9sZGVyKTtcbiAgICAgIGZpbGVzLnB1c2goLi4uY2hpbGRyZW4uZmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgICAgcGVuZGluZy5wdXNoKC4uLmNoaWxkcmVuLmZvbGRlcnMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGNvbXBsZXRlIGZlbmNlZCBNYXJrZG93biBKU09OIG9yIGEgdmVyc2lvbi1vbmUgSlNPTiBlbnZlbG9wZS4gUGFydGlhbCBkb2N1bWVudHMgcmVtYWluIHBlbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8IGRvY3VtZW50ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmZvcm1hdCAhPT0gMSB8fCAhKCdwYXlsb2FkJyBpbiBkb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gZGF0YS1zdG9yZSBkb2N1bWVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnBheWxvYWQ7XG4gICAgfVxuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGhhc2hdIG9mIG1hbmlmZXN0Lmhhc2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKX0tJHtTdHJpbmcoaW5kZXgpfSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgfHwgYXdhaXQgZGlnZXN0KGNodW5rKSAhPT0gaGFzaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnl0ZXMgKz0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKS5sZW5ndGg7XG4gICAgICBpZiAoYnl0ZXMgPiB0aGlzLm1heFNuYXBzaG90Qnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHNuYXBzaG90IGV4Y2VlZHMgZGVjb2RlZCBieXRlIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gaW1tdXRhYmxlIGRvY3VtZW50LCBhY2NlcHRpbmcgb25seSBieXRlLWlkZW50aWNhbCByZXRyaWVzIGF0IGFuIG9jY3VwaWVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiBvciBhbiBpZGVudGljYWwgcmV0cnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd3JpdGVJbW11dGFibGUocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZSwgcGF0aC5lbmRzV2l0aCgnLmpzb24nKSk7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChwYXRoKSAhPT0gdGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGlmIChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGF5bG9hZCkubGVuZ3RoID4gdGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgZXhjZWVkcyBkZWNvZGVkIGJ5dGUgbGltaXQnKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgPCBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgbGV0IGxvdyA9IDE7XG4gICAgICBsZXQgaGlnaCA9IE1hdGgubWluKHBheWxvYWQubGVuZ3RoIC0gb2Zmc2V0LCB0aGlzLm1heEZpbGVCeXRlcyk7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gQklTRUNUSU9OX0RJVklTT1IpO1xuICAgICAgICBpZiAodGhpcy5maXRzKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtaWRkbGUpKSkge1xuICAgICAgICAgIGxvdyA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2gocGF5bG9hZC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxvdykpO1xuICAgICAgb2Zmc2V0ICs9IGxvdztcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBoYXNoZXMucHVzaChhd2FpdCBkaWdlc3QoY2h1bmspKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IGZvcm1hdDogMSwgaGFzaGVzIH07XG4gICAgdGhpcy5jaGVja1NpemUodGhpcy5lbmNvZGUobWFuaWZlc3QpKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGUoYCR7cGFyYW1zLmJhc2V9LSR7U3RyaW5nKGluZGV4KX0ke3RoaXMuZXh0ZW5zaW9ufWAsIGNodW5rKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZShgJHtwYXJhbXMuYmFzZX0ke3RoaXMuZXh0ZW5zaW9ufWAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmNvZGUodmFsdWU6IHVua25vd24sIGlzSnNvbiA9IHRoaXMuZXh0ZW5zaW9uID09PSAnLmpzb24nKTogc3RyaW5nIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChqc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBwYXlsb2FkIG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBpc0pzb24gPyBKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogMSwgcGF5bG9hZDogdmFsdWUgfSkgOiBgJHtET0NVTUVOVF9QUkVGSVh9JHtqc29ufSR7RE9DVU1FTlRfU1VGRklYfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVBhcmVudChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBwYXJ0cy5wb3AoKTtcbiAgICBsZXQgZm9sZGVyID0gJyc7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBmb2xkZXIgPSBmb2xkZXIgPyBgJHtmb2xkZXJ9LyR7cGFydH1gIDogcGFydDtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhmb2xkZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLm1rZGlyKGZvbGRlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGNBQWM7QUFFdkIsU0FBUyw4QkFBOEI7QUFFdkMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sa0JBQWtCO0FBNkRqQixNQUFNLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXdCdkIsWUFBK0IsUUFBNkM7QUFBN0M7QUFDcEMsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxZQUFZLE9BQU8sV0FBVyxTQUFTLFVBQVU7QUFDdEQsVUFBTSxTQUFTLE9BQU8sVUFBVTtBQUNoQyxRQUNFLENBQUMsZ0JBQWdCLE1BQU0sS0FDcEIsQ0FBQyxXQUFXLEtBQUssT0FBTyxRQUFRLEtBQUssQ0FBQyxXQUFXLEtBQUssT0FBTyxPQUFPLEdBQ3ZFO0FBQ0EsWUFBTSxJQUFJLE1BQU0sNEVBQTRFO0FBQUEsSUFDOUY7QUFDQSxTQUFLLE9BQU8sR0FBRyxNQUFNLElBQUksT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPO0FBQzFELFNBQUssZUFBZSxPQUFPLGdCQUFnQjtBQUMzQyxRQUFJLENBQUMsT0FBTyxjQUFjLEtBQUssWUFBWSxLQUFLLEtBQUssZUFBZSxrQkFBa0IsS0FBSyxlQUFlLGdCQUFnQjtBQUN4SCxZQUFNLElBQUksTUFBTSw2REFBNkQ7QUFBQSxJQUMvRTtBQUNBLFNBQUssbUJBQW1CLE9BQU8sb0JBQW9CO0FBQ25ELFFBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxnQkFBZ0IsS0FBSyxLQUFLLG1CQUFtQixrQkFBa0IsS0FB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
440
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2l6ZS1ib3VuZGVkIE1hcmtkb3duIG9yIEpTT04gdHJhbnNwb3J0LCB3aXRoIHZlcmlmaWVkIGNodW5rZWQgc25hcHNob3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGF0YUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4uL2RlYnVnLnRzJztcblxuY29uc3QgREVGQVVMVF9NQVhfRklMRV9CWVRFUyA9IDFfMDAwXzAwMDtcbmNvbnN0IE1JTl9GSUxFX0JZVEVTID0gMjU2O1xuY29uc3QgTUFYX0ZJTEVfQllURVMgPSA0XzAwMF8wMDA7XG5jb25zdCBNQVhfU05BUFNIT1RfQllURVMgPSA2NF8wMDBfMDAwO1xuY29uc3QgRE9DVU1FTlRfUFJFRklYID0gJ2BgYGpzb25cXG4nO1xuY29uc3QgRE9DVU1FTlRfU1VGRklYID0gJ1xcbmBgYFxcbic7XG5jb25zdCBCSVNFQ1RJT05fRElWSVNPUiA9IDI7XG5jb25zdCBIRVhfUkFESVggPSAxNjtcbmNvbnN0IEhFWF9CWVRFX0xFTkdUSCA9IDI7XG5jb25zdCBKT1VSTkFMX1NFR01FTlRfUkVHX0VYUCA9IC9cXC9sb2ctXFxkK1xcLig/Om1kfGpzb24pJC87XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHNoYXJlZC1zdG9yZSB2YXVsdCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVmF1bHQgYWRhcHRlcjsgbm8gZGVza3RvcCBmaWxlc3lzdGVtIEFQSXMgYXJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogRG9jdW1lbnQgZW5jb2RpbmcuIEpTT04gcmVxdWlyZXMgYSBzeW5jIHRvb2wgY29uZmlndXJlZCB0byBjYXJyeSBhcmJpdHJhcnkgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbWFya2Rvd24nYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogJ2pzb24nIHwgJ21hcmtkb3duJztcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYW55IGZpbGUsIGluY2x1ZGluZyBpdHMgZW5jb2Rpbmcgd3JhcHBlci5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBtYXhGaWxlQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIGluIHRoZSByZWNvbnN0cnVjdGVkIHNuYXBzaG90LCBiZWZvcmUgSlNPTiBwYXJzaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjQwMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBtYXhTbmFwc2hvdEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogUGx1Z2luIG1hbmlmZXN0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JlIG5hbWUgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nIGEgY2h1bmtlZCBzbmFwc2hvdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGJhc2UgcGF0aCB3aXRob3V0IGl0cyBleHRlbnNpb24uIFVzZSBhIGZyZXNoIHVuaXF1ZSBuYW1lIGZvciBldmVyeSBwdWJsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2U6IHN0cmluZztcbiAgLyoqXG4gICAqIEpTT04tY29tcGF0aWJsZSBzbmFwc2hvdCwgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgYW5kIGNvdmVyYWdlIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIHN0b3JlLXNjb3BlZCB0cmFuc3BvcnQuIEV2ZXJ5IHB1Ymxpc2hlZCBkb2N1bWVudCBpcyBpbW11dGFibGUgZXhjZXB0IGRldmljZSBhY2tub3dsZWRnZW1lbnRzIGFuZCBhcHBlbmQtb25seVxuICogam91cm5hbCBzZWdtZW50cywgd2hpY2ggb25seSB0aGVpciBvd24gZGV2aWNlIHJld3JpdGVzIGFuZCBvbmx5IGJ5IGV4dGVuZGluZyB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlVHJhbnNwb3J0IHtcbiAgLyoqXG4gIEZpbGUgZXh0ZW5zaW9uIGZvciBuZXcgZG9jdW1lbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogTWF4aW11bSBlbmNvZGVkIGJ5dGVzIHBlciBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhGaWxlQnl0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEZ1bGwgdmF1bHQtcmVsYXRpdmUgc3RvcmUgcm9vdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb290OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyIHVzZWQgYnkgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWRhcHRlcjogRGF0YUFkYXB0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U25hcHNob3RCeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYm91bmRlZCB2YXVsdCB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBZGFwdGVyLCBpZGVudGl0eSBhbmQgZmlsZSBib3VuZHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFkYXB0ZXIgPSBwYXJhbXMuYWRhcHRlcjtcbiAgICB0aGlzLmV4dGVuc2lvbiA9IHBhcmFtcy5mb3JtYXQgPT09ICdqc29uJyA/ICcuanNvbicgOiAnLm1kJztcbiAgICBjb25zdCBmb2xkZXIgPSBwYXJhbXMuZm9sZGVyID8/ICdQbHVnaW4gZGF0YSc7XG4gICAgaWYgKFxuICAgICAgIWlzU2FmZVZhdWx0UGF0aChmb2xkZXIpXG4gICAgICB8fCAhL15bXFx3LV0rJC8udGVzdChwYXJhbXMucGx1Z2luSWQpIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5zdG9yZUlkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHN0b3JlIHJlcXVpcmVzIGEgc2FmZSB2YXVsdC1yZWxhdGl2ZSBmb2xkZXIgYW5kIHNhZmUgcGx1Z2luL3N0b3JlIGlkcycpO1xuICAgIH1cbiAgICB0aGlzLnJvb3QgPSBgJHtmb2xkZXJ9LyR7cGFyYW1zLnBsdWdpbklkfS8ke3BhcmFtcy5zdG9yZUlkfWA7XG4gICAgdGhpcy5tYXhGaWxlQnl0ZXMgPSBwYXJhbXMubWF4RmlsZUJ5dGVzID8/IERFRkFVTFRfTUFYX0ZJTEVfQllURVM7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih0aGlzLm1heEZpbGVCeXRlcykgfHwgdGhpcy5tYXhGaWxlQnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heEZpbGVCeXRlcyA+IE1BWF9GSUxFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgZmlsZSBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA0MDAwMDAwIGJ5dGVzJyk7XG4gICAgfVxuICAgIHRoaXMubWF4U25hcHNob3RCeXRlcyA9IHBhcmFtcy5tYXhTbmFwc2hvdEJ5dGVzID8/IE1BWF9TTkFQU0hPVF9CWVRFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHRoaXMubWF4U25hcHNob3RCeXRlcykgfHwgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzIDwgTUlOX0ZJTEVfQllURVMgfHwgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzID4gTUFYX1NOQVBTSE9UX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgbGltaXQgbXVzdCBiZSBiZXR3ZWVuIDI1NiBhbmQgNjQwMDAwMDAgYnl0ZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIGhpc3RvcnkgYnl0ZSBmb3IgYnl0ZSwgcHJlc2VydmluZyBzb3VyY2UgZmlsZXMgYW5kIHJlZnVzaW5nIGNvbmZsaWN0aW5nIGltbXV0YWJsZSBkZXN0aW5hdGlvbnMuXG4gICAqIEFja25vd2xlZGdlbWVudHMgYXJlIGxvY2FsIHRvIGVhY2ggbG9jYXRpb24gYW5kIGFyZSBub3QgY29waWVkLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gRGVzdGluYXRpb24gZm9yIHRoaXMgc2FtZSBwbHVnaW4gYW5kIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBldmVyeSBjb3BpZWQgZmlsZSBoYXMgYmVlbiB2ZXJpZmllZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb3B5SGlzdG9yeVRvKHRhcmdldDogRGF0YVN0b3JlVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGFyYW1zLnBsdWdpbklkICE9PSB0YXJnZXQucGFyYW1zLnBsdWdpbklkIHx8IHRoaXMucGFyYW1zLnN0b3JlSWQgIT09IHRhcmdldC5wYXJhbXMuc3RvcmVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29weSBkYXRhLXN0b3JlIGhpc3RvcnkgdG8gYSBkaWZmZXJlbnQgc3RvcmUnKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBmaWxlcyA9IGFsbEZpbGVzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgY29tcGxldGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmIChKT1VSTkFMX1NFR01FTlRfUkVHX0VYUC50ZXN0KHBhdGgpICYmIGF3YWl0IHRoaXMucmVhZChwYXRoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbXBsZXRlLmFkZChwYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmICghL1xcL3NuYXBzaG90LVtcXHctXSstbWFuaWZlc3RcXC4oPzptZHxqc29uKSQvLnRlc3QocGF0aCkgfHwgYXdhaXQgdGhpcy5yZWFkU25hcHNob3QocGF0aCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBiYXNlID0gcGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChjaHVuay5zdGFydHNXaXRoKGAke2Jhc2V9LWApICYmIGNodW5rLmVuZHNXaXRoKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb21wbGV0ZS5hZGQoY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wbGV0ZS5hZGQocGF0aCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0KTtcbiAgICAgIHRhcmdldC5jaGVja1NpemUodGV4dCk7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRhcmdldC5yb290ICsgcGF0aC5zbGljZSh0aGlzLnJvb3QubGVuZ3RoKTtcbiAgICAgIHRhcmdldC5jaGVja1BhdGgoZGVzdGluYXRpb24pO1xuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLmV4aXN0cyhkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0ICYmICFhd2FpdCB0aGlzLmNvcHlPdmVyRGlmZmVyZW50SGlzdG9yeSh0YXJnZXQsIHBhdGgsIGRlc3RpbmF0aW9uLCB0ZXh0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0YXJnZXQuZW5zdXJlUGFyZW50KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmFkYXB0ZXIud3JpdGUoZGVzdGluYXRpb24sIHRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBoaXN0b3J5IGNvcHkgZmFpbGVkIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGl0cyBkb2N1bWVudCBmaXRzIHRoZSBjb25maWd1cmVkIGNhcC5cbiAgICovXG4gIHB1YmxpYyBmaXRzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZSh2YWx1ZSkgPD0gdGhpcy5tYXhGaWxlQnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIHN0b3JlJ3MgZmlsZXMgcmVjdXJzaXZlbHksIG5ldmVyIGxlYXZpbmcgaXRzIGZvbGRlci5cbiAgICpcbiAgICogQHJldHVybnMgVmF1bHQtcmVsYXRpdmUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdCgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHRoaXMucm9vdCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IFt0aGlzLnJvb3RdO1xuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZvbGRlciA9IGVuc3VyZU5vbk51bGxhYmxlKHBlbmRpbmcuc2hpZnQoKSk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuYWRhcHRlci5saXN0KGZvbGRlcik7XG4gICAgICBmaWxlcy5wdXNoKC4uLmNoaWxkcmVuLmZpbGVzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke2ZvbGRlcn0vYCkpKTtcbiAgICAgIHBlbmRpbmcucHVzaCguLi5jaGlsZHJlbi5mb2xkZXJzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke2ZvbGRlcn0vYCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzLnNvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlcyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIG9mIGEgbmV3IGRvY3VtZW50IHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBVVEYtOCBieXRlcywgZW5jb2Rpbmcgd3JhcHBlciBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRoaXMuZW5jb2RlKHZhbHVlKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGNvbXBsZXRlIGZlbmNlZCBNYXJrZG93biBKU09OIG9yIGEgdmVyc2lvbi1vbmUgSlNPTiBlbnZlbG9wZS4gUGFydGlhbCBkb2N1bWVudHMgcmVtYWluIHBlbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8IGRvY3VtZW50ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmZvcm1hdCAhPT0gMSB8fCAhKCdwYXlsb2FkJyBpbiBkb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gZGF0YS1zdG9yZSBkb2N1bWVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnBheWxvYWQ7XG4gICAgfVxuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGhhc2hdIG9mIG1hbmlmZXN0Lmhhc2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKX0tJHtTdHJpbmcoaW5kZXgpfSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgfHwgYXdhaXQgZGlnZXN0KGNodW5rKSAhPT0gaGFzaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnl0ZXMgKz0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKS5sZW5ndGg7XG4gICAgICBpZiAoYnl0ZXMgPiB0aGlzLm1heFNuYXBzaG90Qnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHNuYXBzaG90IGV4Y2VlZHMgZGVjb2RlZCBieXRlIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gYXBwZW5kLW9ubHkgZG9jdW1lbnQ6IGFuIG9jY3VwaWVkIHBhdGggaXMgcmV3cml0dGVuIG9ubHkgd2hlbiB0aGUgbmV3IGxpc3Qgc3RyaWN0bHkgZXh0ZW5kcyB0aGUgc3RvcmVkIG9uZS5cbiAgICogQSByZWFkZXIgdGhhdCBzZWVzIGFuIG9sZGVyIGNvcHkgc2VlcyBhIHByZWZpeCwgc28gaXQgYXBwbGllcyBmZXdlciBlbnRyaWVzIGFuZCBuZXZlciBhIGRpZmZlcmVudCBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBKU09OLWNvbXBhdGlibGUgZW50cmllczsgdGhlIHN0b3JlZCBlbnRyaWVzIG11c3QgYmUgdGhlaXIgcHJlZml4LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiwgb3IgYXQgb25jZSB3aGVuIHRoZSBzdG9yZWQgbGlzdCBpcyBhbHJlYWR5IGlkZW50aWNhbC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB3cml0ZUFwcGVuZE9ubHkocGF0aDogc3RyaW5nLCB2YWx1ZXM6IHJlYWRvbmx5IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZXMsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCB0aGlzLnJlYWRTdG9yZWRMaXN0KHBhdGgpO1xuICAgICAgaWYgKHN0b3JlZCA9PT0gbnVsbCB8fCAhaXNMaXN0UHJlZml4KHN0b3JlZCwgdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoc3RvcmVkLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIud3JpdGUocGF0aCwgdGV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gaW1tdXRhYmxlIGRvY3VtZW50LCBhY2NlcHRpbmcgb25seSBieXRlLWlkZW50aWNhbCByZXRyaWVzIGF0IGFuIG9jY3VwaWVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiBvciBhbiBpZGVudGljYWwgcmV0cnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd3JpdGVJbW11dGFibGUocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZSwgcGF0aC5lbmRzV2l0aCgnLmpzb24nKSk7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChwYXRoKSAhPT0gdGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGlmIChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGF5bG9hZCkubGVuZ3RoID4gdGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgZXhjZWVkcyBkZWNvZGVkIGJ5dGUgbGltaXQnKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgPCBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgbGV0IGxvdyA9IDE7XG4gICAgICBsZXQgaGlnaCA9IE1hdGgubWluKHBheWxvYWQubGVuZ3RoIC0gb2Zmc2V0LCB0aGlzLm1heEZpbGVCeXRlcyk7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gQklTRUNUSU9OX0RJVklTT1IpO1xuICAgICAgICBpZiAodGhpcy5maXRzKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtaWRkbGUpKSkge1xuICAgICAgICAgIGxvdyA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2gocGF5bG9hZC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxvdykpO1xuICAgICAgb2Zmc2V0ICs9IGxvdztcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBoYXNoZXMucHVzaChhd2FpdCBkaWdlc3QoY2h1bmspKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IGZvcm1hdDogMSwgaGFzaGVzIH07XG4gICAgdGhpcy5jaGVja1NpemUodGhpcy5lbmNvZGUobWFuaWZlc3QpKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGUoYCR7cGFyYW1zLmJhc2V9LSR7U3RyaW5nKGluZGV4KX0ke3RoaXMuZXh0ZW5zaW9ufWAsIGNodW5rKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZShgJHtwYXJhbXMuYmFzZX0ke3RoaXMuZXh0ZW5zaW9ufWAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgYSBkZXN0aW5hdGlvbiB3aG9zZSBieXRlcyBkaWZmZXIgZnJvbSB0aGUgc291cmNlLiBPbmx5IGEgam91cm5hbCBzZWdtZW50IG1heSBkaWZmZXIsIGJlY2F1c2UgaXQgZ3Jvd3NcbiAgICogd2hpbGUgaXRzIGRldmljZSB3cml0ZXMgaXQsIHNvIGVpdGhlciBjb3B5IG1heSBiZSB0aGUgb2xkZXIgcHJlZml4IG9mIHRoZSBvdGhlcjsgYW55dGhpbmcgZWxzZSBpcyBhIGNvbmZsaWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gRGVzdGluYXRpb24gdHJhbnNwb3J0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFNvdXJjZSBwYXRoLlxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gLSBEZXN0aW5hdGlvbiBwYXRoLlxuICAgKiBAcGFyYW0gdGV4dCAtIFNvdXJjZSBieXRlcy5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgc291cmNlIHdhcyB3cml0dGVuIG92ZXIgdGhlIGRlc3RpbmF0aW9uLCB3aGljaCBtdXN0IHRoZW4gYmUgdmVyaWZpZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlPdmVyRGlmZmVyZW50SGlzdG9yeSh0YXJnZXQ6IERhdGFTdG9yZVRyYW5zcG9ydCwgcGF0aDogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBKT1VSTkFMX1NFR01FTlRfUkVHX0VYUC50ZXN0KHBhdGgpID8gYXdhaXQgdGhpcy5yZWFkU3RvcmVkTGlzdChwYXRoKSA6IG51bGw7XG4gICAgY29uc3QgY29waWVkID0gc291cmNlID09PSBudWxsID8gbnVsbCA6IGF3YWl0IHRhcmdldC5yZWFkU3RvcmVkTGlzdChkZXN0aW5hdGlvbik7XG4gICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBjb3BpZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgIH1cbiAgICBpZiAoaXNMaXN0UHJlZml4KHNvdXJjZSwgY29waWVkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWlzTGlzdFByZWZpeChjb3BpZWQsIHNvdXJjZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgIH1cbiAgICBhd2FpdCB0YXJnZXQuYWRhcHRlci53cml0ZShkZXN0aW5hdGlvbiwgdGV4dCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGVuY29kZSh2YWx1ZTogdW5rbm93biwgaXNKc29uID0gdGhpcy5leHRlbnNpb24gPT09ICcuanNvbicpOiBzdHJpbmcge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKGpzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBheWxvYWQgbXVzdCBiZSBKU09OLWNvbXBhdGlibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSnNvbiA/IEpTT04uc3RyaW5naWZ5KHsgZm9ybWF0OiAxLCBwYXlsb2FkOiB2YWx1ZSB9KSA6IGAke0RPQ1VNRU5UX1BSRUZJWH0ke2pzb259JHtET0NVTUVOVF9TVUZGSVh9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlUGFyZW50KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhcnRzLnBvcCgpO1xuICAgIGxldCBmb2xkZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGZvbGRlciA9IGZvbGRlciA/IGAke2ZvbGRlcn0vJHtwYXJ0fWAgOiBwYXJ0O1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIubWtkaXIoZm9sZGVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMoZm9sZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkTGlzdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCB1bmtub3duW10+IHtcbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkKHBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzTGlzdFByZWZpeChwcmVmaXg6IHJlYWRvbmx5IHVua25vd25bXSwgbGlzdDogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVmaXgubGVuZ3RoIDw9IGxpc3QubGVuZ3RoICYmIHByZWZpeC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGxpc3RbaW5kZXhdKSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGNBQWM7QUFFdkIsU0FBUyw4QkFBOEI7QUFFdkMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sMEJBQTBCO0FBOER6QixNQUFNLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXdCdkIsWUFBK0IsUUFBNkM7QUFBN0M7QUFDcEMsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxZQUFZLE9BQU8sV0FBVyxTQUFTLFVBQVU7QUFDdEQsVUFBTSxTQUFTLE9BQU8sVUFBVTtBQUNoQyxRQUNFLENBQUMs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