@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
@@ -75,12 +75,15 @@ class MultipleTextComponent extends ValueComponent {
75
75
  this.textAreaComponent.setValue("");
76
76
  }
77
77
  /**
78
- * Gets the value of the component.
78
+ * Gets the value of the component: one entry per line of the text area.
79
+ *
80
+ * Blank and whitespace-only lines are skipped, so an empty text area reads as `[]` rather than `['']`. Every other
81
+ * line is kept exactly as typed.
79
82
  *
80
83
  * @returns The value of the component.
81
84
  */
82
85
  getValue() {
83
- return this.textAreaComponent.getValue().split("\n");
86
+ return this.textAreaComponent.getValue().split("\n").filter((line) => line.trim() !== "");
84
87
  }
85
88
  /**
86
89
  * Checks if the component is empty.
@@ -166,4 +169,4 @@ class MultipleTextComponent extends ValueComponent {
166
169
  export {
167
170
  MultipleTextComponent
168
171
  };
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtdGV4dC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYW5kIGVkaXRzIG11bHRpcGxlIHRleHQgdmFsdWVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yRWxlbWVudCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9odG1sLWVsZW1lbnQnO1xuXG5pbXBvcnQge1xuICBUZXh0QXJlYUNvbXBvbmVudCxcbiAgVmFsdWVDb21wb25lbnRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBpbml0UGx1Z2luQ29udGV4dGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IGluaXRQbHVnaW5Db250ZXh0IH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgYFNldHRpbmdFeGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IFNldHRpbmdFeCB9IGZyb20gJy4uL3NldHRpbmctZXgudHMnO1xuaW1wb3J0IHR5cGUgeyBUZXh0QmFzZWRDb21wb25lbnQgfSBmcm9tICcuL3RleHQtYmFzZWQtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi92YWxpZGF0b3ItY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuL3ZhbHVlLWNvbXBvbmVudC13aXRoLWNoYW5nZS10cmFja2luZy50cyc7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYW5kIGVkaXRzIG11bHRpcGxlIHRleHQgdmFsdWVzLlxuICpcbiAqIFlvdSBjYW4gYWRkIHRoaXMgY29tcG9uZW50IHVzaW5nIHtAbGluayBTZXR0aW5nRXguYWRkTXVsdGlwbGVUZXh0fS5cbiAqXG4gKiBJbiBvcmRlciB0byBhZGQgdGhlIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudCwgdXNlIHtAbGluayBpbml0UGx1Z2luQ29udGV4dH0gaW4geW91ciBwbHVnaW4ncyBgb25sb2FkKClgIGZ1bmN0aW9uLlxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29weSBzdHlsZXMgZnJvbSB7QGxpbmsgaHR0cHM6Ly91bnBrZy5jb20vQG1uYW91bW92L29ic2lkaWFuLWxpYi9kaXN0L3N0eWxlcy5jc3N9LlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0Q29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8cmVhZG9ubHkgc3RyaW5nW10+IGltcGxlbWVudHMgVGV4dEJhc2VkQ29tcG9uZW50PHJlYWRvbmx5IHN0cmluZ1tdPiwgVmFsaWRhdG9yQ29tcG9uZW50LCBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAvKipcbiAgICogQW4gaW5wdXQgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dEVsKCk6IEhUTUxUZXh0QXJlYUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRleHRBcmVhQ29tcG9uZW50LmlucHV0RWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRvciBlbGVtZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRvckVsKCk6IFZhbGlkYXRvckVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmlucHV0RWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlubmVyIHRleHQgYXJlYSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGV4dEFyZWFDb21wb25lbnQ6IFRleHRBcmVhQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgc2ltdWxhdGVDaGFuZ2VDYWxsYmFjaz86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbXVsdGlwbGUgdGV4dCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBjb250YWluZXIgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudCA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb250YWluZXJFbCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250YWluZXJFbCwgQ3NzQ2xhc3MuTXVsdGlwbGVUZXh0Q29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgZW1wdHkoKTogdm9pZCB7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5zZXRWYWx1ZSgnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0VmFsdWUoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnRleHRBcmVhQ29tcG9uZW50LmdldFZhbHVlKCkuc3BsaXQoJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tcG9uZW50IGlzIGVtcHR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGNvbXBvbmVudCBpcyBlbXB0eSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5nZXRWYWx1ZSgpID09PSAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb25DaGFuZ2UoY2FsbGJhY2s6IChuZXdWYWx1ZTogcmVhZG9ubHkgc3RyaW5nW10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICBjb25zdCBjaGFuZ2VIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY2FsbGJhY2sodGhpcy5nZXRWYWx1ZSgpKTtcbiAgICB9O1xuICAgIHRoaXMuc2ltdWxhdGVDaGFuZ2VDYWxsYmFjayA9IGNoYW5nZUhhbmRsZXI7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5vbkNoYW5nZShjaGFuZ2VIYW5kbGVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCAtIFRoZSBkaXNhYmxlZCBzdGF0ZSB0byBzZXQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2V0RGlzYWJsZWQoaXNEaXNhYmxlZDogYm9vbGVhbik6IHRoaXMge1xuICAgIHN1cGVyLnNldERpc2FibGVkKGlzRGlzYWJsZWQpO1xuICAgIHRoaXMudGV4dEFyZWFDb21wb25lbnQuc2V0RGlzYWJsZWQoaXNEaXNhYmxlZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGxhY2Vob2xkZXIgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBsYWNlaG9sZGVyIC0gVGhlIHBsYWNlaG9sZGVyIHRvIHNldC5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBzZXRQbGFjZWhvbGRlcihwbGFjZWhvbGRlcjogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5zZXRQbGFjZWhvbGRlcihwbGFjZWhvbGRlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBsYWNlaG9sZGVyVmFsdWUgLSBUaGUgcGxhY2Vob2xkZXIgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHNldFBsYWNlaG9sZGVyVmFsdWUocGxhY2Vob2xkZXJWYWx1ZTogcmVhZG9ubHkgc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLnNldFBsYWNlaG9sZGVyKHRoaXMudmFsdWVUb1N0cmluZyhwbGFjZWhvbGRlclZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldC5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXRWYWx1ZSh2YWx1ZTogcmVhZG9ubHkgc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLnRleHRBcmVhQ29tcG9uZW50LnNldFZhbHVlKHRoaXMudmFsdWVUb1N0cmluZyh2YWx1ZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIGEgY2hhbmdlIGV2ZW50LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Ugb25seSBmcm9tIHRlc3RzIHRvIHNpbXVsYXRlIGEgY2hhbmdlIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHNpbXVsYXRlQ2hhbmdlX18oKTogdm9pZCB7XG4gICAgdGhpcy5zaW11bGF0ZUNoYW5nZUNhbGxiYWNrPy4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgdmFsdWUgdG8gdGhlIHN0cmluZyBzaG93biBpbiB0aGUgdGV4dCBhcmVhLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBjdXN0b21pemUgdGhlIHNlcmlhbGl6YXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCB2YWx1ZVRvU3RyaW5nKHZhbHVlOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHZhbHVlLmpvaW4oJ1xcbicpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFVUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDJCQUEyQjtBQVc3QixNQUFNLDhCQUE4QixlQUE0SjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1yTSxJQUFXLFVBQStCO0FBQ3hDLFdBQU8sS0FBSyxrQkFBa0I7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLElBQVcsY0FBZ0M7QUFDekMsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS21CO0FBQUEsRUFFWDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ELFlBQVksYUFBMEI7QUFDM0MsVUFBTTtBQUNOLFNBQUssb0JBQW9CLElBQUksa0JBQWtCLFdBQVc7QUFDMUQsd0JBQW9CLGFBQWEsU0FBUyxxQkFBcUI7QUFBQSxFQUNqRTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS08sUUFBYztBQUNuQixTQUFLLGtCQUFrQixTQUFTLEVBQUU7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9nQixXQUE4QjtBQUM1QyxXQUFPLEtBQUssa0JBQWtCLFNBQVMsRUFBRSxNQUFNLElBQUk7QUFBQSxFQUNyRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFVBQW1CO0FBQ3hCLFdBQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLFNBQVMsVUFBdUQ7QUFDckUsVUFBTSxnQkFBZ0IsTUFBWTtBQUNoQyxlQUFTLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDMUI7QUFDQSxTQUFLLHlCQUF5QjtBQUM5QixTQUFLLGtCQUFrQixTQUFTLGFBQWE7QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFnQixZQUFZLFlBQTJCO0FBQ3JELFVBQU0sWUFBWSxVQUFVO0FBQzVCLFNBQUssa0JBQWtCLFlBQVksVUFBVTtBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sZUFBZSxhQUEyQjtBQUMvQyxTQUFLLGtCQUFrQixlQUFlLFdBQVc7QUFDakQsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLG9CQUFvQixrQkFBMkM7QUFDcEUsU0FBSyxlQUFlLEtBQUssY0FBYyxnQkFBZ0IsQ0FBQztBQUN4RCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWdCLFNBQVMsT0FBZ0M7QUFDdkQsU0FBSyxrQkFBa0IsU0FBUyxLQUFLLGNBQWMsS0FBSyxDQUFDO0FBQ3pELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sbUJBQXlCO0FBQzlCLFNBQUsseUJBQXlCO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFVLGNBQWMsT0FBa0M7QUFDeEQsV0FBTyxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQ3hCO0FBQ0Y7IiwibmFtZXMiOltdfQ==
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtdGV4dC1jb21wb25lbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIGEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYW5kIGVkaXRzIG11bHRpcGxlIHRleHQgdmFsdWVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yRWxlbWVudCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9odG1sLWVsZW1lbnQnO1xuXG5pbXBvcnQge1xuICBUZXh0QXJlYUNvbXBvbmVudCxcbiAgVmFsdWVDb21wb25lbnRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzIC0tIFdlIG5lZWQgdG8gaW1wb3J0IGBpbml0UGx1Z2luQ29udGV4dGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IGluaXRQbHVnaW5Db250ZXh0IH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgLS0gV2UgbmVlZCB0byBpbXBvcnQgYFNldHRpbmdFeGAgdG8gdXNlIGl0IGluIHRoZSB0c2RvY3MuXG5pbXBvcnQgdHlwZSB7IFNldHRpbmdFeCB9IGZyb20gJy4uL3NldHRpbmctZXgudHMnO1xuaW1wb3J0IHR5cGUgeyBUZXh0QmFzZWRDb21wb25lbnQgfSBmcm9tICcuL3RleHQtYmFzZWQtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi92YWxpZGF0b3ItY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuL3ZhbHVlLWNvbXBvbmVudC13aXRoLWNoYW5nZS10cmFja2luZy50cyc7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgYW5kIGVkaXRzIG11bHRpcGxlIHRleHQgdmFsdWVzLlxuICpcbiAqIFlvdSBjYW4gYWRkIHRoaXMgY29tcG9uZW50IHVzaW5nIHtAbGluayBTZXR0aW5nRXguYWRkTXVsdGlwbGVUZXh0fS5cbiAqXG4gKiBJbiBvcmRlciB0byBhZGQgdGhlIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudCwgdXNlIHtAbGluayBpbml0UGx1Z2luQ29udGV4dH0gaW4geW91ciBwbHVnaW4ncyBgb25sb2FkKClgIGZ1bmN0aW9uLlxuICpcbiAqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY29weSBzdHlsZXMgZnJvbSB7QGxpbmsgaHR0cHM6Ly91bnBrZy5jb20vQG1uYW91bW92L29ic2lkaWFuLWxpYi9kaXN0L3N0eWxlcy5jc3N9LlxuICovXG5leHBvcnQgY2xhc3MgTXVsdGlwbGVUZXh0Q29tcG9uZW50IGV4dGVuZHMgVmFsdWVDb21wb25lbnQ8cmVhZG9ubHkgc3RyaW5nW10+IGltcGxlbWVudHMgVGV4dEJhc2VkQ29tcG9uZW50PHJlYWRvbmx5IHN0cmluZ1tdPiwgVmFsaWRhdG9yQ29tcG9uZW50LCBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAvKipcbiAgICogQW4gaW5wdXQgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaW5wdXQgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGdldCBpbnB1dEVsKCk6IEhUTUxUZXh0QXJlYUVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRleHRBcmVhQ29tcG9uZW50LmlucHV0RWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsaWRhdG9yIGVsZW1lbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRvciBlbGVtZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZhbGlkYXRvckVsKCk6IFZhbGlkYXRvckVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmlucHV0RWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlubmVyIHRleHQgYXJlYSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGV4dEFyZWFDb21wb25lbnQ6IFRleHRBcmVhQ29tcG9uZW50O1xuXG4gIHByaXZhdGUgc2ltdWxhdGVDaGFuZ2VDYWxsYmFjaz86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbXVsdGlwbGUgdGV4dCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBjb250YWluZXIgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudCA9IG5ldyBUZXh0QXJlYUNvbXBvbmVudChjb250YWluZXJFbCk7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhjb250YWluZXJFbCwgQ3NzQ2xhc3MuTXVsdGlwbGVUZXh0Q29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbXB0aWVzIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgZW1wdHkoKTogdm9pZCB7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5zZXRWYWx1ZSgnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudDogb25lIGVudHJ5IHBlciBsaW5lIG9mIHRoZSB0ZXh0IGFyZWEuXG4gICAqXG4gICAqIEJsYW5rIGFuZCB3aGl0ZXNwYWNlLW9ubHkgbGluZXMgYXJlIHNraXBwZWQsIHNvIGFuIGVtcHR5IHRleHQgYXJlYSByZWFkcyBhcyBgW11gIHJhdGhlciB0aGFuIGBbJyddYC4gRXZlcnkgb3RoZXJcbiAgICogbGluZSBpcyBrZXB0IGV4YWN0bHkgYXMgdHlwZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldFZhbHVlKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5nZXRWYWx1ZSgpLnNwbGl0KCdcXG4nKS5maWx0ZXIoKGxpbmUpID0+IGxpbmUudHJpbSgpICE9PSAnJyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb21wb25lbnQgaXMgZW1wdHkuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29tcG9uZW50IGlzIGVtcHR5LCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRleHRBcmVhQ29tcG9uZW50LmdldFZhbHVlKCkgPT09ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIgdG8gdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvbkNoYW5nZShjYWxsYmFjazogKG5ld1ZhbHVlOiByZWFkb25seSBzdHJpbmdbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIGNvbnN0IGNoYW5nZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjYWxsYmFjayh0aGlzLmdldFZhbHVlKCkpO1xuICAgIH07XG4gICAgdGhpcy5zaW11bGF0ZUNoYW5nZUNhbGxiYWNrID0gY2hhbmdlSGFuZGxlcjtcbiAgICB0aGlzLnRleHRBcmVhQ29tcG9uZW50Lm9uQ2hhbmdlKGNoYW5nZUhhbmRsZXIpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpc2FibGVkIHN0YXRlIG9mIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBpc0Rpc2FibGVkIC0gVGhlIGRpc2FibGVkIHN0YXRlIHRvIHNldC5cbiAgICogQHJldHVybnMgVGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXREaXNhYmxlZChpc0Rpc2FibGVkOiBib29sZWFuKTogdGhpcyB7XG4gICAgc3VwZXIuc2V0RGlzYWJsZWQoaXNEaXNhYmxlZCk7XG4gICAgdGhpcy50ZXh0QXJlYUNvbXBvbmVudC5zZXREaXNhYmxlZChpc0Rpc2FibGVkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbGFjZWhvbGRlciBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2Vob2xkZXIgLSBUaGUgcGxhY2Vob2xkZXIgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIHNldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnRleHRBcmVhQ29tcG9uZW50LnNldFBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbGFjZWhvbGRlciB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGxhY2Vob2xkZXJWYWx1ZSAtIFRoZSBwbGFjZWhvbGRlciB2YWx1ZSB0byBzZXQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgc2V0UGxhY2Vob2xkZXJWYWx1ZShwbGFjZWhvbGRlclZhbHVlOiByZWFkb25seSBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMuc2V0UGxhY2Vob2xkZXIodGhpcy52YWx1ZVRvU3RyaW5nKHBsYWNlaG9sZGVyVmFsdWUpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBUaGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNldFZhbHVlKHZhbHVlOiByZWFkb25seSBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMudGV4dEFyZWFDb21wb25lbnQuc2V0VmFsdWUodGhpcy52YWx1ZVRvU3RyaW5nKHZhbHVlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGUgYSBjaGFuZ2UgZXZlbnQuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBvbmx5IGZyb20gdGVzdHMgdG8gc2ltdWxhdGUgYSBjaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgc2ltdWxhdGVDaGFuZ2VfXygpOiB2b2lkIHtcbiAgICB0aGlzLnNpbXVsYXRlQ2hhbmdlQ2FsbGJhY2s/LigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSB2YWx1ZSB0byB0aGUgc3RyaW5nIHNob3duIGluIHRoZSB0ZXh0IGFyZWEuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIGN1c3RvbWl6ZSB0aGUgc2VyaWFsaXphdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbHVlVG9TdHJpbmcodmFsdWU6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUuam9pbignXFxuJyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVVQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMkJBQTJCO0FBVzdCLE1BQU0sOEJBQThCLGVBQTRKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXJNLElBQVcsVUFBK0I7QUFDeEMsV0FBTyxLQUFLLGtCQUFrQjtBQUFBLEVBQ2hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsSUFBVyxjQUFnQztBQUN6QyxXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbUI7QUFBQSxFQUVYO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0QsWUFBWSxhQUEwQjtBQUMzQyxVQUFNO0FBQ04sU0FBSyxvQkFBb0IsSUFBSSxrQkFBa0IsV0FBVztBQUMxRCx3QkFBb0IsYUFBYSxTQUFTLHFCQUFxQjtBQUFBLEVBQ2pFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLTyxRQUFjO0FBQ25CLFNBQUssa0JBQWtCLFNBQVMsRUFBRTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVWdCLFdBQThCO0FBQzVDLFdBQU8sS0FBSyxrQkFBa0IsU0FBUyxFQUFFLE1BQU0sSUFBSSxFQUFFLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxNQUFNLEVBQUU7QUFBQSxFQUMxRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFVBQW1CO0FBQ3hCLFdBQU8sS0FBSyxrQkFBa0IsU0FBUyxNQUFNO0FBQUEsRUFDL0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLFNBQVMsVUFBdUQ7QUFDckUsVUFBTSxnQkFBZ0IsTUFBWTtBQUNoQyxlQUFTLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDMUI7QUFDQSxTQUFLLHlCQUF5QjtBQUM5QixTQUFLLGtCQUFrQixTQUFTLGFBQWE7QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFnQixZQUFZLFlBQTJCO0FBQ3JELFVBQU0sWUFBWSxVQUFVO0FBQzVCLFNBQUssa0JBQWtCLFlBQVksVUFBVTtBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUU8sZUFBZSxhQUEyQjtBQUMvQyxTQUFLLGtCQUFrQixlQUFlLFdBQVc7QUFDakQsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLG9CQUFvQixrQkFBMkM7QUFDcEUsU0FBSyxlQUFlLEtBQUssY0FBYyxnQkFBZ0IsQ0FBQztBQUN4RCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUWdCLFNBQVMsT0FBZ0M7QUFDdkQsU0FBSyxrQkFBa0IsU0FBUyxLQUFLLGNBQWMsS0FBSyxDQUFDO0FBQ3pELFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sbUJBQXlCO0FBQzlCLFNBQUsseUJBQXlCO0FBQUEsRUFDaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFVLGNBQWMsT0FBa0M7QUFDeEQsV0FBTyxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQ3hCO0FBQ0Y7IiwibmFtZXMiOltdfQ==
@@ -0,0 +1,178 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Device-local recovery copies of a plugin's `data.json`, kept BEFORE anything could lose what the file held.
7
+ *
8
+ * Two cases lose a user's settings for good without one. A `data.json` that does not parse (truncated by a sync tool,
9
+ * a crash mid-write, a hand edit) reads as missing, because Obsidian's `Vault.readJson` swallows the parse error
10
+ * (read from `1.15.1`); and a record that parses but holds values the plugin drops or rewrites (an unknown key from a
11
+ * newer plugin version, a legacy migration) is normalized and saved back over the file on the initial load. A copy of
12
+ * the raw text is kept first, in a {@link LocalDataStore}, so no sync tool carries it to other devices and nothing is
13
+ * added to the vault.
14
+ */
15
+ import type { App } from 'obsidian';
16
+ /**
17
+ * How many recovery copies a {@link LocalSettingsRecoveryStore} keeps per plugin by default. The oldest is dropped
18
+ * first.
19
+ */
20
+ export declare const DEFAULT_MAX_SETTINGS_RECOVERY_COPIES = 5;
21
+ /**
22
+ * The {@link LocalDataStore} store id the recovery copies live under. The `-v1` names the record shape below.
23
+ */
24
+ export declare const SETTINGS_RECOVERY_STORE_ID = "settings-recovery-v1";
25
+ /**
26
+ * Why a recovery copy was kept.
27
+ */
28
+ export declare enum SettingsRecoveryReason {
29
+ /**
30
+ * The file did not parse as JSON, so it could not be loaded at all.
31
+ */
32
+ InvalidJson = "invalid-json",
33
+ /**
34
+ * The file parsed, but saving the normalized settings would have dropped or changed a stored value.
35
+ */
36
+ LossyRewrite = "lossy-rewrite"
37
+ }
38
+ /**
39
+ * Constructor parameters for {@link LocalSettingsRecoveryStore}.
40
+ */
41
+ export interface LocalSettingsRecoveryStoreConstructorParams {
42
+ /**
43
+ * The Obsidian app; its device-local `appId` scopes the store to this vault.
44
+ */
45
+ readonly app: App;
46
+ /**
47
+ * IndexedDB implementation, injectable for tests.
48
+ */
49
+ readonly factory?: IDBFactory;
50
+ /**
51
+ * How many copies to keep. Defaults to {@link DEFAULT_MAX_SETTINGS_RECOVERY_COPIES}.
52
+ */
53
+ readonly maxCopies?: number;
54
+ /**
55
+ * The clock, injectable for tests. Defaults to {@link Date.now}.
56
+ */
57
+ readonly now?: () => number;
58
+ /**
59
+ * The `manifest.id` of the plugin.
60
+ */
61
+ readonly pluginId: string;
62
+ }
63
+ /**
64
+ * One kept copy of a plugin's `data.json`.
65
+ */
66
+ export interface SettingsRecoveryCopy {
67
+ /**
68
+ * The copy's id, unique within the plugin's store.
69
+ */
70
+ readonly id: string;
71
+ /**
72
+ * When the copy was kept, in milliseconds since the Unix epoch.
73
+ */
74
+ readonly keptAt: number;
75
+ /**
76
+ * The vault-relative path of the file the copy was taken from.
77
+ */
78
+ readonly path: string;
79
+ /**
80
+ * The file's raw text, byte for byte as it was read.
81
+ */
82
+ readonly rawText: string;
83
+ /**
84
+ * Why the copy was kept.
85
+ */
86
+ readonly reason: SettingsRecoveryReason;
87
+ }
88
+ /**
89
+ * Where recovery copies of a plugin's `data.json` are kept.
90
+ */
91
+ export interface SettingsRecoveryStore {
92
+ /**
93
+ * Keeps a copy. A copy whose raw text is already kept is not duplicated; the existing one is returned.
94
+ *
95
+ * @param params - What to keep.
96
+ * @returns The kept copy.
97
+ */
98
+ readonly keep: (params: SettingsRecoveryStoreKeepParams) => Promise<SettingsRecoveryCopy>;
99
+ /**
100
+ * Lists the kept copies.
101
+ *
102
+ * @returns The copies, newest first.
103
+ */
104
+ readonly list: () => Promise<SettingsRecoveryCopy[]>;
105
+ /**
106
+ * Removes a kept copy. Removing an id that is not kept does nothing.
107
+ *
108
+ * @param id - The copy's id.
109
+ * @returns A promise that resolves when the copy is removed.
110
+ */
111
+ readonly remove: (id: string) => Promise<void>;
112
+ }
113
+ /**
114
+ * Parameters for {@link SettingsRecoveryStore.keep}.
115
+ */
116
+ export interface SettingsRecoveryStoreKeepParams {
117
+ /**
118
+ * The vault-relative path of the file the copy was taken from.
119
+ */
120
+ readonly path: string;
121
+ /**
122
+ * The file's raw text, byte for byte as it was read.
123
+ */
124
+ readonly rawText: string;
125
+ /**
126
+ * Why the copy is kept.
127
+ */
128
+ readonly reason: SettingsRecoveryReason;
129
+ }
130
+ /**
131
+ * A {@link SettingsRecoveryStore} in a device-local {@link LocalDataStore}, keeping the newest few copies.
132
+ *
133
+ * It opens its database per call and closes it again: copies are kept and read rarely (a load that found a damaged
134
+ * file, a lossy first save, the user asking for the list), so holding a connection for the plugin's lifetime would
135
+ * only add a resource to tie to an unload.
136
+ */
137
+ export declare class LocalSettingsRecoveryStore implements SettingsRecoveryStore {
138
+ private readonly factory;
139
+ private readonly maxCopies;
140
+ private readonly now;
141
+ private readonly pluginId;
142
+ private readonly vaultId;
143
+ /**
144
+ * Creates a new store.
145
+ *
146
+ * @param params - The constructor parameters.
147
+ */
148
+ constructor(params: LocalSettingsRecoveryStoreConstructorParams);
149
+ /**
150
+ * Keeps a copy, dropping the oldest ones beyond the limit in the same transaction.
151
+ *
152
+ * @param params - What to keep.
153
+ * @returns The kept copy, or the already kept one with the same raw text.
154
+ */
155
+ keep(params: SettingsRecoveryStoreKeepParams): Promise<SettingsRecoveryCopy>;
156
+ /**
157
+ * Lists the kept copies.
158
+ *
159
+ * @returns The copies, newest first.
160
+ */
161
+ list(): Promise<SettingsRecoveryCopy[]>;
162
+ /**
163
+ * Removes a kept copy.
164
+ *
165
+ * @param id - The copy's id.
166
+ * @returns A promise that resolves when the copy is removed.
167
+ */
168
+ remove(id: string): Promise<void>;
169
+ private withStore;
170
+ }
171
+ /**
172
+ * Checks whether a value is a {@link SettingsRecoveryCopy}. A record of another shape (a later version's, or a damaged
173
+ * one) is ignored rather than trusted.
174
+ *
175
+ * @param value - The value to check.
176
+ * @returns Whether the value is a recovery copy.
177
+ */
178
+ export declare function isSettingsRecoveryCopy(value: unknown): value is SettingsRecoveryCopy;
@@ -0,0 +1,125 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { LocalDataStore } from "./data-stores/local-data-store.mjs";
7
+ const DEFAULT_MAX_SETTINGS_RECOVERY_COPIES = 5;
8
+ const SETTINGS_RECOVERY_STORE_ID = "settings-recovery-v1";
9
+ var SettingsRecoveryReason = /* @__PURE__ */ ((SettingsRecoveryReason2) => {
10
+ SettingsRecoveryReason2["InvalidJson"] = "invalid-json";
11
+ SettingsRecoveryReason2["LossyRewrite"] = "lossy-rewrite";
12
+ return SettingsRecoveryReason2;
13
+ })(SettingsRecoveryReason || {});
14
+ class LocalSettingsRecoveryStore {
15
+ factory;
16
+ maxCopies;
17
+ now;
18
+ pluginId;
19
+ vaultId;
20
+ /**
21
+ * Creates a new store.
22
+ *
23
+ * @param params - The constructor parameters.
24
+ */
25
+ constructor(params) {
26
+ const maxCopies = params.maxCopies ?? DEFAULT_MAX_SETTINGS_RECOVERY_COPIES;
27
+ if (!Number.isSafeInteger(maxCopies) || maxCopies < 1) {
28
+ throw new RangeError(`maxCopies must be a positive integer, got ${String(maxCopies)}.`);
29
+ }
30
+ this.factory = params.factory;
31
+ this.maxCopies = maxCopies;
32
+ this.now = params.now ?? Date.now;
33
+ this.pluginId = params.pluginId;
34
+ this.vaultId = params.app.appId;
35
+ }
36
+ /**
37
+ * Keeps a copy, dropping the oldest ones beyond the limit in the same transaction.
38
+ *
39
+ * @param params - What to keep.
40
+ * @returns The kept copy, or the already kept one with the same raw text.
41
+ */
42
+ // eslint-disable-next-line typescript-dev-toolkit/params-options-name-match -- Implements SettingsRecoveryStore.keep, whose params type it shares.
43
+ async keep(params) {
44
+ return await this.withStore(async (store) => {
45
+ const copies = readCopies(await store.entries());
46
+ const duplicate = copies.find((copy2) => copy2.rawText === params.rawText);
47
+ if (duplicate) {
48
+ return duplicate;
49
+ }
50
+ const keptAt = this.now();
51
+ const copy = {
52
+ id: createCopyId(keptAt, copies),
53
+ keptAt,
54
+ path: params.path,
55
+ rawText: params.rawText,
56
+ reason: params.reason
57
+ };
58
+ const removedKeys = copies.slice(this.maxCopies - 1).map((oldCopy) => oldCopy.id);
59
+ await store.commit({ entries: [[copy.id, copy]], removedKeys });
60
+ return copy;
61
+ });
62
+ }
63
+ /**
64
+ * Lists the kept copies.
65
+ *
66
+ * @returns The copies, newest first.
67
+ */
68
+ async list() {
69
+ return await this.withStore(async (store) => readCopies(await store.entries()));
70
+ }
71
+ /**
72
+ * Removes a kept copy.
73
+ *
74
+ * @param id - The copy's id.
75
+ * @returns A promise that resolves when the copy is removed.
76
+ */
77
+ async remove(id) {
78
+ await this.withStore(async (store) => {
79
+ await store.delete(id);
80
+ });
81
+ }
82
+ async withStore(action) {
83
+ const store = await LocalDataStore.open({
84
+ ...this.factory && { factory: this.factory },
85
+ pluginId: this.pluginId,
86
+ storeId: SETTINGS_RECOVERY_STORE_ID,
87
+ vaultId: this.vaultId
88
+ });
89
+ try {
90
+ return await action(store);
91
+ } finally {
92
+ store.close();
93
+ }
94
+ }
95
+ }
96
+ function isSettingsRecoveryCopy(value) {
97
+ if (typeof value !== "object" || value === null) {
98
+ return false;
99
+ }
100
+ const record = value;
101
+ return typeof record.id === "string" && typeof record.keptAt === "number" && typeof record.path === "string" && typeof record.rawText === "string" && (record.reason === "invalid-json" /* InvalidJson */ || record.reason === "lossy-rewrite" /* LossyRewrite */);
102
+ }
103
+ function compareNewestFirst(a, b) {
104
+ return b.keptAt - a.keptAt || b.id.localeCompare(a.id);
105
+ }
106
+ function createCopyId(keptAt, copies) {
107
+ const ids = new Set(copies.map((copy) => copy.id));
108
+ const base = new Date(keptAt).toISOString();
109
+ let id = base;
110
+ for (let suffix = 1; ids.has(id); suffix++) {
111
+ id = `${base}-${String(suffix)}`;
112
+ }
113
+ return id;
114
+ }
115
+ function readCopies(entries) {
116
+ return entries.map(([, value]) => value).filter(isSettingsRecoveryCopy).sort(compareNewestFirst);
117
+ }
118
+ export {
119
+ DEFAULT_MAX_SETTINGS_RECOVERY_COPIES,
120
+ LocalSettingsRecoveryStore,
121
+ SETTINGS_RECOVERY_STORE_ID,
122
+ SettingsRecoveryReason,
123
+ isSettingsRecoveryCopy
124
+ };
125
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NldHRpbmdzLXJlY292ZXJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRGV2aWNlLWxvY2FsIHJlY292ZXJ5IGNvcGllcyBvZiBhIHBsdWdpbidzIGBkYXRhLmpzb25gLCBrZXB0IEJFRk9SRSBhbnl0aGluZyBjb3VsZCBsb3NlIHdoYXQgdGhlIGZpbGUgaGVsZC5cbiAqXG4gKiBUd28gY2FzZXMgbG9zZSBhIHVzZXIncyBzZXR0aW5ncyBmb3IgZ29vZCB3aXRob3V0IG9uZS4gQSBgZGF0YS5qc29uYCB0aGF0IGRvZXMgbm90IHBhcnNlICh0cnVuY2F0ZWQgYnkgYSBzeW5jIHRvb2wsXG4gKiBhIGNyYXNoIG1pZC13cml0ZSwgYSBoYW5kIGVkaXQpIHJlYWRzIGFzIG1pc3NpbmcsIGJlY2F1c2UgT2JzaWRpYW4ncyBgVmF1bHQucmVhZEpzb25gIHN3YWxsb3dzIHRoZSBwYXJzZSBlcnJvclxuICogKHJlYWQgZnJvbSBgMS4xNS4xYCk7IGFuZCBhIHJlY29yZCB0aGF0IHBhcnNlcyBidXQgaG9sZHMgdmFsdWVzIHRoZSBwbHVnaW4gZHJvcHMgb3IgcmV3cml0ZXMgKGFuIHVua25vd24ga2V5IGZyb20gYVxuICogbmV3ZXIgcGx1Z2luIHZlcnNpb24sIGEgbGVnYWN5IG1pZ3JhdGlvbikgaXMgbm9ybWFsaXplZCBhbmQgc2F2ZWQgYmFjayBvdmVyIHRoZSBmaWxlIG9uIHRoZSBpbml0aWFsIGxvYWQuIEEgY29weSBvZlxuICogdGhlIHJhdyB0ZXh0IGlzIGtlcHQgZmlyc3QsIGluIGEge0BsaW5rIExvY2FsRGF0YVN0b3JlfSwgc28gbm8gc3luYyB0b29sIGNhcnJpZXMgaXQgdG8gb3RoZXIgZGV2aWNlcyBhbmQgbm90aGluZyBpc1xuICogYWRkZWQgdG8gdGhlIHZhdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBMb2NhbERhdGFTdG9yZSB9IGZyb20gJy4vZGF0YS1zdG9yZXMvbG9jYWwtZGF0YS1zdG9yZS50cyc7XG5cbi8qKlxuICogSG93IG1hbnkgcmVjb3ZlcnkgY29waWVzIGEge0BsaW5rIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlfSBrZWVwcyBwZXIgcGx1Z2luIGJ5IGRlZmF1bHQuIFRoZSBvbGRlc3QgaXMgZHJvcHBlZFxuICogZmlyc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9TRVRUSU5HU19SRUNPVkVSWV9DT1BJRVMgPSA1O1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgTG9jYWxEYXRhU3RvcmV9IHN0b3JlIGlkIHRoZSByZWNvdmVyeSBjb3BpZXMgbGl2ZSB1bmRlci4gVGhlIGAtdjFgIG5hbWVzIHRoZSByZWNvcmQgc2hhcGUgYmVsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBTRVRUSU5HU19SRUNPVkVSWV9TVE9SRV9JRCA9ICdzZXR0aW5ncy1yZWNvdmVyeS12MSc7XG5cbi8qKlxuICogV2h5IGEgcmVjb3ZlcnkgY29weSB3YXMga2VwdC5cbiAqL1xuZXhwb3J0IGVudW0gU2V0dGluZ3NSZWNvdmVyeVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSBkaWQgbm90IHBhcnNlIGFzIEpTT04sIHNvIGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQgYXQgYWxsLlxuICAgKi9cbiAgSW52YWxpZEpzb24gPSAnaW52YWxpZC1qc29uJyxcblxuICAvKipcbiAgICogVGhlIGZpbGUgcGFyc2VkLCBidXQgc2F2aW5nIHRoZSBub3JtYWxpemVkIHNldHRpbmdzIHdvdWxkIGhhdmUgZHJvcHBlZCBvciBjaGFuZ2VkIGEgc3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgTG9zc3lSZXdyaXRlID0gJ2xvc3N5LXJld3JpdGUnXG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbFNldHRpbmdzUmVjb3ZlcnlTdG9yZUNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHA7IGl0cyBkZXZpY2UtbG9jYWwgYGFwcElkYCBzY29wZXMgdGhlIHN0b3JlIHRvIHRoaXMgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kZXhlZERCIGltcGxlbWVudGF0aW9uLCBpbmplY3RhYmxlIGZvciB0ZXN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGZhY3Rvcnk/OiBJREJGYWN0b3J5O1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSBjb3BpZXMgdG8ga2VlcC4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfTUFYX1NFVFRJTkdTX1JFQ09WRVJZX0NPUElFU30uXG4gICAqL1xuICByZWFkb25seSBtYXhDb3BpZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjbG9jaywgaW5qZWN0YWJsZSBmb3IgdGVzdHMuIERlZmF1bHRzIHRvIHtAbGluayBEYXRlLm5vd30uXG4gICAqL1xuICByZWFkb25seSBub3c/OiAoKSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBrZXB0IGNvcHkgb2YgYSBwbHVnaW4ncyBgZGF0YS5qc29uYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXR0aW5nc1JlY292ZXJ5Q29weSB7XG4gIC8qKlxuICAgKiBUaGUgY29weSdzIGlkLCB1bmlxdWUgd2l0aGluIHRoZSBwbHVnaW4ncyBzdG9yZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIGNvcHkgd2FzIGtlcHQsIGluIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVW5peCBlcG9jaC5cbiAgICovXG4gIHJlYWRvbmx5IGtlcHRBdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0aGUgY29weSB3YXMgdGFrZW4gZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGUncyByYXcgdGV4dCwgYnl0ZSBmb3IgYnl0ZSBhcyBpdCB3YXMgcmVhZC5cbiAgICovXG4gIHJlYWRvbmx5IHJhd1RleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2h5IHRoZSBjb3B5IHdhcyBrZXB0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBTZXR0aW5nc1JlY292ZXJ5UmVhc29uO1xufVxuXG4vKipcbiAqIFdoZXJlIHJlY292ZXJ5IGNvcGllcyBvZiBhIHBsdWdpbidzIGBkYXRhLmpzb25gIGFyZSBrZXB0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzUmVjb3ZlcnlTdG9yZSB7XG4gIC8qKlxuICAgKiBLZWVwcyBhIGNvcHkuIEEgY29weSB3aG9zZSByYXcgdGV4dCBpcyBhbHJlYWR5IGtlcHQgaXMgbm90IGR1cGxpY2F0ZWQ7IHRoZSBleGlzdGluZyBvbmUgaXMgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXaGF0IHRvIGtlZXAuXG4gICAqIEByZXR1cm5zIFRoZSBrZXB0IGNvcHkuXG4gICAqL1xuICByZWFkb25seSBrZWVwOiAocGFyYW1zOiBTZXR0aW5nc1JlY292ZXJ5U3RvcmVLZWVwUGFyYW1zKSA9PiBQcm9taXNlPFNldHRpbmdzUmVjb3ZlcnlDb3B5PjtcblxuICAvKipcbiAgICogTGlzdHMgdGhlIGtlcHQgY29waWVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29waWVzLCBuZXdlc3QgZmlyc3QuXG4gICAqL1xuICByZWFkb25seSBsaXN0OiAoKSA9PiBQcm9taXNlPFNldHRpbmdzUmVjb3ZlcnlDb3B5W10+O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2VwdCBjb3B5LiBSZW1vdmluZyBhbiBpZCB0aGF0IGlzIG5vdCBrZXB0IGRvZXMgbm90aGluZy5cbiAgICpcbiAgICogQHBhcmFtIGlkIC0gVGhlIGNvcHkncyBpZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29weSBpcyByZW1vdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlOiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgU2V0dGluZ3NSZWNvdmVyeVN0b3JlLmtlZXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzUmVjb3ZlcnlTdG9yZUtlZXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgdGhlIGNvcHkgd2FzIHRha2VuIGZyb20uXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlJ3MgcmF3IHRleHQsIGJ5dGUgZm9yIGJ5dGUgYXMgaXQgd2FzIHJlYWQuXG4gICAqL1xuICByZWFkb25seSByYXdUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoeSB0aGUgY29weSBpcyBrZXB0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBTZXR0aW5nc1JlY292ZXJ5UmVhc29uO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIFNldHRpbmdzUmVjb3ZlcnlTdG9yZX0gaW4gYSBkZXZpY2UtbG9jYWwge0BsaW5rIExvY2FsRGF0YVN0b3JlfSwga2VlcGluZyB0aGUgbmV3ZXN0IGZldyBjb3BpZXMuXG4gKlxuICogSXQgb3BlbnMgaXRzIGRhdGFiYXNlIHBlciBjYWxsIGFuZCBjbG9zZXMgaXQgYWdhaW46IGNvcGllcyBhcmUga2VwdCBhbmQgcmVhZCByYXJlbHkgKGEgbG9hZCB0aGF0IGZvdW5kIGEgZGFtYWdlZFxuICogZmlsZSwgYSBsb3NzeSBmaXJzdCBzYXZlLCB0aGUgdXNlciBhc2tpbmcgZm9yIHRoZSBsaXN0KSwgc28gaG9sZGluZyBhIGNvbm5lY3Rpb24gZm9yIHRoZSBwbHVnaW4ncyBsaWZldGltZSB3b3VsZFxuICogb25seSBhZGQgYSByZXNvdXJjZSB0byB0aWUgdG8gYW4gdW5sb2FkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxTZXR0aW5nc1JlY292ZXJ5U3RvcmUgaW1wbGVtZW50cyBTZXR0aW5nc1JlY292ZXJ5U3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGZhY3Rvcnk6IElEQkZhY3RvcnkgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4Q29waWVzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IExvY2FsU2V0dGluZ3NSZWNvdmVyeVN0b3JlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBjb25zdCBtYXhDb3BpZXMgPSBwYXJhbXMubWF4Q29waWVzID8/IERFRkFVTFRfTUFYX1NFVFRJTkdTX1JFQ09WRVJZX0NPUElFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG1heENvcGllcykgfHwgbWF4Q29waWVzIDwgMSkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYG1heENvcGllcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290ICR7U3RyaW5nKG1heENvcGllcyl9LmApO1xuICAgIH1cbiAgICB0aGlzLmZhY3RvcnkgPSBwYXJhbXMuZmFjdG9yeTtcbiAgICB0aGlzLm1heENvcGllcyA9IG1heENvcGllcztcbiAgICB0aGlzLm5vdyA9IHBhcmFtcy5ub3cgPz8gRGF0ZS5ub3c7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnZhdWx0SWQgPSBwYXJhbXMuYXBwLmFwcElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXBzIGEgY29weSwgZHJvcHBpbmcgdGhlIG9sZGVzdCBvbmVzIGJleW9uZCB0aGUgbGltaXQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXaGF0IHRvIGtlZXAuXG4gICAqIEByZXR1cm5zIFRoZSBrZXB0IGNvcHksIG9yIHRoZSBhbHJlYWR5IGtlcHQgb25lIHdpdGggdGhlIHNhbWUgcmF3IHRleHQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIEltcGxlbWVudHMgU2V0dGluZ3NSZWNvdmVyeVN0b3JlLmtlZXAsIHdob3NlIHBhcmFtcyB0eXBlIGl0IHNoYXJlcy5cbiAgcHVibGljIGFzeW5jIGtlZXAocGFyYW1zOiBTZXR0aW5nc1JlY292ZXJ5U3RvcmVLZWVwUGFyYW1zKTogUHJvbWlzZTxTZXR0aW5nc1JlY292ZXJ5Q29weT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhTdG9yZShhc3luYyAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IGNvcGllcyA9IHJlYWRDb3BpZXMoYXdhaXQgc3RvcmUuZW50cmllcygpKTtcbiAgICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGNvcGllcy5maW5kKChjb3B5KSA9PiBjb3B5LnJhd1RleHQgPT09IHBhcmFtcy5yYXdUZXh0KTtcbiAgICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VwdEF0ID0gdGhpcy5ub3coKTtcbiAgICAgIGNvbnN0IGNvcHk6IFNldHRpbmdzUmVjb3ZlcnlDb3B5ID0ge1xuICAgICAgICBpZDogY3JlYXRlQ29weUlkKGtlcHRBdCwgY29waWVzKSxcbiAgICAgICAga2VwdEF0LFxuICAgICAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICAgICAgcmF3VGV4dDogcGFyYW1zLnJhd1RleHQsXG4gICAgICAgIHJlYXNvbjogcGFyYW1zLnJlYXNvblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlbW92ZWRLZXlzID0gY29waWVzLnNsaWNlKHRoaXMubWF4Q29waWVzIC0gMSkubWFwKChvbGRDb3B5KSA9PiBvbGRDb3B5LmlkKTtcbiAgICAgIGF3YWl0IHN0b3JlLmNvbW1pdCh7IGVudHJpZXM6IFtbY29weS5pZCwgY29weV1dLCByZW1vdmVkS2V5cyB9KTtcbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBrZXB0IGNvcGllcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvcGllcywgbmV3ZXN0IGZpcnN0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxTZXR0aW5nc1JlY292ZXJ5Q29weVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aFN0b3JlKGFzeW5jIChzdG9yZSkgPT4gcmVhZENvcGllcyhhd2FpdCBzdG9yZS5lbnRyaWVzKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2VwdCBjb3B5LlxuICAgKlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgY29weSdzIGlkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IGlzIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLndpdGhTdG9yZShhc3luYyAoc3RvcmUpID0+IHtcbiAgICAgIGF3YWl0IHN0b3JlLmRlbGV0ZShpZCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdpdGhTdG9yZTxUPihhY3Rpb246IChzdG9yZTogTG9jYWxEYXRhU3RvcmUpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBzdG9yZSA9IGF3YWl0IExvY2FsRGF0YVN0b3JlLm9wZW4oe1xuICAgICAgLi4uKHRoaXMuZmFjdG9yeSAmJiB7IGZhY3Rvcnk6IHRoaXMuZmFjdG9yeSB9KSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc3RvcmVJZDogU0VUVElOR1NfUkVDT1ZFUllfU1RPUkVfSUQsXG4gICAgICB2YXVsdElkOiB0aGlzLnZhdWx0SWRcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbihzdG9yZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN0b3JlLmNsb3NlKCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhIHtAbGluayBTZXR0aW5nc1JlY292ZXJ5Q29weX0uIEEgcmVjb3JkIG9mIGFub3RoZXIgc2hhcGUgKGEgbGF0ZXIgdmVyc2lvbidzLCBvciBhIGRhbWFnZWRcbiAqIG9uZSkgaXMgaWdub3JlZCByYXRoZXIgdGhhbiB0cnVzdGVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcmVjb3ZlcnkgY29weS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2V0dGluZ3NSZWNvdmVyeUNvcHkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZXR0aW5nc1JlY292ZXJ5Q29weSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY29yZCA9IHZhbHVlIGFzIFBhcnRpYWw8UmVjb3JkPGtleW9mIFNldHRpbmdzUmVjb3ZlcnlDb3B5LCB1bmtub3duPj47XG4gIHJldHVybiB0eXBlb2YgcmVjb3JkLmlkID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiByZWNvcmQua2VwdEF0ID09PSAnbnVtYmVyJ1xuICAgICYmIHR5cGVvZiByZWNvcmQucGF0aCA9PT0gJ3N0cmluZydcbiAgICAmJiB0eXBlb2YgcmVjb3JkLnJhd1RleHQgPT09ICdzdHJpbmcnXG4gICAgJiYgKHJlY29yZC5yZWFzb24gPT09IFNldHRpbmdzUmVjb3ZlcnlSZWFzb24uSW52YWxpZEpzb24gfHwgcmVjb3JkLnJlYXNvbiA9PT0gU2V0dGluZ3NSZWNvdmVyeVJlYXNvbi5Mb3NzeVJld3JpdGUpO1xufVxuXG5mdW5jdGlvbiBjb21wYXJlTmV3ZXN0Rmlyc3QoYTogU2V0dGluZ3NSZWNvdmVyeUNvcHksIGI6IFNldHRpbmdzUmVjb3ZlcnlDb3B5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGIua2VwdEF0IC0gYS5rZXB0QXQgfHwgYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb3B5SWQoa2VwdEF0OiBudW1iZXIsIGNvcGllczogcmVhZG9ubHkgU2V0dGluZ3NSZWNvdmVyeUNvcHlbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoY29waWVzLm1hcCgoY29weSkgPT4gY29weS5pZCkpO1xuICBjb25zdCBiYXNlID0gbmV3IERhdGUoa2VwdEF0KS50b0lTT1N0cmluZygpO1xuICBsZXQgaWQgPSBiYXNlO1xuICBmb3IgKGxldCBzdWZmaXggPSAxOyBpZHMuaGFzKGlkKTsgc3VmZml4KyspIHtcbiAgICBpZCA9IGAke2Jhc2V9LSR7U3RyaW5nKHN1ZmZpeCl9YDtcbiAgfVxuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIHJlYWRDb3BpZXMoZW50cmllczogcmVhZG9ubHkgKHJlYWRvbmx5IFtzdHJpbmcsIHVua25vd25dKVtdKTogU2V0dGluZ3NSZWNvdmVyeUNvcHlbXSB7XG4gIHJldHVybiBlbnRyaWVzXG4gICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAuZmlsdGVyKGlzU2V0dGluZ3NSZWNvdmVyeUNvcHkpXG4gICAgLnNvcnQoY29tcGFyZU5ld2VzdEZpcnN0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBZUEsU0FBUyxzQkFBc0I7QUFNeEIsTUFBTSx1Q0FBdUM7QUFLN0MsTUFBTSw2QkFBNkI7QUFLbkMsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFJTCxFQUFBQSx3QkFBQSxpQkFBYztBQUtkLEVBQUFBLHdCQUFBLGtCQUFlO0FBVEwsU0FBQUE7QUFBQSxHQUFBO0FBK0hMLE1BQU0sMkJBQTREO0FBQUEsRUFDdEQ7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFxRDtBQUN0RSxVQUFNLFlBQVksT0FBTyxhQUFhO0FBQ3RDLFFBQUksQ0FBQyxPQUFPLGNBQWMsU0FBUyxLQUFLLFlBQVksR0FBRztBQUNyRCxZQUFNLElBQUksV0FBVyw2Q0FBNkMsT0FBTyxTQUFTLENBQUMsR0FBRztBQUFBLElBQ3hGO0FBQ0EsU0FBSyxVQUFVLE9BQU87QUFDdEIsU0FBSyxZQUFZO0FBQ2pCLFNBQUssTUFBTSxPQUFPLE9BQU8sS0FBSztBQUM5QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLFVBQVUsT0FBTyxJQUFJO0FBQUEsRUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxLQUFLLFFBQXdFO0FBQ3hGLFdBQU8sTUFBTSxLQUFLLFVBQVUsT0FBTyxVQUFVO0FBQzNDLFlBQU0sU0FBUyxXQUFXLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDL0MsWUFBTSxZQUFZLE9BQU8sS0FBSyxDQUFDQyxVQUFTQSxNQUFLLFlBQVksT0FBTyxPQUFPO0FBQ3ZFLFVBQUksV0FBVztBQUNiLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxTQUFTLEtBQUssSUFBSTtBQUN4QixZQUFNLE9BQTZCO0FBQUEsUUFDakMsSUFBSSxhQUFhLFFBQVEsTUFBTTtBQUFBLFFBQy9CO0FBQUEsUUFDQSxNQUFNLE9BQU87QUFBQSxRQUNiLFNBQVMsT0FBTztBQUFBLFFBQ2hCLFFBQVEsT0FBTztBQUFBLE1BQ2pCO0FBQ0EsWUFBTSxjQUFjLE9BQU8sTUFBTSxLQUFLLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLFFBQVEsRUFBRTtBQUNoRixZQUFNLE1BQU0sT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUM7QUFDOUQsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLE9BQXdDO0FBQ25ELFdBQU8sTUFBTSxLQUFLLFVBQVUsT0FBTyxVQUFVLFdBQVcsTUFBTSxNQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQUEsRUFDaEY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWEsT0FBTyxJQUEyQjtBQUM3QyxVQUFNLEtBQUssVUFBVSxPQUFPLFVBQVU7QUFDcEMsWUFBTSxNQUFNLE9BQU8sRUFBRTtBQUFBLElBQ3ZCLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFQSxNQUFjLFVBQWEsUUFBMkQ7QUFDcEYsVUFBTSxRQUFRLE1BQU0sZUFBZSxLQUFLO0FBQUEsTUFDdEMsR0FBSSxLQUFLLFdBQVcsRUFBRSxTQUFTLEtBQUssUUFBUTtBQUFBLE1BQzVDLFVBQVUsS0FBSztBQUFBLE1BQ2YsU0FBUztBQUFBLE1BQ1QsU0FBUyxLQUFLO0FBQUEsSUFDaEIsQ0FBQztBQUNELFFBQUk7QUFDRixhQUFPLE1BQU0sT0FBTyxLQUFLO0FBQUEsSUFDM0IsVUFBRTtBQUNBLFlBQU0sTUFBTTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQ0Y7QUFTTyxTQUFTLHVCQUF1QixPQUErQztBQUNwRixNQUFJLE9BQU8sVUFBVSxZQUFZLFVBQVUsTUFBTTtBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUNBLFFBQU0sU0FBUztBQUNmLFNBQU8sT0FBTyxPQUFPLE9BQU8sWUFDdkIsT0FBTyxPQUFPLFdBQVcsWUFDekIsT0FBTyxPQUFPLFNBQVMsWUFDdkIsT0FBTyxPQUFPLFlBQVksYUFDekIsT0FBTyxXQUFXLG9DQUFzQyxPQUFPLFdBQVc7QUFDbEY7QUFFQSxTQUFTLG1CQUFtQixHQUF5QixHQUFpQztBQUNwRixTQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLGNBQWMsRUFBRSxFQUFFO0FBQ3ZEO0FBRUEsU0FBUyxhQUFhLFFBQWdCLFFBQWlEO0FBQ3JGLFFBQU0sTUFBTSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLEVBQUUsQ0FBQztBQUNqRCxRQUFNLE9BQU8sSUFBSSxLQUFLLE1BQU0sRUFBRSxZQUFZO0FBQzFDLE1BQUksS0FBSztBQUNULFdBQVMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLEdBQUcsVUFBVTtBQUMxQyxTQUFLLEdBQUcsSUFBSSxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQUEsRUFDaEM7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLFdBQVcsU0FBMEU7QUFDNUYsU0FBTyxRQUNKLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLEtBQUssRUFDeEIsT0FBTyxzQkFBc0IsRUFDN0IsS0FBSyxrQkFBa0I7QUFDNUI7IiwKICAibmFtZXMiOiBbIlNldHRpbmdzUmVjb3ZlcnlSZWFzb24iLCAiY29weSJdCn0K
@@ -128,7 +128,7 @@ class SettingsTabs {
128
128
  return this;
129
129
  }
