@mnaoumov/obsidian-lib 10.11.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 (460) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/worker-component/package.json +6 -0
  5. package/components/worker-pool-component/package.json +6 -0
  6. package/components/workspace-layout-state-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +477 -285
  8. package/dist/lib/cjs/__merged.d.cts +26 -10
  9. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  10. package/dist/lib/cjs/app.cjs +2 -2
  11. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  12. package/dist/lib/cjs/attachment-path.cjs +9 -9
  13. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  15. package/dist/lib/cjs/backlink-index.cjs +5 -5
  16. package/dist/lib/cjs/backlink.cjs +7 -7
  17. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  18. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  19. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  20. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  21. package/dist/lib/cjs/bug-report.cjs +38 -12
  22. package/dist/lib/cjs/bug-report.d.cts +65 -0
  23. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  24. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  25. package/dist/lib/cjs/callout.cjs +6 -6
  26. package/dist/lib/cjs/canvas.cjs +11 -9
  27. package/dist/lib/cjs/canvas.d.cts +13 -0
  28. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  29. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  30. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  31. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  32. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  33. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  34. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  35. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  39. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  40. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  41. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  42. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  43. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  44. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  46. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
  47. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  48. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  49. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  50. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  51. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  52. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  53. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  54. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  55. package/dist/lib/cjs/community-plugins.cjs +3 -3
  56. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  57. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  58. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  59. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  60. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  61. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  62. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  63. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  64. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  65. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  66. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  67. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  68. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  69. package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
  70. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  71. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
  72. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  73. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  74. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  75. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  76. package/dist/lib/cjs/components/index.cjs +54 -39
  77. package/dist/lib/cjs/components/index.d.cts +5 -0
  78. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  79. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  80. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  81. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  82. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  83. package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
  84. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  85. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  86. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  87. package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
  88. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  89. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  90. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  91. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  92. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  93. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  94. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  95. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  96. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  97. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  98. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  99. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  100. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  101. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  102. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  103. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  104. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  105. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  106. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  107. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  108. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  109. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  110. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  111. package/dist/lib/cjs/constructors/index.cjs +1 -1
  112. package/dist/lib/cjs/css-class.cjs +5 -1
  113. package/dist/lib/cjs/css-class.d.cts +16 -0
  114. package/dist/lib/cjs/data-handler.cjs +264 -6
  115. package/dist/lib/cjs/data-handler.d.cts +219 -2
  116. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  117. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  118. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  119. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  120. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  121. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  122. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  123. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  124. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  125. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  126. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  127. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  128. package/dist/lib/cjs/dataview-link.cjs +2 -2
  129. package/dist/lib/cjs/dataview.cjs +27 -7
  130. package/dist/lib/cjs/dataview.d.cts +14 -0
  131. package/dist/lib/cjs/debug.cjs +3 -3
  132. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  133. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  134. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  135. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  136. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  137. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  138. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  139. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  140. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  141. package/dist/lib/cjs/disposable.cjs +150 -0
  142. package/dist/lib/cjs/disposable.d.cts +39 -0
  143. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  144. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  145. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  146. package/dist/lib/cjs/editor.cjs +6 -6
  147. package/dist/lib/cjs/events.cjs +2 -2
  148. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  149. package/dist/lib/cjs/feature-request.cjs +1 -1
  150. package/dist/lib/cjs/file-change.cjs +10 -10
  151. package/dist/lib/cjs/file-explorer.cjs +2 -2
  152. package/dist/lib/cjs/file-manager.cjs +5 -5
  153. package/dist/lib/cjs/file-system.cjs +10 -10
  154. package/dist/lib/cjs/folder-note.cjs +4 -4
  155. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  156. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  157. package/dist/lib/cjs/frontmatter.cjs +5 -5
  158. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  159. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  160. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  161. package/dist/lib/cjs/hotkey.cjs +1 -1
  162. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  163. package/dist/lib/cjs/html-element.cjs +2 -2
  164. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  165. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  166. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  167. package/dist/lib/cjs/i18n/index.cjs +4 -4
  168. package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
  169. package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
  170. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  171. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  172. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
  173. package/dist/lib/cjs/index.cjs +147 -126
  174. package/dist/lib/cjs/index.d.cts +7 -0
  175. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  176. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  177. package/dist/lib/cjs/library-styles.cjs +3 -3
  178. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  179. package/dist/lib/cjs/link.cjs +76 -56
  180. package/dist/lib/cjs/link.d.cts +20 -14
  181. package/dist/lib/cjs/logger.cjs +4 -4
  182. package/dist/lib/cjs/loop.cjs +10 -16
  183. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  184. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  185. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  186. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  187. package/dist/lib/cjs/markdown-view.cjs +191 -3
  188. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  189. package/dist/lib/cjs/markdown.cjs +12 -12
  190. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  191. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  192. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  193. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  194. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  195. package/dist/lib/cjs/modals/alert.cjs +4 -4
  196. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  197. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  198. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  199. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  200. package/dist/lib/cjs/modals/index.cjs +17 -11
  201. package/dist/lib/cjs/modals/index.d.cts +2 -0
  202. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  203. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  204. package/dist/lib/cjs/modals/modal.cjs +3 -3
  205. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  206. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  207. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  208. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  209. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  210. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  211. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  212. package/dist/lib/cjs/note-priority.cjs +2 -2
  213. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  214. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  215. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  216. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  217. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  218. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  219. package/dist/lib/cjs/parse-link.cjs +14 -14
  220. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  221. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  222. package/dist/lib/cjs/path-settings.cjs +3 -3
  223. package/dist/lib/cjs/pdf.cjs +2 -2
  224. package/dist/lib/cjs/plugin/index.cjs +18 -12
  225. package/dist/lib/cjs/plugin/index.d.cts +2 -0
  226. package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
  227. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  228. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  229. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  230. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  231. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  232. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  233. package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
  234. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  235. package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
  236. package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
  237. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  238. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  239. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  240. package/dist/lib/cjs/plugin/plugin.cjs +133 -34
  241. package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
  242. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  243. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  244. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  245. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  246. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  247. package/dist/lib/cjs/popovers/index.cjs +3 -3
  248. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  249. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  250. package/dist/lib/cjs/queue.cjs +8 -8
  251. package/dist/lib/cjs/react/app-context.cjs +3 -3
  252. package/dist/lib/cjs/react/index.cjs +1 -1
  253. package/dist/lib/cjs/reference-definition.cjs +1 -1
  254. package/dist/lib/cjs/reference.cjs +3 -3
  255. package/dist/lib/cjs/release-asset.cjs +5 -5
  256. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  257. package/dist/lib/cjs/request-url.cjs +4 -4
  258. package/dist/lib/cjs/resource-lock.cjs +46 -42
  259. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  260. package/dist/lib/cjs/resource-url.cjs +3 -3
  261. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  262. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  264. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  265. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  266. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  268. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  269. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  270. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  271. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  272. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  273. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  274. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  275. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  276. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  277. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  278. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  279. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  280. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  281. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  282. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  283. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  284. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  285. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  286. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  287. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  288. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  289. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  290. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  291. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  292. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  293. package/dist/lib/cjs/setting-ex.cjs +26 -26
  294. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  295. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  296. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  297. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  298. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  299. package/dist/lib/cjs/templater.cjs +14 -4
  300. package/dist/lib/cjs/templater.d.cts +6 -0
  301. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  302. package/dist/lib/cjs/transformers/index.cjs +1 -1
  303. package/dist/lib/cjs/trusted-input.cjs +1 -1
  304. package/dist/lib/cjs/validation.cjs +4 -4
  305. package/dist/lib/cjs/vault-delete.cjs +6 -6
  306. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  307. package/dist/lib/cjs/vault.cjs +12 -12
  308. package/dist/lib/cjs/view-registrar.cjs +1 -1
  309. package/dist/lib/cjs/virtual-file.cjs +16 -14
  310. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  311. package/dist/lib/cjs/wasm.cjs +119 -0
  312. package/dist/lib/cjs/wasm.d.cts +54 -0
  313. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  314. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  315. package/dist/lib/cjs/workspace.cjs +1 -1
  316. package/dist/lib/esm/__merged.d.mts +26 -10
  317. package/dist/lib/esm/__merged.mjs +215 -5
  318. package/dist/lib/esm/app.mjs +2 -2
  319. package/dist/lib/esm/attachment-path.d.mts +3 -3
  320. package/dist/lib/esm/attachment-path.mjs +2 -2
  321. package/dist/lib/esm/backlink-index.mjs +2 -2
  322. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  323. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  324. package/dist/lib/esm/bug-report.d.mts +65 -0
  325. package/dist/lib/esm/bug-report.mjs +33 -10
  326. package/dist/lib/esm/canvas.d.mts +13 -0
  327. package/dist/lib/esm/canvas.mjs +6 -5
  328. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  329. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  330. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  331. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  332. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  333. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  334. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  335. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  336. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  337. package/dist/lib/esm/components/component-ex.mjs +19 -6
  338. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  339. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  340. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  341. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  342. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  343. package/dist/lib/esm/components/index.d.mts +5 -0
  344. package/dist/lib/esm/components/index.mjs +12 -2
  345. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  346. package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
  347. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  348. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  349. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  350. package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
  351. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  352. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  353. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  354. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  355. package/dist/lib/esm/components/worker-component.mjs +279 -0
  356. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  357. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  358. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  359. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  360. package/dist/lib/esm/css-class.d.mts +16 -0
  361. package/dist/lib/esm/css-class.mjs +5 -1
  362. package/dist/lib/esm/data-handler.d.mts +219 -2
  363. package/dist/lib/esm/data-handler.mjs +262 -5
  364. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  365. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  366. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  367. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  368. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  369. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  370. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  371. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  372. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  373. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  374. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  375. package/dist/lib/esm/dataview.d.mts +14 -0
  376. package/dist/lib/esm/dataview.mjs +19 -1
  377. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  378. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  379. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  380. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  381. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  382. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  383. package/dist/lib/esm/disposable.d.mts +39 -0
  384. package/dist/lib/esm/disposable.mjs +64 -0
  385. package/dist/lib/esm/file-system.mjs +2 -2
  386. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  387. package/dist/lib/esm/generated-during-build.mjs +2 -2
  388. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  389. package/dist/lib/esm/git-rename-history.mjs +1 -1
  390. package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
  391. package/dist/lib/esm/i18n/locales/en.mjs +27 -1
  392. package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
  393. package/dist/lib/esm/index.d.mts +7 -0
  394. package/dist/lib/esm/index.mjs +15 -1
  395. package/dist/lib/esm/link.d.mts +20 -14
  396. package/dist/lib/esm/link.mjs +57 -38
  397. package/dist/lib/esm/loop.mjs +2 -8
  398. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  399. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  400. package/dist/lib/esm/markdown-view.d.mts +48 -1
  401. package/dist/lib/esm/markdown-view.mjs +192 -2
  402. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  403. package/dist/lib/esm/metadata-cache.mjs +6 -6
  404. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  405. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  406. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  407. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  408. package/dist/lib/esm/modals/index.d.mts +2 -0
  409. package/dist/lib/esm/modals/index.mjs +5 -1
  410. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  411. package/dist/lib/esm/modals/prompt.mjs +1 -1
  412. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  413. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  414. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  415. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  416. package/dist/lib/esm/parse-link.mjs +4 -4
  417. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  418. package/dist/lib/esm/path-compatibility.mjs +277 -0
  419. package/dist/lib/esm/plugin/index.d.mts +2 -0
  420. package/dist/lib/esm/plugin/index.mjs +6 -2
  421. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  422. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  423. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  424. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  425. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  426. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  427. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  428. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  429. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  430. package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
  431. package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
  432. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  433. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  434. package/dist/lib/esm/plugin/plugin.d.mts +35 -5
  435. package/dist/lib/esm/plugin/plugin.mjs +118 -9
  436. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  437. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  438. package/dist/lib/esm/release-asset.mjs +1 -1
  439. package/dist/lib/esm/resource-lock.d.mts +8 -7
  440. package/dist/lib/esm/resource-lock.mjs +31 -26
  441. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  442. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  443. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  444. package/dist/lib/esm/settings-recovery.mjs +125 -0
  445. package/dist/lib/esm/settings-tabs.mjs +2 -2
  446. package/dist/lib/esm/templater.d.mts +6 -0
  447. package/dist/lib/esm/templater.mjs +11 -2
  448. package/dist/lib/esm/vault.mjs +1 -1
  449. package/dist/lib/esm/virtual-file.d.mts +2 -1
  450. package/dist/lib/esm/virtual-file.mjs +7 -5
  451. package/dist/lib/esm/wasm.d.mts +54 -0
  452. package/dist/lib/esm/wasm.mjs +30 -0
  453. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  454. package/dist/lib/esm/worker-protocol.mjs +113 -0
  455. package/dist/styles.css +16 -1
  456. package/modals/copy-text-manually/package.json +6 -0
  457. package/modals/review-bug-report-diagnostics/package.json +6 -0
  458. package/package.json +10 -8
  459. package/plugin/plugin-instance/package.json +6 -0
  460. package/plugin/third-party-plugin/package.json +6 -0
@@ -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/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGNBQWM7QUFFdkIsU0FBUyw4QkFBOEI7QUFFdkMsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sMEJBQTBCO0FBOER6QixNQUFNLG1CQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXdCdkIsWUFBK0IsUUFBNkM7QUFBN0M7QUFDcEMsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxZQUFZLE9BQU8sV0FBVyxTQUFTLFVBQVU7QUFDdEQsVUFBTSxTQUFTLE9BQU8sVUFBVTtBQUNoQyxRQUNFLENBQUMsZ0JBQWdCLE1BQU0sS0FDcEIsQ0FBQyxXQUFXLEtBQUssT0FBTyxRQUFRLEtBQUssQ0FBQyxXQUFXLEtBQUssT0FBTyxPQUFPLEdBQ3ZFO0FBQ0EsWUFBTSxJQUFJLE1BQU0sNEVBQTRFO0FBQUEsSUFDOUY7QUFDQSxTQUFLLE9BQU8sR0FBRyxNQUFNLElBQUksT0FBTyxRQUFRLElBQUksT0FBTyxPQUFPO0FBQzFELFNBQUssZUFBZSxPQUFPLGdCQUFnQjtBQUMzQyxRQUFJLENBQUMsT0FBTyxjQUFjLEtBQUssWUFBWSxLQUFLLEtBQUssZUFBZSxrQkFBa0IsS0FBSyxlQUFlLGdCQUFnQjtBQUN4SCxZQUFNLElBQUksTUFBTSw2REFBNkQ7QUFBQSxJQUMvRTtBQUNBLFNBQUssbUJBQW1CLE9BQU8sb0JBQW9CO0FBQ25ELFFBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxnQkFBZ0IsS0FBSyxLQUFLLG1CQUFtQixrQkFBa0IsS0FBSyxtQkFBbUIsb0JBQW9CO0FBQ3hJLFlBQU0sSUFBSSxNQUFNLGtFQUFrRTtBQUFBLElBQ3BGO0FBQUEsRUFDRjtBQUFBLEVBbkJzQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBcEJ0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJRztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBbUNqQixNQUFhLGNBQWMsUUFBMkM7QUFDcEUsUUFBSSxLQUFLLE9BQU8sYUFBYSxPQUFPLE9BQU8sWUFBWSxLQUFLLE9BQU8sWUFBWSxPQUFPLE9BQU8sU0FBUztBQUNwRyxZQUFNLElBQUksTUFBTSxxREFBcUQ7QUFBQSxJQUN2RTtBQUNBLFVBQU0sV0FBVyxNQUFNLEtBQUssS0FBSztBQUNqQyxVQUFNLFFBQVEsU0FBUyxPQUFPLENBQUMsU0FBUyxLQUFLLFdBQVcsR0FBRyxLQUFLLElBQUksV0FBVyxDQUFDO0FBQ2hGLFVBQU0sV0FBVyxvQkFBSSxJQUFZO0FBQ2pDLGVBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQUksd0JBQXdCLEtBQUssSUFBSSxLQUFLLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxRQUFXO0FBQzdFLGlCQUFTLElBQUksSUFBSTtBQUFBLE1BQ25CO0FBQ0EsVUFBSSxDQUFDLDJDQUEyQyxLQUFLLElBQUksS0FBSyxNQUFNLEtBQUssYUFBYSxJQUFJLE1BQU0sUUFBVztBQUN6RztBQUFBLE1BQ0Y7QUFDQSxZQUFNLFlBQVksS0FBSyxTQUFTLE9BQU8sSUFBSSxVQUFVO0FBQ3JELFlBQU0sT0FBTyxLQUFLLE1BQU0sR0FBRyxDQUFDLFVBQVUsTUFBTTtBQUM1QyxpQkFBVyxTQUFTLE9BQU87QUFDekIsWUFBSSxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsS0FBSyxNQUFNLFNBQVMsU0FBUyxHQUFHO0FBQzdELG1CQUFTLElBQUksS0FBSztBQUFBLFFBQ3BCO0FBQUEsTUFDRjtBQUNBLGVBQVMsSUFBSSxJQUFJO0FBQUEsSUFDbkI7QUFDQSxlQUFXLFFBQVEsVUFBVTtBQUMzQixXQUFLLFVBQVUsSUFBSTtBQUNuQixZQUFNLE9BQU8sTUFBTSxLQUFLLFFBQVEsS0FBSyxJQUFJO0FBQ3pDLFdBQUssVUFBVSxJQUFJO0FBQ25CLGFBQU8sVUFBVSxJQUFJO0FBQ3JCLFlBQU0sY0FBYyxPQUFPLE9BQU8sS0FBSyxNQUFNLEtBQUssS0FBSyxNQUFNO0FBQzdELGFBQU8sVUFBVSxXQUFXO0FBQzVCLFVBQUksTUFBTSxPQUFPLFFBQVEsT0FBTyxXQUFXLEdBQUc7QUFDNUMsWUFBSSxNQUFNLE9BQU8sUUFBUSxLQUFLLFdBQVcsTUFBTSxRQUFRLENBQUMsTUFBTSxLQUFLLHlCQUF5QixRQUFRLE1BQU0sYUFBYSxJQUFJLEdBQUc7QUFDNUg7QUFBQSxRQUNGO0FBQUEsTUFDRixPQUFPO0FBQ0wsY0FBTSxPQUFPLGFBQWEsV0FBVztBQUNyQyxjQUFNLE9BQU8sUUFBUSxNQUFNLGFBQWEsSUFBSTtBQUFBLE1BQzlDO0FBQ0EsVUFBSSxNQUFNLE9BQU8sUUFBUSxLQUFLLFdBQVcsTUFBTSxNQUFNO0FBQ25ELGNBQU0sSUFBSSxNQUFNLDZDQUE2QztBQUFBLE1BQy9EO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLEtBQUssT0FBeUI7QUFDbkMsV0FBTyxLQUFLLFFBQVEsS0FBSyxLQUFLLEtBQUs7QUFBQSxFQUNyQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsT0FBMEI7QUFDckMsUUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLE9BQU8sS0FBSyxJQUFJLEdBQUc7QUFDekMsYUFBTyxDQUFDO0FBQUEsSUFDVjtBQUNBLFVBQU0sVUFBVSxDQUFDLEtBQUssSUFBSTtBQUMxQixVQUFNLFFBQWtCLENBQUM7QUFDekIsV0FBTyxRQUFRLFNBQVMsR0FBRztBQUN6QixZQUFNLFNBQVMsa0JBQWtCLFFBQVEsTUFBTSxDQUFDO0FBQ2hELFlBQU0sV0FBVyxNQUFNLEtBQUssUUFBUSxLQUFLLE1BQU07QUFDL0MsWUFBTSxLQUFLLEdBQUcsU0FBUyxNQUFNLE9BQU8sQ0FBQyxTQUFTLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDNUUsY0FBUSxLQUFLLEdBQUcsU0FBUyxRQUFRLE9BQU8sQ0FBQyxTQUFTLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFBQSxJQUNsRjtBQUNBLFdBQU8sTUFBTSxLQUFLO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLFFBQVEsT0FBd0I7QUFDckMsV0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEtBQUssT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3REO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLEtBQUssTUFBZ0M7QUFDaEQsU0FBSyxVQUFVLElBQUk7QUFDbkIsUUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLE9BQU8sSUFBSSxHQUFHO0FBQ3BDLGFBQU87QUFBQSxJQUNUO0FBQ0EsUUFBSTtBQUNKLFFBQUk7QUFDRixhQUFPLE1BQU0sS0FBSyxRQUFRLEtBQUssSUFBSTtBQUFBLElBQ3JDLFNBQVMsT0FBTztBQUNkLFVBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxPQUFPLElBQUksR0FBRztBQUNwQyxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU07QUFBQSxJQUNSO0FBQ0EsU0FBSyxVQUFVLElBQUk7QUFDbkIsUUFBSSxLQUFLLFNBQVMsT0FBTyxHQUFHO0FBQzFCLFVBQUk7QUFDSixVQUFJO0FBQ0YsbUJBQVcsS0FBSyxNQUFNLElBQUk7QUFBQSxNQUM1QixRQUFRO0FBQ04sZUFBTztBQUFBLE1BQ1Q7QUFDQSxVQUFJLE9BQU8sYUFBYSxZQUFZLGFBQWEsUUFBUSxFQUFFLFlBQVksYUFBYSxTQUFTLFdBQVcsS0FBSyxFQUFFLGFBQWEsV0FBVztBQUNySSxjQUFNLElBQUksTUFBTSxrQ0FBa0M7QUFBQSxNQUNwRDtBQUNBLGFBQU8sU0FBUztBQUFBLElBQ2xCO0FBQ0EsUUFBSSxDQUFDLEtBQUssV0FBVyxlQUFlLEtBQUssQ0FBQyxLQUFLLFNBQVMsZUFBZSxHQUFHO0FBQ3hFLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxTQUFrQixLQUFLLE1BQU0sS0FBSyxNQUFNLGdCQUFnQixRQUFRLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQztBQUM5RixXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxhQUFhLE1BQWdDO0FBQ3hELFVBQU0sV0FBVyxNQUFNLEtBQUssS0FBSyxJQUFJO0FBQ3JDLFFBQ0UsT0FBTyxhQUFhLFlBQVksYUFBYSxRQUFRLEVBQUUsWUFBWSxhQUFhLFNBQVMsV0FBVyxLQUNqRyxFQUFFLFlBQVksYUFBYSxDQUFDLE1BQU0sUUFBUSxTQUFTLE1BQU0sS0FDekQsU0FBUyxPQUFPLFdBQVcsS0FBSyxTQUFTLE9BQU8sS0FBSyxDQUFDLFNBQWtCLE9BQU8sU0FBUyxRQUFRLEdBQ25HO0FBQ0EsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFNBQW1CLENBQUM7QUFDMUIsUUFBSSxRQUFRO0FBQ1osZUFBVyxDQUFDLE9BQU8sSUFBSSxLQUFLLFNBQVMsT0FBTyxRQUFRLEdBQUc7QUFDckQsWUFBTSxZQUFZLEtBQUssU0FBUyxPQUFPLElBQUksVUFBVTtBQUNyRCxZQUFNLFFBQVEsTUFBTSxLQUFLLEtBQUssR0FBRyxLQUFLLE1BQU0sR0FBRyxDQUFDLFVBQVUsTUFBTSxDQUFDLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRyxTQUFTLEVBQUU7QUFDaEcsVUFBSSxPQUFPLFVBQVUsWUFBWSxNQUFNLE9BQU8sS0FBSyxNQUFNLE1BQU07QUFDN0QsZUFBTztBQUFBLE1BQ1Q7QUFDQSxlQUFTLElBQUksWUFBWSxFQUFFLE9BQU8sS0FBSyxFQUFFO0FBQ3pDLFVBQUksUUFBUSxLQUFLLGtCQUFrQjtBQUNqQyxjQUFNLElBQUksTUFBTSxnREFBZ0Q7QUFBQSxNQUNsRTtBQUNBLGFBQU8sS0FBSyxLQUFLO0FBQUEsSUFDbkI7QUFDQSxVQUFNLFNBQWtCLEtBQUssTUFBTSxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQ2xELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLE9BQU8sTUFBNkI7QUFDL0MsU0FBSyxVQUFVLElBQUk7QUFDbkIsVUFBTSxLQUFLLFFBQVEsT0FBTyxJQUFJO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxNQUFNLE1BQWMsT0FBK0I7QUFDOUQsU0FBSyxVQUFVLElBQUk7QUFDbkIsVUFBTSxPQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssU0FBUyxPQUFPLENBQUM7QUFDdEQsU0FBSyxVQUFVLElBQUk7QUFDbkIsVUFBTSxLQUFLLGFBQWEsSUFBSTtBQUM1QixVQUFNLEtBQUssUUFBUSxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBQ3JDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUEsTUFBYSxnQkFBZ0IsTUFBYyxRQUEyQztBQUNwRixTQUFLLFVBQVUsSUFBSTtBQUNuQixVQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxTQUFTLE9BQU8sQ0FBQztBQUN2RCxTQUFLLFVBQVUsSUFBSTtBQUNuQixRQUFJLE1BQU0sS0FBSyxRQUFRLE9BQU8sSUFBSSxHQUFHO0FBQ25DLFlBQU0sU0FBUyxNQUFNLEtBQUssZUFBZSxJQUFJO0FBQzdDLFVBQUksV0FBVyxRQUFRLENBQUMsYUFBYSxRQUFRLE1BQU0sR0FBRztBQUNwRCxjQUFNLElBQUksTUFBTSwyQ0FBMkM7QUFBQSxNQUM3RDtBQUNBLFVBQUksT0FBTyxXQUFXLE9BQU8sUUFBUTtBQUNuQztBQUFBLE1BQ0Y7QUFDQSxZQUFNLEtBQUssUUFBUSxNQUFNLE1BQU0sSUFBSTtBQUNuQztBQUFBLElBQ0Y7QUFDQSxVQUFNLEtBQUssYUFBYSxJQUFJO0FBQzVCLFVBQU0sS0FBSyxRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxlQUFlLE1BQWMsT0FBK0I7QUFDdkUsU0FBSyxVQUFVLElBQUk7QUFDbkIsVUFBTSxPQUFPLEtBQUssT0FBTyxPQUFPLEtBQUssU0FBUyxPQUFPLENBQUM7QUFDdEQsU0FBSyxVQUFVLElBQUk7QUFDbkIsUUFBSSxNQUFNLEtBQUssUUFBUSxPQUFPLElBQUksR0FBRztBQUNuQyxVQUFJLE1BQU0sS0FBSyxRQUFRLEtBQUssSUFBSSxNQUFNLE1BQU07QUFDMUMsY0FBTSxJQUFJLE1BQU0sMkNBQTJDO0FBQUEsTUFDN0Q7QUFDQTtBQUFBLElBQ0Y7QUFDQSxVQUFNLEtBQUssYUFBYSxJQUFJO0FBQzVCLFVBQU0sS0FBSyxRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsY0FBYyxRQUE4RDtBQUN2RixVQUFNLFVBQVUsS0FBSyxVQUFVLE9BQU8sT0FBTztBQUM3QyxRQUFJLFlBQVksUUFBVztBQUN6QixZQUFNLElBQUksTUFBTSxrQ0FBa0M7QUFBQSxJQUNwRDtBQUNBLFFBQUksSUFBSSxZQUFZLEVBQUUsT0FBTyxPQUFPLEVBQUUsU0FBUyxLQUFLLGtCQUFrQjtBQUNwRSxZQUFNLElBQUksTUFBTSxnREFBZ0Q7QUFBQSxJQUNsRTtBQUNBLFVBQU0sU0FBbUIsQ0FBQztBQUMxQixRQUFJLFNBQVM7QUFDYixXQUFPLFNBQVMsUUFBUSxRQUFRO0FBQzlCLFVBQUksTUFBTTtBQUNWLFVBQUksT0FBTyxLQUFLLElBQUksUUFBUSxTQUFTLFFBQVEsS0FBSyxZQUFZO0FBQzlELGFBQU8sTUFBTSxNQUFNO0FBQ2pCLGNBQU0sU0FBUyxLQUFLLE1BQU0sTUFBTSxRQUFRLGlCQUFpQjtBQUN6RCxZQUFJLEtBQUssS0FBSyxRQUFRLE1BQU0sUUFBUSxTQUFTLE1BQU0sQ0FBQyxHQUFHO0FBQ3JELGdCQUFNO0FBQUEsUUFDUixPQUFPO0FBQ0wsaUJBQU8sU0FBUztBQUFBLFFBQ2xCO0FBQUEsTUFDRjtBQUNBLGFBQU8sS0FBSyxRQUFRLE1BQU0sUUFBUSxTQUFTLEdBQUcsQ0FBQztBQUMvQyxnQkFBVTtBQUFBLElBQ1o7QUFDQSxVQUFNLFNBQW1CLENBQUM7QUFDMUIsZUFBVyxTQUFTLFFBQVE7QUFDMUIsYUFBTyxLQUFLLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFBQSxJQUNqQztBQUNBLFVBQU0sV0FBVyxFQUFFLFFBQVEsR0FBRyxPQUFPO0FBQ3JDLFNBQUssVUFBVSxLQUFLLE9BQU8sUUFBUSxDQUFDO0FBQ3BDLGVBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSyxPQUFPLFFBQVEsR0FBRztBQUM3QyxZQUFNLEtBQUssTUFBTSxHQUFHLE9BQU8sSUFBSSxJQUFJLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksS0FBSztBQUFBLElBQzVFO0FBQ0EsVUFBTSxLQUFLLE1BQU0sR0FBRyxPQUFPLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxRQUFRO0FBQUEsRUFDOUQ7QUFBQSxFQUVRLFVBQVUsTUFBb0I7QUFDcEMsUUFBSSxDQUFDLEtBQUssV0FBVyxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHO0FBQy9ELFlBQU0sSUFBSSxNQUFNLDhDQUE4QztBQUFBLElBQ2hFO0FBQUEsRUFDRjtBQUFBLEVBRVEsVUFBVSxNQUFvQjtBQUNwQyxVQUFNLE9BQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxJQUFJLEVBQUU7QUFDNUMsUUFBSSxRQUFRLEtBQUssY0FBYztBQUM3QjtBQUFBLElBQ0Y7QUFDQSxVQUFNLFVBQVUsc0JBQXNCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixPQUFPLEtBQUssWUFBWSxDQUFDO0FBQ2pHLFFBQUksT0FBTyxPQUFPO0FBQ2xCLDJCQUF1QixXQUFXLEVBQUUsT0FBTztBQUMzQyxVQUFNLElBQUksTUFBTSxPQUFPO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsTUFBYyx5QkFBeUIsUUFBNEIsTUFBYyxhQUFxQixNQUFnQztBQUNwSSxVQUFNLFNBQVMsd0JBQXdCLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxlQUFlLElBQUksSUFBSTtBQUN0RixVQUFNLFNBQVMsV0FBVyxPQUFPLE9BQU8sTUFBTSxPQUFPLGVBQWUsV0FBVztBQUMvRSxRQUFJLFdBQVcsUUFBUSxXQUFXLE1BQU07QUFDdEMsWUFBTSxJQUFJLE1BQU0sMENBQTBDO0FBQUEsSUFDNUQ7QUFDQSxRQUFJLGFBQWEsUUFBUSxNQUFNLEdBQUc7QUFDaEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLENBQUMsYUFBYSxRQUFRLE1BQU0sR0FBRztBQUNqQyxZQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxJQUM1RDtBQUNBLFVBQU0sT0FBTyxRQUFRLE1BQU0sYUFBYSxJQUFJO0FBQzVDLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxPQUFPLE9BQWdCLFNBQVMsS0FBSyxjQUFjLFNBQWlCO0FBQzFFLFVBQU0sT0FBTyxLQUFLLFVBQVUsS0FBSztBQUNqQyxRQUFJLFNBQVMsUUFBVztBQUN0QixZQUFNLElBQUksTUFBTSw0Q0FBNEM7QUFBQSxJQUM5RDtBQUNBLFdBQU8sU0FBUyxLQUFLLFVBQVUsRUFBRSxRQUFRLEdBQUcsU0FBUyxNQUFNLENBQUMsSUFBSSxHQUFHLGVBQWUsR0FBRyxJQUFJLEdBQUcsZUFBZTtBQUFBLEVBQzdHO0FBQUEsRUFFQSxNQUFjLGFBQWEsTUFBNkI7QUFDdEQsVUFBTSxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQzVCLFVBQU0sSUFBSTtBQUNWLFFBQUksU0FBUztBQUNiLGVBQVcsUUFBUSxPQUFPO0FBQ3hCLGVBQVMsU0FBUyxHQUFHLE1BQU0sSUFBSSxJQUFJLEtBQUs7QUFDeEMsVUFBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLE9BQU8sTUFBTSxHQUFHO0FBQ3RDLFlBQUk7QUFDRixnQkFBTSxLQUFLLFFBQVEsTUFBTSxNQUFNO0FBQUEsUUFDakMsU0FBUyxPQUFPO0FBQ2QsY0FBSSxDQUFDLE1BQU0sS0FBSyxRQUFRLE9BQU8sTUFBTSxHQUFHO0FBQ3RDLGtCQUFNO0FBQUEsVUFDUjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE1BQWMsZUFBZSxNQUF5QztBQUNwRSxRQUFJO0FBQ0osUUFBSTtBQUNGLGNBQVEsTUFBTSxLQUFLLEtBQUssSUFBSTtBQUFBLElBQzlCLFFBQVE7QUFDTixhQUFPO0FBQUEsSUFDVDtBQUNBLFdBQU8sTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRO0FBQUEsRUFDeEM7QUFDRjtBQUVBLGVBQWUsT0FBTyxNQUErQjtBQUNuRCxRQUFNLE9BQU8sTUFBTSxPQUFPLE9BQU8sT0FBTyxPQUFPLFdBQVcsSUFBSSxZQUFZLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDeEYsU0FBTyxDQUFDLEdBQUcsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxTQUFTLEVBQUUsU0FBUyxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQ2pIO0FBRUEsU0FBUyxhQUFhLFFBQTRCLE1BQW1DO0FBQ25GLFNBQU8sT0FBTyxVQUFVLEtBQUssVUFBVSxPQUFPLE1BQU0sQ0FBQyxPQUFPLFVBQVUsS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUM3SDtBQUVBLFNBQVMsZ0JBQWdCLE1BQXVCO0FBQzlDLFNBQU8sS0FBSyxNQUFNLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsS0FBSyxTQUFTLE9BQU8sU0FBUyxRQUFRLENBQUMsZ0NBQWdDLEtBQUssSUFBSSxDQUFDO0FBQ3hJOyIsIm5hbWVzIjpbXX0=
@@ -5,6 +5,33 @@
5
5
  *