130
130
  findEntry(tabId) {
131
- return this.entries.find((entry) => entry.tab.id === tabId);
131
+ return this.entries.find((entry) => entry.tab.id === tabId) ?? null;
132
132
  }
133
133
  onKeyDown(event_) {
134
134
  const count = this.entries.length;
@@ -167,4 +167,4 @@ class SettingsTabs {
167
167
  export {
168
168
  SettingsTabs
169
169
  };
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy10YWJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUYWJiZWQgc2VjdGlvbnMgaW5zaWRlIGEgcGx1Z2luJ3Mgc2V0dGluZ3MuXG4gKi9cblxuaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgaW5pdFBsdWdpbkNvbnRleHRgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBpbml0UGx1Z2luQ29udGV4dCB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgdGFiIG9mIHtAbGluayBTZXR0aW5nc1RhYnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzVGFiIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGFuIE9ic2lkaWFuIGljb24gc2hvd24gYmVmb3JlIHRoZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgaWNvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSB0YWIsIHVuaXF1ZSBhbW9uZyB0aGUgdGFicy5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHNob3duIG9uIHRoZSB0YWIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB0YWIncyBzZXR0aW5ncyBpbnRvIHRoZSBwYW5lbCwgd2hpY2ggaXMgZW1wdHkgZWFjaCB0aW1lIHRoZSB0YWIgaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBwYW5lbC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcjogKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFNldHRpbmdzVGFiRW50cnkge1xuICByZWFkb25seSBidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIHJlYWRvbmx5IHRhYjogU2V0dGluZ3NUYWI7XG59XG5cbi8qKlxuICogVGFiYmVkIHNlY3Rpb25zIGluc2lkZSBhIHBsdWdpbidzIHNldHRpbmdzOiBhIHJvdyBvZiB0YWIgYnV0dG9ucyBhbmQgb25lIHBhbmVsLCB3aGljaCByZW5kZXJzIG9ubHkgdGhlIHNlbGVjdGVkIHRhYi5cbiAqIFRoZSBhcnJvdyBrZXlzLCBIb21lIGFuZCBFbmQgbW92ZSBiZXR3ZWVuIHRhYnMsIGFzIGluIHRoZSBXQUktQVJJQSB0YWJzIHBhdHRlcm4uXG4gKlxuICogYGBgdHNcbiAqIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICogICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gKiAgIG5ldyBTZXR0aW5nc1RhYnModGhpcy5jb250YWluZXJFbClcbiAqICAgICAuYWRkVGFiKHsgaWQ6ICdnZW5lcmFsJywgbmFtZTogJ0dlbmVyYWwnLCByZW5kZXI6IChlbCkgPT4gdGhpcy5yZW5kZXJHZW5lcmFsKGVsKSB9KVxuICogICAgIC5hZGRUYWIoeyBpZDogJ2FkdmFuY2VkJywgbmFtZTogJ0FkdmFuY2VkJywgcmVuZGVyOiAoZWwpID0+IHRoaXMucmVuZGVyQWR2YW5jZWQoZWwpIH0pXG4gKiAgICAgLnNlbGVjdFRhYih0aGlzLmxhc3RUYWJJZClcbiAqICAgICAub25UYWJDaGFuZ2UoKHRhYklkKSA9PiB7XG4gKiAgICAgICB0aGlzLmxhc3RUYWJJZCA9IHRhYklkO1xuICogICAgIH0pO1xuICogfVxuICogYGBgXG4gKlxuICogSW4gb3JkZXIgdG8gYWRkIHRoZSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgaW5pdFBsdWdpbkNvbnRleHR9IGluIHlvdXIgcGx1Z2luJ3MgYG9ubG9hZCgpYCBmdW5jdGlvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNvcHkgc3R5bGVzIGZyb20ge0BsaW5rIGh0dHBzOi8vdW5wa2cuY29tL0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGlzdC9zdHlsZXMuY3NzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzVGFicyB7XG4gIC8qKlxuICAgKiBUaGUgcGFuZWwgdGhlIHNlbGVjdGVkIHRhYiByZW5kZXJzIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFuZWxFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSByb3cgb2YgdGFiIGJ1dHRvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFiQmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgY2hhbmdlQ2FsbGJhY2s/OiAodGFiSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzOiBTZXR0aW5nc1RhYkVudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFRhYklkOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgc2V0dGluZ3MgdGFicy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGFpbmVyRWwsIENzc0NsYXNzLlNldHRpbmdzVGFicyk7XG4gICAgdGhpcy50YWJCYXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7IGF0dHI6IHsgcm9sZTogJ3RhYmxpc3QnIH0sIGNsczogJ3NldHRpbmdzLXRhYnMtYmFyJyB9KTtcbiAgICB0aGlzLnRhYkJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBhbmVsRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoeyBhdHRyOiB7IHJvbGU6ICd0YWJwYW5lbCcgfSwgY2xzOiAnc2V0dGluZ3MtdGFicy1wYW5lbCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhYi4gVGhlIGZpcnN0IHRhYiBhZGRlZCBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHRhYiAtIFRoZSB0YWIuXG4gICAqIEByZXR1cm5zIFRoZSB0YWJzLlxuICAgKiBAdGhyb3dzIElmIGEgdGFiIHdpdGggdGhlIHNhbWUgaWQgd2FzIGFscmVhZHkgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFiKHRhYjogU2V0dGluZ3NUYWIpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5maW5kRW50cnkodGFiLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHNldHRpbmdzIHRhYiB3aXRoIHRoZSBpZCAke3RhYi5pZH0gd2FzIGFscmVhZHkgYWRkZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy50YWJCYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7ICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJywgJ3JvbGUnOiAndGFiJywgJ3RhYmluZGV4JzogJy0xJyB9LCBjbHM6ICdzZXR0aW5ncy10YWJzLWJ1dHRvbicgfSk7XG4gICAgaWYgKHRhYi5pY29uKSB7XG4gICAgICBzZXRJY29uKGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyBjbHM6ICdzZXR0aW5ncy10YWJzLWljb24nIH0pLCB0YWIuaWNvbik7XG4gICAgfVxuICAgIGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiB0YWIubmFtZSB9KTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goeyBidXR0b25FbCwgdGFiIH0pO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiSWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCB0YWIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCwgb3IgYG51bGxgIGJlZm9yZSBhbnkgdGFiIGlzIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkVGFiSWQoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFub3RoZXIgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2ssIGdpdmVuIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgdGFiLlxuICAgKiBAcmV0dXJucyBUaGUgdGFicy5cbiAgICovXG4gIHB1YmxpYyBvblRhYkNoYW5nZShjYWxsYmFjazogKHRhYklkOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHRhYiBhbmQgcmVuZGVycyBpdCBpbnRvIHRoZSBwYW5lbC4gQW4gdW5rbm93biBpZCwgc3VjaCBhcyBhIHN0b3JlZCBpZCB3aG9zZSB0YWIgd2FzIHNpbmNlIHJlbW92ZWQsIGxlYXZlc1xuICAgKiB0aGUgc2VsZWN0aW9uIGFzIGl0IGlzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFiSWQgLSBUaGUgaWQgb2YgdGhlIHRhYi5cbiAgICogQHJldHVybnMgVGhlIHRhYnMuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VGFiKHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpbmRFbnRyeSh0YWJJZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdGFiIH0gPSBlbnRyeTtcbiAgICBjb25zdCBpc0NoYW5nZSA9IHRoaXMuc2VsZWN0ZWRUYWJJZCAhPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkVGFiSWQgIT09IHRhYi5pZDtcbiAgICB0aGlzLnNlbGVjdGVkVGFiSWQgPSB0YWIuaWQ7XG4gICAgZm9yIChjb25zdCB7IGJ1dHRvbkVsLCB0YWI6IGNhbmRpZGF0ZSB9IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGNhbmRpZGF0ZSA9PT0gdGFiO1xuICAgICAgYnV0dG9uRWwudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuSXNBY3RpdmUsIGlzU2VsZWN0ZWQpO1xuICAgICAgYnV0dG9uRWwuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIGJ1dHRvbkVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBpc1NlbGVjdGVkID8gJzAnIDogJy0xJyk7XG4gICAgfVxuICAgIHRoaXMucGFuZWxFbC5lbXB0eSgpO1xuICAgIHRhYi5yZW5kZXIodGhpcy5wYW5lbEVsKTtcbiAgICBpZiAoaXNDaGFuZ2UpIHtcbiAgICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2s/Lih0YWIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVudHJ5KHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogU2V0dGluZ3NUYWJFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkudGFiLmlkID09PSB0YWJJZCk7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudF86IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkudGFiLmlkID09PSB0aGlzLnNlbGVjdGVkVGFiSWQpO1xuICAgIGxldCBuZXh0SW5kZXg6IG51bWJlcjtcbiAgICBzd2l0Y2ggKGV2ZW50Xy5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gKGluZGV4IC0gMSArIGNvdW50KSAlIGNvdW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiB7XG4gICAgICAgIG5leHRJbmRleCA9IChpbmRleCArIDEpICUgY291bnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICBuZXh0SW5kZXggPSBjb3VudCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnSG9tZSc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEVudHJ5ID0gdGhpcy5lbnRyaWVzW25leHRJbmRleF07XG4gICAgaWYgKCFuZXh0RW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnRfLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RUYWIobmV4dEVudHJ5LnRhYi5p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
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy10YWJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUYWJiZWQgc2VjdGlvbnMgaW5zaWRlIGEgcGx1Z2luJ3Mgc2V0dGluZ3MuXG4gKi9cblxuaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgaW5pdFBsdWdpbkNvbnRleHRgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBpbml0UGx1Z2luQ29udGV4dCB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgdGFiIG9mIHtAbGluayBTZXR0aW5nc1RhYnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzVGFiIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGFuIE9ic2lkaWFuIGljb24gc2hvd24gYmVmb3JlIHRoZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgaWNvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSB0YWIsIHVuaXF1ZSBhbW9uZyB0aGUgdGFicy5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHNob3duIG9uIHRoZSB0YWIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB0YWIncyBzZXR0aW5ncyBpbnRvIHRoZSBwYW5lbCwgd2hpY2ggaXMgZW1wdHkgZWFjaCB0aW1lIHRoZSB0YWIgaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBwYW5lbC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcjogKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFNldHRpbmdzVGFiRW50cnkge1xuICByZWFkb25seSBidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIHJlYWRvbmx5IHRhYjogU2V0dGluZ3NUYWI7XG59XG5cbi8qKlxuICogVGFiYmVkIHNlY3Rpb25zIGluc2lkZSBhIHBsdWdpbidzIHNldHRpbmdzOiBhIHJvdyBvZiB0YWIgYnV0dG9ucyBhbmQgb25lIHBhbmVsLCB3aGljaCByZW5kZXJzIG9ubHkgdGhlIHNlbGVjdGVkIHRhYi5cbiAqIFRoZSBhcnJvdyBrZXlzLCBIb21lIGFuZCBFbmQgbW92ZSBiZXR3ZWVuIHRhYnMsIGFzIGluIHRoZSBXQUktQVJJQSB0YWJzIHBhdHRlcm4uXG4gKlxuICogYGBgdHNcbiAqIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICogICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gKiAgIG5ldyBTZXR0aW5nc1RhYnModGhpcy5jb250YWluZXJFbClcbiAqICAgICAuYWRkVGFiKHsgaWQ6ICdnZW5lcmFsJywgbmFtZTogJ0dlbmVyYWwnLCByZW5kZXI6IChlbCkgPT4gdGhpcy5yZW5kZXJHZW5lcmFsKGVsKSB9KVxuICogICAgIC5hZGRUYWIoeyBpZDogJ2FkdmFuY2VkJywgbmFtZTogJ0FkdmFuY2VkJywgcmVuZGVyOiAoZWwpID0+IHRoaXMucmVuZGVyQWR2YW5jZWQoZWwpIH0pXG4gKiAgICAgLnNlbGVjdFRhYih0aGlzLmxhc3RUYWJJZClcbiAqICAgICAub25UYWJDaGFuZ2UoKHRhYklkKSA9PiB7XG4gKiAgICAgICB0aGlzLmxhc3RUYWJJZCA9IHRhYklkO1xuICogICAgIH0pO1xuICogfVxuICogYGBgXG4gKlxuICogSW4gb3JkZXIgdG8gYWRkIHRoZSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgaW5pdFBsdWdpbkNvbnRleHR9IGluIHlvdXIgcGx1Z2luJ3MgYG9ubG9hZCgpYCBmdW5jdGlvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNvcHkgc3R5bGVzIGZyb20ge0BsaW5rIGh0dHBzOi8vdW5wa2cuY29tL0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGlzdC9zdHlsZXMuY3NzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzVGFicyB7XG4gIC8qKlxuICAgKiBUaGUgcGFuZWwgdGhlIHNlbGVjdGVkIHRhYiByZW5kZXJzIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFuZWxFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSByb3cgb2YgdGFiIGJ1dHRvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFiQmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgY2hhbmdlQ2FsbGJhY2s/OiAodGFiSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzOiBTZXR0aW5nc1RhYkVudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFRhYklkOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgc2V0dGluZ3MgdGFicy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGFpbmVyRWwsIENzc0NsYXNzLlNldHRpbmdzVGFicyk7XG4gICAgdGhpcy50YWJCYXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7IGF0dHI6IHsgcm9sZTogJ3RhYmxpc3QnIH0sIGNsczogJ3NldHRpbmdzLXRhYnMtYmFyJyB9KTtcbiAgICB0aGlzLnRhYkJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBhbmVsRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoeyBhdHRyOiB7IHJvbGU6ICd0YWJwYW5lbCcgfSwgY2xzOiAnc2V0dGluZ3MtdGFicy1wYW5lbCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhYi4gVGhlIGZpcnN0IHRhYiBhZGRlZCBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHRhYiAtIFRoZSB0YWIuXG4gICAqIEByZXR1cm5zIFRoZSB0YWJzLlxuICAgKiBAdGhyb3dzIElmIGEgdGFiIHdpdGggdGhlIHNhbWUgaWQgd2FzIGFscmVhZHkgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFiKHRhYjogU2V0dGluZ3NUYWIpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5maW5kRW50cnkodGFiLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHNldHRpbmdzIHRhYiB3aXRoIHRoZSBpZCAke3RhYi5pZH0gd2FzIGFscmVhZHkgYWRkZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy50YWJCYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7ICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJywgJ3JvbGUnOiAndGFiJywgJ3RhYmluZGV4JzogJy0xJyB9LCBjbHM6ICdzZXR0aW5ncy10YWJzLWJ1dHRvbicgfSk7XG4gICAgaWYgKHRhYi5pY29uKSB7XG4gICAgICBzZXRJY29uKGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyBjbHM6ICdzZXR0aW5ncy10YWJzLWljb24nIH0pLCB0YWIuaWNvbik7XG4gICAgfVxuICAgIGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiB0YWIubmFtZSB9KTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goeyBidXR0b25FbCwgdGFiIH0pO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiSWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCB0YWIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCwgb3IgYG51bGxgIGJlZm9yZSBhbnkgdGFiIGlzIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkVGFiSWQoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFub3RoZXIgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2ssIGdpdmVuIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgdGFiLlxuICAgKiBAcmV0dXJucyBUaGUgdGFicy5cbiAgICovXG4gIHB1YmxpYyBvblRhYkNoYW5nZShjYWxsYmFjazogKHRhYklkOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHRhYiBhbmQgcmVuZGVycyBpdCBpbnRvIHRoZSBwYW5lbC4gQW4gdW5rbm93biBpZCwgc3VjaCBhcyBhIHN0b3JlZCBpZCB3aG9zZSB0YWIgd2FzIHNpbmNlIHJlbW92ZWQsIGxlYXZlc1xuICAgKiB0aGUgc2VsZWN0aW9uIGFzIGl0IGlzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFiSWQgLSBUaGUgaWQgb2YgdGhlIHRhYi5cbiAgICogQHJldHVybnMgVGhlIHRhYnMuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VGFiKHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpbmRFbnRyeSh0YWJJZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdGFiIH0gPSBlbnRyeTtcbiAgICBjb25zdCBpc0NoYW5nZSA9IHRoaXMuc2VsZWN0ZWRUYWJJZCAhPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkVGFiSWQgIT09IHRhYi5pZDtcbiAgICB0aGlzLnNlbGVjdGVkVGFiSWQgPSB0YWIuaWQ7XG4gICAgZm9yIChjb25zdCB7IGJ1dHRvbkVsLCB0YWI6IGNhbmRpZGF0ZSB9IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGNhbmRpZGF0ZSA9PT0gdGFiO1xuICAgICAgYnV0dG9uRWwudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuSXNBY3RpdmUsIGlzU2VsZWN0ZWQpO1xuICAgICAgYnV0dG9uRWwuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIGJ1dHRvbkVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBpc1NlbGVjdGVkID8gJzAnIDogJy0xJyk7XG4gICAgfVxuICAgIHRoaXMucGFuZWxFbC5lbXB0eSgpO1xuICAgIHRhYi5yZW5kZXIodGhpcy5wYW5lbEVsKTtcbiAgICBpZiAoaXNDaGFuZ2UpIHtcbiAgICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2s/Lih0YWIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVudHJ5KHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVsbCB8IFNldHRpbmdzVGFiRW50cnkge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZmluZCgoZW50cnkpID0+IGVudHJ5LnRhYi5pZCA9PT0gdGFiSWQpID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudF86IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkudGFiLmlkID09PSB0aGlzLnNlbGVjdGVkVGFiSWQpO1xuICAgIGxldCBuZXh0SW5kZXg6IG51bWJlcjtcbiAgICBzd2l0Y2ggKGV2ZW50Xy5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gKGluZGV4IC0gMSArIGNvdW50KSAlIGNvdW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiB7XG4gICAgICAgIG5leHRJbmRleCA9IChpbmRleCArIDEpICUgY291bnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICBuZXh0SW5kZXggPSBjb3VudCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnSG9tZSc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEVudHJ5ID0gdGhpcy5lbnRyaWVzW25leHRJbmRleF07XG4gICAgaWYgKCFuZXh0RW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnRfLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RUYWIobmV4dEVudHJ5LnRh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
@@ -35,6 +35,7 @@
35
35
  */
36
36
  import type { App, TFile } from 'obsidian';
37
37
  import type { PathOrFile } from './file-system.mjs';
38
+ import type { ThirdPartyPluginAdapter } from './plugin/third-party-plugin.mjs';
38
39
  import { AppActiveFileProvider } from './active-file-provider.mjs';
39
40
  /**
40
41
  * Parameters for {@link getTemplaterFunctions}.
@@ -282,3 +283,8 @@ export declare function requireTemplaterApi(app: App): TemplaterApi;
282
283
  * @returns The internal API, or `null` when `Templater` is not there to talk to.
283
284
  */
284
285
  export declare function resolveTemplaterApi(app: App): null | TemplaterApi;
286
+ /**
287
+ * The {@link ThirdPartyPluginAdapter} of `Templater`, for `watchThirdPartyPluginApi`, the waits and
288
+ * `createThirdPartyPluginDependency`. It reads `plugin.templater` and verifies the members this module calls.
289
+ */
290
+ export declare const TEMPLATER_PLUGIN_ADAPTER: ThirdPartyPluginAdapter<TemplaterApi>;
@@ -108,7 +108,15 @@ function requireTemplaterApi(app) {
108
108
  }
109
109
  function resolveTemplaterApi(app) {
110
110
  const plugin = app.plugins.getPlugin(TEMPLATER_PLUGIN_ID);
111
- if (!plugin || !("templater" in plugin)) {
111
+ return plugin ? getTemplaterApiFromPlugin(plugin) : null;
112
+ }
113
+ const TEMPLATER_PLUGIN_ADAPTER = {
114
+ getApi: getTemplaterApiFromPlugin,
115
+ pluginId: TEMPLATER_PLUGIN_ID,
116
+ pluginName: "Templater"
117
+ };
118
+ function getTemplaterApiFromPlugin(plugin) {
119
+ if (!("templater" in plugin)) {
112
120
  return null;
113
121
  }
114
122
  const templater = plugin.templater;
@@ -123,6 +131,7 @@ function isTemplaterApi(value) {
123
131
  return typeof functionsGenerator === "object" && functionsGenerator !== null && "generate_object" in functionsGenerator && typeof functionsGenerator.generate_object === "function";
124
132
  }
125
133
  export {
134
+ TEMPLATER_PLUGIN_ADAPTER,
126
135
  TEMPLATER_PLUGIN_ID,
127
136
  TemplaterActiveFileProvider,
128
137
  TemplaterRunMode,
@@ -134,4 +143,4 @@ export {
134
143
  requireTemplaterApi,
135
144
  resolveTemplaterApi
136
145
  };
137
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBzbGljZSBvZiBgVGVtcGxhdGVyYCdzIElOVEVSTkFMIEFQSSB0aGlzIGxpYnJhcnkgdGFsa3MgdG8sIGFuZCB0aGUgcnVudGltZSBuYXJyb3dpbmcgdGhhdCBnZXRzIGhvbGRcbiAqIG9mIGl0LlxuICpcbiAqICoqYFRlbXBsYXRlcmAgcHVibGlzaGVzIG5vIEFQSS4qKiBSZW5kZXJpbmcgYSB0ZW1wbGF0ZSBhZ2FpbnN0IGEgZmlsZSBhbmQgZ2V0dGluZyB0aGUgcmVzdWx0aW5nIHN0cmluZ1xuICogYmFjayBpcyBvbmx5IHJlYWNoYWJsZSB0aHJvdWdoIHVuZG9jdW1lbnRlZCBpbnRlcm5hbHMgaGFuZ2luZyBvZmZcbiAqIGBhcHAucGx1Z2lucy5nZXRQbHVnaW4oJ3RlbXBsYXRlci1vYnNpZGlhbicpLnRlbXBsYXRlcmAgXHUyMDE0IGBjcmVhdGVfcnVubmluZ19jb25maWdgLFxuICogYGZ1bmN0aW9uc19nZW5lcmF0b3IuZ2VuZXJhdGVfb2JqZWN0YCwgYHJlYWRfYW5kX3BhcnNlX3RlbXBsYXRlYCwgYW5kIGEgYFJ1bk1vZGVgIGVudW0uIEV2ZXJ5IHBsdWdpblxuICogdGhhdCB3YW50cyBpdCByZS1kZXJpdmVzIHRoZSBzYW1lIHJldmVyc2UgZW5naW5lZXJpbmcsIHdoaWNoIGlzIHdoeSBpdCBsaXZlcyBoZXJlIGluc3RlYWQuXG4gKlxuICogKipUaGlzIG1vZHVsZSBpcyBleHBsaWNpdGx5IEJFU1QtRUZGT1JULioqIE5vdGhpbmcgaXQgYmluZHMgdG8gaXMgZG9jdW1lbnRlZCBvciBjb3ZlcmVkIGJ5IGBUZW1wbGF0ZXJgJ3NcbiAqIHNlbWFudGljIHZlcnNpb25pbmcsIHNvIGEgYFRlbXBsYXRlcmAgcmVsZWFzZSBtYXkgcmVuYW1lIG9yIHJlc2hhcGUgYW55IG9mIGl0IHdpdGhvdXQgd2FybmluZy4gVGhlIHNoYXBlc1xuICogYmVsb3cgd2VyZSByZWFkIGZyb20gYFRlbXBsYXRlcmAgYDIuMjQuM2AuIFR3byBkZWxpYmVyYXRlIGNvbnNlcXVlbmNlcyBmb2xsb3c6XG4gKlxuICogLSB7QGxpbmsgcmVzb2x2ZVRlbXBsYXRlckFwaX0gcmV0dXJucyBgbnVsbGAgXHUyMDE0IGEgYFRlbXBsYXRlcmAgdG9vIG9sZCwgdG9vIG5ldyBvciB0b28gYnJva2VuIHRvIHRhbGsgdG9cbiAqICAgcmVhZHMgYXMgXCJub3QgdGhlcmVcIiBhbmQgdGhlIGludGVncmF0aW9uIHN0YXlzIGRvcm1hbnQuXG4gKiAtIHtAbGluayByZXF1aXJlVGVtcGxhdGVyQXBpfSB0aHJvd3MgYSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0gdGhhdCBOQU1FUyB0aGUgcGx1Z2luIGFuZCB0aGVcbiAqICAgcmVhc29uLCByYXRoZXIgdGhhbiBsZXR0aW5nIGEgYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzdXJmYWNlIGZyb20gc29tZXdoZXJlIGluc2lkZVxuICogICBgVGVtcGxhdGVyYC5cbiAqXG4gKiBUaGUgdHlwZXMgYXJlIERFQ0xBUkVEIEhFUkUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGFuZCBuYXJyb3dlZCB0byB0aGUgbWVtYmVycyBhY3R1YWxseSBjYWxsZWQ6IGBUZW1wbGF0ZXJgXG4gKiBzaGlwcyBubyBucG0gdHlwZXMgcGFja2FnZSwgYW5kIGRlcGVuZGluZyBvbiBpdCB3b3VsZCB0dXJuIGFuIG9wdGlvbmFsIGludGVncmF0aW9uIGludG8gYSBidWlsZC10aW1lXG4gKiBkZXBlbmRlbmN5LlxuICpcbiAqIFRoZSBzZWNvbmQgdGhpbmcgdGhpcyBtb2R1bGUgc3VwcGxpZXMgaXMgYW4gYWN0aXZlLWZpbGUgYW5zd2VyLiBXaGlsZSBhIHRlbXBsYXRlIHJlbmRlcnMsXG4gKiBgYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClgIHN0aWxsIHBvaW50cyBhdCB3aGF0ZXZlciB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgb3BlbiBcdTIwMTQgTk9UIGF0IHRoZSBmaWxlXG4gKiB0aGUgdGVtcGxhdGUgaXMgYmVpbmcgcmVuZGVyZWQgZm9yIFx1MjAxNCBzbyBhIHBsdWdpbidzIG93biBoZWxwZXIgY2FsbGVkIGZyb20gaW5zaWRlIGEgdGVtcGxhdGUgcmVzb2x2ZXNcbiAqIGxpbmtzIGFnYWluc3QgdGhlIHdyb25nIG5vdGUuIHtAbGluayBUZW1wbGF0ZXJBY3RpdmVGaWxlUHJvdmlkZXJ9IGFuc3dlcnMgd2l0aCB0aGUgcmVuZGVyIHRhcmdldCBmb3IgdGhlXG4gKiBkdXJhdGlvbiBvZiBhIHtAbGluayBwYXJzZVRlbXBsYXRlfSBjYWxsIGFuZCBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2Ugb3RoZXJ3aXNlLiBOb3RlIHRoaXMgaXMgYWJvdXRcbiAqIHRoZSBDT05TVU1FUidzIGhlbHBlcnM6IGBUZW1wbGF0ZXJgJ3Mgb3duIGB0cC5maWxlLipgIGFscmVhZHkgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgcnVubmluZyBjb25maWcnc1xuICogYHRhcmdldF9maWxlYCBhbmQgbmVlZHMgbm8gaGVscC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcblxuaW1wb3J0IHsgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIH0gZnJvbSAnLi9hY3RpdmUtZmlsZS1wcm92aWRlci50cyc7XG5pbXBvcnQgeyBnZXRGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFRlbXBsYXRlckZ1bmN0aW9uc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VGVtcGxhdGVyRnVuY3Rpb25zUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gYFRlbXBsYXRlcmAncyBgY3VycmVudF9mdW5jdGlvbnNfb2JqZWN0YCB3aGVuIGl0IGFscmVhZHkgaGFzIG9uZSwgaW5zdGVhZCBvZlxuICAgKiBnZW5lcmF0aW5nIGEgZnJlc2ggb2JqZWN0LiBSZXVzZSBpcyBjaGVhcGVyIGFuZCBnaXZlcyB0aGUgb2JqZWN0IG9mIHRoZSByZW5kZXIgY3VycmVudGx5IGluIGZsaWdodDtcbiAgICogcGFzcyBgZmFsc2VgIHRvIGZvcmNlIGEgbmV3IG9uZSBidWlsdCBmb3IgYHRhcmdldFBhdGhPckZpbGVgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldXNlQ3VycmVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRoZSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHNob3VsZCByZXNvbHZlIGFnYWluc3QgXHUyMDE0IHdoYXQgYHRwLmZpbGUuKmAgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHBhcnNlVGVtcGxhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlVGVtcGxhdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGUgdGVtcGxhdGUgaXMgcmVuZGVyZWQgRk9SLiBJdCBpcyB3aGF0IGB0cC5maWxlLipgIHJlc29sdmVzIHRvIGluc2lkZSB0aGUgdGVtcGxhdGUsIGFuZFxuICAgKiB3aGF0IHtAbGluayBUZW1wbGF0ZXJBY3RpdmVGaWxlUHJvdmlkZXJ9IHJlcG9ydHMgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSBmaWxlIHRvIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBsYXRlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBgVGVtcGxhdGVyYCdzIGludGVybmFsIEFQSSBvYmplY3QsIG5hcnJvd2VkIHRvIHRoZSBtZW1iZXJzIHRoaXMgbGlicmFyeSBjYWxscy5cbiAqXG4gKiBJdHMgbWVtYmVycyBhcmUgYHNuYWtlX2Nhc2VgIGJlY2F1c2UgYFRlbXBsYXRlcmAncyBhcmU7IHRoZXkgYXJlIHRyYW5zY3JpYmVkIHJhdGhlciB0aGFuIHJlbmFtZWQgc28gdGhlXG4gKiBzaGFwZSBjYW4gYmUgY2hlY2tlZCBhZ2FpbnN0IGBUZW1wbGF0ZXJgJ3Mgc291cmNlIGF0IGEgZ2xhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlckFwaSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHtAbGluayBUZW1wbGF0ZXJSdW5uaW5nQ29uZmlnfSB0aGF0IGRlc2NyaWJlcyBvbmUgcmVuZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gdGVtcGxhdGVGaWxlIC0gVGhlIHRlbXBsYXRlIGJlaW5nIHJlbmRlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgKGFzIHdoZW4gb25seVxuICAgKiB0aGUgZnVuY3Rpb25zIG9iamVjdCBpcyB3YW50ZWQpLlxuICAgKiBAcGFyYW0gdGFyZ2V0RmlsZSAtIFRoZSBmaWxlIHRoZSByZW5kZXIgaXMgZm9yLlxuICAgKiBAcGFyYW0gcnVuTW9kZSAtIFdoaWNoIHtAbGluayBUZW1wbGF0ZXJSdW5Nb2RlfSB0aGUgcmVuZGVyIGlzLlxuICAgKiBAcmV0dXJucyBUaGUgcnVubmluZyBjb25maWcuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVfcnVubmluZ19jb25maWc6ICh0ZW1wbGF0ZUZpbGU6IFRGaWxlIHwgdW5kZWZpbmVkLCB0YXJnZXRGaWxlOiBURmlsZSwgcnVuTW9kZTogVGVtcGxhdGVyUnVuTW9kZSkgPT4gVGVtcGxhdGVyUnVubmluZ0NvbmZpZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9ucyBvYmplY3QgKGB0cGApIG9mIHRoZSByZW5kZXIgY3VycmVudGx5IGluIGZsaWdodCwgd2hlbiB0aGVyZSBpcyBvbmUuXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50X2Z1bmN0aW9uc19vYmplY3Q/OiBvYmplY3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZnVuY3Rpb25zIG9iamVjdCAoYHRwYCkgYSB0ZW1wbGF0ZSBpcyBldmFsdWF0ZWQgYWdhaW5zdC5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uc19nZW5lcmF0b3I6IFRlbXBsYXRlckZ1bmN0aW9uc0dlbmVyYXRvcjtcblxuICAvKipcbiAgICogUmVhZHMgdGhlIGNvbmZpZydzIGB0ZW1wbGF0ZV9maWxlYCBhbmQgcmVuZGVycyBpdCwgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSB7QGxpbmsgVGVtcGxhdGVyUnVubmluZ0NvbmZpZ30gZGVzY3JpYmluZyB0aGUgcmVuZGVyLiBgVGVtcGxhdGVyYCB0aHJvd3Mgd2hlbiBpdHNcbiAgICogYHRlbXBsYXRlX2ZpbGVgIGlzIG5vdCBhIGBURmlsZWAuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcmVuZGVyZWQgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRfYW5kX3BhcnNlX3RlbXBsYXRlOiAoY29uZmlnOiBUZW1wbGF0ZXJSdW5uaW5nQ29uZmlnKSA9PiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogVGhlIGBmdW5jdGlvbnNfZ2VuZXJhdG9yYCBoYWxmIG9mIHtAbGluayBUZW1wbGF0ZXJBcGl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlckZ1bmN0aW9uc0dlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGZ1bmN0aW9ucyBvYmplY3QgKGB0cGApIGZvciBhIHJ1bm5pbmcgY29uZmlnLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIHtAbGluayBUZW1wbGF0ZXJSdW5uaW5nQ29uZmlnfSB0byBidWlsZCBmb3IuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgZnVuY3Rpb25zIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRlX29iamVjdDogKGNvbmZpZzogVGVtcGxhdGVyUnVubmluZ0NvbmZpZykgPT4gUHJvbWlzZTxvYmplY3Q+O1xufVxuXG4vKipcbiAqIE9uZSBgVGVtcGxhdGVyYCByZW5kZXIsIGFzIGBUZW1wbGF0ZXJgJ3MgYGNyZWF0ZV9ydW5uaW5nX2NvbmZpZ2AgZGVzY3JpYmVzIGl0LlxuICpcbiAqIEl0cyBtZW1iZXJzIGFyZSBgc25ha2VfY2FzZWAgYmVjYXVzZSBgVGVtcGxhdGVyYCdzIGFyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZXJSdW5uaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBmaWxlIGBUZW1wbGF0ZXJgIGNvbnNpZGVycyBhY3RpdmUuIGBUZW1wbGF0ZXJgIGZpbGxzIHRoaXMgaW4gaXRzZWxmIGZyb21cbiAgICogYHdvcmtzcGFjZS5hY3RpdmVFZGl0b3I/LmZpbGUgPz8gd29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKWA7IGl0IGlzIG9wdGlvbmFsIGhlcmUgYmVjYXVzZSBhXG4gICAqIGhhbmQtYnVpbHQgY29uZmlnIG1heSBvbWl0IGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlX2ZpbGU/OiBudWxsIHwgVEZpbGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoaWNoIHtAbGluayBUZW1wbGF0ZXJSdW5Nb2RlfSB0aGUgcmVuZGVyIGlzLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuX21vZGU6IFRlbXBsYXRlclJ1bk1vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIHRoZSByZW5kZXIgaXMgZm9yIFx1MjAxNCB3aGF0IGB0cC5maWxlLipgIHJlc29sdmVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0X2ZpbGU6IFRGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgYmVpbmcgcmVuZGVyZWQsIHdoZW4gdGhlcmUgaXMgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGVfZmlsZT86IFRGaWxlIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBUZW1wbGF0ZXJgJ3MgcGx1Z2luIGlkLCBhcyBpdHMgbWFuaWZlc3QgZGVjbGFyZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBURU1QTEFURVJfUExVR0lOX0lEID0gJ3RlbXBsYXRlci1vYnNpZGlhbic7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW1hZ2ljLW51bWJlcnMgLS0gVGhlc2UgYXJlIGBUZW1wbGF0ZXJgJ3Mgb3duIGBSdW5Nb2RlYCB2YWx1ZXMsIHRyYW5zY3JpYmVkLiAqL1xuLyoqXG4gKiBgVGVtcGxhdGVyYCdzIGBSdW5Nb2RlYCBlbnVtLCB3aGljaCBzYXlzIHdoYXQga2luZCBvZiByZW5kZXIgYSB7QGxpbmsgVGVtcGxhdGVyUnVubmluZ0NvbmZpZ30gZGVzY3JpYmVzLlxuICpcbiAqIFRoZSBudW1lcmljIHZhbHVlcyBBUkUgYFRlbXBsYXRlcmAncywgYW5kIHRoZSBtZW1iZXJzIGFyZSBsaXN0ZWQgaW4gaXRzIGRlY2xhcmF0aW9uIG9yZGVyIHNvIHRoZSB0d28gY2FuXG4gKiBiZSBjb21wYXJlZCBsaW5lIGZvciBsaW5lLiBUaGV5IGFyZSB3cml0dGVuIG91dCBleHBsaWNpdGx5IGFsbCB0aGUgc2FtZSwgYmVjYXVzZSB0aGV5IGNyb3NzIGludG9cbiAqIGBUZW1wbGF0ZXJgIGFzIGludGVnZXJzIFx1MjAxNCBuZXZlciByZW51bWJlciB0aGVtLlxuICovXG5leHBvcnQgZW51bSBUZW1wbGF0ZXJSdW5Nb2RlIHtcbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgdGVtcGxhdGUgaW50byBhIG5ld2x5IGNyZWF0ZWQgZmlsZS5cbiAgICovXG4gIENyZWF0ZU5ld0Zyb21UZW1wbGF0ZSA9IDAsXG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgdGVtcGxhdGUgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSBhY3RpdmUgZmlsZS5cbiAgICovXG4gIEFwcGVuZEFjdGl2ZUZpbGUgPSAxLFxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRlbXBsYXRlIGFuZCBvdmVyd3JpdGUgYSBnaXZlbiBmaWxlIHdpdGggdGhlIHJlc3VsdC5cbiAgICovXG4gIE92ZXJ3cml0ZUZpbGUgPSAyLFxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRlbXBsYXRlIGFuZCBvdmVyd3JpdGUgdGhlIGFjdGl2ZSBmaWxlIHdpdGggdGhlIHJlc3VsdC5cbiAgICovXG4gIE92ZXJ3cml0ZUFjdGl2ZUZpbGUgPSAzLFxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRlbXBsYXRlIG9uIGRlbWFuZCwgZm9yIGEgY2FsbGVyIHRoYXQgd2FudHMgdGhlIHJlc3VsdGluZyB0ZXh0IHJhdGhlciB0aGFuIGEgZmlsZVxuICAgKiB3cml0dGVuLiBUaGlzIGlzIHdoYXQge0BsaW5rIHBhcnNlVGVtcGxhdGV9IHVzZXMuXG4gICAqL1xuICBEeW5hbWljUHJvY2Vzc29yID0gNCxcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZW1wbGF0ZSBhcyBhIHN0YXJ0dXAgdGVtcGxhdGUuIHtAbGluayBnZXRUZW1wbGF0ZXJGdW5jdGlvbnN9IHVzZXMgaXQgZm9yIHRoZSB0aHJvd2F3YXlcbiAgICogY29uZmlnIGl0IGJ1aWxkcywgYmVjYXVzZSB0aGF0IGNvbmZpZyByZW5kZXJzIG5vdGhpbmcuXG4gICAqL1xuICBTdGFydHVwVGVtcGxhdGUgPSA1XG59XG4vKiBlc2xpbnQtZW5hYmxlIG5vLW1hZ2ljLW51bWJlcnMgLS0gVGhlc2UgYXJlIGBUZW1wbGF0ZXJgJ3Mgb3duIGBSdW5Nb2RlYCB2YWx1ZXMsIHRyYW5zY3JpYmVkLiAqL1xuXG4vKipcbiAqIFdoeSBgVGVtcGxhdGVyYCdzIGludGVybmFsIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKi9cbmV4cG9ydCBlbnVtIFRlbXBsYXRlclVuYXZhaWxhYmlsaXR5UmVhc29uIHtcbiAgLyoqXG4gICAqIGBUZW1wbGF0ZXJgIGlzIG5vdCBpbnN0YWxsZWQsIG9yIGlzIGluc3RhbGxlZCBidXQgZGlzYWJsZWQuIE9ic2lkaWFuJ3MgYGdldFBsdWdpbmAgY2Fubm90IHRlbGwgdGhlIHR3b1xuICAgKiBhcGFydCBcdTIwMTQgaXQgcmV0dXJucyBub3RoaW5nIGVpdGhlciB3YXkuXG4gICAqL1xuICBOb3RMb2FkZWQgPSAnbm90TG9hZGVkJyxcblxuICAvKipcbiAgICogYFRlbXBsYXRlcmAgaXMgbG9hZGVkLCBidXQgZG9lcyBub3QgZXhwb3NlIHRoZSBpbnRlcm5hbHMgdGhpcyBsaWJyYXJ5IGNhbGxzIFx1MjAxNCBpdCBpcyB0b28gb2xkLCB0b28gbmV3LFxuICAgKiBvciBoYXMgYmVlbiByZXNoYXBlZC5cbiAgICovXG4gIFNoYXBlQ2hhbmdlZCA9ICdzaGFwZUNoYW5nZWQnXG59XG5cbi8qKlxuICogQWN0aXZlLWZpbGUgcHJvdmlkZXIgdGhhdCBhbnN3ZXJzIHdpdGggdGhlIGZpbGUgYSB7QGxpbmsgcGFyc2VUZW1wbGF0ZX0gcmVuZGVyIGlzIGN1cnJlbnRseSBmb3IsXG4gKiBmYWxsaW5nIGJhY2sgdG8gdGhlIHdvcmtzcGFjZSdzIGFjdGl2ZSBmaWxlIHdoZW4gbm8gcmVuZGVyIGlzIGluIGZsaWdodC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwaWVjZSB0aGF0IG1ha2VzIGEgY29uc3VtZXIncyBvd24gdGVtcGxhdGUgaGVscGVycyByZXNvbHZlIGFnYWluc3QgdGhlIHJpZ2h0IG5vdGU6IGR1cmluZyBhXG4gKiByZW5kZXIgdGhlIHdvcmtzcGFjZSBzdGlsbCBoYXMgd2hhdGV2ZXIgdGhlIHVzZXIgd2FzIGxvb2tpbmcgYXQgb3Blbiwgd2hpY2ggaXMgcmFyZWx5IHRoZSB0YXJnZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZXJBY3RpdmVGaWxlUHJvdmlkZXIgZXh0ZW5kcyBBcHBBY3RpdmVGaWxlUHJvdmlkZXIge1xuICAvKipcbiAgICogR2V0cyB0aGUgZmlsZSB0aGUgaW5uZXJtb3N0IGluLWZsaWdodCB7QGxpbmsgcGFyc2VUZW1wbGF0ZX0gcmVuZGVyIGlzIGZvciwgb3IgdGhlIHdvcmtzcGFjZSdzIGFjdGl2ZVxuICAgKiBmaWxlIHdoZW4gdGhlcmUgaXMgbm8gcmVuZGVyIGluIGZsaWdodC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGFjdGl2ZSBmaWxlLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm9uZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRBY3RpdmVGaWxlKCk6IG51bGwgfCBURmlsZSB7XG4gICAgcmV0dXJuIGdldFRlbXBsYXRlclJlbmRlclRhcmdldEZpbGUoKSA/PyBzdXBlci5nZXRBY3RpdmVGaWxlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBgVGVtcGxhdGVyYCdzIGludGVybmFsIEFQSSBjYW5ub3QgYmUgaGFuZGVkIG92ZXIsIGNhcnJ5aW5nIHRoZVxuICoge0BsaW5rIFRlbXBsYXRlclVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXMgd2h5LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSB0d28gZmFpbHVyZXMgb2NjdXJyZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVhc29uOiBUZW1wbGF0ZXJVbmF2YWlsYWJpbGl0eVJlYXNvbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBUZW1wbGF0ZXJVbmF2YWlsYWJsZUVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFdoeSB0aGUgQVBJIGlzIHVuYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlYXNvbjogVGVtcGxhdGVyVW5hdmFpbGFiaWxpdHlSZWFzb24pIHtcbiAgICBzdXBlcihgVGhlIGludGVybmFsIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtURU1QTEFURVJfUExVR0lOX0lEfVwiIGlzIHVuYXZhaWxhYmxlOiAke3JlYXNvbn0uYCk7XG4gICAgdGhpcy5uYW1lID0gJ1RlbXBsYXRlclVuYXZhaWxhYmxlRXJyb3InO1xuICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBgVGVtcGxhdGVyYCdzIGZ1bmN0aW9ucyBvYmplY3QgXHUyMDE0IHRoZSBgdHBgIGEgdGVtcGxhdGUgaXMgZXZhbHVhdGVkIGFnYWluc3QgXHUyMDE0IHNvIGEgY2FsbGVyIGNhbiBpbnZva2VcbiAqIGB0cC5kYXRlLm5vdygpYCwgYHRwLmZpbGUudGl0bGVgIGFuZCB0aGUgcmVzdCBvdXRzaWRlIGEgdGVtcGxhdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0VGVtcGxhdGVyRnVuY3Rpb25zUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgZnVuY3Rpb25zIG9iamVjdC5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0gd2hlbiBgVGVtcGxhdGVyYCBpcyBub3QgbG9hZGVkIG9yIGl0cyBzaGFwZSBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRlbXBsYXRlckZ1bmN0aW9ucyhwYXJhbXM6IEdldFRlbXBsYXRlckZ1bmN0aW9uc1BhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgc2hvdWxkUmV1c2VDdXJyZW50ID0gdHJ1ZSxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFwaSA9IHJlcXVpcmVUZW1wbGF0ZXJBcGkoYXBwKTtcblxuICBpZiAoc2hvdWxkUmV1c2VDdXJyZW50ICYmIGFwaS5jdXJyZW50X2Z1bmN0aW9uc19vYmplY3QpIHtcbiAgICByZXR1cm4gYXBpLmN1cnJlbnRfZnVuY3Rpb25zX29iamVjdDtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZVxuICB9KTtcbiAgY29uc3QgY29uZmlnID0gYXBpLmNyZWF0ZV9ydW5uaW5nX2NvbmZpZyh1bmRlZmluZWQsIHRhcmdldEZpbGUsIFRlbXBsYXRlclJ1bk1vZGUuU3RhcnR1cFRlbXBsYXRlKTtcbiAgcmV0dXJuIGF3YWl0IGFwaS5mdW5jdGlvbnNfZ2VuZXJhdG9yLmdlbmVyYXRlX29iamVjdChjb25maWcpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGZpbGUgdGhlIGlubmVybW9zdCBpbi1mbGlnaHQge0BsaW5rIHBhcnNlVGVtcGxhdGV9IHJlbmRlciBpcyBmb3IuXG4gKlxuICogUmVuZGVycyBuZXN0IFx1MjAxNCBhIHRlbXBsYXRlIG1heSByZW5kZXIgYW5vdGhlciBcdTIwMTQgc28gdGhlIGNhbGxzIGZvcm0gYSBzdGFjayBhbmQgdGhpcyByZXBvcnRzIHRoZSB0b3Agb2ZcbiAqIGl0LiBPdXRzaWRlIGFueSByZW5kZXIgaXQgaXMgYG51bGxgLlxuICpcbiAqIEByZXR1cm5zIFRoZSByZW5kZXIgdGFyZ2V0LCBvciBgbnVsbGAgd2hlbiBubyByZW5kZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVyUmVuZGVyVGFyZ2V0RmlsZSgpOiBudWxsIHwgVEZpbGUge1xuICByZXR1cm4gcmVuZGVyVGFyZ2V0RmlsZXMuYXQoLTEpID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGBUZW1wbGF0ZXJgIHRlbXBsYXRlIGFnYWluc3QgYSB0YXJnZXQgZmlsZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRleHQsIHdpdGhvdXQgd3JpdGluZ1xuICogYW55dGhpbmcuXG4gKlxuICogRm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbCB7QGxpbmsgZ2V0VGVtcGxhdGVyUmVuZGVyVGFyZ2V0RmlsZX0gYW5kXG4gKiB7QGxpbmsgVGVtcGxhdGVyQWN0aXZlRmlsZVByb3ZpZGVyfSByZXBvcnQgYHRhcmdldFBhdGhPckZpbGVgLCBzbyBhIGNvbnN1bWVyJ3Mgb3duIGhlbHBlcnMgaW52b2tlZCBmcm9tXG4gKiBpbnNpZGUgdGhlIHRlbXBsYXRlIHJlc29sdmUgYWdhaW5zdCBpdCByYXRoZXIgdGhhbiBhZ2FpbnN0IHdoYXRldmVyIHRoZSB1c2VyIGhhcyBvcGVuLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFBhcnNlVGVtcGxhdGVQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSByZW5kZXJlZCB0ZXh0LlxuICogQHRocm93cyBBIHtAbGluayBUZW1wbGF0ZXJVbmF2YWlsYWJsZUVycm9yfSB3aGVuIGBUZW1wbGF0ZXJgIGlzIG5vdCBsb2FkZWQgb3IgaXRzIHNoYXBlIGhhcyBjaGFuZ2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUZW1wbGF0ZShwYXJhbXM6IFBhcnNlVGVtcGxhdGVQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHRhcmdldFBhdGhPckZpbGUsXG4gICAgdGVtcGxhdGVQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRlbXBsYXRlRmlsZSA9IGdldEZpbGUoe1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlOiB0ZW1wbGF0ZVBhdGhPckZpbGVcbiAgfSk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZVxuICB9KTtcbiAgY29uc3QgYXBpID0gcmVxdWlyZVRlbXBsYXRlckFwaShhcHApO1xuXG4gIHJlbmRlclRhcmdldEZpbGVzLnB1c2godGFyZ2V0RmlsZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFwaS5yZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZSh7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlIC0tIGBUZW1wbGF0ZXJgIEFQSS5cbiAgICAgIHJ1bl9tb2RlOiBUZW1wbGF0ZXJSdW5Nb2RlLkR5bmFtaWNQcm9jZXNzb3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlIC0tIGBUZW1wbGF0ZXJgIEFQSS5cbiAgICAgIHRhcmdldF9maWxlOiB0YXJnZXRGaWxlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZSAtLSBgVGVtcGxhdGVyYCBBUEkuXG4gICAgICB0ZW1wbGF0ZV9maWxlOiB0ZW1wbGF0ZUZpbGVcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICByZW5kZXJUYXJnZXRGaWxlcy5wb3AoKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYFRlbXBsYXRlcmAncyBpbnRlcm5hbCBBUEksIHRocm93aW5nIHdoZW4gaXQgY2Fubm90IGJlIGhhZC5cbiAqXG4gKiBVc2UgdGhpcyB3aGVyZSB0aGUgY2FsbGVyIGNhbm5vdCBjYXJyeSBvbiB3aXRob3V0IGBUZW1wbGF0ZXJgIFx1MjAxNCB0aGUgZXJyb3IgbmFtZXMgdGhlIHBsdWdpbiBhbmQgc2F5cyB3aGljaFxuICogb2YgdGhlIHR3byBmYWlsdXJlcyBvY2N1cnJlZC4gVXNlIHtAbGluayByZXNvbHZlVGVtcGxhdGVyQXBpfSBpbnN0ZWFkIHdoZXJlIHRoZSBpbnRlZ3JhdGlvbiBpcyBvcHRpb25hbC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIGBUZW1wbGF0ZXJgJ3MgaW50ZXJuYWwgQVBJLlxuICogQHRocm93cyBBIHtAbGluayBUZW1wbGF0ZXJVbmF2YWlsYWJsZUVycm9yfSB3aGVuIGBUZW1wbGF0ZXJgIGlzIG5vdCBsb2FkZWQgb3IgaXRzIHNoYXBlIGhhcyBjaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZVRlbXBsYXRlckFwaShhcHA6IEFwcCk6IFRlbXBsYXRlckFwaSB7XG4gIGlmICghYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFRFTVBMQVRFUl9QTFVHSU5fSUQpKSB7XG4gICAgdGhyb3cgbmV3IFRlbXBsYXRlclVuYXZhaWxhYmxlRXJyb3IoVGVtcGxhdGVyVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90TG9hZGVkKTtcbiAgfVxuXG4gIGNvbnN0IGFwaSA9IHJlc29sdmVUZW1wbGF0ZXJBcGkoYXBwKTtcbiAgaWYgKCFhcGkpIHtcbiAgICB0aHJvdyBuZXcgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcihUZW1wbGF0ZXJVbmF2YWlsYWJpbGl0eVJlYXNvbi5TaGFwZUNoYW5nZWQpO1xuICB9XG5cbiAgcmV0dXJuIGFwaTtcbn1cblxuLyoqXG4gKiBHZXRzIGBUZW1wbGF0ZXJgJ3MgaW50ZXJuYWwgQVBJLCB3aGVuIGBUZW1wbGF0ZXJgIGlzIGluc3RhbGxlZCwgZW5hYmxlZCBhbmQgc3RpbGwgdGhlIHNoYXBlIHRoaXMgbGlicmFyeVxuICogZXhwZWN0cy5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIFRoZSBpbnRlcm5hbCBBUEksIG9yIGBudWxsYCB3aGVuIGBUZW1wbGF0ZXJgIGlzIG5vdCB0aGVyZSB0byB0YWxrIHRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlbXBsYXRlckFwaShhcHA6IEFwcCk6IG51bGwgfCBUZW1wbGF0ZXJBcGkge1xuICBjb25zdCBwbHVnaW4gPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4oVEVNUExBVEVSX1BMVUdJTl9JRCk7XG4gIGlmICghcGx1Z2luIHx8ICEoJ3RlbXBsYXRlcicgaW4gcGx1Z2luKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdGVtcGxhdGVyOiB1bmtub3duID0gcGx1Z2luLnRlbXBsYXRlcjtcbiAgcmV0dXJuIGlzVGVtcGxhdGVyQXBpKHRlbXBsYXRlcikgPyB0ZW1wbGF0ZXIgOiBudWxsO1xufVxuXG4vKlxuICogVGhlIHN0YWNrIG9mIGZpbGVzIGluLWZsaWdodCBgcGFyc2VUZW1wbGF0ZWAgY2FsbHMgYXJlIHJlbmRlcmluZyBmb3IsIGlubmVybW9zdCBsYXN0LiBBIHN0YWNrIHJhdGhlclxuICogdGhhbiBhIHNpbmdsZSBzbG90IGJlY2F1c2UgYSB0ZW1wbGF0ZSBtYXkgcmVuZGVyIGFub3RoZXIsIGFuZCBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlYXNzaWduZWRcbiAqIHZhcmlhYmxlIGJlY2F1c2UgcHVzaGluZyBhbmQgcG9wcGluZyBhIGBjb25zdGAgbmVlZHMgbm8gd3JpdGUgdG8gYW4gb3V0ZXIgYmluZGluZyBhY3Jvc3MgYW4gYGF3YWl0YC5cbiAqL1xuY29uc3QgcmVuZGVyVGFyZ2V0RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuLyoqXG4gKiBDaGVja3MgdGhhdCBhIHZhbHVlIGlzIGBUZW1wbGF0ZXJgJ3MgaW50ZXJuYWwgQVBJLCBieSB0aGUgbWVtYmVycyB0aGlzIGxpYnJhcnkgYWN0dWFsbHkgY2FsbHMuXG4gKlxuICogQSBwcmVkaWNhdGUgcmF0aGVyIHRoYW4gYSBjYXN0IG9uIHB1cnBvc2U6IGB0ZW1wbGF0ZXJgIGlzIG5vdCBwYXJ0IG9mIE9ic2lkaWFuJ3MgYFBsdWdpbmAgdHlwZSwgc28gdGhlXG4gKiB2YWx1ZSBhcnJpdmVzIGFzIGB1bmtub3duYCBhbmQgdGhlIG9ubHkgaG9uZXN0IHdheSB0byB0eXBlIGl0IGlzIHRvIFZFUklGWSBpdC4gQSBgVGVtcGxhdGVyYCB0aGF0IHJlbmFtZXNcbiAqIG9uZSBvZiB0aGVzZSB0aGVyZWZvcmUgcmVhZHMgYXMgXCJub3QgdGhlcmVcIiwgaW5zdGVhZCBvZiB0aHJvd2luZyBmcm9tIGluc2lkZSBhIHJlbmRlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgY2FuZGlkYXRlIGB0ZW1wbGF0ZXJgIG9iamVjdC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgaXQgY2FycmllcyBldmVyeSBtZW1iZXIgdGhpcyBsaWJyYXJ5IGNhbGxzLlxuICovXG5mdW5jdGlvbiBpc1RlbXBsYXRlckFwaSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFRlbXBsYXRlckFwaSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsIHx8ICEoJ2NyZWF0ZV9ydW5uaW5nX2NvbmZpZycgaW4gdmFsdWUpIHx8IHR5cGVvZiB2YWx1ZS5jcmVhdGVfcnVubmluZ19jb25maWcgIT09ICdmdW5jdGlvbicgfHwgISgncmVhZF9hbmRfcGFyc2VfdGVtcGxhdGUnIGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUucmVhZF9hbmRfcGFyc2VfdGVtcGxhdGUgIT09ICdmdW5jdGlvbicgfHwgISgnZnVuY3Rpb25zX2dlbmVyYXRvcicgaW4gdmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZnVuY3Rpb25zR2VuZXJhdG9yOiB1bmtub3duID0gdmFsdWUuZnVuY3Rpb25zX2dlbmVyYXRvcjtcbiAgcmV0dXJuIHR5cGVvZiBmdW5jdGlvbnNHZW5lcmF0b3IgPT09ICdvYmplY3QnICYmIGZ1bmN0aW9uc0dlbmVyYXRvciAhPT0gbnVsbCAmJiAnZ2VuZXJhdGVfb2JqZWN0JyBpbiBmdW5jdGlvbnNHZW5lcmF0b3IgJiYgdHlwZW9mIGZ1bmN0aW9uc0dlbmVyYXRvci5nZW5lcmF0ZV9vYmplY3QgPT09ICdmdW5jdGlvbic7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQTBDQSxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGVBQWU7QUFrSWpCLE1BQU0sc0JBQXNCO0FBVTVCLElBQUssbUJBQUwsa0JBQUtBLHNCQUFMO0FBSUwsRUFBQUEsb0NBQUEsMkJBQXdCLEtBQXhCO0FBS0EsRUFBQUEsb0NBQUEsc0JBQW1CLEtBQW5CO0FBS0EsRUFBQUEsb0NBQUEsbUJBQWdCLEtBQWhCO0FBS0EsRUFBQUEsb0NBQUEseUJBQXNCLEtBQXRCO0FBTUEsRUFBQUEsb0NBQUEsc0JBQW1CLEtBQW5CO0FBTUEsRUFBQUEsb0NBQUEscUJBQWtCLEtBQWxCO0FBL0JVLFNBQUFBO0FBQUEsR0FBQTtBQXNDTCxJQUFLLGdDQUFMLGtCQUFLQyxtQ0FBTDtBQUtMLEVBQUFBLCtCQUFBLGVBQVk7QUFNWixFQUFBQSwrQkFBQSxrQkFBZTtBQVhMLFNBQUFBO0FBQUEsR0FBQTtBQXFCTCxNQUFNLG9DQUFvQyxzQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9yRCxnQkFBOEI7QUFDNUMsV0FBTyw2QkFBNkIsS0FBSyxNQUFNLGNBQWM7QUFBQSxFQUMvRDtBQUNGO0FBTU8sTUFBTSxrQ0FBa0MsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSW5DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxRQUF1QztBQUN4RCxVQUFNLG1DQUFtQyxtQkFBbUIscUJBQXFCLE1BQU0sR0FBRztBQUMxRixTQUFLLE9BQU87QUFDWixTQUFLLFNBQVM7QUFBQSxFQUNoQjtBQUNGO0FBVUEsZUFBc0Isc0JBQXNCLFFBQXNEO0FBQ2hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQSxxQkFBcUI7QUFBQSxJQUNyQjtBQUFBLEVBQ0YsSUFBSTtBQUNKLFFBQU0sTUFBTSxvQkFBb0IsR0FBRztBQUVuQyxNQUFJLHNCQUFzQixJQUFJLDBCQUEwQjtBQUN0RCxXQUFPLElBQUk7QUFBQSxFQUNiO0FBRUEsUUFBTSxhQUFhLFFBQVE7QUFBQSxJQUN6QjtBQUFBLElBQ0EsWUFBWTtBQUFBLEVBQ2QsQ0FBQztBQUNELFFBQU0sU0FBUyxJQUFJLHNCQUFzQixRQUFXLFlBQVksdUJBQWdDO0FBQ2hHLFNBQU8sTUFBTSxJQUFJLG9CQUFvQixnQkFBZ0IsTUFBTTtBQUM3RDtBQVVPLFNBQVMsK0JBQTZDO0FBQzNELFNBQU8sa0JBQWtCLEdBQUcsRUFBRSxLQUFLO0FBQ3JDO0FBY0EsZUFBc0IsY0FBYyxRQUE4QztBQUNoRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxlQUFlLFFBQVE7QUFBQSxJQUMzQjtBQUFBLElBQ0EsWUFBWTtBQUFBLEVBQ2QsQ0FBQztBQUNELFFBQU0sYUFBYSxRQUFRO0FBQUEsSUFDekI7QUFBQSxJQUNBLFlBQVk7QUFBQSxFQUNkLENBQUM7QUFDRCxRQUFNLE1BQU0sb0JBQW9CLEdBQUc7QUFFbkMsb0JBQWtCLEtBQUssVUFBVTtBQUNqQyxNQUFJO0FBQ0YsV0FBTyxNQUFNLElBQUksd0JBQXdCO0FBQUE7QUFBQSxNQUV2QyxVQUFVO0FBQUE7QUFBQSxNQUVWLGFBQWE7QUFBQTtBQUFBLE1BRWIsZUFBZTtBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNILFVBQUU7QUFDQSxzQkFBa0IsSUFBSTtBQUFBLEVBQ3hCO0FBQ0Y7QUFZTyxTQUFTLG9CQUFvQixLQUF3QjtBQUMxRCxNQUFJLENBQUMsSUFBSSxRQUFRLFVBQVUsbUJBQW1CLEdBQUc7QUFDL0MsVUFBTSxJQUFJLDBCQUEwQiwyQkFBdUM7QUFBQSxFQUM3RTtBQUVBLFFBQU0sTUFBTSxvQkFBb0IsR0FBRztBQUNuQyxNQUFJLENBQUMsS0FBSztBQUNSLFVBQU0sSUFBSSwwQkFBMEIsaUNBQTBDO0FBQUEsRUFDaEY7QUFFQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLG9CQUFvQixLQUErQjtBQUNqRSxRQUFNLFNBQVMsSUFBSSxRQUFRLFVBQVUsbUJBQW1CO0FBQ3hELE1BQUksQ0FBQyxVQUFVLEVBQUUsZUFBZSxTQUFTO0FBQ3ZDLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxZQUFxQixPQUFPO0FBQ2xDLFNBQU8sZUFBZSxTQUFTLElBQUksWUFBWTtBQUNqRDtBQU9BLE1BQU0sb0JBQTZCLENBQUM7QUFZcEMsU0FBUyxlQUFlLE9BQXVDO0FBQzdELE1BQUksT0FBTyxVQUFVLFlBQVksVUFBVSxRQUFRLEVBQUUsMkJBQTJCLFVBQVUsT0FBTyxNQUFNLDBCQUEwQixjQUFjLEVBQUUsNkJBQTZCLFVBQVUsT0FBTyxNQUFNLDRCQUE0QixjQUFjLEVBQUUseUJBQXlCLFFBQVE7QUFDaFIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLHFCQUE4QixNQUFNO0FBQzFDLFNBQU8sT0FBTyx1QkFBdUIsWUFBWSx1QkFBdUIsUUFBUSxxQkFBcUIsc0JBQXNCLE9BQU8sbUJBQW1CLG9CQUFvQjtBQUMzSzsiLAogICJuYW1lcyI6IFsiVGVtcGxhdGVyUnVuTW9kZSIsICJUZW1wbGF0ZXJVbmF2YWlsYWJpbGl0eVJlYXNvbiJdCn0K
146
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBzbGljZSBvZiBgVGVtcGxhdGVyYCdzIElOVEVSTkFMIEFQSSB0aGlzIGxpYnJhcnkgdGFsa3MgdG8sIGFuZCB0aGUgcnVudGltZSBuYXJyb3dpbmcgdGhhdCBnZXRzIGhvbGRcbiAqIG9mIGl0LlxuICpcbiAqICoqYFRlbXBsYXRlcmAgcHVibGlzaGVzIG5vIEFQSS4qKiBSZW5kZXJpbmcgYSB0ZW1wbGF0ZSBhZ2FpbnN0IGEgZmlsZSBhbmQgZ2V0dGluZyB0aGUgcmVzdWx0aW5nIHN0cmluZ1xuICogYmFjayBpcyBvbmx5IHJlYWNoYWJsZSB0aHJvdWdoIHVuZG9jdW1lbnRlZCBpbnRlcm5hbHMgaGFuZ2luZyBvZmZcbiAqIGBhcHAucGx1Z2lucy5nZXRQbHVnaW4oJ3RlbXBsYXRlci1vYnNpZGlhbicpLnRlbXBsYXRlcmAgXHUyMDE0IGBjcmVhdGVfcnVubmluZ19jb25maWdgLFxuICogYGZ1bmN0aW9uc19nZW5lcmF0b3IuZ2VuZXJhdGVfb2JqZWN0YCwgYHJlYWRfYW5kX3BhcnNlX3RlbXBsYXRlYCwgYW5kIGEgYFJ1bk1vZGVgIGVudW0uIEV2ZXJ5IHBsdWdpblxuICogdGhhdCB3YW50cyBpdCByZS1kZXJpdmVzIHRoZSBzYW1lIHJldmVyc2UgZW5naW5lZXJpbmcsIHdoaWNoIGlzIHdoeSBpdCBsaXZlcyBoZXJlIGluc3RlYWQuXG4gKlxuICogKipUaGlzIG1vZHVsZSBpcyBleHBsaWNpdGx5IEJFU1QtRUZGT1JULioqIE5vdGhpbmcgaXQgYmluZHMgdG8gaXMgZG9jdW1lbnRlZCBvciBjb3ZlcmVkIGJ5IGBUZW1wbGF0ZXJgJ3NcbiAqIHNlbWFudGljIHZlcnNpb25pbmcsIHNvIGEgYFRlbXBsYXRlcmAgcmVsZWFzZSBtYXkgcmVuYW1lIG9yIHJlc2hhcGUgYW55IG9mIGl0IHdpdGhvdXQgd2FybmluZy4gVGhlIHNoYXBlc1xuICogYmVsb3cgd2VyZSByZWFkIGZyb20gYFRlbXBsYXRlcmAgYDIuMjQuM2AuIFR3byBkZWxpYmVyYXRlIGNvbnNlcXVlbmNlcyBmb2xsb3c6XG4gKlxuICogLSB7QGxpbmsgcmVzb2x2ZVRlbXBsYXRlckFwaX0gcmV0dXJucyBgbnVsbGAgXHUyMDE0IGEgYFRlbXBsYXRlcmAgdG9vIG9sZCwgdG9vIG5ldyBvciB0b28gYnJva2VuIHRvIHRhbGsgdG9cbiAqICAgcmVhZHMgYXMgXCJub3QgdGhlcmVcIiBhbmQgdGhlIGludGVncmF0aW9uIHN0YXlzIGRvcm1hbnQuXG4gKiAtIHtAbGluayByZXF1aXJlVGVtcGxhdGVyQXBpfSB0aHJvd3MgYSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0gdGhhdCBOQU1FUyB0aGUgcGx1Z2luIGFuZCB0aGVcbiAqICAgcmVhc29uLCByYXRoZXIgdGhhbiBsZXR0aW5nIGEgYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzdXJmYWNlIGZyb20gc29tZXdoZXJlIGluc2lkZVxuICogICBgVGVtcGxhdGVyYC5cbiAqXG4gKiBUaGUgdHlwZXMgYXJlIERFQ0xBUkVEIEhFUkUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGFuZCBuYXJyb3dlZCB0byB0aGUgbWVtYmVycyBhY3R1YWxseSBjYWxsZWQ6IGBUZW1wbGF0ZXJgXG4gKiBzaGlwcyBubyBucG0gdHlwZXMgcGFja2FnZSwgYW5kIGRlcGVuZGluZyBvbiBpdCB3b3VsZCB0dXJuIGFuIG9wdGlvbmFsIGludGVncmF0aW9uIGludG8gYSBidWlsZC10aW1lXG4gKiBkZXBlbmRlbmN5LlxuICpcbiAqIFRoZSBzZWNvbmQgdGhpbmcgdGhpcyBtb2R1bGUgc3VwcGxpZXMgaXMgYW4gYWN0aXZlLWZpbGUgYW5zd2VyLiBXaGlsZSBhIHRlbXBsYXRlIHJlbmRlcnMsXG4gKiBgYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClgIHN0aWxsIHBvaW50cyBhdCB3aGF0ZXZlciB0aGUgdXNlciBoYXBwZW5zIHRvIGhhdmUgb3BlbiBcdTIwMTQgTk9UIGF0IHRoZSBmaWxlXG4gKiB0aGUgdGVtcGxhdGUgaXMgYmVpbmcgcmVuZGVyZWQgZm9yIFx1MjAxNCBzbyBhIHBsdWdpbidzIG93biBoZWxwZXIgY2FsbGVkIGZyb20gaW5zaWRlIGEgdGVtcGxhdGUgcmVzb2x2ZXNcbiAqIGxpbmtzIGFnYWluc3QgdGhlIHdyb25nIG5vdGUuIHtAbGluayBUZW1wbGF0ZXJBY3RpdmVGaWxlUHJvdmlkZXJ9IGFuc3dlcnMgd2l0aCB0aGUgcmVuZGVyIHRhcmdldCBmb3IgdGhlXG4gKiBkdXJhdGlvbiBvZiBhIHtAbGluayBwYXJzZVRlbXBsYXRlfSBjYWxsIGFuZCBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2Ugb3RoZXJ3aXNlLiBOb3RlIHRoaXMgaXMgYWJvdXRcbiAqIHRoZSBDT05TVU1FUidzIGhlbHBlcnM6IGBUZW1wbGF0ZXJgJ3Mgb3duIGB0cC5maWxlLipgIGFscmVhZHkgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgcnVubmluZyBjb25maWcnc1xuICogYHRhcmdldF9maWxlYCBhbmQgbmVlZHMgbm8gaGVscC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBUaGlyZFBhcnR5UGx1Z2luQWRhcHRlciB9IGZyb20gJy4vcGx1Z2luL3RoaXJkLXBhcnR5LXBsdWdpbi50cyc7XG5cbmltcG9ydCB7IEFwcEFjdGl2ZUZpbGVQcm92aWRlciB9IGZyb20gJy4vYWN0aXZlLWZpbGUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRUZW1wbGF0ZXJGdW5jdGlvbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFRlbXBsYXRlckZ1bmN0aW9uc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV0dXJuIGBUZW1wbGF0ZXJgJ3MgYGN1cnJlbnRfZnVuY3Rpb25zX29iamVjdGAgd2hlbiBpdCBhbHJlYWR5IGhhcyBvbmUsIGluc3RlYWQgb2ZcbiAgICogZ2VuZXJhdGluZyBhIGZyZXNoIG9iamVjdC4gUmV1c2UgaXMgY2hlYXBlciBhbmQgZ2l2ZXMgdGhlIG9iamVjdCBvZiB0aGUgcmVuZGVyIGN1cnJlbnRseSBpbiBmbGlnaHQ7XG4gICAqIHBhc3MgYGZhbHNlYCB0byBmb3JjZSBhIG5ldyBvbmUgYnVpbHQgZm9yIGB0YXJnZXRQYXRoT3JGaWxlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUN1cnJlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBzaG91bGQgcmVzb2x2ZSBhZ2FpbnN0IFx1MjAxNCB3aGF0IGB0cC5maWxlLipgIHJlcG9ydHMuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBwYXJzZVRlbXBsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZVRlbXBsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZpbGUgdGhlIHRlbXBsYXRlIGlzIHJlbmRlcmVkIEZPUi4gSXQgaXMgd2hhdCBgdHAuZmlsZS4qYCByZXNvbHZlcyB0byBpbnNpZGUgdGhlIHRlbXBsYXRlLCBhbmRcbiAgICogd2hhdCB7QGxpbmsgVGVtcGxhdGVyQWN0aXZlRmlsZVByb3ZpZGVyfSByZXBvcnRzIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhbGwuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVtcGxhdGUgZmlsZSB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSB0ZW1wbGF0ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogYFRlbXBsYXRlcmAncyBpbnRlcm5hbCBBUEkgb2JqZWN0LCBuYXJyb3dlZCB0byB0aGUgbWVtYmVycyB0aGlzIGxpYnJhcnkgY2FsbHMuXG4gKlxuICogSXRzIG1lbWJlcnMgYXJlIGBzbmFrZV9jYXNlYCBiZWNhdXNlIGBUZW1wbGF0ZXJgJ3MgYXJlOyB0aGV5IGFyZSB0cmFuc2NyaWJlZCByYXRoZXIgdGhhbiByZW5hbWVkIHNvIHRoZVxuICogc2hhcGUgY2FuIGJlIGNoZWNrZWQgYWdhaW5zdCBgVGVtcGxhdGVyYCdzIHNvdXJjZSBhdCBhIGdsYW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZXJBcGkge1xuICAvKipcbiAgICogQnVpbGRzIHRoZSB7QGxpbmsgVGVtcGxhdGVyUnVubmluZ0NvbmZpZ30gdGhhdCBkZXNjcmliZXMgb25lIHJlbmRlci5cbiAgICpcbiAgICogQHBhcmFtIHRlbXBsYXRlRmlsZSAtIFRoZSB0ZW1wbGF0ZSBiZWluZyByZW5kZXJlZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lIChhcyB3aGVuIG9ubHlcbiAgICogdGhlIGZ1bmN0aW9ucyBvYmplY3QgaXMgd2FudGVkKS5cbiAgICogQHBhcmFtIHRhcmdldEZpbGUgLSBUaGUgZmlsZSB0aGUgcmVuZGVyIGlzIGZvci5cbiAgICogQHBhcmFtIHJ1bk1vZGUgLSBXaGljaCB7QGxpbmsgVGVtcGxhdGVyUnVuTW9kZX0gdGhlIHJlbmRlciBpcy5cbiAgICogQHJldHVybnMgVGhlIHJ1bm5pbmcgY29uZmlnLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlX3J1bm5pbmdfY29uZmlnOiAodGVtcGxhdGVGaWxlOiBURmlsZSB8IHVuZGVmaW5lZCwgdGFyZ2V0RmlsZTogVEZpbGUsIHJ1bk1vZGU6IFRlbXBsYXRlclJ1bk1vZGUpID0+IFRlbXBsYXRlclJ1bm5pbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbnMgb2JqZWN0IChgdHBgKSBvZiB0aGUgcmVuZGVyIGN1cnJlbnRseSBpbiBmbGlnaHQsIHdoZW4gdGhlcmUgaXMgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudF9mdW5jdGlvbnNfb2JqZWN0Pzogb2JqZWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGZ1bmN0aW9ucyBvYmplY3QgKGB0cGApIGEgdGVtcGxhdGUgaXMgZXZhbHVhdGVkIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbnNfZ2VuZXJhdG9yOiBUZW1wbGF0ZXJGdW5jdGlvbnNHZW5lcmF0b3I7XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBjb25maWcncyBgdGVtcGxhdGVfZmlsZWAgYW5kIHJlbmRlcnMgaXQsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIHRleHQuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBUaGUge0BsaW5rIFRlbXBsYXRlclJ1bm5pbmdDb25maWd9IGRlc2NyaWJpbmcgdGhlIHJlbmRlci4gYFRlbXBsYXRlcmAgdGhyb3dzIHdoZW4gaXRzXG4gICAqIGB0ZW1wbGF0ZV9maWxlYCBpcyBub3QgYSBgVEZpbGVgLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIHJlbmRlcmVkIHRleHQuXG4gICAqL1xuICByZWFkb25seSByZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZTogKGNvbmZpZzogVGVtcGxhdGVyUnVubmluZ0NvbmZpZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFRoZSBgZnVuY3Rpb25zX2dlbmVyYXRvcmAgaGFsZiBvZiB7QGxpbmsgVGVtcGxhdGVyQXBpfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZXJGdW5jdGlvbnNHZW5lcmF0b3Ige1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBmdW5jdGlvbnMgb2JqZWN0IChgdHBgKSBmb3IgYSBydW5uaW5nIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSB7QGxpbmsgVGVtcGxhdGVyUnVubmluZ0NvbmZpZ30gdG8gYnVpbGQgZm9yLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGZ1bmN0aW9ucyBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBnZW5lcmF0ZV9vYmplY3Q6IChjb25maWc6IFRlbXBsYXRlclJ1bm5pbmdDb25maWcpID0+IFByb21pc2U8b2JqZWN0Pjtcbn1cblxuLyoqXG4gKiBPbmUgYFRlbXBsYXRlcmAgcmVuZGVyLCBhcyBgVGVtcGxhdGVyYCdzIGBjcmVhdGVfcnVubmluZ19jb25maWdgIGRlc2NyaWJlcyBpdC5cbiAqXG4gKiBJdHMgbWVtYmVycyBhcmUgYHNuYWtlX2Nhc2VgIGJlY2F1c2UgYFRlbXBsYXRlcmAncyBhcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVyUnVubmluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZmlsZSBgVGVtcGxhdGVyYCBjb25zaWRlcnMgYWN0aXZlLiBgVGVtcGxhdGVyYCBmaWxscyB0aGlzIGluIGl0c2VsZiBmcm9tXG4gICAqIGB3b3Jrc3BhY2UuYWN0aXZlRWRpdG9yPy5maWxlID8/IHdvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKClgOyBpdCBpcyBvcHRpb25hbCBoZXJlIGJlY2F1c2UgYVxuICAgKiBoYW5kLWJ1aWx0IGNvbmZpZyBtYXkgb21pdCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZV9maWxlPzogbnVsbCB8IFRGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGljaCB7QGxpbmsgVGVtcGxhdGVyUnVuTW9kZX0gdGhlIHJlbmRlciBpcy5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bl9tb2RlOiBUZW1wbGF0ZXJSdW5Nb2RlO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsZSB0aGUgcmVuZGVyIGlzIGZvciBcdTIwMTQgd2hhdCBgdHAuZmlsZS4qYCByZXNvbHZlcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldF9maWxlOiBURmlsZTtcblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIGJlaW5nIHJlbmRlcmVkLCB3aGVuIHRoZXJlIGlzIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHRlbXBsYXRlX2ZpbGU/OiBURmlsZSB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBgVGVtcGxhdGVyYCdzIHBsdWdpbiBpZCwgYXMgaXRzIG1hbmlmZXN0IGRlY2xhcmVzIGl0LlxuICovXG5leHBvcnQgY29uc3QgVEVNUExBVEVSX1BMVUdJTl9JRCA9ICd0ZW1wbGF0ZXItb2JzaWRpYW4nO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1tYWdpYy1udW1iZXJzIC0tIFRoZXNlIGFyZSBgVGVtcGxhdGVyYCdzIG93biBgUnVuTW9kZWAgdmFsdWVzLCB0cmFuc2NyaWJlZC4gKi9cbi8qKlxuICogYFRlbXBsYXRlcmAncyBgUnVuTW9kZWAgZW51bSwgd2hpY2ggc2F5cyB3aGF0IGtpbmQgb2YgcmVuZGVyIGEge0BsaW5rIFRlbXBsYXRlclJ1bm5pbmdDb25maWd9IGRlc2NyaWJlcy5cbiAqXG4gKiBUaGUgbnVtZXJpYyB2YWx1ZXMgQVJFIGBUZW1wbGF0ZXJgJ3MsIGFuZCB0aGUgbWVtYmVycyBhcmUgbGlzdGVkIGluIGl0cyBkZWNsYXJhdGlvbiBvcmRlciBzbyB0aGUgdHdvIGNhblxuICogYmUgY29tcGFyZWQgbGluZSBmb3IgbGluZS4gVGhleSBhcmUgd3JpdHRlbiBvdXQgZXhwbGljaXRseSBhbGwgdGhlIHNhbWUsIGJlY2F1c2UgdGhleSBjcm9zcyBpbnRvXG4gKiBgVGVtcGxhdGVyYCBhcyBpbnRlZ2VycyBcdTIwMTQgbmV2ZXIgcmVudW1iZXIgdGhlbS5cbiAqL1xuZXhwb3J0IGVudW0gVGVtcGxhdGVyUnVuTW9kZSB7XG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRlbXBsYXRlIGludG8gYSBuZXdseSBjcmVhdGVkIGZpbGUuXG4gICAqL1xuICBDcmVhdGVOZXdGcm9tVGVtcGxhdGUgPSAwLFxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIHRlbXBsYXRlIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgYWN0aXZlIGZpbGUuXG4gICAqL1xuICBBcHBlbmRBY3RpdmVGaWxlID0gMSxcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlIGEgZ2l2ZW4gZmlsZSB3aXRoIHRoZSByZXN1bHQuXG4gICAqL1xuICBPdmVyd3JpdGVGaWxlID0gMixcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlIHRoZSBhY3RpdmUgZmlsZSB3aXRoIHRoZSByZXN1bHQuXG4gICAqL1xuICBPdmVyd3JpdGVBY3RpdmVGaWxlID0gMyxcblxuICAvKipcbiAgICogUmVuZGVyIHRoZSB0ZW1wbGF0ZSBvbiBkZW1hbmQsIGZvciBhIGNhbGxlciB0aGF0IHdhbnRzIHRoZSByZXN1bHRpbmcgdGV4dCByYXRoZXIgdGhhbiBhIGZpbGVcbiAgICogd3JpdHRlbi4gVGhpcyBpcyB3aGF0IHtAbGluayBwYXJzZVRlbXBsYXRlfSB1c2VzLlxuICAgKi9cbiAgRHluYW1pY1Byb2Nlc3NvciA9IDQsXG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgdGVtcGxhdGUgYXMgYSBzdGFydHVwIHRlbXBsYXRlLiB7QGxpbmsgZ2V0VGVtcGxhdGVyRnVuY3Rpb25zfSB1c2VzIGl0IGZvciB0aGUgdGhyb3dhd2F5XG4gICAqIGNvbmZpZyBpdCBidWlsZHMsIGJlY2F1c2UgdGhhdCBjb25maWcgcmVuZGVycyBub3RoaW5nLlxuICAgKi9cbiAgU3RhcnR1cFRlbXBsYXRlID0gNVxufVxuLyogZXNsaW50LWVuYWJsZSBuby1tYWdpYy1udW1iZXJzIC0tIFRoZXNlIGFyZSBgVGVtcGxhdGVyYCdzIG93biBgUnVuTW9kZWAgdmFsdWVzLCB0cmFuc2NyaWJlZC4gKi9cblxuLyoqXG4gKiBXaHkgYFRlbXBsYXRlcmAncyBpbnRlcm5hbCBBUEkgY291bGQgbm90IGJlIGhhbmRlZCBvdmVyLlxuICovXG5leHBvcnQgZW51bSBUZW1wbGF0ZXJVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBgVGVtcGxhdGVyYCBpcyBub3QgaW5zdGFsbGVkLCBvciBpcyBpbnN0YWxsZWQgYnV0IGRpc2FibGVkLiBPYnNpZGlhbidzIGBnZXRQbHVnaW5gIGNhbm5vdCB0ZWxsIHRoZSB0d29cbiAgICogYXBhcnQgXHUyMDE0IGl0IHJldHVybnMgbm90aGluZyBlaXRoZXIgd2F5LlxuICAgKi9cbiAgTm90TG9hZGVkID0gJ25vdExvYWRlZCcsXG5cbiAgLyoqXG4gICAqIGBUZW1wbGF0ZXJgIGlzIGxvYWRlZCwgYnV0IGRvZXMgbm90IGV4cG9zZSB0aGUgaW50ZXJuYWxzIHRoaXMgbGlicmFyeSBjYWxscyBcdTIwMTQgaXQgaXMgdG9vIG9sZCwgdG9vIG5ldyxcbiAgICogb3IgaGFzIGJlZW4gcmVzaGFwZWQuXG4gICAqL1xuICBTaGFwZUNoYW5nZWQgPSAnc2hhcGVDaGFuZ2VkJ1xufVxuXG4vKipcbiAqIEFjdGl2ZS1maWxlIHByb3ZpZGVyIHRoYXQgYW5zd2VycyB3aXRoIHRoZSBmaWxlIGEge0BsaW5rIHBhcnNlVGVtcGxhdGV9IHJlbmRlciBpcyBjdXJyZW50bHkgZm9yLFxuICogZmFsbGluZyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2UncyBhY3RpdmUgZmlsZSB3aGVuIG5vIHJlbmRlciBpcyBpbiBmbGlnaHQuXG4gKlxuICogVGhpcyBpcyB0aGUgcGllY2UgdGhhdCBtYWtlcyBhIGNvbnN1bWVyJ3Mgb3duIHRlbXBsYXRlIGhlbHBlcnMgcmVzb2x2ZSBhZ2FpbnN0IHRoZSByaWdodCBub3RlOiBkdXJpbmcgYVxuICogcmVuZGVyIHRoZSB3b3Jrc3BhY2Ugc3RpbGwgaGFzIHdoYXRldmVyIHRoZSB1c2VyIHdhcyBsb29raW5nIGF0IG9wZW4sIHdoaWNoIGlzIHJhcmVseSB0aGUgdGFyZ2V0LlxuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVyQWN0aXZlRmlsZVByb3ZpZGVyIGV4dGVuZHMgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpbGUgdGhlIGlubmVybW9zdCBpbi1mbGlnaHQge0BsaW5rIHBhcnNlVGVtcGxhdGV9IHJlbmRlciBpcyBmb3IsIG9yIHRoZSB3b3Jrc3BhY2UncyBhY3RpdmVcbiAgICogZmlsZSB3aGVuIHRoZXJlIGlzIG5vIHJlbmRlciBpbiBmbGlnaHQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBhY3RpdmUgZmlsZSwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0QWN0aXZlRmlsZSgpOiBudWxsIHwgVEZpbGUge1xuICAgIHJldHVybiBnZXRUZW1wbGF0ZXJSZW5kZXJUYXJnZXRGaWxlKCkgPz8gc3VwZXIuZ2V0QWN0aXZlRmlsZSgpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYFRlbXBsYXRlcmAncyBpbnRlcm5hbCBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGVcbiAqIHtAbGluayBUZW1wbGF0ZXJVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlclVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgdHdvIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogVGVtcGxhdGVyVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBXaHkgdGhlIEFQSSBpcyB1bmF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihyZWFzb246IFRlbXBsYXRlclVuYXZhaWxhYmlsaXR5UmVhc29uKSB7XG4gICAgc3VwZXIoYFRoZSBpbnRlcm5hbCBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7VEVNUExBVEVSX1BMVUdJTl9JRH1cIiBpcyB1bmF2YWlsYWJsZTogJHtyZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdUZW1wbGF0ZXJVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgYFRlbXBsYXRlcmAncyBmdW5jdGlvbnMgb2JqZWN0IFx1MjAxNCB0aGUgYHRwYCBhIHRlbXBsYXRlIGlzIGV2YWx1YXRlZCBhZ2FpbnN0IFx1MjAxNCBzbyBhIGNhbGxlciBjYW4gaW52b2tlXG4gKiBgdHAuZGF0ZS5ub3coKWAsIGB0cC5maWxlLnRpdGxlYCBhbmQgdGhlIHJlc3Qgb3V0c2lkZSBhIHRlbXBsYXRlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEdldFRlbXBsYXRlckZ1bmN0aW9uc1BhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGZ1bmN0aW9ucyBvYmplY3QuXG4gKiBAdGhyb3dzIEEge0BsaW5rIFRlbXBsYXRlclVuYXZhaWxhYmxlRXJyb3J9IHdoZW4gYFRlbXBsYXRlcmAgaXMgbm90IGxvYWRlZCBvciBpdHMgc2hhcGUgaGFzIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRUZW1wbGF0ZXJGdW5jdGlvbnMocGFyYW1zOiBHZXRUZW1wbGF0ZXJGdW5jdGlvbnNQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHNob3VsZFJldXNlQ3VycmVudCA9IHRydWUsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhcGkgPSByZXF1aXJlVGVtcGxhdGVyQXBpKGFwcCk7XG5cbiAgaWYgKHNob3VsZFJldXNlQ3VycmVudCAmJiBhcGkuY3VycmVudF9mdW5jdGlvbnNfb2JqZWN0KSB7XG4gICAgcmV0dXJuIGFwaS5jdXJyZW50X2Z1bmN0aW9uc19vYmplY3Q7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGVcbiAgfSk7XG4gIGNvbnN0IGNvbmZpZyA9IGFwaS5jcmVhdGVfcnVubmluZ19jb25maWcodW5kZWZpbmVkLCB0YXJnZXRGaWxlLCBUZW1wbGF0ZXJSdW5Nb2RlLlN0YXJ0dXBUZW1wbGF0ZSk7XG4gIHJldHVybiBhd2FpdCBhcGkuZnVuY3Rpb25zX2dlbmVyYXRvci5nZW5lcmF0ZV9vYmplY3QoY29uZmlnKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBmaWxlIHRoZSBpbm5lcm1vc3QgaW4tZmxpZ2h0IHtAbGluayBwYXJzZVRlbXBsYXRlfSByZW5kZXIgaXMgZm9yLlxuICpcbiAqIFJlbmRlcnMgbmVzdCBcdTIwMTQgYSB0ZW1wbGF0ZSBtYXkgcmVuZGVyIGFub3RoZXIgXHUyMDE0IHNvIHRoZSBjYWxscyBmb3JtIGEgc3RhY2sgYW5kIHRoaXMgcmVwb3J0cyB0aGUgdG9wIG9mXG4gKiBpdC4gT3V0c2lkZSBhbnkgcmVuZGVyIGl0IGlzIGBudWxsYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVuZGVyIHRhcmdldCwgb3IgYG51bGxgIHdoZW4gbm8gcmVuZGVyIGlzIGluIGZsaWdodC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBsYXRlclJlbmRlclRhcmdldEZpbGUoKTogbnVsbCB8IFRGaWxlIHtcbiAgcmV0dXJuIHJlbmRlclRhcmdldEZpbGVzLmF0KC0xKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBgVGVtcGxhdGVyYCB0ZW1wbGF0ZSBhZ2FpbnN0IGEgdGFyZ2V0IGZpbGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyB0ZXh0LCB3aXRob3V0IHdyaXRpbmdcbiAqIGFueXRoaW5nLlxuICpcbiAqIEZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNhbGwge0BsaW5rIGdldFRlbXBsYXRlclJlbmRlclRhcmdldEZpbGV9IGFuZFxuICoge0BsaW5rIFRlbXBsYXRlckFjdGl2ZUZpbGVQcm92aWRlcn0gcmVwb3J0IGB0YXJnZXRQYXRoT3JGaWxlYCwgc28gYSBjb25zdW1lcidzIG93biBoZWxwZXJzIGludm9rZWQgZnJvbVxuICogaW5zaWRlIHRoZSB0ZW1wbGF0ZSByZXNvbHZlIGFnYWluc3QgaXQgcmF0aGVyIHRoYW4gYWdhaW5zdCB3aGF0ZXZlciB0aGUgdXNlciBoYXMgb3Blbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBQYXJzZVRlbXBsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgcmVuZGVyZWQgdGV4dC5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0gd2hlbiBgVGVtcGxhdGVyYCBpcyBub3QgbG9hZGVkIG9yIGl0cyBzaGFwZSBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlVGVtcGxhdGUocGFyYW1zOiBQYXJzZVRlbXBsYXRlUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlLFxuICAgIHRlbXBsYXRlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB0ZW1wbGF0ZUZpbGUgPSBnZXRGaWxlKHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZTogdGVtcGxhdGVQYXRoT3JGaWxlXG4gIH0pO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGVcbiAgfSk7XG4gIGNvbnN0IGFwaSA9IHJlcXVpcmVUZW1wbGF0ZXJBcGkoYXBwKTtcblxuICByZW5kZXJUYXJnZXRGaWxlcy5wdXNoKHRhcmdldEZpbGUpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhcGkucmVhZF9hbmRfcGFyc2VfdGVtcGxhdGUoe1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZSAtLSBgVGVtcGxhdGVyYCBBUEkuXG4gICAgICBydW5fbW9kZTogVGVtcGxhdGVyUnVuTW9kZS5EeW5hbWljUHJvY2Vzc29yLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZSAtLSBgVGVtcGxhdGVyYCBBUEkuXG4gICAgICB0YXJnZXRfZmlsZTogdGFyZ2V0RmlsZSxcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2UgLS0gYFRlbXBsYXRlcmAgQVBJLlxuICAgICAgdGVtcGxhdGVfZmlsZTogdGVtcGxhdGVGaWxlXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgcmVuZGVyVGFyZ2V0RmlsZXMucG9wKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGBUZW1wbGF0ZXJgJ3MgaW50ZXJuYWwgQVBJLCB0aHJvd2luZyB3aGVuIGl0IGNhbm5vdCBiZSBoYWQuXG4gKlxuICogVXNlIHRoaXMgd2hlcmUgdGhlIGNhbGxlciBjYW5ub3QgY2Fycnkgb24gd2l0aG91dCBgVGVtcGxhdGVyYCBcdTIwMTQgdGhlIGVycm9yIG5hbWVzIHRoZSBwbHVnaW4gYW5kIHNheXMgd2hpY2hcbiAqIG9mIHRoZSB0d28gZmFpbHVyZXMgb2NjdXJyZWQuIFVzZSB7QGxpbmsgcmVzb2x2ZVRlbXBsYXRlckFwaX0gaW5zdGVhZCB3aGVyZSB0aGUgaW50ZWdyYXRpb24gaXMgb3B0aW9uYWwuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgVGVtcGxhdGVyYCdzIGludGVybmFsIEFQSS5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgVGVtcGxhdGVyVW5hdmFpbGFibGVFcnJvcn0gd2hlbiBgVGVtcGxhdGVyYCBpcyBub3QgbG9hZGVkIG9yIGl0cyBzaGFwZSBoYXMgY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVUZW1wbGF0ZXJBcGkoYXBwOiBBcHApOiBUZW1wbGF0ZXJBcGkge1xuICBpZiAoIWFwcC5wbHVnaW5zLmdldFBsdWdpbihURU1QTEFURVJfUExVR0lOX0lEKSkge1xuICAgIHRocm93IG5ldyBUZW1wbGF0ZXJVbmF2YWlsYWJsZUVycm9yKFRlbXBsYXRlclVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdExvYWRlZCk7XG4gIH1cblxuICBjb25zdCBhcGkgPSByZXNvbHZlVGVtcGxhdGVyQXBpKGFwcCk7XG4gIGlmICghYXBpKSB7XG4gICAgdGhyb3cgbmV3IFRlbXBsYXRlclVuYXZhaWxhYmxlRXJyb3IoVGVtcGxhdGVyVW5hdmFpbGFiaWxpdHlSZWFzb24uU2hhcGVDaGFuZ2VkKTtcbiAgfVxuXG4gIHJldHVybiBhcGk7XG59XG5cbi8qKlxuICogR2V0cyBgVGVtcGxhdGVyYCdzIGludGVybmFsIEFQSSwgd2hlbiBgVGVtcGxhdGVyYCBpcyBpbnN0YWxsZWQsIGVuYWJsZWQgYW5kIHN0aWxsIHRoZSBzaGFwZSB0aGlzIGxpYnJhcnlcbiAqIGV4cGVjdHMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBUaGUgaW50ZXJuYWwgQVBJLCBvciBgbnVsbGAgd2hlbiBgVGVtcGxhdGVyYCBpcyBub3QgdGhlcmUgdG8gdGFsayB0by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUZW1wbGF0ZXJBcGkoYXBwOiBBcHApOiBudWxsIHwgVGVtcGxhdGVyQXBpIHtcbiAgY29uc3QgcGx1Z2luID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKFRFTVBMQVRFUl9QTFVHSU5fSUQpO1xuICByZXR1cm4gcGx1Z2luID8gZ2V0VGVtcGxhdGVyQXBpRnJvbVBsdWdpbihwbHVnaW4pIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIFRoaXJkUGFydHlQbHVnaW5BZGFwdGVyfSBvZiBgVGVtcGxhdGVyYCwgZm9yIGB3YXRjaFRoaXJkUGFydHlQbHVnaW5BcGlgLCB0aGUgd2FpdHMgYW5kXG4gKiBgY3JlYXRlVGhpcmRQYXJ0eVBsdWdpbkRlcGVuZGVuY3lgLiBJdCByZWFkcyBgcGx1Z2luLnRlbXBsYXRlcmAgYW5kIHZlcmlmaWVzIHRoZSBtZW1iZXJzIHRoaXMgbW9kdWxlIGNhbGxzLlxuICovXG5leHBvcnQgY29uc3QgVEVNUExBVEVSX1BMVUdJTl9BREFQVEVSOiBUaGlyZFBhcnR5UGx1Z2luQWRhcHRlcjxUZW1wbGF0ZXJBcGk+ID0ge1xuICBnZXRBcGk6IGdldFRlbXBsYXRlckFwaUZyb21QbHVnaW4sXG4gIHBsdWdpbklkOiBURU1QTEFURVJfUExVR0lOX0lELFxuICBwbHVnaW5OYW1lOiAnVGVtcGxhdGVyJ1xufTtcblxuZnVuY3Rpb24gZ2V0VGVtcGxhdGVyQXBpRnJvbVBsdWdpbihwbHVnaW46IFBsdWdpbik6IG51bGwgfCBUZW1wbGF0ZXJBcGkge1xuICBpZiAoISgndGVtcGxhdGVyJyBpbiBwbHVnaW4pKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB0ZW1wbGF0ZXI6IHVua25vd24gPSBwbHVnaW4udGVtcGxhdGVyO1xuICByZXR1cm4gaXNUZW1wbGF0ZXJBcGkodGVtcGxhdGVyKSA/IHRlbXBsYXRlciA6IG51bGw7XG59XG5cbi8qXG4gKiBUaGUgc3RhY2sgb2YgZmlsZXMgaW4tZmxpZ2h0IGBwYXJzZVRlbXBsYXRlYCBjYWxscyBhcmUgcmVuZGVyaW5nIGZvciwgaW5uZXJtb3N0IGxhc3QuIEEgc3RhY2sgcmF0aGVyXG4gKiB0aGFuIGEgc2luZ2xlIHNsb3QgYmVjYXVzZSBhIHRlbXBsYXRlIG1heSByZW5kZXIgYW5vdGhlciwgYW5kIGFuIGFycmF5IHJhdGhlciB0aGFuIGEgcmVhc3NpZ25lZFxuICogdmFyaWFibGUgYmVjYXVzZSBwdXNoaW5nIGFuZCBwb3BwaW5nIGEgYGNvbnN0YCBuZWVkcyBubyB3cml0ZSB0byBhbiBvdXRlciBiaW5kaW5nIGFjcm9zcyBhbiBgYXdhaXRgLlxuICovXG5jb25zdCByZW5kZXJUYXJnZXRGaWxlczogVEZpbGVbXSA9IFtdO1xuXG4vKipcbiAqIENoZWNrcyB0aGF0IGEgdmFsdWUgaXMgYFRlbXBsYXRlcmAncyBpbnRlcm5hbCBBUEksIGJ5IHRoZSBtZW1iZXJzIHRoaXMgbGlicmFyeSBhY3R1YWxseSBjYWxscy5cbiAqXG4gKiBBIHByZWRpY2F0ZSByYXRoZXIgdGhhbiBhIGNhc3Qgb24gcHVycG9zZTogYHRlbXBsYXRlcmAgaXMgbm90IHBhcnQgb2YgT2JzaWRpYW4ncyBgUGx1Z2luYCB0eXBlLCBzbyB0aGVcbiAqIHZhbHVlIGFycml2ZXMgYXMgYHVua25vd25gIGFuZCB0aGUgb25seSBob25lc3Qgd2F5IHRvIHR5cGUgaXQgaXMgdG8gVkVSSUZZIGl0LiBBIGBUZW1wbGF0ZXJgIHRoYXQgcmVuYW1lc1xuICogb25lIG9mIHRoZXNlIHRoZXJlZm9yZSByZWFkcyBhcyBcIm5vdCB0aGVyZVwiLCBpbnN0ZWFkIG9mIHRocm93aW5nIGZyb20gaW5zaWRlIGEgcmVuZGVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjYW5kaWRhdGUgYHRlbXBsYXRlcmAgb2JqZWN0LlxuICogQHJldHVybnMgV2hldGhlciBpdCBjYXJyaWVzIGV2ZXJ5IG1lbWJlciB0aGlzIGxpYnJhcnkgY2FsbHMuXG4gKi9cbmZ1bmN0aW9uIGlzVGVtcGxhdGVyQXBpKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVGVtcGxhdGVyQXBpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwgfHwgISgnY3JlYXRlX3J1bm5pbmdfY29uZmlnJyBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlLmNyZWF0ZV9ydW5uaW5nX2NvbmZpZyAhPT0gJ2Z1bmN0aW9uJyB8fCAhKCdyZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZScgaW4gdmFsdWUpIHx8IHR5cGVvZiB2YWx1ZS5yZWFkX2FuZF9wYXJzZV90ZW1wbGF0ZSAhPT0gJ2Z1bmN0aW9uJyB8fCAhKCdmdW5jdGlvbnNfZ2VuZXJhdG9yJyBpbiB2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBmdW5jdGlvbnNHZW5lcmF0b3I6IHVua25vd24gPSB2YWx1ZS5mdW5jdGlvbnNfZ2VuZXJhdG9yO1xuICByZXR1cm4gdHlwZW9mIGZ1bmN0aW9uc0dlbmVyYXRvciA9PT0gJ29iamVjdCcgJiYgZnVuY3Rpb25zR2VuZXJhdG9yICE9PSBudWxsICYmICdnZW5lcmF0ZV9vYmplY3QnIGluIGZ1bmN0aW9uc0dlbmVyYXRvciAmJiB0eXBlb2YgZnVuY3Rpb25zR2VuZXJhdG9yLmdlbmVyYXRlX29iamVjdCA9PT0gJ2Z1bmN0aW9uJztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBNENBLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsZUFBZTtBQWtJakIsTUFBTSxzQkFBc0I7QUFVNUIsSUFBSyxtQkFBTCxrQkFBS0Esc0JBQUw7QUFJTCxFQUFBQSxvQ0FBQSwyQkFBd0IsS0FBeEI7QUFLQSxFQUFBQSxvQ0FBQSxzQkFBbUIsS0FBbkI7QUFLQSxFQUFBQSxvQ0FBQSxtQkFBZ0IsS0FBaEI7QUFLQSxFQUFBQSxvQ0FBQSx5QkFBc0IsS0FBdEI7QUFNQSxFQUFBQSxvQ0FBQSxzQkFBbUIsS0FBbkI7QUFNQSxFQUFBQSxvQ0FBQSxxQkFBa0IsS0FBbEI7QUEvQlUsU0FBQUE7QUFBQSxHQUFBO0FBc0NMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBS0wsRUFBQUEsK0JBQUEsZUFBWTtBQU1aLEVBQUFBLCtCQUFBLGtCQUFlO0FBWEwsU0FBQUE7QUFBQSxHQUFBO0FBcUJMLE1BQU0sb0NBQW9DLHNCQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT3JELGdCQUE4QjtBQUM1QyxXQUFPLDZCQUE2QixLQUFLLE1BQU0sY0FBYztBQUFBLEVBQy9EO0FBQ0Y7QUFNTyxNQUFNLGtDQUFrQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJbkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVCxZQUFZLFFBQXVDO0FBQ3hELFVBQU0sbUNBQW1DLG1CQUFtQixxQkFBcUIsTUFBTSxHQUFHO0FBQzFGLFNBQUssT0FBTztBQUNaLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQ0Y7QUFVQSxlQUFzQixzQkFBc0IsUUFBc0Q7QUFDaEcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBLHFCQUFxQjtBQUFBLElBQ3JCO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxNQUFNLG9CQUFvQixHQUFHO0FBRW5DLE1BQUksc0JBQXNCLElBQUksMEJBQTBCO0FBQ3RELFdBQU8sSUFBSTtBQUFBLEVBQ2I7QUFFQSxRQUFNLGFBQWEsUUFBUTtBQUFBLElBQ3pCO0FBQUEsSUFDQSxZQUFZO0FBQUEsRUFDZCxDQUFDO0FBQ0QsUUFBTSxTQUFTLElBQUksc0JBQXNCLFFBQVcsWUFBWSx1QkFBZ0M7QUFDaEcsU0FBTyxNQUFNLElBQUksb0JBQW9CLGdCQUFnQixNQUFNO0FBQzdEO0FBVU8sU0FBUywrQkFBNkM7QUFDM0QsU0FBTyxrQkFBa0IsR0FBRyxFQUFFLEtBQUs7QUFDckM7QUFjQSxlQUFzQixjQUFjLFFBQThDO0FBQ2hGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLGVBQWUsUUFBUTtBQUFBLElBQzNCO0FBQUEsSUFDQSxZQUFZO0FBQUEsRUFDZCxDQUFDO0FBQ0QsUUFBTSxhQUFhLFFBQVE7QUFBQSxJQUN6QjtBQUFBLElBQ0EsWUFBWTtBQUFBLEVBQ2QsQ0FBQztBQUNELFFBQU0sTUFBTSxvQkFBb0IsR0FBRztBQUVuQyxvQkFBa0IsS0FBSyxVQUFVO0FBQ2pDLE1BQUk7QUFDRixXQUFPLE1BQU0sSUFBSSx3QkFBd0I7QUFBQTtBQUFBLE1BRXZDLFVBQVU7QUFBQTtBQUFBLE1BRVYsYUFBYTtBQUFBO0FBQUEsTUFFYixlQUFlO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBQ0gsVUFBRTtBQUNBLHNCQUFrQixJQUFJO0FBQUEsRUFDeEI7QUFDRjtBQVlPLFNBQVMsb0JBQW9CLEtBQXdCO0FBQzFELE1BQUksQ0FBQyxJQUFJLFFBQVEsVUFBVSxtQkFBbUIsR0FBRztBQUMvQyxVQUFNLElBQUksMEJBQTBCLDJCQUF1QztBQUFBLEVBQzdFO0FBRUEsUUFBTSxNQUFNLG9CQUFvQixHQUFHO0FBQ25DLE1BQUksQ0FBQyxLQUFLO0FBQ1IsVUFBTSxJQUFJLDBCQUEwQixpQ0FBMEM7QUFBQSxFQUNoRjtBQUVBLFNBQU87QUFDVDtBQVNPLFNBQVMsb0JBQW9CLEtBQStCO0FBQ2pFLFFBQU0sU0FBUyxJQUFJLFFBQVEsVUFBVSxtQkFBbUI7QUFDeEQsU0FBTyxTQUFTLDBCQUEwQixNQUFNLElBQUk7QUFDdEQ7QUFNTyxNQUFNLDJCQUFrRTtBQUFBLEVBQzdFLFFBQVE7QUFBQSxFQUNSLFVBQVU7QUFBQSxFQUNWLFlBQVk7QUFDZDtBQUVBLFNBQVMsMEJBQTBCLFFBQXFDO0FBQ3RFLE1BQUksRUFBRSxlQUFlLFNBQVM7QUFDNUIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFlBQXFCLE9BQU87QUFDbEMsU0FBTyxlQUFlLFNBQVMsSUFBSSxZQUFZO0FBQ2pEO0FBT0EsTUFBTSxvQkFBNkIsQ0FBQztBQVlwQyxTQUFTLGVBQWUsT0FBdUM7QUFDN0QsTUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsRUFBRSwyQkFBMkIsVUFBVSxPQUFPLE1BQU0sMEJBQTBCLGNBQWMsRUFBRSw2QkFBNkIsVUFBVSxPQUFPLE1BQU0sNEJBQTRCLGNBQWMsRUFBRSx5QkFBeUIsUUFBUTtBQUNoUixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0scUJBQThCLE1BQU07QUFDMUMsU0FBTyxPQUFPLHVCQUF1QixZQUFZLHVCQUF1QixRQUFRLHFCQUFxQixzQkFBc0IsT0FBTyxtQkFBbUIsb0JBQW9CO0FBQzNLOyIsCiAgIm5hbWVzIjogWyJUZW1wbGF0ZXJSdW5Nb2RlIiwgIlRlbXBsYXRlclVuYXZhaWxhYmlsaXR5UmVhc29uIl0KfQo=