6
6
  * Record-based device-local persistence, isolated by vault, plugin and store.
7
7
  */
8
+ /**
9
+ * Why a {@link LocalDataStore} connection stopped accepting operations.
10
+ */
11
+ export declare enum LocalDataStoreCloseReason {
12
+ /**
13
+ * The browser closed the connection on its own, for example because the database was deleted or the storage was
14
+ * cleared.
15
+ */
16
+ ClosedByBrowser = "closedByBrowser",
17
+ /**
18
+ * The owner called {@link LocalDataStore.close}, usually because it unloaded.
19
+ */
20
+ ClosedByOwner = "closedByOwner",
21
+ /**
22
+ * Another connection asked for a newer schema version, so this one closed to let it upgrade.
23
+ */
24
+ VersionChange = "versionChange"
25
+ }
26
+ /**
27
+ * Options of a {@link LocalDataStoreClosedError}.
28
+ */
29
+ export interface LocalDataStoreClosedErrorConstructorOptions {
30
+ /**
31
+ * The IndexedDB error the closed-store error replaces.
32
+ */
33
+ readonly cause?: unknown;
34
+ }
8
35
  /**
9
36
  * Atomic mutations of a local record store.
10
37
  */
@@ -54,6 +81,14 @@ export interface LocalDataStoreOpenParams {
54
81
  */
55
82
  export declare class LocalDataStore {
56
83
  private readonly database;
84
+ /**
85
+ * Whether the connection is closed or closing, so no further operation can run.
86
+ *
87
+ * @returns `true` once {@link LocalDataStore.close} was called, or the browser or a schema upgrade closed the
88
+ * connection.
89
+ */
90
+ get isClosed(): boolean;
91
+ private closeReason;
57
92
  private constructor();
58
93
  /**
59
94
  * Opens an isolated database. Writes resolve only once their transaction commits.
@@ -69,7 +104,8 @@ export declare class LocalDataStore {
69
104
  */
70
105
  clear(): Promise<void>;
71
106
  /**
72
- * Closes this connection without deleting its records.
107
+ * Closes this connection without deleting its records. Every later operation rejects with
108
+ * {@link LocalDataStoreClosedError}. Closing twice is harmless.
73
109
  */
74
110
  close(): void;
75
111
  /**
@@ -123,5 +159,26 @@ export declare class LocalDataStore {
123
159
  * @returns A promise that resolves after commit.
124
160
  */
125
161
  set(key: string, value: unknown): Promise<void>;
162
+ private markClosed;
126
163
  private run;
164
+ private toClosedError;
165
+ }
166
+ /**
167
+ * Thrown by every operation of a {@link LocalDataStore} whose connection is closed or closing.
168
+ *
169
+ * It replaces IndexedDB's raw `InvalidStateError` ("The database connection is closing"), which names neither the
170
+ * store nor the cause. The usual cause is work that outlived its owner: a debounced or scheduled save that runs after
171
+ * the plugin unloaded and closed its store.
172
+ */
173
+ export declare class LocalDataStoreClosedError extends Error {
174
+ readonly databaseName: string;
175
+ readonly reason: LocalDataStoreCloseReason;
176
+ /**
177
+ * Creates a {@link LocalDataStoreClosedError}.
178
+ *
179
+ * @param databaseName - The IndexedDB database name of the store.
180
+ * @param reason - Why the connection closed.
181
+ * @param options - The IndexedDB error this one replaces, as its `cause`.
182
+ */
183
+ constructor(databaseName: string, reason: LocalDataStoreCloseReason, options?: LocalDataStoreClosedErrorConstructorOptions);
127
184
  }
@@ -3,11 +3,34 @@ 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
5
 
6
+ var LocalDataStoreCloseReason = /* @__PURE__ */ ((LocalDataStoreCloseReason2) => {
7
+ LocalDataStoreCloseReason2["ClosedByBrowser"] = "closedByBrowser";
8
+ LocalDataStoreCloseReason2["ClosedByOwner"] = "closedByOwner";
9
+ LocalDataStoreCloseReason2["VersionChange"] = "versionChange";
10
+ return LocalDataStoreCloseReason2;
11
+ })(LocalDataStoreCloseReason || {});
6
12
  class LocalDataStore {
7
13
  constructor(database) {
8
14
  this.database = database;
15
+ database.onversionchange = () => {
16
+ this.markClosed("versionChange" /* VersionChange */);
17
+ database.close();
18
+ };
19
+ database.addEventListener("close", () => {
20
+ this.markClosed("closedByBrowser" /* ClosedByBrowser */);
21
+ });
9
22
  }
10
23
  database;
24
+ /**
25
+ * Whether the connection is closed or closing, so no further operation can run.
26
+ *
27
+ * @returns `true` once {@link LocalDataStore.close} was called, or the browser or a schema upgrade closed the
28
+ * connection.
29
+ */
30
+ get isClosed() {
31
+ return this.closeReason !== null;
32
+ }
33
+ closeReason = null;
11
34
  /**
12
35
  * Opens an isolated database. Writes resolve only once their transaction commits.
13
36
  *
@@ -25,11 +48,7 @@ class LocalDataStore {
25
48
  reject(new Error("Could not open local data store", { cause: request.error }));
26
49
  });
27
50
  request.onsuccess = () => {
28
- const database = request.result;
29
- database.onversionchange = () => {
30
- database.close();
31
- };
32
- resolve(new LocalDataStore(database));
51
+ resolve(new LocalDataStore(request.result));
33
52
  };
34
53
  });
35
54
  }
@@ -42,9 +61,11 @@ class LocalDataStore {
42
61
  await this.run("readwrite", (store) => store.clear());
43
62
  }
44
63
  /**
45
- * Closes this connection without deleting its records.
64
+ * Closes this connection without deleting its records. Every later operation rejects with
65
+ * {@link LocalDataStoreClosedError}. Closing twice is harmless.
46
66
  */
47
67
  close() {
68
+ this.markClosed("closedByOwner" /* ClosedByOwner */);
48
69
  this.database.close();
49
70
  }
50
71
  /**
@@ -146,9 +167,22 @@ class LocalDataStore {
146
167
  async set(key, value) {
147
168
  await this.run("readwrite", (store) => store.put(value, key));
148
169
  }
170
+ markClosed(reason) {
171
+ this.closeReason ??= reason;
172
+ }
173
+ // eslint-disable-next-line typescript-dev-toolkit/no-undefined-return-type -- Mirrors IndexedDB: a missing record reads as `undefined`, which a stored `null` must stay distinct from.
149
174
  async run(mode, action) {
150
175
  return await new Promise((resolve, reject) => {
151
- const transaction = this.database.transaction("records", mode);
176
+ let transaction;
177
+ try {
178
+ if (this.closeReason !== null) {
179
+ throw new LocalDataStoreClosedError(this.database.name, this.closeReason);
180
+ }
181
+ transaction = this.database.transaction("records", mode);
182
+ } catch (error) {
183
+ reject(this.toClosedError(error));
184
+ return;
185
+ }
152
186
  let request;
153
187
  try {
154
188
  request = action(transaction.objectStore("records"));
@@ -165,8 +199,36 @@ class LocalDataStore {
165
199
  });
166
200
  });
167
201
  }
202
+ toClosedError(error) {
203
+ if (error instanceof LocalDataStoreClosedError) {
204
+ return error;
205
+ }
206
+ if (error instanceof Error && error.name === "InvalidStateError") {
207
+ return new LocalDataStoreClosedError(this.database.name, this.closeReason ?? "closedByBrowser" /* ClosedByBrowser */, { cause: error });
208
+ }
209
+ return error instanceof Error ? error : new Error("Local data-store transaction failed", { cause: error });
210
+ }
211
+ }
212
+ class LocalDataStoreClosedError extends Error {
213
+ /**
214
+ * Creates a {@link LocalDataStoreClosedError}.
215
+ *
216
+ * @param databaseName - The IndexedDB database name of the store.
217
+ * @param reason - Why the connection closed.
218
+ * @param options - The IndexedDB error this one replaces, as its `cause`.
219
+ */
220
+ constructor(databaseName, reason, options) {
221
+ super(`The local data store "${databaseName}" is closed (${reason}), so the operation was not run.`, options);
222
+ this.databaseName = databaseName;
223
+ this.reason = reason;
224
+ this.name = "LocalDataStoreClosedError";
225
+ }
226
+ databaseName;
227
+ reason;
168
228
  }
169
229
  export {
170
- LocalDataStore
230
+ LocalDataStore,
231
+ LocalDataStoreCloseReason,
232
+ LocalDataStoreClosedError
171
233
  };
172
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2xvY2FsLWRhdGEtc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIG9mIHRoaXMgc3RvcmUgZmlyc3QsIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzIHRoZSB3cml0ZXMuXG4gICAqXG4gICAqIEVpdGhlciB0aGUgc3RvcmUgaXMgcmVwbGFjZWQgYnkgYGVudHJpZXNgIGFzIGEgd2hvbGUsIG9yLCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBmYWlscywgZXZlcnkgcHJldmlvdXMgcmVjb3JkIHN1cnZpdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDbGVhcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Igb3BlbmluZyBhIGxvY2FsIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbmRleGVkREIgaW1wbGVtZW50YXRpb24sIGluamVjdGFibGUgZm9yIHRlc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeT86IElEQkZhY3Rvcnk7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBhbmQgc2NoZW1hIHZlcnNpb24gY2hvc2VuIGJ5IHRoZSBjb25zdW1lci5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YWJsZSwgZGV2aWNlLWxvY2FsIHZhdWx0IGlkZW50aXR5OyBuZXZlciB0aGUgdmF1bHQgZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbG9jYWwgc3RvcmUgaG9sZHMgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWVzOyBpdCBuZXZlciB3cml0ZXMgdG8gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhU3RvcmUge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGF0YWJhc2U6IElEQkRhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBpc29sYXRlZCBkYXRhYmFzZS4gV3JpdGVzIHJlc29sdmUgb25seSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBTdG9yZSBpZGVudGl0eSBhbmQgb3B0aW9uYWwgSW5kZXhlZERCIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIHN0b3JlOyBjbG9zZSBpdCB3aGVuIGl0cyBvd25lciB1bmxvYWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zKTogUHJvbWlzZTxMb2NhbERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgb2JzaWRpYW4tbGliOiR7SlNPTi5zdHJpbmdpZnkoW3BhcmFtcy52YXVsdElkLCBwYXJhbXMucGx1Z2luSWQsIHBhcmFtcy5zdG9yZUlkXSl9YDtcbiAgICBjb25zdCByZXF1ZXN0ID0gKHBhcmFtcy5mYWN0b3J5ID8/IGluZGV4ZWREQikub3BlbihuYW1lLCAxKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKCdyZWNvcmRzJyk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gbG9jYWwgZGF0YSBzdG9yZScsIHsgY2F1c2U6IHJlcXVlc3QuZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgZGF0YWJhc2Uub252ZXJzaW9uY2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFiYXNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyBzZXZlcmFsIHJlY29yZCBjaGFuZ2VzIGF0b21pY2FsbHkgd2l0aG91dCBzZXJpYWxpemluZyB0aGUgcmVzdCBvZiB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXcml0ZXMgYW5kIGRlbGV0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24sIG9wdGlvbmFsbHkgYWZ0ZXIgY2xlYXJpbmcgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21taXQocGFyYW1zOiBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGlmIChwYXJhbXMuc2hvdWxkQ2xlYXIpIHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5yZW1vdmVkS2V5cyA/PyBbXSkge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcy5lbnRyaWVzKSB7XG4gICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIHJlcXVlc3QgdG8gcmVzb2x2ZSB3aXRoOiBhIGNsb3NpbmcgYHN0b3JlLmNvdW50KClgIHdvdWxkIHdhbGsgZXZlcnkgcmVjb3JkIG9mIHRoZSBzdG9yZSBvbiBlYWNoIGNvbW1pdC5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgcmVjb3JkcyBpbiBrZXkgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGFjaGVkIGtleS92YWx1ZSBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnRyaWVzKCk6IFByb21pc2U8W3N0cmluZywgdW5rbm93bl1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICAvLyBUd28gYnVsayByZWFkcyBpbiBvbmUgdHJhbnNhY3Rpb24gc2VlIHRoZSBzYW1lIHNuYXBzaG90IGluIHRoZSBzYW1lIGtleSBvcmRlciwgc28gdGhleSBwYWlyIHVwIGJ5IGluZGV4LlxuICAgIC8vIEEgY3Vyc29yIGRpc3BhdGNoZXMgb25lIGV2ZW50IHBlciByZWNvcmQgaW5zdGVhZDsgYXQgOTAsMDAwIHJlY29yZHMgaW4gT2JzaWRpYW4gaXQgdG9vayAxLjUgdG8gMiB0aW1lcyBhcyBsb25nLlxuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qga2V5c1JlcXVlc3QgPSBzdG9yZS5nZXRBbGxLZXlzKCk7XG4gICAgICBjb25zdCB2YWx1ZXNSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICB2YWx1ZXNSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGtleXNSZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIGtleSBpcyBub3QgYSBzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKFtrZXksIHZhbHVlc1tpbmRleF1dKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB2YWx1ZXNSZXF1ZXN0O1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBzaGFyZWQtc3RvcmUgb3BlcmF0aW9uIGFjcm9zcyBjb25uZWN0aW9ucywgd2luZG93cyBhbmQgYnVuZGxlZCBsaWJyYXJ5IGNvcGllcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBXb3JrIHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoaXMgZGF0YWJhc2UncyBXZWIgTG9jay5cbiAgICogQHJldHVybnMgVGhlIGNhbGxiYWNrIHJlc3VsdCBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhjbHVzaXZlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IHdpbmRvdy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdCh0aGlzLmRhdGFiYXNlLm5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEl0cyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgcmVjb3JkIG9uY2UsIGF0b21pY2FsbHkgYWNyb3NzIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdXNlZCBvbmx5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjb21taXR0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pLnRoZW4oKGV4aXN0aW5nKSA9PiBleGlzdGluZyA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBleGlzdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dCh2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oJ3JlY29yZHMnLCBtb2RlKTtcbiAgICAgIGxldCByZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+IHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdCA9IGFjdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgncmVjb3JkcycpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUgdHJhbnNhY3Rpb24gZmFpbGVkJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBBbiBhY3Rpb24gdGhhdCBpc3N1ZWQgbm8gcmVxdWVzdCBvZiBpdHMgb3duIHJlc29sdmVzIHdpdGggYHVuZGVmaW5lZGAgb25jZSBpdHMgd3JpdGVzIGNvbW1pdC5cbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0Py5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGFib3J0ZWQnLCB7IGNhdXNlOiB0cmFuc2FjdGlvbi5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUF3RE8sTUFBTSxlQUFlO0FBQUEsRUFDbEIsWUFBNkIsVUFBdUI7QUFBdkI7QUFBQSxFQUF3QjtBQUFBLEVBQXhCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRckMsYUFBb0IsS0FBSyxRQUEyRDtBQUNsRixVQUFNLE9BQU8sZ0JBQWdCLEtBQUssVUFBVSxDQUFDLE9BQU8sU0FBUyxPQUFPLFVBQVUsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUM5RixVQUFNLFdBQVcsT0FBTyxXQUFXLFdBQVcsS0FBSyxNQUFNLENBQUM7QUFDMUQsV0FBTyxNQUFNLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUM1QyxjQUFRLGtCQUFrQixNQUFZO0FBQ3BDLGdCQUFRLE9BQU8sa0JBQWtCLFNBQVM7QUFBQSxNQUM1QztBQUNBLGNBQVEsaUJBQWlCLFNBQVMsTUFBWTtBQUM1QyxlQUFPLElBQUksTUFBTSxtQ0FBbUMsRUFBRSxPQUFPLFFBQVEsTUFBTSxDQUFDLENBQUM7QUFBQSxNQUMvRSxDQUFDO0FBQ0QsY0FBUSxZQUFZLE1BQVk7QUFDOUIsY0FBTSxXQUFXLFFBQVE7QUFDekIsaUJBQVMsa0JBQWtCLE1BQVk7QUFDckMsbUJBQVMsTUFBTTtBQUFBLFFBQ2pCO0FBQ0EsZ0JBQVEsSUFBSSxlQUFlLFFBQVEsQ0FBQztBQUFBLE1BQ3RDO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsUUFBdUI7QUFDbEMsVUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLFVBQVUsTUFBTSxNQUFNLENBQUM7QUFBQSxFQUN0RDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBYztBQUNuQixTQUFLLFNBQVMsTUFBTTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLE9BQU8sUUFBbUQ7QUFDckUsVUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLFVBQVU7QUFDckMsVUFBSSxPQUFPLGFBQWE7QUFDdEIsY0FBTSxNQUFNO0FBQUEsTUFDZDtBQUNBLGlCQUFXLE9BQU8sT0FBTyxlQUFlLENBQUMsR0FBRztBQUMxQyxjQUFNLE9BQU8sR0FBRztBQUFBLE1BQ2xCO0FBQ0EsaUJBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFNBQVM7QUFDekMsY0FBTSxJQUFJLE9BQU8sR0FBRztBQUFBLE1BQ3RCO0FBQUEsSUFFRixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxPQUFPLEtBQTRCO0FBQzlDLFVBQU0sS0FBSyxJQUFJLGFBQWEsQ0FBQyxVQUFVLE1BQU0sT0FBTyxHQUFHLENBQUM7QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQWEsVUFBd0M7QUFDbkQsVUFBTSxVQUErQixDQUFDO0FBR3RDLFVBQU0sS0FBSyxJQUFJLFlBQVksQ0FBQyxVQUFVO0FBQ3BDLFlBQU0sY0FBYyxNQUFNLFdBQVc7QUFDckMsWUFBTSxnQkFBZ0IsTUFBTSxPQUFPO0FBQ25DLG9CQUFjLFlBQVksTUFBWTtBQUNwQyxjQUFNLE9BQU8sWUFBWTtBQUN6QixjQUFNLFNBQVMsY0FBYztBQUM3QixtQkFBVyxDQUFDLE9BQU8sR0FBRyxLQUFLLEtBQUssUUFBUSxHQUFHO0FBQ3pDLGNBQUksT0FBTyxRQUFRLFVBQVU7QUFDM0Isa0JBQU0sSUFBSSxVQUFVLHNDQUFzQztBQUFBLFVBQzVEO0FBQ0Esa0JBQVEsS0FBSyxDQUFDLEtBQUssT0FBTyxLQUFLLENBQUMsQ0FBQztBQUFBLFFBQ25DO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNULENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxNQUFhLFVBQWEsVUFBd0M7QUFDaEUsV0FBTyxNQUFNLE9BQU8sVUFBVSxNQUFNLFFBQVEsS0FBSyxTQUFTLE1BQU0sUUFBUTtBQUFBLEVBQzFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLElBQUksS0FBK0I7QUFDOUMsV0FBTyxNQUFNLEtBQUssSUFBYSxZQUFZLENBQUMsVUFBVSxNQUFNLElBQUksR0FBRyxDQUFDO0FBQUEsRUFDdEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxZQUFZLEtBQWEsT0FBa0M7QUFDdEUsV0FBTyxNQUFNLEtBQUssSUFBYSxhQUFhLENBQUMsVUFBVTtBQUNyRCxZQUFNLFVBQVUsTUFBTSxJQUFJLEdBQUc7QUFDN0IsY0FBUSxZQUFZLE1BQVk7QUFDOUIsWUFBSSxRQUFRLFdBQVcsUUFBVztBQUNoQyxnQkFBTSxJQUFJLE9BQU8sR0FBRztBQUFBLFFBQ3RCO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNULENBQUMsRUFBRSxLQUFLLENBQUMsYUFBYSxhQUFhLFNBQVksUUFBUSxRQUFRO0FBQUEsRUFDakU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxJQUFJLEtBQWEsT0FBK0I7QUFDM0QsVUFBTSxLQUFLLElBQUksYUFBYSxDQUFDLFVBQVUsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQUEsRUFDOUQ7QUFBQSxFQUVBLE1BQWMsSUFBTyxNQUEwQixRQUFzRjtBQUNuSSxXQUFPLE1BQU0sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQzVDLFlBQU0sY0FBYyxLQUFLLFNBQVMsWUFBWSxXQUFXLElBQUk7QUFDN0QsVUFBSTtBQUNKLFVBQUk7QUFDRixrQkFBVSxPQUFPLFlBQVksWUFBWSxTQUFTLENBQUM7QUFBQSxNQUNyRCxTQUFTLE9BQU87QUFDZCxvQkFBWSxNQUFNO0FBQ2xCLGVBQU8saUJBQWlCLFFBQVEsUUFBUSxJQUFJLE1BQU0sdUNBQXVDLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMxRztBQUFBLE1BQ0Y7QUFDQSxrQkFBWSxhQUFhLE1BQVk7QUFFbkMsZ0JBQVEsU0FBUyxNQUFNO0FBQUEsTUFDekI7QUFDQSxrQkFBWSxpQkFBaUIsU0FBUyxNQUFZO0FBQ2hELGVBQU8sSUFBSSxNQUFNLHdDQUF3QyxFQUFFLE9BQU8sWUFBWSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQ3hGLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
234
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RvcmVzL2xvY2FsLWRhdGEtc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZWNvcmQtYmFzZWQgZGV2aWNlLWxvY2FsIHBlcnNpc3RlbmNlLCBpc29sYXRlZCBieSB2YXVsdCwgcGx1Z2luIGFuZCBzdG9yZS5cbiAqL1xuXG4vKipcbiAqIFdoeSBhIHtAbGluayBMb2NhbERhdGFTdG9yZX0gY29ubmVjdGlvbiBzdG9wcGVkIGFjY2VwdGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZW51bSBMb2NhbERhdGFTdG9yZUNsb3NlUmVhc29uIHtcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBvbiBpdHMgb3duLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZSBkYXRhYmFzZSB3YXMgZGVsZXRlZCBvciB0aGUgc3RvcmFnZSB3YXNcbiAgICogY2xlYXJlZC5cbiAgICovXG4gIENsb3NlZEJ5QnJvd3NlciA9ICdjbG9zZWRCeUJyb3dzZXInLFxuICAvKipcbiAgICogVGhlIG93bmVyIGNhbGxlZCB7QGxpbmsgTG9jYWxEYXRhU3RvcmUuY2xvc2V9LCB1c3VhbGx5IGJlY2F1c2UgaXQgdW5sb2FkZWQuXG4gICAqL1xuICBDbG9zZWRCeU93bmVyID0gJ2Nsb3NlZEJ5T3duZXInLFxuICAvKipcbiAgICogQW5vdGhlciBjb25uZWN0aW9uIGFza2VkIGZvciBhIG5ld2VyIHNjaGVtYSB2ZXJzaW9uLCBzbyB0aGlzIG9uZSBjbG9zZWQgdG8gbGV0IGl0IHVwZ3JhZGUuXG4gICAqL1xuICBWZXJzaW9uQ2hhbmdlID0gJ3ZlcnNpb25DaGFuZ2UnXG59XG5cbi8qKlxuICogT3B0aW9ucyBvZiBhIHtAbGluayBMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBJbmRleGVkREIgZXJyb3IgdGhlIGNsb3NlZC1zdG9yZSBlcnJvciByZXBsYWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbXV0YXRpb25zIG9mIGEgbG9jYWwgcmVjb3JkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlQ29tbWl0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEtleS92YWx1ZSBwYWlycyB0byB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IChyZWFkb25seSBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgLyoqXG4gICAqIEtleXMgcmVtb3ZlZCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyB0aGUgd3JpdGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSByZW1vdmVkS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogRGVsZXRlcyBldmVyeSByZWNvcmQgb2YgdGhpcyBzdG9yZSBmaXJzdCwgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogRWl0aGVyIHRoZSBzdG9yZSBpcyByZXBsYWNlZCBieSBgZW50cmllc2AgYXMgYSB3aG9sZSwgb3IsIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGZhaWxzLCBldmVyeSBwcmV2aW91cyByZWNvcmQgc3Vydml2ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsZWFyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgbG9jYWwgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zIHtcbiAgLyoqXG4gICAqIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbiwgaW5qZWN0YWJsZSBmb3IgdGVzdHMuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5PzogSURCRmFjdG9yeTtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBuYW1lIGFuZCBzY2hlbWEgdmVyc2lvbiBjaG9zZW4gYnkgdGhlIGNvbnN1bWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlLCBkZXZpY2UtbG9jYWwgdmF1bHQgaWRlbnRpdHk7IG5ldmVyIHRoZSB2YXVsdCBkaXNwbGF5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBsb2NhbCBzdG9yZSBob2xkcyBzdHJ1Y3R1cmVkLWNsb25lYWJsZSB2YWx1ZXM7IGl0IG5ldmVyIHdyaXRlcyB0byB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFTdG9yZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBvciBjbG9zaW5nLCBzbyBubyBmdXJ0aGVyIG9wZXJhdGlvbiBjYW4gcnVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgb25jZSB7QGxpbmsgTG9jYWxEYXRhU3RvcmUuY2xvc2V9IHdhcyBjYWxsZWQsIG9yIHRoZSBicm93c2VyIG9yIGEgc2NoZW1hIHVwZ3JhZGUgY2xvc2VkIHRoZVxuICAgKiAgIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlUmVhc29uICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVJlYXNvbjogTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhYmFzZTogSURCRGF0YWJhc2UpIHtcbiAgICBkYXRhYmFzZS5vbnZlcnNpb25jaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm1hcmtDbG9zZWQoTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbi5WZXJzaW9uQ2hhbmdlKTtcbiAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgfTtcbiAgICAvLyBGaXJlZCBvbmx5IHdoZW4gdGhlIGJyb3dzZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFibm9ybWFsbHksIG5ldmVyIGFmdGVyIGBjbG9zZSgpYC5cbiAgICBkYXRhYmFzZS5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubWFya0Nsb3NlZChMb2NhbERhdGFTdG9yZUNsb3NlUmVhc29uLkNsb3NlZEJ5QnJvd3Nlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gaXNvbGF0ZWQgZGF0YWJhc2UuIFdyaXRlcyByZXNvbHZlIG9ubHkgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBjb21taXRzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gU3RvcmUgaWRlbnRpdHkgYW5kIG9wdGlvbmFsIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGNvbm5lY3RlZCBzdG9yZTsgY2xvc2UgaXQgd2hlbiBpdHMgb3duZXIgdW5sb2Fkcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyk6IFByb21pc2U8TG9jYWxEYXRhU3RvcmU+IHtcbiAgICBjb25zdCBuYW1lID0gYG9ic2lkaWFuLWxpYjoke0pTT04uc3RyaW5naWZ5KFtwYXJhbXMudmF1bHRJZCwgcGFyYW1zLnBsdWdpbklkLCBwYXJhbXMuc3RvcmVJZF0pfWA7XG4gICAgY29uc3QgcmVxdWVzdCA9IChwYXJhbXMuZmFjdG9yeSA/PyBpbmRleGVkREIpLm9wZW4obmFtZSwgMSk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXF1ZXN0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSgncmVjb3JkcycpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBvcGVuIGxvY2FsIGRhdGEgc3RvcmUnLCB7IGNhdXNlOiByZXF1ZXN0LmVycm9yIH0pKTtcbiAgICAgIH0pO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKHJlcXVlc3QucmVzdWx0KSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy4gRXZlcnkgbGF0ZXIgb3BlcmF0aW9uIHJlamVjdHMgd2l0aFxuICAgKiB7QGxpbmsgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcn0uIENsb3NpbmcgdHdpY2UgaXMgaGFybWxlc3MuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQ2xvc2VkKExvY2FsRGF0YVN0b3JlQ2xvc2VSZWFzb24uQ2xvc2VkQnlPd25lcik7XG4gICAgdGhpcy5kYXRhYmFzZS5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgc2V2ZXJhbCByZWNvcmQgY2hhbmdlcyBhdG9taWNhbGx5IHdpdGhvdXQgc2VyaWFsaXppbmcgdGhlIHJlc3Qgb2YgdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV3JpdGVzIGFuZCBkZWxldGlvbnMgaW4gb25lIHRyYW5zYWN0aW9uLCBvcHRpb25hbGx5IGFmdGVyIGNsZWFyaW5nIHRoZSBzdG9yZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25seSBhZnRlciBhbGwgY2hhbmdlcyBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tbWl0KHBhcmFtczogTG9jYWxEYXRhU3RvcmVDb21taXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnNob3VsZENsZWFyKSB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMucmVtb3ZlZEtleXMgPz8gW10pIHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMuZW50cmllcykge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgICAvLyBObyByZXF1ZXN0IHRvIHJlc29sdmUgd2l0aDogYSBjbG9zaW5nIGBzdG9yZS5jb3VudCgpYCB3b3VsZCB3YWxrIGV2ZXJ5IHJlY29yZCBvZiB0aGUgc3RvcmUgb24gZWFjaCBjb21taXQuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoa2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYWxsIHJlY29yZHMgaW4ga2V5IG9yZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRhY2hlZCBrZXkvdmFsdWUgcGFpcnMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW50cmllcygpOiBQcm9taXNlPFtzdHJpbmcsIHVua25vd25dW10+IHtcbiAgICBjb25zdCByZWNvcmRzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgLy8gVHdvIGJ1bGsgcmVhZHMgaW4gb25lIHRyYW5zYWN0aW9uIHNlZSB0aGUgc2FtZSBzbmFwc2hvdCBpbiB0aGUgc2FtZSBrZXkgb3JkZXIsIHNvIHRoZXkgcGFpciB1cCBieSBpbmRleC5cbiAgICAvLyBBIGN1cnNvciBkaXNwYXRjaGVzIG9uZSBldmVudCBwZXIgcmVjb3JkIGluc3RlYWQ7IGF0IDkwLDAwMCByZWNvcmRzIGluIE9ic2lkaWFuIGl0IHRvb2sgMS41IHRvIDIgdGltZXMgYXMgbG9uZy5cbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IGtleXNSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsS2V5cygpO1xuICAgICAgY29uc3QgdmFsdWVzUmVxdWVzdCA9IHN0b3JlLmdldEFsbCgpO1xuICAgICAgdmFsdWVzUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBrZXlzUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlc1JlcXVlc3QucmVzdWx0O1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwga2V5XSBvZiBrZXlzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTG9jYWwgZGF0YS1zdG9yZSBrZXkgaXMgbm90IGEgc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZHMucHVzaChba2V5LCB2YWx1ZXNbaW5kZXhdXSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gdmFsdWVzUmVxdWVzdDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgc2hhcmVkLXN0b3JlIG9wZXJhdGlvbiBhY3Jvc3MgY29ubmVjdGlvbnMsIHdpbmRvd3MgYW5kIGJ1bmRsZWQgbGlicmFyeSBjb3BpZXMuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gV29yayBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGlzIGRhdGFiYXNlJ3MgV2ViIExvY2suXG4gICAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayByZXN1bHQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsb2NrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4Y2x1c2l2ZTxUPihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCB3aW5kb3cubmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QodGhpcy5kYXRhYmFzZS5uYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSByZWNvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcmV0dXJucyBJdHMgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bjx1bmtub3duPigncmVhZG9ubHknLCAoc3RvcmUpID0+IHN0b3JlLmdldChrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIHJlY29yZCBvbmNlLCBhdG9taWNhbGx5IGFjcm9zcyBjb25uZWN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHVzZWQgb25seSB3aGVuIHRoZSBrZXkgaXMgYWJzZW50LlxuICAgKiBAcmV0dXJucyBUaGUgZXhpc3Rpbmcgb3IgbmV3bHkgY29tbWl0dGVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9yQ3JlYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bjx1bmtub3duPigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9KS50aGVuKChleGlzdGluZykgPT4gZXhpc3RpbmcgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZXhpc3RpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHN0cnVjdHVyZWQtY2xvbmVhYmxlIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gcGVyc2lzdC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5wdXQodmFsdWUsIGtleSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQ2xvc2VkKHJlYXNvbjogTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VSZWFzb24gPz89IHJlYXNvbjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L25vLXVuZGVmaW5lZC1yZXR1cm4tdHlwZSAtLSBNaXJyb3JzIEluZGV4ZWREQjogYSBtaXNzaW5nIHJlY29yZCByZWFkcyBhcyBgdW5kZWZpbmVkYCwgd2hpY2ggYSBzdG9yZWQgYG51bGxgIG11c3Qgc3RheSBkaXN0aW5jdCBmcm9tLlxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdHJhbnNhY3Rpb246IElEQlRyYW5zYWN0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VSZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcih0aGlzLmRhdGFiYXNlLm5hbWUsIHRoaXMuY2xvc2VSZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbigncmVjb3JkcycsIG1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KHRoaXMudG9DbG9zZWRFcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QgPSBhY3Rpb24odHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ3JlY29yZHMnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0cmFuc2FjdGlvbi5hYm9ydCgpO1xuICAgICAgICByZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGZhaWxlZCcsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLy8gQW4gYWN0aW9uIHRoYXQgaXNzdWVkIG5vIHJlcXVlc3Qgb2YgaXRzIG93biByZXNvbHZlcyB3aXRoIGB1bmRlZmluZWRgIG9uY2UgaXRzIHdyaXRlcyBjb21taXQuXG4gICAgICAgIHJlc29sdmUocmVxdWVzdD8ucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICB0cmFuc2FjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTG9jYWwgZGF0YS1zdG9yZSB0cmFuc2FjdGlvbiBhYm9ydGVkJywgeyBjYXVzZTogdHJhbnNhY3Rpb24uZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRvQ2xvc2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcikge1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICAvLyBBIGNsb3NpbmcgY29ubmVjdGlvbiBtYWtlcyBgdHJhbnNhY3Rpb24oKWAgdGhyb3cgYEludmFsaWRTdGF0ZUVycm9yYCBzeW5jaHJvbm91c2x5LlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdJbnZhbGlkU3RhdGVFcnJvcicpIHtcbiAgICAgIHJldHVybiBuZXcgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcih0aGlzLmRhdGFiYXNlLm5hbWUsIHRoaXMuY2xvc2VSZWFzb24gPz8gTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbi5DbG9zZWRCeUJyb3dzZXIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGZhaWxlZCcsIHsgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IGV2ZXJ5IG9wZXJhdGlvbiBvZiBhIHtAbGluayBMb2NhbERhdGFTdG9yZX0gd2hvc2UgY29ubmVjdGlvbiBpcyBjbG9zZWQgb3IgY2xvc2luZy5cbiAqXG4gKiBJdCByZXBsYWNlcyBJbmRleGVkREIncyByYXcgYEludmFsaWRTdGF0ZUVycm9yYCAoXCJUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjbG9zaW5nXCIpLCB3aGljaCBuYW1lcyBuZWl0aGVyIHRoZVxuICogc3RvcmUgbm9yIHRoZSBjYXVzZS4gVGhlIHVzdWFsIGNhdXNlIGlzIHdvcmsgdGhhdCBvdXRsaXZlZCBpdHMgb3duZXI6IGEgZGVib3VuY2VkIG9yIHNjaGVkdWxlZCBzYXZlIHRoYXQgcnVucyBhZnRlclxuICogdGhlIHBsdWdpbiB1bmxvYWRlZCBhbmQgY2xvc2VkIGl0cyBzdG9yZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIC0gVGhlIEluZGV4ZWREQiBkYXRhYmFzZSBuYW1lIG9mIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHJlYXNvbiAtIFdoeSB0aGUgY29ubmVjdGlvbiBjbG9zZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEluZGV4ZWREQiBlcnJvciB0aGlzIG9uZSByZXBsYWNlcywgYXMgaXRzIGBjYXVzZWAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZWFzb246IExvY2FsRGF0YVN0b3JlQ2xvc2VSZWFzb24sXG4gICAgb3B0aW9ucz86IExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3JDb25zdHJ1Y3Rvck9wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoYFRoZSBsb2NhbCBkYXRhIHN0b3JlIFwiJHtkYXRhYmFzZU5hbWV9XCIgaXMgY2xvc2VkICgke3JlYXNvbn0pLCBzbyB0aGUgb3BlcmF0aW9uIHdhcyBub3QgcnVuLmAsIG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9ICdMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yJztcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTTyxJQUFLLDRCQUFMLGtCQUFLQSwrQkFBTDtBQUtMLEVBQUFBLDJCQUFBLHFCQUFrQjtBQUlsQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFJaEIsRUFBQUEsMkJBQUEsbUJBQWdCO0FBYk4sU0FB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U0FBUyxXQUFXO0FBQzVDLFVBQUk7QUFDSixVQUFJO0FBQ0YsWUFBSSxLQUFLLGdCQUFnQixNQUFNO0FBQzdCLGdCQUFNLElBQUksMEJBQTBCLEtBQUssU0FBUyxNQUFNLEtBQUssV0FBVztBQUFBLFFBQzFFO0FBQ0Esc0JBQWMsS0FBSyxTQUFTLFlBQVksV0FBVyxJQUFJO0FBQUEsTUFDekQsU0FBUyxPQUFPO0FBQ2QsZUFBTyxLQUFLLGNBQWMsS0FBSyxDQUFDO0FBQ2hDO0FBQUEsTUFDRjtBQUNBLFVBQUk7QUFDSixVQUFJO0FBQ0Ysa0JBQVUsT0FBTyxZQUFZLFlBQVksU0FBUyxDQUFDO0FBQUEsTUFDckQsU0FBUyxPQUFPO0FBQ2Qsb0JBQVksTUFBTTtBQUNsQixlQUFPLGlCQUFpQixRQUFRLFFBQVEsSUFBSSxNQUFNLHVDQUF1QyxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFDMUc7QUFBQSxNQUNGO0FBQ0Esa0JBQVksYUFBYSxNQUFZO0FBRW5DLGdCQUFRLFNBQVMsTUFBTTtBQUFBLE1BQ3pCO0FBQ0Esa0JBQVksaUJBQWlCLFNBQVMsTUFBWTtBQUNoRCxlQUFPLElBQUksTUFBTSx3Q0FBd0MsRUFBRSxPQUFPLFlBQVksTUFBTSxDQUFDLENBQUM7QUFBQSxNQUN4RixDQUFDO0FBQUEsSUFDSCxDQUFDO0FBQUEsRUFDSDtBQUFBLEVBRVEsY0FBYyxPQUF1QjtBQUMzQyxRQUFJLGlCQUFpQiwyQkFBMkI7QUFDOUMsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLGlCQUFpQixTQUFTLE1BQU0sU0FBUyxxQkFBcUI7QUFDaEUsYUFBTyxJQUFJLDBCQUEwQixLQUFLLFNBQVMsTUFBTSxLQUFLLGVBQWUseUNBQTJDLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxJQUMxSTtBQUNBLFdBQU8saUJBQWlCLFFBQVEsUUFBUSxJQUFJLE1BQU0sdUNBQXVDLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxFQUMzRztBQUNGO0FBU08sTUFBTSxrQ0FBa0MsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRNUMsWUFDVyxjQUNBLFFBQ2hCLFNBQ0E7QUFDQSxVQUFNLHlCQUF5QixZQUFZLGdCQUFnQixNQUFNLG9DQUFvQyxPQUFPO0FBSjVGO0FBQ0E7QUFJaEIsU0FBSyxPQUFPO0FBQUEsRUFDZDtBQUFBLEVBTmtCO0FBQUEsRUFDQTtBQU1wQjsiLAogICJuYW1lcyI6IFsiTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbiJdCn0K
@@ -90,6 +90,7 @@ export declare class SharedDataStore {
90
90
  private readonly knownTransportRoots;
91
91
  private readonly localRecords;
92
92
  private readonly locations;
93
+ private readonly ownSegments;
93
94
  private replica;
94
95
  private time;
95
96
  private readonly vector;
@@ -152,7 +153,7 @@ export declare class SharedDataStore {
152
153
  */
153
154
  set(key: string, value: JsonValue): Promise<void>;
154
155
  /**
155
- * Publishes a batch of register writes, split into bounded immutable segments.
156
+ * Publishes a batch of register writes, appended to this device's open journal segment and split into bounded ones.
156
157
  * Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
157
158
  *
158
159
  * @param entries - Register writes or set additions.
@@ -184,6 +185,22 @@ export declare class SharedDataStore {
184
185
  private mergeFiles;
185
186
  private mergeTransport;
186
187
  private observeClock;
188
+ /**
189
+ * Picks the segment the next operation may extend: this device's newest one in the active transport, when it ends
190
+ * exactly at the device's last sequence and is still small enough that rewriting it stays cheap.
191
+ *
192
+ * @returns The open segment, or `null` when the next operation starts a new file.
193
+ */
194
+ private openSegment;
195
+ private openSegmentBytes;
187
196
  private persist;
188
197
  private publish;
198
+ /**
199
+ * Rewrites `have` only when another device's acknowledged sequence moved, or the stored copy is due a refresh.
200
+ * Other devices read only their own entry from it, so this device's own sequence never forces a write.
201
+ *
202
+ * @returns A promise that resolves once the acknowledgement is current.
203
+ */
204
+ private publishAcknowledgement;
205
+ private segmentPath;
189
206
  }