@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
@@ -119,34 +119,35 @@ __export(plugin_exports, {
119
119
  showErrorAndDisablePlugin: () => showErrorAndDisablePlugin
120
120
  });
121
121
  module.exports = __toCommonJS(plugin_exports);
122
- var import_async_events = require('@mnaoumov/typescript-lib/async-events');
123
- var import_error = require('@mnaoumov/typescript-lib/error');
124
- var import_function = require('@mnaoumov/typescript-lib/function');
125
- var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
126
- var import_obsidian = require('obsidian');
127
- var import_active_file_provider = require('../active-file-provider.cjs');
128
- var import_command_handler_component = require('../command-handlers/command-handler-component.cjs');
129
- var import_unlock_active_note_command_handler = require('../command-handlers/unlock-active-note-command-handler.cjs');
130
- var import_command_registrar = require('../command-registrar.cjs');
131
- var import_community_plugins = require('../community-plugins.cjs');
132
- var import_abort_signal_component = require('../components/abort-signal-component.cjs');
133
- var import_async_error_handler_component = require('../components/async-error-handler-component.cjs');
134
- var import_component_ex = require('../components/component-ex.cjs');
135
- var import_console_debug_component = require('../components/console-debug-component.cjs');
136
- var import_menu_event_registrar_component = require('../components/menu-event-registrar-component.cjs');
137
- var import_notebook_navigator_menu_event_registrar_component = require('../components/notebook-navigator-menu-event-registrar-component.cjs');
138
- var import_plugin_context_component = require('../components/plugin-context-component.cjs');
139
- var import_plugin_gate_component = require('../components/plugin-gate-component.cjs');
140
- var import_plugin_notice_component = require('../components/plugin-notice-component.cjs');
141
- var import_plugin_settings_component = require('../components/plugin-settings-component.cjs');
142
- var import_data_handler = require('../data-handler.cjs');
143
- var import_i18n = require('../i18n/i18n.cjs');
144
- var import_translations_map = require('../i18n/locales/translations-map.cjs');
145
- var import_resource_lock = require('../resource-lock.cjs');
146
- var import_plugin_api = require('./plugin-api.cjs');
147
- var import_plugin_async_cleanup = require('./plugin-async-cleanup.cjs');
148
- var import_plugin_event_source = require('./plugin-event-source.cjs');
149
- var import_plugin_lifecycle_events = require('./plugin-lifecycle-events.cjs');
122
+ var import_async_events = require("@mnaoumov/typescript-lib/async-events");
123
+ var import_error = require("@mnaoumov/typescript-lib/error");
124
+ var import_function = require("@mnaoumov/typescript-lib/function");
125
+ var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
126
+ var import_obsidian = require("obsidian");
127
+ var import_active_file_provider = require("../active-file-provider.cjs");
128
+ var import_command_handler_component = require("../command-handlers/command-handler-component.cjs");
129
+ var import_unlock_active_note_command_handler = require("../command-handlers/unlock-active-note-command-handler.cjs");
130
+ var import_command_registrar = require("../command-registrar.cjs");
131
+ var import_community_plugins = require("../community-plugins.cjs");
132
+ var import_abort_signal_component = require("../components/abort-signal-component.cjs");
133
+ var import_async_error_handler_component = require("../components/async-error-handler-component.cjs");
134
+ var import_component_ex = require("../components/component-ex.cjs");
135
+ var import_console_debug_component = require("../components/console-debug-component.cjs");
136
+ var import_menu_event_registrar_component = require("../components/menu-event-registrar-component.cjs");
137
+ var import_notebook_navigator_menu_event_registrar_component = require("../components/notebook-navigator-menu-event-registrar-component.cjs");
138
+ var import_plugin_context_component = require("../components/plugin-context-component.cjs");
139
+ var import_plugin_gate_component = require("../components/plugin-gate-component.cjs");
140
+ var import_plugin_notice_component = require("../components/plugin-notice-component.cjs");
141
+ var import_plugin_settings_component = require("../components/plugin-settings-component.cjs");
142
+ var import_data_handler = require("../data-handler.cjs");
143
+ var import_debug = require("../debug.cjs");
144
+ var import_i18n = require("../i18n/i18n.cjs");
145
+ var import_translations_map = require("../i18n/locales/translations-map.cjs");
146
+ var import_resource_lock = require("../resource-lock.cjs");
147
+ var import_plugin_api = require("./plugin-api.cjs");
148
+ var import_plugin_async_cleanup = require("./plugin-async-cleanup.cjs");
149
+ var import_plugin_event_source = require("./plugin-event-source.cjs");
150
+ var import_plugin_lifecycle_events = require("./plugin-lifecycle-events.cjs");
150
151
  class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsidian.Plugin) {
151
152
  /**
152
153
  * Gets abort signal component.
@@ -318,6 +319,11 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
318
319
  // A child added before the gate opens is queued and loaded when it does, which is what `ComponentEx`
319
320
  // already does for any child added to a not-yet-loaded component.
320
321
  gatedWrapperComponent = new import_component_ex.ComponentEx();
322
+ // Whether a feature surface of this instance has ever been torn down. Until one has, every cleanup still pending
323
+ // under this plugin id belongs to the PREVIOUS instance, which `onload` has already waited for, so the first surface
324
+ // load must not wait for it a second time. After a timeout it is still pending, and a second wait doubled the
325
+ // timeout and showed its notices twice.
326
+ hasUnloadedFeatureSurface = false;
321
327
  // The payload broadcast when this plugin finished loading, kept so the matching unloaded broadcast
322
328
  // describes the same plugin without re-deriving it from a surface that has since been torn down. Null
323
329
  // whenever no loaded broadcast is outstanding, which is what keeps the two events paired.
@@ -370,12 +376,14 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
370
376
  * Do NOT override this method. Override {@link onloadImpl} instead.
371
377
  */
372
378
  async onload() {
379
+ let hasLoadedUniversalWrapper = false;
373
380
  try {
374
381
  if ((0, import_plugin_async_cleanup.hasPendingPluginAsyncCleanups)(this.manifest.id)) {
375
382
  await this.waitForPreviousAsyncCleanups();
376
383
  }
377
384
  super.addChild(this.universalWrapperComponent);
378
385
  this.universalWrapperComponent.load();
386
+ hasLoadedUniversalWrapper = true;
379
387
  await (0, import_i18n.initI18N)(this.createTranslationsMap());
380
388
  this.pluginContextComponent = this.addUniversalChild(
381
389
  new import_plugin_context_component.PluginContextComponent({
@@ -444,6 +452,10 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
444
452
  this.addUniversalChild(pluginGateComponent);
445
453
  await this.universalWrapperComponent.loadWithPromises();
446
454
  } catch (error) {
455
+ if (hasLoadedUniversalWrapper && !this.universalWrapperComponent._loaded && isSilentErrorTree(error)) {
456
+ (0, import_debug.getObsidianLibDebugger)("PluginBase:onload")(`Plugin ${this.manifest.name} (${this.manifest.id}) was unloaded during its own load`);
457
+ return;
458
+ }
447
459
  (0, import_error.printError)(new Error(`Error loading plugin ${this.manifest.name} (${this.manifest.id})`, { cause: error }));
448
460
  throw error;
449
461
  }
@@ -482,6 +494,18 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
482
494
  createTranslationsMap() {
483
495
  return import_translations_map.defaultTranslationsMap;
484
496
  }
497
+ /**
498
+ * Provides how long a new instance waits for the previous instance's async cleanups before it tells the user that
499
+ * its load is paused.
500
+ *
501
+ * Most cleanups settle within milliseconds, so a notice on every reload would only flash. Override in subclass to
502
+ * change it. The default is 500 milliseconds.
503
+ *
504
+ * @returns The delay in milliseconds.
505
+ */
506
+ getAsyncCleanupNoticeDelayInMilliseconds() {
507
+ return import_plugin_async_cleanup.DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS;
508
+ }
485
509
  /**
486
510
  * Provides how long a new instance waits for the previous instance's async cleanups before loading anyway.
487
511
  *
@@ -557,9 +581,11 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
557
581
  * settings banner that installs the missing plugin in one click. The load completes the moment the
558
582
  * dependency arrives, with no restart.
559
583
  *
560
- * A dependency must publish an API through `publishPluginApi`, which is what makes its presence,
561
- * absence, version and departure all observable through one mechanism. A plugin with nothing to expose
562
- * can publish an empty API purely so it can be depended upon.
584
+ * A plugin built on this library is declared as a `PluginDependency`: it must publish an API through
585
+ * `publishPluginApi`, which is what makes its presence, absence, version and departure all observable
586
+ * through one mechanism. A plugin with nothing to expose can publish an empty API purely so it can be
587
+ * depended upon. A THIRD-PARTY plugin, which publishes nothing there, is declared through its adapter with
588
+ * `createThirdPartyPluginDependency`, and the gate reads its API the way the adapter says.
563
589
  *
564
590
  * @returns The declared dependencies.
565
591
  */
@@ -656,6 +682,36 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
656
682
  payload
657
683
  });
658
684
  }
685
+ /**
686
+ * Provides the notice component for the cleanup wait.
687
+ *
688
+ * The wait in {@link onload} runs before the universal notice component exists, so that path gets a standalone
689
+ * one. It is never unloaded, because unloading hides its notice, and the timeout notice must stay readable after the
690
+ * wait. It holds nothing but the notices it shows, which hide themselves.
691
+ *
692
+ * @returns The notice component.
693
+ */
694
+ getAsyncCleanupNoticeComponent() {
695
+ const pluginNoticeComponent = this.components.pluginNoticeComponent;
696
+ if (pluginNoticeComponent) {
697
+ return pluginNoticeComponent;
698
+ }
699
+ const standalonePluginNoticeComponent = new import_plugin_notice_component.PluginNoticeComponent({
700
+ app: this.app,
701
+ pluginName: this.manifest.name
702
+ });
703
+ standalonePluginNoticeComponent.load();
704
+ return standalonePluginNoticeComponent;
705
+ }
706
+ /**
707
+ * Checks whether a feature surface whose load is in progress has since been torn down or replaced.
708
+ *
709
+ * @param gatedWrapperComponent - The surface being loaded.
710
+ * @returns `true` when the surface is no longer the plugin's live one.
711
+ */
712
+ isFeatureSurfaceGone(gatedWrapperComponent) {
713
+ return !gatedWrapperComponent._loaded || this.gatedWrapperComponent !== gatedWrapperComponent;
714
+ }
659
715
  /**
660
716
  * Builds and loads the subclass's feature surface, then publishes its APIs and announces itself.
661
717
  *
@@ -669,11 +725,17 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
669
725
  const gatedWrapperComponent = this.gatedWrapperComponent;
670
726
  this.universalWrapperComponent.addChild(gatedWrapperComponent);
671
727
  gatedWrapperComponent.load();
672
- if ((0, import_plugin_async_cleanup.hasPendingPluginAsyncCleanups)(this.manifest.id)) {
728
+ if (this.hasUnloadedFeatureSurface && (0, import_plugin_async_cleanup.hasPendingPluginAsyncCleanups)(this.manifest.id)) {
673
729
  await this.waitForPreviousAsyncCleanups();
674
730
  }
675
731
  await this.onloadImpl();
732
+ if (this.isFeatureSurfaceGone(gatedWrapperComponent)) {
733
+ return;
734
+ }
676
735
  await gatedWrapperComponent.loadWithPromises();
736
+ if (this.isFeatureSurfaceGone(gatedWrapperComponent)) {
737
+ return;
738
+ }
677
739
  for (const declaration of this.getPluginApis()) {
678
740
  (0, import_plugin_api.publishPluginApi)({
679
741
  ...declaration,
@@ -699,15 +761,29 @@ class PluginBase extends (0, import_async_events.mixinAsyncEvents)()(import_obsi
699
761
  unloadFeatureSurface() {
700
762
  const gatedWrapperComponent = this.gatedWrapperComponent;
701
763
  this.gatedWrapperComponent = new import_component_ex.ComponentEx();
764
+ this.hasUnloadedFeatureSurface = true;
702
765
  this.universalWrapperComponent.removeChild(gatedWrapperComponent);
703
766
  this.broadcastUnloaded();
704
767
  }
705
768
  async waitForPreviousAsyncCleanups() {
706
769
  const timeoutInMilliseconds = this.getAsyncCleanupTimeoutInMilliseconds();
707
- if (await (0, import_plugin_async_cleanup.didPluginAsyncCleanupsSettle)({ pluginId: this.manifest.id, timeoutInMilliseconds })) {
770
+ const pluginNoticeComponent = this.getAsyncCleanupNoticeComponent();
771
+ const pausedNotice = pluginNoticeComponent.showNoticeAfterDelay({
772
+ content: () => (0, import_i18n.t)(($) => $.obsidianLib.notices.pluginLoadPaused),
773
+ delayInMilliseconds: this.getAsyncCleanupNoticeDelayInMilliseconds(),
774
+ mode: import_plugin_notice_component.PluginNoticeMode.Separate
775
+ });
776
+ let didSettle;
777
+ try {
778
+ didSettle = await (0, import_plugin_async_cleanup.didPluginAsyncCleanupsSettle)({ pluginId: this.manifest.id, timeoutInMilliseconds });
779
+ } finally {
780
+ pausedNotice.dispose();
781
+ }
782
+ if (didSettle) {
708
783
  return;
709
784
  }
710
785
  console.warn(`Plugin ${this.manifest.id}: the previous instance's async cleanups did not finish in ${String(timeoutInMilliseconds)} ms; loading anyway.`);
786
+ pluginNoticeComponent.showNotice((0, import_i18n.t)(($) => $.obsidianLib.notices.pluginLoadPauseTimedOut), { mode: import_plugin_notice_component.PluginNoticeMode.Separate });
711
787
  }
712
788
  }
713
789
  async function reloadPlugin(plugin) {
@@ -727,10 +803,33 @@ async function showErrorAndDisablePlugin(plugin, message) {
727
803
  (0, import_error.printError)(new Error(message));
728
804
  await plugin.app.plugins.disablePlugin(plugin.manifest.id);
729
805
  }
806
+ function isSilentErrorTree(error) {
807
+ const pendingErrors = [error];
808
+ while (pendingErrors.length > 0) {
809
+ const pendingError = pendingErrors.pop();
810
+ if (pendingError instanceof import_error.SilentError) {
811
+ continue;
812
+ }
813
+ if (pendingError instanceof AggregateError) {
814
+ const errors = pendingError.errors;
815
+ if (errors.length === 0) {
816
+ return false;
817
+ }
818
+ pendingErrors.push(...errors);
819
+ continue;
820
+ }
821
+ if (pendingError instanceof Error && pendingError.cause !== void 0) {
822
+ pendingErrors.push(pendingError.cause);
823
+ continue;
824
+ }
825
+ return false;
826
+ }
827
+ return true;
828
+ }
730
829
  // Annotate the CommonJS export names for ESM import in node:
731
830
  0 && (module.exports = {
732
831
  PluginBase,
733
832
  reloadPlugin,
734
833
  showErrorAndDisablePlugin
735
834
  });
736
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luQ29uZmxpY3QsXG4gIFBsdWdpbkRlcGVuZGVuY3lcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbnNNYXAgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5BcGlEZWNsYXJhdGlvbiB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBsdWdpbkV2ZW50TWFwLFxuICBQbHVnaW5FdmVudFNvdXJjZVxufSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgfSBmcm9tICcuL3BsdWdpbi1saWZlY3ljbGUtZXZlbnRzLnRzJztcblxuaW1wb3J0IHsgQXBwQWN0aXZlRmlsZVByb3ZpZGVyIH0gZnJvbSAnLi4vYWN0aXZlLWZpbGUtcHJvdmlkZXIudHMnO1xuaW1wb3J0IHsgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21tYW5kLWhhbmRsZXJzL2NvbW1hbmQtaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVW5sb2NrQWN0aXZlTm90ZUNvbW1hbmRIYW5kbGVyIH0gZnJvbSAnLi4vY29tbWFuZC1oYW5kbGVycy91bmxvY2stYWN0aXZlLW5vdGUtY29tbWFuZC1oYW5kbGVyLnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbW1hbmRSZWdpc3RyYXIgfSBmcm9tICcuLi9jb21tYW5kLXJlZ2lzdHJhci50cyc7XG5pbXBvcnQgeyBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3IgfSBmcm9tICcuLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5pbXBvcnQgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXN5bmMtZXJyb3ItaGFuZGxlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDb25zb2xlRGVidWdDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbnNvbGUtZGVidWctY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9ub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpbkNvbnRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5HYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tZ2F0ZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luTm90aWNlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHsgaW5pdEkxOE4gfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgZGVmYXVsdFRyYW5zbGF0aW9uc01hcCB9IGZyb20gJy4uL2kxOG4vbG9jYWxlcy90cmFuc2xhdGlvbnMtbWFwLnRzJztcbmltcG9ydCB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbkFwaSB9IGZyb20gJy4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICBkaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlLFxuICBoYXNQZW5kaW5nUGx1Z2luQXN5bmNDbGVhbnVwcyxcbiAgcmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXBcbn0gZnJvbSAnLi9wbHVnaW4tYXN5bmMtY2xlYW51cC50cyc7XG5pbXBvcnQgeyBQbHVnaW5FdmVudFNvdXJjZUltcGwgfSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50XG59IGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuXG4vKipcbiAqIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBvd25lZCBieSB7QGxpbmsgUGx1Z2luQmFzZX0sIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3NvciBleHBvc2luZ1xuICogZWFjaCBvbmUuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbCBiZWNhdXNlIGEgY29tcG9uZW50IG9ubHkgZXhpc3RzIG9uY2Uge0BsaW5rIFBsdWdpbkJhc2Uub25sb2FkfVxuICogaGFzIGNyZWF0ZWQgaXQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5CYXNlQ29tcG9uZW50cyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50PzogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50PzogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50PzogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudD86IENvbnNvbGVEZWJ1Z0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgcGx1Z2luQ29udGV4dENvbXBvbmVudD86IFBsdWdpbkNvbnRleHRDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHBsdWdpbkdhdGVDb21wb25lbnQ/OiBQbHVnaW5HYXRlQ29tcG9uZW50O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50PzogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudD86IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBPYnNpZGlhbiBwbHVnaW5zIHdpdGggYSBjb21wb25lbnQtYmFzZWQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIFJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyBhdXRvbWF0aWNhbGx5LiBTdWJjbGFzc2VzIGFkZCBvciByZXBsYWNlIGNvbXBvbmVudHNcbiAqIHZpYSB7QGxpbmsgcmVtb3ZlQ2hpbGR9IC8ge0BsaW5rIGFkZENoaWxkfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2UgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpbkV2ZW50TWFwPigpKFBsdWdpbikgaW1wbGVtZW50cyBQbHVnaW5FdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBHZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KCk6IEFib3J0U2lnbmFsQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmFib3J0U2lnbmFsQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KHZhbHVlOiBBYm9ydFNpZ25hbENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhYm9ydFNpZ25hbENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQoKTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2hhcmVkIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuIFJlZ2lzdGVyIGEgcGx1Z2luJ3MgY29tbWFuZHMgb24gaXQgdmlhXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIHlvdXIgb3duXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudH0g4oCUIHRoZSBhcHAtYmFja2VkIGFjdGl2ZS1maWxlIHByb3ZpZGVyLCBjb21tYW5kIHJlZ2lzdHJhciwgbWVudVxuICAgKiBldmVudCByZWdpc3RyYXIsIGFuZCBwbHVnaW4gbmFtZSBhcmUgYWxyZWFkeSB3aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KCk6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQodmFsdWU6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbW1hbmRIYW5kbGVyQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBjb25zb2xlRGVidWdDb21wb25lbnQoKTogQ29uc29sZURlYnVnQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCh2YWx1ZTogQ29uc29sZURlYnVnQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbnNvbGVEZWJ1Z0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudCAocGx1Z2luIElELCBkZWJ1ZyBjb250cm9sbGVyLCBsaWJyYXJ5IHN0eWxlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCgpOiBQbHVnaW5Db250ZXh0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpbkNvbnRleHRDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbkNvbnRleHRDb21wb25lbnQodmFsdWU6IFBsdWdpbkNvbnRleHRDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luQ29udGV4dENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBnYXRlIGhvbGRpbmcgdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSB1cCBvciBkb3duLlxuICAgKlxuICAgKiBSZWFjaCBmb3IgaXQgZnJvbSBhIHNldHRpbmdzIHRhYiB0byByZW5kZXIgdGhlIG92ZXJsYXAgYmFubmVyIGZvciBhXG4gICAqIHtAbGluayBjb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudCFQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm59IGNvbmZsaWN0IOKAlCB0aGUgb25lXG4gICAqIGJhbm5lciB0aGUgbGlicmFyeSBjYW5ub3QgcGxhY2UgaXRzZWxmLCBiZWNhdXNlIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzIGl0cyBvd24gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBSZWFkYWJsZSB0aHJvdWdob3V0IHtAbGluayBvbmxvYWRJbXBsfSwgaW5jbHVkaW5nIGl0cyBzeW5jaHJvbm91cyBwcmVmaXgsIHdoaWNoIGlzIHdoZXJlIGEgc2V0dGluZ3NcbiAgICogdGFiIGlzIGJ1aWx0LiBUaGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gaW5jaWRlbnRhbDogYWRkaW5nIHRoZSBnYXRlIGlzIHdoYXQgcnVuc1xuICAgKiB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIHtAbGluayBvbmxvYWR9IGFzc2lnbnMgdGhpcyBmaWVsZCBiZWZvcmUgYWRkaW5nIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5HYXRlQ29tcG9uZW50KCk6IFBsdWdpbkdhdGVDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luR2F0ZUNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5HYXRlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5HYXRlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpbkdhdGVDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpbk5vdGljZUNvbXBvbmVudCgpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luTm90aWNlQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luTm90aWNlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luTm90aWNlQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQoKTogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gUGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQodmFsdWU6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpblNldHRpbmdzQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudCwgdXNlZCB0byBsb2NrIG5vdGVzIHJlYWQtb25seSBkdXJpbmcgbG9uZyBvcGVyYXRpb25zLiBPd25lZCBieVxuICAgKiB0aGUgcGx1Z2luLCBzbyBpdHMgbG9ja3MgYXJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmVzb3VyY2VMb2NrQ29tcG9uZW50KCk6IFJlc291cmNlTG9ja0NvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5yZXNvdXJjZUxvY2tDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gRWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCByZXNvdXJjZUxvY2tDb21wb25lbnQodmFsdWU6IFJlc291cmNlTG9ja0NvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdyZXNvdXJjZUxvY2tDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudHM6IFBsdWdpbkJhc2VDb21wb25lbnRzID0ge307XG5cbiAgLy8gRXZlcnl0aGluZyB0aGUgU1VCQ0xBU1Mgb3duczogd2hhdCBgb25sb2FkSW1wbGAgYWRkcywgYW5kIHdoYXQgaXQgYWRkcyBsYXRlci5cbiAgLy9cbiAgLy8gQSBzZWNvbmQgd3JhcHBlciByYXRoZXIgdGhhbiBvbmUsIGJlY2F1c2UgdGhlIHR3byB0aWVycyBoYXZlIG9wcG9zaXRlIGxpZmV0aW1lcy4gVGhlIHVuaXZlcnNhbFxuICAvLyBjb21wb25lbnRzIGhhdmUgdG8gT1VUTElWRSBhIGxvc3QgZGVwZW5kZW5jeSDigJQgdGhleSBhcmUgd2hhdCBzaG93cyB0aGUgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIHRoYXRcbiAgLy8gd2VudCBhd2F5IGFuZCByZW5kZXJzIHRoZSBidXR0b24gdGhhdCBicmluZ3MgaXQgYmFjayDigJQgd2hpbGUgdGhlIHN1YmNsYXNzJ3Mgc3VyZmFjZSBpcyBleGFjdGx5IHdoYXRcbiAgLy8gbXVzdCBzdG9wIHJ1bm5pbmcuIFVubG9hZGluZyBvbmUgd3JhcHBlciBob2xkaW5nIGJvdGggd291bGQgc2lsZW5jZSB0aGUgcGx1Z2luIGF0IHRoZSBtb21lbnQgaXQgbW9zdFxuICAvLyBuZWVkcyB0byBzcGVhay5cbiAgLy9cbiAgLy8gQWx3YXlzIHByZXNlbnQsIG5ldmVyIG51bGwsIGFuZCBSRVBMQUNFRCByYXRoZXIgdGhhbiBlbXB0aWVkIHdoZW4gdGhlIHN1cmZhY2UgaXMgdG9ybiBkb3duLiBUaGF0IGtlZXBzXG4gIC8vIGBhZGRDaGlsZGAgY2FsbGFibGUgYXQgZXZlcnkgcG9pbnQgaW4gdGhlIHBsdWdpbidzIGxpZmUsIGV4YWN0bHkgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdGllcnMgZXhpc3RlZDpcbiAgLy8gQSBjaGlsZCBhZGRlZCBiZWZvcmUgdGhlIGdhdGUgb3BlbnMgaXMgcXVldWVkIGFuZCBsb2FkZWQgd2hlbiBpdCBkb2VzLCB3aGljaCBpcyB3aGF0IGBDb21wb25lbnRFeGBcbiAgLy8gYWxyZWFkeSBkb2VzIGZvciBhbnkgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gIHByaXZhdGUgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudEV4KCk7XG5cbiAgLy8gVGhlIHBheWxvYWQgYnJvYWRjYXN0IHdoZW4gdGhpcyBwbHVnaW4gZmluaXNoZWQgbG9hZGluZywga2VwdCBzbyB0aGUgbWF0Y2hpbmcgdW5sb2FkZWQgYnJvYWRjYXN0XG4gIC8vIGRlc2NyaWJlcyB0aGUgc2FtZSBwbHVnaW4gd2l0aG91dCByZS1kZXJpdmluZyBpdCBmcm9tIGEgc3VyZmFjZSB0aGF0IGhhcyBzaW5jZSBiZWVuIHRvcm4gZG93bi4gTnVsbFxuICAvLyB3aGVuZXZlciBubyBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoZSB0d28gZXZlbnRzIHBhaXJlZC5cbiAgcHJpdmF0ZSBsaWZlY3ljbGVFdmVudFBheWxvYWQ6IG51bGwgfCBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgPSBudWxsO1xuXG4gIC8vIFRoZSBsaWJyYXJ5J3Mgb3duIGNvbXBvbmVudHMsIHdoaWNoIG91dGxpdmUgYW55IGRlcGVuZGVuY3kuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIHdyYXBwZXIgaG9sZGluZyB0aGUgc3ViY2xhc3MncyBvd24gc3VyZmFjZSwgd2hpY2gge0BsaW5rIG9ubG9hZH1cbiAgICogY3JlYXRlcyBhbmQgbG9hZHMgYmVmb3JlIGNhbGxpbmcge0BsaW5rIG9ubG9hZEltcGx9LiBTbyBhIGNoaWxkIGFkZGVkIGR1cmluZyB7QGxpbmsgb25sb2FkSW1wbH0gaXNcbiAgICogbG9hZGVkIGltbWVkaWF0ZWx5LCBjaGlsZHJlbi1maXJzdCwgYW5kIGlzIHVzYWJsZSBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICAgKlxuICAgKiBUaGF0IHdyYXBwZXIgaXMgdG9ybiBkb3duIGFuZCByZWJ1aWx0IHdoZW5ldmVyIHRoZSBnYXRlIGNsb3NlcyBhbmQgb3BlbnMgYWdhaW4g4oCUIGEgZGVwZW5kZW5jeSBkZWNsYXJlZFxuICAgKiBieSB7QGxpbmsgZ2V0UGx1Z2luRGVwZW5kZW5jaWVzfSBnb2luZyBhd2F5IGFuZCBjb21pbmcgYmFjaywgb3IgYSBjb25mbGljdCBkZWNsYXJlZCBieVxuICAgKiB7QGxpbmsgZ2V0UGx1Z2luQ29uZmxpY3RzfSBhcHBlYXJpbmcgYW5kIGJlaW5nIHJlc29sdmVkIOKAlCBzbyBhIGNoaWxkIGFkZGVkIGhlcmUgbGl2ZXMgZXhhY3RseSBhcyBsb25nXG4gICAqIGFzIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgZG9lcy4gQWRkaW5nIG9uZSB3aGlsZSB0aGUgc3VyZmFjZSBpcyBkb3duIGlzIHN0aWxsIGxlZ2l0aW1hdGUg4oCUIGl0IGlzXG4gICAqIHF1ZXVlZCBhbmQgbG9hZGVkIHdoZW4gdGhlIHN1cmZhY2UgbmV4dCBjb21lcyB1cCwgdGhlIHdheSB7QGxpbmsgQ29tcG9uZW50RXguYWRkQ2hpbGR9IGFscmVhZHkgcXVldWVzXG4gICAqIGEgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNVQkNMQVNTJ3MgZG9vciwgYW5kIHRoZSBvbmx5IG9uZSBpdCBoYXM6IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyB7QGxpbmsgb25sb2FkfSByZWdpc3RlcnNcbiAgICogdGFrZSBhIHByaXZhdGUgcm91dGUgb250byBhIGRpZmZlcmVudCB3cmFwcGVyLiBTbyBhbnl0aGluZyBvYnNlcnZpbmcgdGhpcyBtZXRob2Qg4oCUIGEgdGVzdCBjb3VudGluZyBpdHNcbiAgICogY2FsbHMsIGEgcGF0Y2ggd3JhcHBpbmcgaXQg4oCUIHNlZXMgZXhhY3RseSB0aGUgY2hpbGRyZW4gdGhlIHN1YmNsYXNzIGFkZGVkLCBhbmQgbm9uZSBvZiB0aGUgbGlicmFyeSdzLlxuICAgKiBCZWZvcmUgdGhlIHR3byB0aWVycyBleGlzdGVkIG9uZSBkb29yIGNhcnJpZWQgYm90aCwgYW5kIGEgY29uc3VtZXIgY291bnRpbmcgdGhlIHRvdGFsIGlzIHRoZSBvbmUgdGhpbmdcbiAgICogdGhlIHNwbGl0IGNvdWxkIG5vdCBrZWVwIHdvcmtpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhZGRDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyBpZiBuZWVkZWQuIE1ha2Ugc3VyZSB0byBjYWxsIGBhd2FpdCBzdXBlci5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKWAgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZT8uKCk7XG4gICAgYXdhaXQgdGhpcy50cmlnZ2VyQXN5bmMoJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZC5cbiAgICpcbiAgICogT3JjaGVzdHJhdGVzIGxvYWRpbmc6IHJlZ2lzdGVycyB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMsIGxldHMgdGhlIHN1YmNsYXNzIHdpcmUgaXRzIG93blxuICAgKiBjb21wb25lbnRzIHZpYSB7QGxpbmsgb25sb2FkSW1wbH0sIHRoZW4gYXdhaXRzIHRoZSBhc3luYyB0YWlsIG9mIGV2ZXJ5IGxvYWQuXG4gICAqIEVhY2ggY29tcG9uZW50IGxvYWRzIGFzIGl0IGlzIGFkZGVkLCBjaGlsZHJlbi1maXJzdC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBPdmVycmlkZSB7QGxpbmsgb25sb2FkSW1wbH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJlZm9yZSBhbnl0aGluZyBlbHNlOiB0aGUgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4gbWF5IHN0aWxsIGJlIGNsb3Npbmcgd2hhdCB0aGlzIG9uZSBpcyBhYm91dCB0b1xuICAgICAgLy8gb3BlbiwgYmVjYXVzZSBPYnNpZGlhbiBydW5zIGBvbnVubG9hZGAgc3luY2hyb25vdXNseSBhbmQgYXdhaXRzIG5vdGhpbmcgaXQgc3RhcnRlZC4gQXdhaXRlZCBvbmx5IHdoZW4gc29tZSBhcmVcbiAgICAgIC8vIHBlbmRpbmcsIHNvIGEgcGx1Z2luIHdpdGggbm9uZSBhdHRhY2hlcyBpdHMgd3JhcHBlciBiZWxvdyB3aXRob3V0IHlpZWxkaW5nIGZpcnN0LlxuICAgICAgaWYgKGhhc1BlbmRpbmdQbHVnaW5Bc3luY0NsZWFudXBzKHRoaXMubWFuaWZlc3QuaWQpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMud2FpdEZvclByZXZpb3VzQXN5bmNDbGVhbnVwcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgd3JhcHBlciBpcyBhdHRhY2hlZCBhbmQgbG9hZGVkIGJlZm9yZSBhbnl0aGluZyBpcyB3aXJlZCB1cCwgc28gZXZlcnkgYGFkZENoaWxkYCBiZWxvd1xuICAgICAgLy8gbG9hZHMgaXRzIGNoaWxkIHN0cmFpZ2h0IGF3YXkgcmF0aGVyIHRoYW4gcXVldWluZyBpdC5cbiAgICAgIC8vIFRoYXQgaXMgd2hhdCBsZXRzIGEgY29tbWFuZCBoYW5kbGVyIHJlZ2lzdGVyIGl0cyBtZW51IGV2ZW50cyBmcm9tIGBvblJlZ2lzdGVyZWRgLCB3aGljaFxuICAgICAgLy8gYHJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzYCBhd2FpdHMgYW5kIHdoaWNoIGEgcmVnaXN0cmFyIHJlZnVzZXMgd2hpbGUgdW5sb2FkZWQuXG4gICAgICAvLyBBdHRhY2hpbmcgaXQgdXAgZnJvbnQgYWxzbyByZWdpc3RlcnMgdGhlIHdyYXBwZXIgZm9yIHRlYXJkb3duIGJlZm9yZSBhbnl0aGluZyBjYW4gdGhyb3cuXG4gICAgICAvLyBUaGUgbG9hZCBpcyBleHBsaWNpdCByYXRoZXIgdGhhbiBsZWZ0IHRvIGBhZGRDaGlsZGAsIHdoaWNoIGxvYWRzIHRoZSBjaGlsZCBvbmx5IHdoZW4gdGhlXG4gICAgICAvLyBwbHVnaW4gaXRzZWxmIGlzIGxvYWRlZCDigJQgdHJ1ZSB3aGVuIE9ic2lkaWFuIGNhbGxzIGBsb2FkKClgLCBidXQgbm90IHdoZW4gYSBjYWxsZXIgaW52b2tlc1xuICAgICAgLy8gYG9ubG9hZCgpYCBkaXJlY3RseS5cbiAgICAgIHN1cGVyLmFkZENoaWxkKHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudCk7XG4gICAgICB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQubG9hZCgpO1xuXG4gICAgICBhd2FpdCBpbml0STE4Tih0aGlzLmNyZWF0ZVRyYW5zbGF0aW9uc01hcCgpKTtcbiAgICAgIHRoaXMucGx1Z2luQ29udGV4dENvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBQbHVnaW5Db250ZXh0Q29tcG9uZW50KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luTm90aWNlQ29tcG9uZW50KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbk5hbWU6IHRoaXMubWFuaWZlc3QubmFtZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBBc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCh0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCkpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IEFib3J0U2lnbmFsQ29tcG9uZW50KHRoaXMubWFuaWZlc3QuaWQpKTtcbiAgICAgIHRoaXMuY29uc29sZURlYnVnQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgQ29uc29sZURlYnVnQ29tcG9uZW50KHRoaXMubWFuaWZlc3QuaWQpKTtcbiAgICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwLCB0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICAvLyBgTm90ZWJvb2sgTmF2aWdhdG9yYCBkcmF3cyBpdHMgb3duIGZpbGUgdHJlZSBhbmQgbmV2ZXIgcmFpc2VzIE9ic2lkaWFuJ3MgYGZpbGUtbWVudWAgL1xuICAgICAgLy8gYGZpbGVzLW1lbnVgIGV2ZW50cywgc28gZXZlcnkgcGx1Z2luJ3MgY29udGV4dC1tZW51IGl0ZW1zIHdvdWxkIHZhbmlzaCBmb3IgYW55b25lIGJyb3dzaW5nXG4gICAgICAvLyB0aHJvdWdoIGl0LiBXaXJlZCBoZXJlIHJhdGhlciB0aGFuIHBlci1wbHVnaW46IHRoZSBicmlkZ2Ugc3RheXMgZG9ybWFudCB3aGVuIE5vdGVib29rXG4gICAgICAvLyBOYXZpZ2F0b3IgaXMgbm90IGluc3RhbGxlZCwgYW5kIGEgcGx1Z2luIHdpdGggbm8gZmlsZS9mb2xkZXIgaGFuZGxlcnMgY29udHJpYnV0ZXMgbm90aGluZy5cbiAgICAgIGNvbnN0IG5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50KHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbk5hbWU6IHRoaXMubWFuaWZlc3QubmFtZSxcbiAgICAgICAgICBzdWJtZW51SWNvbjogdGhpcy5nZXROb3RlYm9va05hdmlnYXRvck1lbnVTdWJtZW51SWNvbigpXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBDb21tYW5kSGFuZGxlckNvbXBvbmVudCh7XG4gICAgICAgICAgYWN0aXZlRmlsZVByb3ZpZGVyOiBuZXcgQXBwQWN0aXZlRmlsZVByb3ZpZGVyKHRoaXMuYXBwKSxcbiAgICAgICAgICBhZGRpdGlvbmFsTWVudUV2ZW50UmVnaXN0cmFyczogW25vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50XSxcbiAgICAgICAgICAvLyBUaGUgY29tcG9uZW50IGlzIHVuaXZlcnNhbDsgdGhlIGNvbW1hbmRzIHJlZ2lzdGVyZWQgVEhST1VHSCBpdCBhcmUgbm90LiBBIHN1YmNsYXNzIHJlZ2lzdGVyc1xuICAgICAgICAgIC8vIGl0cyBvd24gZnJvbSBgb25sb2FkSW1wbGAsIGNsb3Npbmcgb3ZlciBjb2xsYWJvcmF0b3JzIHRoYXQgYmVsb25nIHRvIHRoZSBmZWF0dXJlIHN1cmZhY2Ug4oCUIHNvXG4gICAgICAgICAgLy8gdGhvc2UgY29tbWFuZHMgbXVzdCBnbyBkb3duIHdpdGggdGhlIHN1cmZhY2Ugd2hlbiB0aGUgZ2F0ZSBjbG9zZXMsIG9yIHRoZXkgc2l0IGluIHRoZSBwYWxldHRlXG4gICAgICAgICAgLy8gY2FsbGluZyBpbnRvIHRvcm4tZG93biBvYmplY3RzLCBhbmQgYXJlIHJlZ2lzdGVyZWQgYSBzZWNvbmQgdGltZSB3aGVuIHRoZSBnYXRlIHJlb3BlbnMgYW5kXG4gICAgICAgICAgLy8gYG9ubG9hZEltcGxgIHJ1bnMgYWdhaW4uXG4gICAgICAgICAgLy8gUmVzb2x2ZWQgb24gZXZlcnkgY2FsbCByYXRoZXIgdGhhbiBjYXB0dXJlZCBoZXJlLCBiZWNhdXNlIGB1bmxvYWRGZWF0dXJlU3VyZmFjZWAgUkVQTEFDRVMgdGhlXG4gICAgICAgICAgLy8gd3JhcHBlciBpbnN0ZWFkIG9mIGVtcHR5aW5nIGl0OiBlYWNoIGN5Y2xlJ3MgY29tbWFuZHMgYmVsb25nIHRvIHRoYXQgY3ljbGUncyB3cmFwcGVyLlxuICAgICAgICAgIGNvbW1hbmRMaWZldGltZU93bmVyUHJvdmlkZXI6ICgpOiBDb21wb25lbnRFeCA9PiB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCxcbiAgICAgICAgICBjb21tYW5kUmVnaXN0cmFyOiBuZXcgUGx1Z2luQ29tbWFuZFJlZ2lzdHJhcih0aGlzKSxcbiAgICAgICAgICBtZW51RXZlbnRSZWdpc3RyYXI6IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IE1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCh0aGlzLmFwcCkpLFxuICAgICAgICAgIHBsdWdpbk5hbWU6IHRoaXMubWFuaWZlc3QubmFtZVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIC8vIEFsd2F5cyBhdmFpbGFibGU7IHRoZSBjb21tYW5kJ3Mgb3duIGBjYW5FeGVjdXRlYCBoaWRlcyBpdCB1bmxlc3MgdGhlIGFjdGl2ZSBub3RlIGlzIGxvY2tlZC5cbiAgICAgIC8vIFRoZSBvbmUgY29tbWFuZCB0aGF0IG5hbWVzIGl0cyBvd25lciBleHBsaWNpdGx5LCBvcHRpbmcgT1VUIG9mIHRoZSBzdXJmYWNlLXNjb3BlZCBkZWZhdWx0IGFib3ZlOlxuICAgICAgLy8gSXQgaXMgdGhlIHJlc2N1ZSBmb3IgYSBub3RlIGxlZnQgbG9ja2VkLCBpdCBjbG9zZXMgb3ZlciBub3RoaW5nIGJ1dCB0aGUgdW5pdmVyc2FsIHJlc291cmNlLWxvY2tcbiAgICAgIC8vIGNvbXBvbmVudCwgYW5kIGEgYmxvY2tlZCBwbHVnaW4gaXMgZXhhY3RseSB3aGVuIGEgdXNlciBtYXkgbmVlZCBpdC5cbiAgICAgIGF3YWl0IHRoaXMuY29tbWFuZEhhbmRsZXJDb21wb25lbnQucmVnaXN0ZXJDb21tYW5kSGFuZGxlcnMoKCkgPT4gW1xuICAgICAgICBuZXcgVW5sb2NrQWN0aXZlTm90ZUNvbW1hbmRIYW5kbGVyKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHJlc291cmNlTG9ja0NvbXBvbmVudDogdGhpcy5yZXNvdXJjZUxvY2tDb21wb25lbnRcbiAgICAgICAgfSlcbiAgICAgIF0sIHsgbGlmZXRpbWVPd25lcjogdGhpcy5jb21tYW5kSGFuZGxlckNvbXBvbmVudCB9KTtcblxuICAgICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8b2JqZWN0Pih7XG4gICAgICAgICAgZGF0YUhhbmRsZXI6IG5ldyBQbHVnaW5EYXRhSGFuZGxlcih0aGlzKSxcbiAgICAgICAgICBwbHVnaW5FdmVudFNvdXJjZTogbmV3IFBsdWdpbkV2ZW50U291cmNlSW1wbCh0aGlzKSxcbiAgICAgICAgICBwbHVnaW5TZXR0aW5nc0NsYXNzOiBPYmplY3RcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIFRoZSBnYXRlLiBJdCBsb2FkcyB0aGUgZmVhdHVyZSBzdXJmYWNlIGl0c2VsZiBvbmNlIGV2ZXJ5IGRlY2xhcmVkIGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBub1xuICAgICAgLy8gZGVjbGFyZWQgY29uZmxpY3QgaG9sZHMg4oCUIHdoaWNoIGZvciBhIHBsdWdpbiBkZWNsYXJpbmcgbmVpdGhlciBpcyBpbW1lZGlhdGVseSwgc3luY2hyb25vdXNseSxcbiAgICAgIC8vIGJlZm9yZSB0aGlzIGxpbmUgcmV0dXJucyDigJQgYW5kIHVubG9hZHMgaXQgYWdhaW4gaWYgYSBkZXBlbmRlbmN5IGlzIGxhdGVyIGRpc2FibGVkIG9yIHVuaW5zdGFsbGVkLFxuICAgICAgLy8gb3IgYSBjb25mbGljdGluZyBwbHVnaW4gaXMgZW5hYmxlZC4gQSBwbHVnaW4gdGhhdCBpcyBibG9ja2VkIHRoZXJlZm9yZSByZWFjaGVzIGBsb2FkV2l0aFByb21pc2VzYFxuICAgICAgLy8gYmVsb3cgaGF2aW5nIHJlZ2lzdGVyZWQgbm90aGluZyBvZiBpdHMgb3duLCB3aXRoIG9ubHkgdGhlIHVuaXZlcnNhbCBjb21wb25lbnRzIGFib3ZlIHJ1bm5pbmcgdG9cbiAgICAgIC8vIGV4cGxhaW4gd2h5IGFuZCB0byBvZmZlciB0aGUgcmVwYWlyLlxuICAgICAgLy8gQXNzaWduZWQgQkVGT1JFIHRoZSBhZGQsIHVubGlrZSBldmVyeSB1bml2ZXJzYWwgY29tcG9uZW50IGFib3ZlLCBhbmQgdGhhdCBvcmRlciBpcyB0aGUgd2hvbGVcbiAgICAgIC8vIHBvaW50LiBBZGRpbmcgdGhpcyBvbmUgaXMgd2hhdCBydW5zIGBvbmxvYWRJbXBsYCwgcGVyIHRoZSBwYXJhZ3JhcGggYWJvdmUsIHNvIHRoZSBhc3NpZ25tZW50XG4gICAgICAvLyBzdGF0ZW1lbnQgaGFzIG5vdCByZXR1cm5lZCB5ZXQgd2hpbGUgdGhlIHN1YmNsYXNzIGlzIHJ1bm5pbmcg4oCUIGFuZCBhIHNldHRpbmdzIHRhYiBidWlsdCB0aGVyZVxuICAgICAgLy8gcmVhZHMgYHRoaXMucGx1Z2luR2F0ZUNvbXBvbmVudGAgdG8gcmVuZGVyIHRoZSBgV2FybmAgYmFubmVyLiBBc3NpZ25pbmcgYWZ0ZXIgdGhlIGFkZCB3b3VsZFxuICAgICAgLy8gbWFrZSB0aGF0IHJlYWQgdGhyb3cgYFZhbHVlIGlzIHVuZGVmaW5lZGAgb3V0IG9mIHRoZSBnZXR0ZXIsIHdoaWNoIGlzIGFuIG9wYXF1ZSB3YXkgdG8gc2F5XG4gICAgICAvLyBcInRvbyBlYXJseVwiLiBOb3RoaW5nIGFib3V0IGNoaWxkLWFkZCBvcmRlciBtb3ZlczogdGhlIHNlcXVlbmNlIG9mIGBhZGRVbml2ZXJzYWxDaGlsZGAgY2FsbHMgaXNcbiAgICAgIC8vIHVuY2hhbmdlZCwgYW5kIGBzZXRDb21wb25lbnRgIGlzIGEgcGxhaW4gc3RvcmUuXG4gICAgICBjb25zdCBwbHVnaW5HYXRlQ29tcG9uZW50ID0gbmV3IFBsdWdpbkdhdGVDb21wb25lbnQoe1xuICAgICAgICBjb25mbGljdHM6IHRoaXMuZ2V0UGx1Z2luQ29uZmxpY3RzKCksXG4gICAgICAgIGRlcGVuZGVuY2llczogdGhpcy5nZXRQbHVnaW5EZXBlbmRlbmNpZXMoKSxcbiAgICAgICAgbG9hZEZlYXR1cmVTdXJmYWNlOiAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpLFxuICAgICAgICBwbHVnaW46IHRoaXMsXG4gICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgIHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMucGx1Z2luR2F0ZUNvbXBvbmVudCA9IHBsdWdpbkdhdGVDb21wb25lbnQ7XG4gICAgICB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKHBsdWdpbkdhdGVDb21wb25lbnQpO1xuXG4gICAgICAvLyBFdmVyeSBjaGlsZCBoYXMgYWxyZWFkeSBsb2FkZWQgYXMgaXQgd2FzIGFkZGVkOyB0aGlzIGF3YWl0cyB0aGVpciBhY2N1bXVsYXRlZCBhc3luYyB0YWlscyBhbmRcbiAgICAgIC8vIHJlcG9ydHMgYW55IGZhaWx1cmUgYXMgYSBzaW5nbGUgYEFnZ3JlZ2F0ZUVycm9yYC5cbiAgICAgIGF3YWl0IHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5sb2FkV2l0aFByb21pc2VzKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBFcnJvciBsb2FkaW5nIHBsdWdpbiAke3RoaXMubWFuaWZlc3QubmFtZX0gKCR7dGhpcy5tYW5pZmVzdC5pZH0pYCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgdW5sb2FkZWQuXG4gICAqXG4gICAqIEFubm91bmNlcyB0aGUgZGVwYXJ0dXJlIG9uIGBhcHAud29ya3NwYWNlYCBzbyBhbnl0aGluZyBkZXBlbmRpbmcgb24gdGhpcyBwbHVnaW4gbGVhcm5zIG9mIGl0IGF0IHRoZVxuICAgKiBtb21lbnQgaXQgaGFwcGVucywgcmF0aGVyIHRoYW4gZGlzY292ZXJpbmcgaXQgbGF0ZXIgdGhyb3VnaCBiZWhhdmlvciB0aGF0IHF1aWV0bHkgc3RvcHBlZC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kOyBwdXQgdGVhcmRvd24gb24gYSBjb21wb25lbnQgaW5zdGVhZCwgd2hpY2ggdW5sb2FkcyB3aXRoIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5icm9hZGNhc3RVbmxvYWRlZCgpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVtb3ZlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgLy8gUm91dGVkIGJ5IG93bmVyc2hpcCByYXRoZXIgdGhhbiBieSB3aGljaCB0aWVyIGBhZGRDaGlsZGAgd291bGQgaGF2ZSBjaG9zZW4sIGJlY2F1c2UgdGhlIHR3byBkbyBub3RcbiAgICAvLyBhbHdheXMgYWdyZWU6IGEgdW5pdmVyc2FsIGNvbXBvbmVudCBpcyBwYXJlbnRlZCBkaXJlY3RseSBvbiB0aGUgdW5pdmVyc2FsIHdyYXBwZXIsIHlldCBhIHN1YmNsYXNzXG4gICAgLy8gcmVwbGFjaW5nIG9uZSBnb2VzIHRocm91Z2ggdGhlIHNhbWUgcHVibGljIGByZW1vdmVDaGlsZGAgYXMgaXQgd291bGQgZm9yIGl0cyBvd24gY2hpbGRyZW4uXG4gICAgcmV0dXJuIHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50Lmhhc0NoaWxkKGNvbXBvbmVudCkgPyB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChjb21wb25lbnQpIDogdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9ucyBtYXAgdXNlZCB0byBpbml0aWFsaXplIGkxOG4gZHVyaW5nIHtAbGluayBvbmxvYWR9LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBzdXBwbHkgcGx1Z2luLXNwZWNpZmljIHRyYW5zbGF0aW9ucy4gVGhlIGRlZmF1bHQgcmV0dXJucyB0aGUgYnVpbHQtaW5cbiAgICogYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgIHRyYW5zbGF0aW9ucy4gQSBsYW5ndWFnZSBtYXkgbWFwIHRvIGEgYExvY2FsZUxvYWRlcmAgaW5zdGVhZCBvZiBpdHMgdHJhbnNsYXRpb25zLCBzb1xuICAgKiBvbmx5IHRoZSBzaG93biBsYW5ndWFnZSBpcyBpbml0aWFsaXplZDsgc2VlIHtAbGluayBodHRwczovL21uYW91bW92LmRldi9vYnNpZGlhbi1saWIvZ3VpZGVzL3RyYW5zbGF0aW9ucy99LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRpb25zIG1hcC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2xhdGlvbnNNYXAoKTogVHJhbnNsYXRpb25zTWFwIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBob3cgbG9uZyBhIG5ldyBpbnN0YW5jZSB3YWl0cyBmb3IgdGhlIHByZXZpb3VzIGluc3RhbmNlJ3MgYXN5bmMgY2xlYW51cHMgYmVmb3JlIGxvYWRpbmcgYW55d2F5LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBjaGFuZ2UgaXQuIFRoZSBkZWZhdWx0IGlzIDEwIHNlY29uZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3luY0NsZWFudXBUaW1lb3V0SW5NaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gREVGQVVMVF9QTFVHSU5fQVNZTkNfQ0xFQU5VUF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgaWNvbiBzaG93biBvbiB0aGUgcGx1Z2luJ3MgcGFyZW50IGVudHJ5IGluIGBOb3RlYm9vayBOYXZpZ2F0b3JgJ3MgY29udGV4dCBtZW51cy5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gYnJhbmQgdGhhdCBlbnRyeTsgdGhlIGRlZmF1bHQgbGVhdmVzIGl0IHdpdGhvdXQgYW4gaWNvbi4gVGhlIGVudHJ5IGlzXG4gICAqIHRpdGxlZCB3aXRoIHRoZSBwbHVnaW4gbmFtZSBhbmQgaXMgYWRkZWQgYXV0b21hdGljYWxseSDigJQgc2VlXG4gICAqIHtAbGluayBOb3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudH0uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpY29uLCBvciBgJydgIGZvciBubyBpY29uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldE5vdGVib29rTmF2aWdhdG9yTWVudVN1Ym1lbnVJY29uKCk6IEljb25OYW1lIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIEFQSXMgdGhpcyBwbHVnaW4gZXhwb3NlcyB0byBvdGhlciBwbHVnaW5zLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBwdWJsaXNoIG9uZS4gVGhlIGRlZmF1bHQgcHVibGlzaGVzIG5vbmUuIENhbGxlZCBhZnRlciB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIGFcbiAgICogZGVjbGFyYXRpb24gbWF5IHJlZmVyZW5jZSBhbnl0aGluZyBpdCBjcmVhdGVkOyB0aGUgcmV0dXJuZWQgZGVjbGFyYXRpb25zIGFyZSBwdWJsaXNoZWQgdGhyb3VnaFxuICAgKiBgcHVibGlzaFBsdWdpbkFwaWAgYW5kIHJldm9rZWQgd2hlbiB0aGUgcGx1Z2luJ3MgZmVhdHVyZSBzdXJmYWNlIHVubG9hZHMuXG4gICAqXG4gICAqIFJldHVybmluZyBhIExJU1QgcmF0aGVyIHRoYW4gYSBzaW5nbGUgQVBJIGlzIGRlbGliZXJhdGU6IHRoZSByZWdpc3RyeSBzdXBwb3J0cyBzZXZlcmFsIGNvbnRyYWN0XG4gICAqIHZlcnNpb25zIHB1Ymxpc2hlZCBzaWRlIGJ5IHNpZGUsIHdoaWNoIGlzIGhvdyBhIHByb3ZpZGVyIHNoaXBzIGEgYnJlYWtpbmcgYDIuMC4wYCB3aXRob3V0IHN0cmFuZGluZ1xuICAgKiBjb25zdW1lcnMgc3RpbGwgcGlubmVkIHRvIGBeMWAuXG4gICAqXG4gICAqIEV2ZXJ5IGRlY2xhcmF0aW9uIGhlcmUgaXMgcHVibGlzaGVkIEJFRk9SRSB0aGUgYG9ic2lkaWFuLWxpYjpwbHVnaW4tbG9hZGVkYCBicm9hZGNhc3QsIHdoaWNoIGlzXG4gICAqIHdoYXQgbGV0cyBhIGxpc3RlbmVyIGNhbGwgdGhlc2UgQVBJcyB0aGUgbW9tZW50IGl0IGhlYXJzIHRoYXQgZXZlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBBUEkgZGVjbGFyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkFwaXMoKTogUGx1Z2luQXBpRGVjbGFyYXRpb25bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSBwbHVnaW5zIHRoaXMgb25lIHJlZnVzZXMsIG9yIHdhcm5zIGFib3V0LCBydW5uaW5nIGJlc2lkZS5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gZGVjbGFyZSBhbiBvdmVybGFwLiBUaGUgZGVmYXVsdCBkZWNsYXJlcyBub25lLlxuICAgKlxuICAgKiBBIGBCbG9ja2AgY29uZmxpY3QgaXMgdGhlIG1pcnJvciBpbWFnZSBvZiBhIGRlcGVuZGVuY3k6IHdoaWxlIGEgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYVxuICAgKiBjb25mbGljdGluZyB2ZXJzaW9uLCB7QGxpbmsgb25sb2FkSW1wbH0gZG9lcyBub3QgcnVuIGF0IGFsbCBhbmQgdGhlIHBsdWdpbiByZWdpc3RlcnMgbm90aGluZy4gRGVjbGFyZVxuICAgKiBpdCB3aGVuIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0IOKAlCB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gd2luXG4gICAqIHRoYXQgcmFjZSwgYmVjYXVzZSB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLCBzbyByZWZ1c2luZyBkZXRlcm1pbmlzdGljYWxseVxuICAgKiBiZWF0cyBjb21wZXRpbmcgdW5wcmVkaWN0YWJseS4gQSBgV2FybmAgY29uZmxpY3QgZGVjbGFyZXMgYW4gb3ZlcmxhcCB0aGF0IGlzIG1lcmVseSBhbm5veWluZywgc3VjaCBhcyBhXG4gICAqIGR1cGxpY2F0ZWQgY29tbWFuZDogYm90aCBwbHVnaW5zIGtlZXAgcnVubmluZyBhbmQgdGhlIHVzZXIgaXMgdG9sZC5cbiAgICpcbiAgICogVW5saWtlIGEgZGVwZW5kZW5jeSwgYSBjb25mbGljdGluZyBwbHVnaW4gbmVlZCBub3QgcHVibGlzaCBhbnl0aGluZyDigJQgaXQgaXMgZGV0ZWN0ZWQgYnkgcmVhZGluZyBpdHNcbiAgICogaW5zdGFsbGVkIHZlcnNpb24sIHdoaWNoIGlzIHRoZSBvbmx5IHRoaW5nIGFib3V0IGFub3RoZXIgcGx1Z2luIHRoYXQgcmVhZHMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiBsb2FkXG4gICAqIG9yZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVjbGFyZWQgY29uZmxpY3RzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkNvbmZsaWN0cygpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHBsdWdpbnMgdGhpcyBvbmUgY2Fubm90IHdvcmsgd2l0aG91dC5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gZGVjbGFyZSBhIG1hbmRhdG9yeSBkZXBlbmRlbmN5LiBUaGUgZGVmYXVsdCBkZWNsYXJlcyBub25lLCBhbmQgc3VjaCBhIHBsdWdpblxuICAgKiBsb2FkcyBleGFjdGx5IGFzIGl0IGFsd2F5cyBoYXMuXG4gICAqXG4gICAqIEEgZGVjbGFyZWQgZGVwZW5kZW5jeSBpcyBNQU5EQVRPUlksIHVubGlrZSB0aGUgb2ZmZXIgYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnRgIG1ha2VzOiB3aGlsZSBvbmUgaXNcbiAgICogbWlzc2luZywgZGlzYWJsZWQsIG9yIHRvbyBvbGQsIHtAbGluayBvbmxvYWRJbXBsfSBkb2VzIG5vdCBydW4gYXQgYWxsIGFuZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBub3RoaW5nXG4gICAqIOKAlCBubyBjb21tYW5kcywgbm8gaGFuZGxlcnMsIG5vIHBhdGNoZXMuIEl0IHN0YXlzIGVuYWJsZWQgaW4gT2JzaWRpYW4ncyBsaXN0IHJhdGhlciB0aGFuIGRpc2FibGluZ1xuICAgKiBpdHNlbGYsIGJlY2F1c2UgdGhlIGVuYWJsZWQgc2V0IGlzIHRoZSB1c2VyJ3MgdG8gY2hhbmdlLCBhbmQgaXQgZXhwbGFpbnMgaXRzZWxmIHRocm91Z2ggYSBub3RpY2UgYW5kIGFcbiAgICogc2V0dGluZ3MgYmFubmVyIHRoYXQgaW5zdGFsbHMgdGhlIG1pc3NpbmcgcGx1Z2luIGluIG9uZSBjbGljay4gVGhlIGxvYWQgY29tcGxldGVzIHRoZSBtb21lbnQgdGhlXG4gICAqIGRlcGVuZGVuY3kgYXJyaXZlcywgd2l0aCBubyByZXN0YXJ0LlxuICAgKlxuICAgKiBBIGRlcGVuZGVuY3kgbXVzdCBwdWJsaXNoIGFuIEFQSSB0aHJvdWdoIGBwdWJsaXNoUGx1Z2luQXBpYCwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdHMgcHJlc2VuY2UsXG4gICAqIGFic2VuY2UsIHZlcnNpb24gYW5kIGRlcGFydHVyZSBhbGwgb2JzZXJ2YWJsZSB0aHJvdWdoIG9uZSBtZWNoYW5pc20uIEEgcGx1Z2luIHdpdGggbm90aGluZyB0byBleHBvc2VcbiAgICogY2FuIHB1Ymxpc2ggYW4gZW1wdHkgQVBJIHB1cmVseSBzbyBpdCBjYW4gYmUgZGVwZW5kZWQgdXBvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlY2xhcmVkIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRQbHVnaW5EZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGR1cmluZyB7QGxpbmsgb25sb2FkfSB0byB3aXJlIHBsdWdpbi1zcGVjaWZpYyBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBhZGQgY2hpbGQgY29tcG9uZW50cyB2aWEge0BsaW5rIGFkZENoaWxkfS4gVGhlIHVuaXZlcnNhbCBjb21wb25lbnRzIGFyZVxuICAgKiBhdmFpbGFibGUgaGVyZS4gQ2hpbGRyZW4gYXJlIGxvYWRlZCBzZXF1ZW50aWFsbHkgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGFkZGVkIChjaGlsZHJlbi1maXJzdCkuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc3ViY2xhc3MgbG9hZCBsb2dpYyBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBvbmxvYWRJbXBsKCk6IFByb21pc2FibGU8dm9pZD4ge1xuICAgIHJldHVybiBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYW4gYXN5bmMgY2xlYW51cCB0aGF0IHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luIGF3YWl0cyBiZWZvcmUgaXQgc3RhcnRzLlxuICAgKlxuICAgKiBVc2UgaXQgZm9yIHRlYXJkb3duIHRoYXQgY2Fubm90IGZpbmlzaCBzeW5jaHJvbm91c2x5IGFuZCBtdXN0IGZpbmlzaCBiZWZvcmUgdGhlIHJlc291cmNlIGlzIG9wZW5lZCBhZ2Fpbiwgc3VjaFxuICAgKiBhcyBjbG9zaW5nIGFuIEluZGV4ZWREQiBjb25uZWN0aW9uLiBPYnNpZGlhbidzIGBvbnVubG9hZGAgaXMgc3luY2hyb25vdXMgYW5kIGF3YWl0cyBub3RoaW5nLCBzbyB3aXRob3V0IHRoaXMgYVxuICAgKiByZWxvYWQgc3RhcnRzIHRoZSBuZXcgaW5zdGFuY2Ugd2hpbGUgdGhlIG9sZCBvbmUgc3RpbGwgaG9sZHMgdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBTY29wZWQgbGlrZSB7QGxpbmsgYWRkQ2hpbGR9OiB0aGUgY2xlYW51cCBzdGFydHMgd2hlbiB0aGUgcGx1Z2luJ3MgZmVhdHVyZSBzdXJmYWNlIHVubG9hZHMsIHdoaWNoIGlzIG9uIHBsdWdpblxuICAgKiB1bmxvYWQgYW5kIHdoZW5ldmVyIHRoZSBnYXRlIGNsb3Nlcy4gVGhlIG5leHQgbG9hZCBvZiB0aGUgcGx1Z2luLCBhbmQgdGhlIG5leHQgb3BlbmluZyBvZiB0aGUgZ2F0ZSwgYXdhaXQgaXQsXG4gICAqIGJvdW5kZWQgYnkge0BsaW5rIGdldEFzeW5jQ2xlYW51cFRpbWVvdXRJbk1pbGxpc2Vjb25kc30uIEEgY2xlYW51cCB0aGF0IHRocm93cyBpcyBwcmludGVkLCBuZXZlciByZXRocm93bi5cbiAgICpcbiAgICogQHBhcmFtIGNsZWFudXAgLSBUaGUgY2xlYW51cCB0byBydW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJBc3luY0NsZWFudXAoY2xlYW51cDogKCkgPT4gUHJvbWlzYWJsZTx2b2lkPik6IHZvaWQge1xuICAgIHJlZ2lzdGVyUGx1Z2luQXN5bmNDbGVhbnVwKHtcbiAgICAgIGNsZWFudXAsXG4gICAgICBjb21wb25lbnQ6IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LFxuICAgICAgcGx1Z2luSWQ6IHRoaXMubWFuaWZlc3QuaWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYSB1bml2ZXJzYWwgY29tcG9uZW50LCB1bmxvYWRpbmcgd2hpY2hldmVyIGNvbXBvbmVudCB0aGUga2V5IGhlbGQgYmVmb3JlLlxuICAgKlxuICAgKiBLZXllZCBieSBuYW1lIHJhdGhlciB0aGFuIGhhbmRlZCB0aGUgcHJldmlvdXMgdmFsdWUgYmVjYXVzZSBga2V5b2YgdGhpc2AgZXhjbHVkZXMgcHJpdmF0ZVxuICAgKiBtZW1iZXJzLCBzbyB0aGUgY29tcG9uZW50cyBsaXZlIGluIGEgc2luZ2xlIHtAbGluayBQbHVnaW5CYXNlQ29tcG9uZW50c30gYmFnIHdob3NlIGtleXMgQVJFXG4gICAqIGluZGV4YWJsZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUS2V5IC0gVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGtleSBvZiB0aGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tcG9uZW50IHRvIHN0b3JlLlxuICAgKi9cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhlIHVuaXZlcnNhbCB0aWVyLCB3aGljaCBvdXRsaXZlcyBhbnkgZGVwZW5kZW5jeS5cbiAgICpcbiAgICogUHJpdmF0ZSBvbiBwdXJwb3NlOiBvbmx5IHRoaXMgY2xhc3MgZGVjaWRlcyB3aGF0IGlzIHVuaXZlcnNhbC4gQSBzdWJjbGFzcyBhZGRpbmcgb25lIG9mIGl0cyBvd24gZ29lc1xuICAgKiB0aHJvdWdoIHtAbGluayBhZGRDaGlsZH0gYW5kIGxhbmRzIGluIHRoZSBnYXRlZCB0aWVyLCB3aGVyZSBpdCBiZWxvbmdzLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRDb21wb25lbnQgLSBUaGUgdHlwZSBvZiBjb21wb25lbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0gY29tcG9uZW50IC0gVGhlIGNvbXBvbmVudCBpbnN0YW5jZSB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoZSBhZGRlZCBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGFkZFVuaXZlcnNhbENoaWxkPFRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQ+KGNvbXBvbmVudDogVENvbXBvbmVudCk6IFRDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgb24gYGFwcC53b3Jrc3BhY2VgIHRoYXQgdGhpcyBwbHVnaW4gaXMgbG9hZGVkIGFuZCBpdHMgQVBJcyBhcmUgY2FsbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGJyb2FkY2FzdExvYWRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZCA9IHtcbiAgICAgIGFwaVZlcnNpb25zOiB0aGlzLmdldFBsdWdpbkFwaXMoKS5tYXAoKGRlY2xhcmF0aW9uKSA9PiBkZWNsYXJhdGlvbi5hcGlWZXJzaW9uKSxcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5JZHM6IHRoaXMuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzKCkubWFwKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LnBsdWdpbklkKSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lLFxuICAgICAgcGx1Z2luVmVyc2lvbjogdGhpcy5tYW5pZmVzdC52ZXJzaW9uXG4gICAgfTtcblxuICAgIHRyaWdnZXJQbHVnaW5MaWZlY3ljbGVFdmVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgbmFtZTogUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICAgICAgcGF5bG9hZDogdGhpcy5saWZlY3ljbGVFdmVudFBheWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbm5vdW5jZXMgb24gYGFwcC53b3Jrc3BhY2VgIHRoYXQgdGhpcyBwbHVnaW4ncyBzdXJmYWNlIGhhcyBnb25lIGF3YXkuXG4gICAqXG4gICAqIFNpbGVudCB1bmxlc3MgYSBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCBzbyB0aGUgdHdvIGV2ZW50cyBzdGF5IHBhaXJlZDogYSBwbHVnaW4gdGhhdCBuZXZlclxuICAgKiBnb3QgcGFzdCBpdHMgZGVwZW5kZW5jeSBnYXRlIG5ldmVyIGFubm91bmNlZCBpdHNlbGYsIGFuZCBtdXN0IG5vdCBhbm5vdW5jZSBhIGRlcGFydHVyZSBlaXRoZXIuXG4gICAqL1xuICBwcml2YXRlIGJyb2FkY2FzdFVubG9hZGVkKCk6IHZvaWQge1xuICAgIGNvbnN0IHBheWxvYWQgPSB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZDtcbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxpZmVjeWNsZUV2ZW50UGF5bG9hZCA9IG51bGw7XG4gICAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50KHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBuYW1lOiBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgICAgIHBheWxvYWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW5kIGxvYWRzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSwgdGhlbiBwdWJsaXNoZXMgaXRzIEFQSXMgYW5kIGFubm91bmNlcyBpdHNlbGYuXG4gICAqXG4gICAqIE5PVCBpZGVtcG90ZW50LCBkZWxpYmVyYXRlbHkuIGBQbHVnaW5HYXRlQ29tcG9uZW50YCBvd25zIHRoZSB1cC9kb3duIHN0YXRlIG1hY2hpbmUgYW5kIGNhbGxzXG4gICAqIHRoaXMgb25seSBvbiBhIHJlYWwgdHJhbnNpdGlvbjsgYSBzZWNvbmQgZ3VhcmQgaGVyZSB3b3VsZCBiZSBhIHNlY29uZCBjb3B5IG9mIHRoYXQgc3RhdGUsIHdoaWNoIGlzIHRoZVxuICAgKiBraW5kIG9mIGR1cGxpY2F0ZSB0aGF0IGRyaWZ0cy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZCBhbmQgdGhlIGJyb2FkY2FzdCBoYXMgYmVlbiBtYWRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRmVhdHVyZVN1cmZhY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTG9hZGVkIGV4cGxpY2l0bHkgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgdW5pdmVyc2FsIHdyYXBwZXIgaXM6IGBhZGRDaGlsZGAgbG9hZHMgYSBjaGlsZCBvbmx5IG9uY2VcbiAgICAvLyBpdHMgcGFyZW50IGlzIGxvYWRlZCwgYW5kIHRoZSBzdXJmYWNlIGhhcyB0byBiZSBsaXZlIGJlZm9yZSBgb25sb2FkSW1wbGAgc3RhcnRzIGFkZGluZyB0byBpdC5cbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcbiAgICB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoZ2F0ZWRXcmFwcGVyQ29tcG9uZW50KTtcbiAgICBnYXRlZFdyYXBwZXJDb21wb25lbnQubG9hZCgpO1xuXG4gICAgLy8gQSBzdXJmYWNlIHJlb3BlbmVkIGFmdGVyIHRoZSBnYXRlIGNsb3NlZCB3YWl0cyBmb3IgdGhlIGNsZWFudXBzIHRoZSBwcmV2aW91cyBzdXJmYWNlIHN0YXJ0ZWQuIE9ubHkgd2hlbiBzb21lXG4gICAgLy8gYXJlIHBlbmRpbmcsIHNvIGEgZmlyc3QgbG9hZCwgd2hlcmUgYG9ubG9hZGAgYWxyZWFkeSB3YWl0ZWQsIHN0aWxsIHJ1bnMgYG9ubG9hZEltcGxgIHN5bmNocm9ub3VzbHkuXG4gICAgaWYgKGhhc1BlbmRpbmdQbHVnaW5Bc3luY0NsZWFudXBzKHRoaXMubWFuaWZlc3QuaWQpKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JQcmV2aW91c0FzeW5jQ2xlYW51cHMoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9ubG9hZEltcGwoKTtcbiAgICBhd2FpdCBnYXRlZFdyYXBwZXJDb21wb25lbnQubG9hZFdpdGhQcm9taXNlcygpO1xuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0aGlzLmdldFBsdWdpbkFwaXMoKSkge1xuICAgICAgcHVibGlzaFBsdWdpbkFwaSh7XG4gICAgICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgICAgICAvLyBSZXZva2VkIHdpdGggdGhlIFNVUkZBQ0UsIG5vdCB3aXRoIHRoZSBwbHVnaW46IGEgcGx1Z2luIHdob3NlIGRlcGVuZGVuY3kgZ29lcyBhd2F5IGtlZXBzIHJ1bm5pbmdcbiAgICAgICAgLy8gaXRzIHVuaXZlcnNhbCBjb21wb25lbnRzLCBhbmQgYSBjb25zdW1lciBtdXN0IG5vdCBiZSBsZWZ0IGhvbGRpbmcgYSBoYW5kbGUgaW50byB0aGUgaGFsZiBvZiBpdFxuICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IHRvcm4gZG93bi5cbiAgICAgICAgY29tcG9uZW50OiBnYXRlZFdyYXBwZXJDb21wb25lbnQsXG4gICAgICAgIHBsdWdpbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5icm9hZGNhc3RMb2FkZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50PFRLZXkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5CYXNlQ29tcG9uZW50cz4oa2V5OiBUS2V5LCB2YWx1ZTogTm9uTnVsbGFibGU8UGx1Z2luQmFzZUNvbXBvbmVudHNbVEtleV0+KTogdm9pZCB7XG4gICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2tleV07XG4gICAgaWYgKG9sZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChvbGRDb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSBkb3duLCBsZWF2aW5nIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBydW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmxvYWRGZWF0dXJlU3VyZmFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcblxuICAgIC8vIFJlcGxhY2VkIEJFRk9SRSB0aGUgb2xkIG9uZSBpcyB1bmxvYWRlZCwgc28gYW55dGhpbmcgdGhhdCByZXN1bWVzIG1pZC10ZWFyZG93biBhbmQgY2FsbHMgYGFkZENoaWxkYFxuICAgIC8vIHBhcmtzIGl0cyBjaGlsZCBvbiB0aGUgZnJlc2ggc3VyZmFjZSByYXRoZXIgdGhhbiBvbiB0aGUgb25lIGJlaW5nIHRvcm4gZG93biDigJQgd2hlcmUgYENvbXBvbmVudEV4YFxuICAgIC8vIHdvdWxkIHJlZnVzZSBpdCBvdXRyaWdodCwgc2luY2UgaXQgcmVmdXNlcyBjaGlsZHJlbiBhZGRlZCB0byBhbiBhbHJlYWR5LXVubG9hZGVkIGNvbXBvbmVudC5cbiAgICB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChnYXRlZFdyYXBwZXJDb21wb25lbnQpO1xuXG4gICAgdGhpcy5icm9hZGNhc3RVbmxvYWRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yUHJldmlvdXNBc3luY0NsZWFudXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHRoaXMuZ2V0QXN5bmNDbGVhbnVwVGltZW91dEluTWlsbGlzZWNvbmRzKCk7XG4gICAgaWYgKGF3YWl0IGRpZFBsdWdpbkFzeW5jQ2xlYW51cHNTZXR0bGUoeyBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCwgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS53YXJuKGBQbHVnaW4gJHt0aGlzLm1hbmlmZXN0LmlkfTogdGhlIHByZXZpb3VzIGluc3RhbmNlJ3MgYXN5bmMgY2xlYW51cHMgZGlkIG5vdCBmaW5pc2ggaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX0gbXM7IGxvYWRpbmcgYW55d2F5LmApO1xuICB9XG59XG5cbi8qKlxuICogUmVsb2FkcyB0aGUgc3BlY2lmaWVkIHBsdWdpbiBieSBkaXNhYmxpbmcgYW5kIHRoZW4gcmUtZW5hYmxpbmcgaXQuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVsb2FkLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgcmVsb2FkZWQuXG4gKiBAdGhyb3dzIHtAbGluayBQbHVnaW5FbmFibGVSZWZ1c2VkRXJyb3J9IElmIE9ic2lkaWFuIHJlZnVzZWQgdG8gZW5hYmxlIHRoZSBwbHVnaW4gYWdhaW4sIHdoaWNoIGxlYXZlcyBpdFxuICogZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWRQbHVnaW4ocGx1Z2luOiBQbHVnaW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2lucyA9IHBsdWdpbi5hcHAucGx1Z2lucztcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG4gIGF3YWl0IHBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW5JZCk7XG4gIGlmICghYXdhaXQgcGx1Z2lucy5lbmFibGVQbHVnaW4ocGx1Z2luSWQpKSB7XG4gICAgdGhyb3cgbmV3IFBsdWdpbkVuYWJsZVJlZnVzZWRFcnJvcihwbHVnaW5JZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIGFzIGEgbm90aWNlLCBsb2dzIGl0IHRvIHRoZSBjb25zb2xlLCBhbmQgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gZGlzYWJsZS5cbiAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSBhbmQgbG9nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBwbHVnaW4gaXMgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93RXJyb3JBbmREaXNhYmxlUGx1Z2luKHBsdWdpbjogUGx1Z2luLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgYXBwOiBwbHVnaW4uYXBwLFxuICAgIHBsdWdpbk5hbWU6IHBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gIH0pO1xuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShtZXNzYWdlKTtcbiAgcHJpbnRFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpO1xuICBhd2FpdCBwbHVnaW4uYXBwLnBsdWdpbnMuZGlzYWJsZVBsdWdpbihwbHVnaW4ubWFuaWZlc3QuaWQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBLDBCQUFpQztBQUNqQyxtQkFBMkI7QUFDM0Isc0JBQTBCO0FBQzFCLHlCQUFrQztBQUNsQyxzQkFBdUI7QUFjdkIsa0NBQXNDO0FBQ3RDLHVDQUF3QztBQUN4QyxnREFBK0M7QUFDL0MsK0JBQXVDO0FBQ3ZDLCtCQUF5QztBQUN6QyxvQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDBCQUE0QjtBQUM1QixxQ0FBc0M7QUFDdEMsNENBQTRDO0FBQzVDLCtEQUE2RDtBQUM3RCxzQ0FBdUM7QUFDdkMsbUNBQW9DO0FBQ3BDLHFDQUFzQztBQUN0Qyx1Q0FBNEM7QUFDNUMsMEJBQWtDO0FBQ2xDLGtCQUF5QjtBQUN6Qiw4QkFBdUM7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
835
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHVzaW5nIGEgY29tcG9uZW50LWJhc2VkIGFyY2hpdGVjdHVyZS5cbiAqXG4gKiBQbHVnaW5CYXNlIHJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyAoY29udGV4dCwgaTE4biwgZXJyb3IgaGFuZGxpbmcsIGFib3J0IHNpZ25hbCwgbGlmZWN5Y2xlIGV2ZW50cywgZGVidWcpLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50LFxuICBJY29uTmFtZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQge1xuICBwcmludEVycm9yLFxuICBTaWxlbnRFcnJvclxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBEZWNsYXJlZFBsdWdpbkRlcGVuZGVuY3ksXG4gIFBsdWdpbkNvbmZsaWN0XG59IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLWdhdGUtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25zTWFwIH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpRGVjbGFyYXRpb24gfSBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5FdmVudE1hcCxcbiAgUGx1Z2luRXZlbnRTb3VyY2Vcbn0gZnJvbSAnLi9wbHVnaW4tZXZlbnQtc291cmNlLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkIH0gZnJvbSAnLi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5cbmltcG9ydCB7IEFwcEFjdGl2ZUZpbGVQcm92aWRlciB9IGZyb20gJy4uL2FjdGl2ZS1maWxlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tbWFuZC1oYW5kbGVycy9jb21tYW5kLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFVubG9ja0FjdGl2ZU5vdGVDb21tYW5kSGFuZGxlciB9IGZyb20gJy4uL2NvbW1hbmQtaGFuZGxlcnMvdW5sb2NrLWFjdGl2ZS1ub3RlLWNvbW1hbmQtaGFuZGxlci50cyc7XG5pbXBvcnQgeyBQbHVnaW5Db21tYW5kUmVnaXN0cmFyIH0gZnJvbSAnLi4vY29tbWFuZC1yZWdpc3RyYXIudHMnO1xuaW1wb3J0IHsgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yIH0gZnJvbSAnLi4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgQWJvcnRTaWduYWxDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2Fib3J0LXNpZ25hbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FzeW5jLWVycm9yLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ29uc29sZURlYnVnQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9jb25zb2xlLWRlYnVnLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBOb3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5Db250ZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tY29udGV4dC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGx1Z2luR2F0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLWdhdGUtY29tcG9uZW50LnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgUGx1Z2luTm90aWNlTW9kZVxufSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQbHVnaW5EYXRhSGFuZGxlciB9IGZyb20gJy4uL2RhdGEtaGFuZGxlci50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHtcbiAgaW5pdEkxOE4sXG4gIHRcbn0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGRlZmF1bHRUcmFuc2xhdGlvbnNNYXAgfSBmcm9tICcuLi9pMThuL2xvY2FsZXMvdHJhbnNsYXRpb25zLW1hcC50cyc7XG5pbXBvcnQgeyBSZXNvdXJjZUxvY2tDb21wb25lbnQgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IHB1Ymxpc2hQbHVnaW5BcGkgfSBmcm9tICcuL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9QTFVHSU5fQVNZTkNfQ0xFQU5VUF9OT1RJQ0VfREVMQVlfSU5fTUlMTElTRUNPTkRTLFxuICBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICBkaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlLFxuICBoYXNQZW5kaW5nUGx1Z2luQXN5bmNDbGVhbnVwcyxcbiAgcmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXBcbn0gZnJvbSAnLi9wbHVnaW4tYXN5bmMtY2xlYW51cC50cyc7XG5pbXBvcnQgeyBQbHVnaW5FdmVudFNvdXJjZUltcGwgfSBmcm9tICcuL3BsdWdpbi1ldmVudC1zb3VyY2UudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRSxcbiAgdHJpZ2dlclBsdWdpbkxpZmVjeWNsZUV2ZW50XG59IGZyb20gJy4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuXG4vKipcbiAqIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBvd25lZCBieSB7QGxpbmsgUGx1Z2luQmFzZX0sIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhY2Nlc3NvciBleHBvc2luZ1xuICogZWFjaCBvbmUuIEV2ZXJ5IG1lbWJlciBpcyBvcHRpb25hbCBiZWNhdXNlIGEgY29tcG9uZW50IG9ubHkgZXhpc3RzIG9uY2Uge0BsaW5rIFBsdWdpbkJhc2Uub25sb2FkfVxuICogaGFzIGNyZWF0ZWQgaXQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5CYXNlQ29tcG9uZW50cyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50PzogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50PzogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50PzogQ29tbWFuZEhhbmRsZXJDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudD86IENvbnNvbGVEZWJ1Z0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgcGx1Z2luQ29udGV4dENvbXBvbmVudD86IFBsdWdpbkNvbnRleHRDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHBsdWdpbkdhdGVDb21wb25lbnQ/OiBQbHVnaW5HYXRlQ29tcG9uZW50O1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50PzogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD47XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudD86IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjcmVhdGluZyBPYnNpZGlhbiBwbHVnaW5zIHdpdGggYSBjb21wb25lbnQtYmFzZWQgYXJjaGl0ZWN0dXJlLlxuICpcbiAqIFJlZ2lzdGVycyB1bml2ZXJzYWwgY29tcG9uZW50cyBhdXRvbWF0aWNhbGx5LiBTdWJjbGFzc2VzIGFkZCBvciByZXBsYWNlIGNvbXBvbmVudHNcbiAqIHZpYSB7QGxpbmsgcmVtb3ZlQ2hpbGR9IC8ge0BsaW5rIGFkZENoaWxkfS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2UgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpbkV2ZW50TWFwPigpKFBsdWdpbikgaW1wbGVtZW50cyBQbHVnaW5FdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBHZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KCk6IEFib3J0U2lnbmFsQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmFib3J0U2lnbmFsQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFib3J0IHNpZ25hbCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGFib3J0U2lnbmFsQ29tcG9uZW50KHZhbHVlOiBBYm9ydFNpZ25hbENvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdhYm9ydFNpZ25hbENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBhc3luYyBlcnJvciBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQoKTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMuYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYXN5bmMgZXJyb3IgaGFuZGxlciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEFzeW5jIGVycm9yIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBhc3luY0Vycm9ySGFuZGxlckNvbXBvbmVudCh2YWx1ZTogQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgnYXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc2hhcmVkIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuIFJlZ2lzdGVyIGEgcGx1Z2luJ3MgY29tbWFuZHMgb24gaXQgdmlhXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudC5yZWdpc3RlckNvbW1hbmRIYW5kbGVyc30gcmF0aGVyIHRoYW4gY29uc3RydWN0aW5nIHlvdXIgb3duXG4gICAqIHtAbGluayBDb21tYW5kSGFuZGxlckNvbXBvbmVudH0g4oCUIHRoZSBhcHAtYmFja2VkIGFjdGl2ZS1maWxlIHByb3ZpZGVyLCBjb21tYW5kIHJlZ2lzdHJhciwgbWVudVxuICAgKiBldmVudCByZWdpc3RyYXIsIGFuZCBwbHVnaW4gbmFtZSBhcmUgYWxyZWFkeSB3aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbW1hbmQgaGFuZGxlciBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KCk6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjb21tYW5kIGhhbmRsZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY29tbWFuZCBoYW5kbGVyIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgY29tbWFuZEhhbmRsZXJDb21wb25lbnQodmFsdWU6IENvbW1hbmRIYW5kbGVyQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbW1hbmRIYW5kbGVyQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgY29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIGNvbnNvbGUgZGVidWcgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBjb25zb2xlRGVidWdDb21wb25lbnQoKTogQ29uc29sZURlYnVnQ29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjb25zb2xlIGRlYnVnIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29uc29sZSBkZWJ1ZyBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IGNvbnNvbGVEZWJ1Z0NvbXBvbmVudCh2YWx1ZTogQ29uc29sZURlYnVnQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ2NvbnNvbGVEZWJ1Z0NvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudCAocGx1Z2luIElELCBkZWJ1ZyBjb250cm9sbGVyLCBsaWJyYXJ5IHN0eWxlcykuXG4gICAqXG4gICAqIEByZXR1cm5zIHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luQ29udGV4dENvbXBvbmVudCgpOiBQbHVnaW5Db250ZXh0Q29tcG9uZW50IHtcbiAgICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5jb21wb25lbnRzLnBsdWdpbkNvbnRleHRDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIGNvbnRleHQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gY29udGV4dCBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0IHBsdWdpbkNvbnRleHRDb21wb25lbnQodmFsdWU6IFBsdWdpbkNvbnRleHRDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luQ29udGV4dENvbXBvbmVudCcsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBnYXRlIGhvbGRpbmcgdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSB1cCBvciBkb3duLlxuICAgKlxuICAgKiBSZWFjaCBmb3IgaXQgZnJvbSBhIHNldHRpbmdzIHRhYiB0byByZW5kZXIgdGhlIG92ZXJsYXAgYmFubmVyIGZvciBhXG4gICAqIHtAbGluayBjb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudCFQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm59IGNvbmZsaWN0IOKAlCB0aGUgb25lXG4gICAqIGJhbm5lciB0aGUgbGlicmFyeSBjYW5ub3QgcGxhY2UgaXRzZWxmLCBiZWNhdXNlIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzIGl0cyBvd24gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBSZWFkYWJsZSB0aHJvdWdob3V0IHtAbGluayBvbmxvYWRJbXBsfSwgaW5jbHVkaW5nIGl0cyBzeW5jaHJvbm91cyBwcmVmaXgsIHdoaWNoIGlzIHdoZXJlIGEgc2V0dGluZ3NcbiAgICogdGFiIGlzIGJ1aWx0LiBUaGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gaW5jaWRlbnRhbDogYWRkaW5nIHRoZSBnYXRlIGlzIHdoYXQgcnVuc1xuICAgKiB7QGxpbmsgb25sb2FkSW1wbH0sIHNvIHtAbGluayBvbmxvYWR9IGFzc2lnbnMgdGhpcyBmaWVsZCBiZWZvcmUgYWRkaW5nIGl0LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBwbHVnaW5HYXRlQ29tcG9uZW50KCk6IFBsdWdpbkdhdGVDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luR2F0ZUNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgcGx1Z2luIGdhdGUgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBwbHVnaW5HYXRlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5HYXRlQ29tcG9uZW50KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpbkdhdGVDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHBsdWdpbk5vdGljZUNvbXBvbmVudCgpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luTm90aWNlQ29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBQbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luTm90aWNlQ29tcG9uZW50KHZhbHVlOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLnNldENvbXBvbmVudCgncGx1Z2luTm90aWNlQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHJldHVybnMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQoKTogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4ge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmNvbXBvbmVudHMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gUGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBzZXQgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQodmFsdWU6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxvYmplY3Q+KSB7XG4gICAgdGhpcy5zZXRDb21wb25lbnQoJ3BsdWdpblNldHRpbmdzQ29tcG9uZW50JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudCwgdXNlZCB0byBsb2NrIG5vdGVzIHJlYWQtb25seSBkdXJpbmcgbG9uZyBvcGVyYXRpb25zLiBPd25lZCBieVxuICAgKiB0aGUgcGx1Z2luLCBzbyBpdHMgbG9ja3MgYXJlIHJlbGVhc2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgcmVzb3VyY2VMb2NrQ29tcG9uZW50KCk6IFJlc291cmNlTG9ja0NvbXBvbmVudCB7XG4gICAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKHRoaXMuY29tcG9uZW50cy5yZXNvdXJjZUxvY2tDb21wb25lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGVkaXRvciBsb2NrIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gRWRpdG9yIGxvY2sgY29tcG9uZW50LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCByZXNvdXJjZUxvY2tDb21wb25lbnQodmFsdWU6IFJlc291cmNlTG9ja0NvbXBvbmVudCkge1xuICAgIHRoaXMuc2V0Q29tcG9uZW50KCdyZXNvdXJjZUxvY2tDb21wb25lbnQnLCB2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudHM6IFBsdWdpbkJhc2VDb21wb25lbnRzID0ge307XG5cbiAgLy8gRXZlcnl0aGluZyB0aGUgU1VCQ0xBU1Mgb3duczogd2hhdCBgb25sb2FkSW1wbGAgYWRkcywgYW5kIHdoYXQgaXQgYWRkcyBsYXRlci5cbiAgLy9cbiAgLy8gQSBzZWNvbmQgd3JhcHBlciByYXRoZXIgdGhhbiBvbmUsIGJlY2F1c2UgdGhlIHR3byB0aWVycyBoYXZlIG9wcG9zaXRlIGxpZmV0aW1lcy4gVGhlIHVuaXZlcnNhbFxuICAvLyBjb21wb25lbnRzIGhhdmUgdG8gT1VUTElWRSBhIGxvc3QgZGVwZW5kZW5jeSDigJQgdGhleSBhcmUgd2hhdCBzaG93cyB0aGUgbm90aWNlIG5hbWluZyB0aGUgcGx1Z2luIHRoYXRcbiAgLy8gd2VudCBhd2F5IGFuZCByZW5kZXJzIHRoZSBidXR0b24gdGhhdCBicmluZ3MgaXQgYmFjayDigJQgd2hpbGUgdGhlIHN1YmNsYXNzJ3Mgc3VyZmFjZSBpcyBleGFjdGx5IHdoYXRcbiAgLy8gbXVzdCBzdG9wIHJ1bm5pbmcuIFVubG9hZGluZyBvbmUgd3JhcHBlciBob2xkaW5nIGJvdGggd291bGQgc2lsZW5jZSB0aGUgcGx1Z2luIGF0IHRoZSBtb21lbnQgaXQgbW9zdFxuICAvLyBuZWVkcyB0byBzcGVhay5cbiAgLy9cbiAgLy8gQWx3YXlzIHByZXNlbnQsIG5ldmVyIG51bGwsIGFuZCBSRVBMQUNFRCByYXRoZXIgdGhhbiBlbXB0aWVkIHdoZW4gdGhlIHN1cmZhY2UgaXMgdG9ybiBkb3duLiBUaGF0IGtlZXBzXG4gIC8vIGBhZGRDaGlsZGAgY2FsbGFibGUgYXQgZXZlcnkgcG9pbnQgaW4gdGhlIHBsdWdpbidzIGxpZmUsIGV4YWN0bHkgYXMgaXQgd2FzIGJlZm9yZSB0aGUgdGllcnMgZXhpc3RlZDpcbiAgLy8gQSBjaGlsZCBhZGRlZCBiZWZvcmUgdGhlIGdhdGUgb3BlbnMgaXMgcXVldWVkIGFuZCBsb2FkZWQgd2hlbiBpdCBkb2VzLCB3aGljaCBpcyB3aGF0IGBDb21wb25lbnRFeGBcbiAgLy8gYWxyZWFkeSBkb2VzIGZvciBhbnkgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gIHByaXZhdGUgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gbmV3IENvbXBvbmVudEV4KCk7XG5cbiAgLy8gV2hldGhlciBhIGZlYXR1cmUgc3VyZmFjZSBvZiB0aGlzIGluc3RhbmNlIGhhcyBldmVyIGJlZW4gdG9ybiBkb3duLiBVbnRpbCBvbmUgaGFzLCBldmVyeSBjbGVhbnVwIHN0aWxsIHBlbmRpbmdcbiAgLy8gdW5kZXIgdGhpcyBwbHVnaW4gaWQgYmVsb25ncyB0byB0aGUgUFJFVklPVVMgaW5zdGFuY2UsIHdoaWNoIGBvbmxvYWRgIGhhcyBhbHJlYWR5IHdhaXRlZCBmb3IsIHNvIHRoZSBmaXJzdCBzdXJmYWNlXG4gIC8vIGxvYWQgbXVzdCBub3Qgd2FpdCBmb3IgaXQgYSBzZWNvbmQgdGltZS4gQWZ0ZXIgYSB0aW1lb3V0IGl0IGlzIHN0aWxsIHBlbmRpbmcsIGFuZCBhIHNlY29uZCB3YWl0IGRvdWJsZWQgdGhlXG4gIC8vIHRpbWVvdXQgYW5kIHNob3dlZCBpdHMgbm90aWNlcyB0d2ljZS5cbiAgcHJpdmF0ZSBoYXNVbmxvYWRlZEZlYXR1cmVTdXJmYWNlID0gZmFsc2U7XG5cbiAgLy8gVGhlIHBheWxvYWQgYnJvYWRjYXN0IHdoZW4gdGhpcyBwbHVnaW4gZmluaXNoZWQgbG9hZGluZywga2VwdCBzbyB0aGUgbWF0Y2hpbmcgdW5sb2FkZWQgYnJvYWRjYXN0XG4gIC8vIGRlc2NyaWJlcyB0aGUgc2FtZSBwbHVnaW4gd2l0aG91dCByZS1kZXJpdmluZyBpdCBmcm9tIGEgc3VyZmFjZSB0aGF0IGhhcyBzaW5jZSBiZWVuIHRvcm4gZG93bi4gTnVsbFxuICAvLyB3aGVuZXZlciBubyBsb2FkZWQgYnJvYWRjYXN0IGlzIG91dHN0YW5kaW5nLCB3aGljaCBpcyB3aGF0IGtlZXBzIHRoZSB0d28gZXZlbnRzIHBhaXJlZC5cbiAgcHJpdmF0ZSBsaWZlY3ljbGVFdmVudFBheWxvYWQ6IG51bGwgfCBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQgPSBudWxsO1xuXG4gIC8vIFRoZSBsaWJyYXJ5J3Mgb3duIGNvbXBvbmVudHMsIHdoaWNoIG91dGxpdmUgYW55IGRlcGVuZGVuY3kuXG4gIHByaXZhdGUgcmVhZG9ubHkgdW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgKlxuICAgKiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIGludGVybmFsIHdyYXBwZXIgaG9sZGluZyB0aGUgc3ViY2xhc3MncyBvd24gc3VyZmFjZSwgd2hpY2gge0BsaW5rIG9ubG9hZH1cbiAgICogY3JlYXRlcyBhbmQgbG9hZHMgYmVmb3JlIGNhbGxpbmcge0BsaW5rIG9ubG9hZEltcGx9LiBTbyBhIGNoaWxkIGFkZGVkIGR1cmluZyB7QGxpbmsgb25sb2FkSW1wbH0gaXNcbiAgICogbG9hZGVkIGltbWVkaWF0ZWx5LCBjaGlsZHJlbi1maXJzdCwgYW5kIGlzIHVzYWJsZSBieSB0aGUgdGltZSB0aGlzIG1ldGhvZCByZXR1cm5zLlxuICAgKlxuICAgKiBUaGF0IHdyYXBwZXIgaXMgdG9ybiBkb3duIGFuZCByZWJ1aWx0IHdoZW5ldmVyIHRoZSBnYXRlIGNsb3NlcyBhbmQgb3BlbnMgYWdhaW4g4oCUIGEgZGVwZW5kZW5jeSBkZWNsYXJlZFxuICAgKiBieSB7QGxpbmsgZ2V0UGx1Z2luRGVwZW5kZW5jaWVzfSBnb2luZyBhd2F5IGFuZCBjb21pbmcgYmFjaywgb3IgYSBjb25mbGljdCBkZWNsYXJlZCBieVxuICAgKiB7QGxpbmsgZ2V0UGx1Z2luQ29uZmxpY3RzfSBhcHBlYXJpbmcgYW5kIGJlaW5nIHJlc29sdmVkIOKAlCBzbyBhIGNoaWxkIGFkZGVkIGhlcmUgbGl2ZXMgZXhhY3RseSBhcyBsb25nXG4gICAqIGFzIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgZG9lcy4gQWRkaW5nIG9uZSB3aGlsZSB0aGUgc3VyZmFjZSBpcyBkb3duIGlzIHN0aWxsIGxlZ2l0aW1hdGUg4oCUIGl0IGlzXG4gICAqIHF1ZXVlZCBhbmQgbG9hZGVkIHdoZW4gdGhlIHN1cmZhY2UgbmV4dCBjb21lcyB1cCwgdGhlIHdheSB7QGxpbmsgQ29tcG9uZW50RXguYWRkQ2hpbGR9IGFscmVhZHkgcXVldWVzXG4gICAqIGEgY2hpbGQgYWRkZWQgdG8gYSBub3QteWV0LWxvYWRlZCBjb21wb25lbnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNVQkNMQVNTJ3MgZG9vciwgYW5kIHRoZSBvbmx5IG9uZSBpdCBoYXM6IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyB7QGxpbmsgb25sb2FkfSByZWdpc3RlcnNcbiAgICogdGFrZSBhIHByaXZhdGUgcm91dGUgb250byBhIGRpZmZlcmVudCB3cmFwcGVyLiBTbyBhbnl0aGluZyBvYnNlcnZpbmcgdGhpcyBtZXRob2Qg4oCUIGEgdGVzdCBjb3VudGluZyBpdHNcbiAgICogY2FsbHMsIGEgcGF0Y2ggd3JhcHBpbmcgaXQg4oCUIHNlZXMgZXhhY3RseSB0aGUgY2hpbGRyZW4gdGhlIHN1YmNsYXNzIGFkZGVkLCBhbmQgbm9uZSBvZiB0aGUgbGlicmFyeSdzLlxuICAgKiBCZWZvcmUgdGhlIHR3byB0aWVycyBleGlzdGVkIG9uZSBkb29yIGNhcnJpZWQgYm90aCwgYW5kIGEgY29uc3VtZXIgY291bnRpbmcgdGhlIHRvdGFsIGlzIHRoZSBvbmUgdGhpbmdcbiAgICogdGhlIHNwbGl0IGNvdWxkIG5vdCBrZWVwIHdvcmtpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhZGRDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQuYWRkQ2hpbGQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyBpZiBuZWVkZWQuIE1ha2Ugc3VyZSB0byBjYWxsIGBhd2FpdCBzdXBlci5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKWAgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25FeHRlcm5hbFNldHRpbmdzQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZT8uKCk7XG4gICAgYXdhaXQgdGhpcy50cmlnZ2VyQXN5bmMoJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZC5cbiAgICpcbiAgICogT3JjaGVzdHJhdGVzIGxvYWRpbmc6IHJlZ2lzdGVycyB0aGUgdW5pdmVyc2FsIGNvbXBvbmVudHMsIGxldHMgdGhlIHN1YmNsYXNzIHdpcmUgaXRzIG93blxuICAgKiBjb21wb25lbnRzIHZpYSB7QGxpbmsgb25sb2FkSW1wbH0sIHRoZW4gYXdhaXRzIHRoZSBhc3luYyB0YWlsIG9mIGV2ZXJ5IGxvYWQuXG4gICAqIEVhY2ggY29tcG9uZW50IGxvYWRzIGFzIGl0IGlzIGFkZGVkLCBjaGlsZHJlbi1maXJzdC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBPdmVycmlkZSB7QGxpbmsgb25sb2FkSW1wbH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGhhc0xvYWRlZFVuaXZlcnNhbFdyYXBwZXIgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgLy8gQmVmb3JlIGFueXRoaW5nIGVsc2U6IHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBtYXkgc3RpbGwgYmUgY2xvc2luZyB3aGF0IHRoaXMgb25lIGlzIGFib3V0IHRvXG4gICAgICAvLyBvcGVuLCBiZWNhdXNlIE9ic2lkaWFuIHJ1bnMgYG9udW5sb2FkYCBzeW5jaHJvbm91c2x5IGFuZCBhd2FpdHMgbm90aGluZyBpdCBzdGFydGVkLiBBd2FpdGVkIG9ubHkgd2hlbiBzb21lIGFyZVxuICAgICAgLy8gcGVuZGluZywgc28gYSBwbHVnaW4gd2l0aCBub25lIGF0dGFjaGVzIGl0cyB3cmFwcGVyIGJlbG93IHdpdGhvdXQgeWllbGRpbmcgZmlyc3QuXG4gICAgICBpZiAoaGFzUGVuZGluZ1BsdWdpbkFzeW5jQ2xlYW51cHModGhpcy5tYW5pZmVzdC5pZCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yUHJldmlvdXNBc3luY0NsZWFudXBzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB3cmFwcGVyIGlzIGF0dGFjaGVkIGFuZCBsb2FkZWQgYmVmb3JlIGFueXRoaW5nIGlzIHdpcmVkIHVwLCBzbyBldmVyeSBgYWRkQ2hpbGRgIGJlbG93XG4gICAgICAvLyBsb2FkcyBpdHMgY2hpbGQgc3RyYWlnaHQgYXdheSByYXRoZXIgdGhhbiBxdWV1aW5nIGl0LlxuICAgICAgLy8gVGhhdCBpcyB3aGF0IGxldHMgYSBjb21tYW5kIGhhbmRsZXIgcmVnaXN0ZXIgaXRzIG1lbnUgZXZlbnRzIGZyb20gYG9uUmVnaXN0ZXJlZGAsIHdoaWNoXG4gICAgICAvLyBgcmVnaXN0ZXJDb21tYW5kSGFuZGxlcnNgIGF3YWl0cyBhbmQgd2hpY2ggYSByZWdpc3RyYXIgcmVmdXNlcyB3aGlsZSB1bmxvYWRlZC5cbiAgICAgIC8vIEF0dGFjaGluZyBpdCB1cCBmcm9udCBhbHNvIHJlZ2lzdGVycyB0aGUgd3JhcHBlciBmb3IgdGVhcmRvd24gYmVmb3JlIGFueXRoaW5nIGNhbiB0aHJvdy5cbiAgICAgIC8vIFRoZSBsb2FkIGlzIGV4cGxpY2l0IHJhdGhlciB0aGFuIGxlZnQgdG8gYGFkZENoaWxkYCwgd2hpY2ggbG9hZHMgdGhlIGNoaWxkIG9ubHkgd2hlbiB0aGVcbiAgICAgIC8vIHBsdWdpbiBpdHNlbGYgaXMgbG9hZGVkIOKAlCB0cnVlIHdoZW4gT2JzaWRpYW4gY2FsbHMgYGxvYWQoKWAsIGJ1dCBub3Qgd2hlbiBhIGNhbGxlciBpbnZva2VzXG4gICAgICAvLyBgb25sb2FkKClgIGRpcmVjdGx5LlxuICAgICAgc3VwZXIuYWRkQ2hpbGQodGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50KTtcbiAgICAgIHRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5sb2FkKCk7XG4gICAgICBoYXNMb2FkZWRVbml2ZXJzYWxXcmFwcGVyID0gdHJ1ZTtcblxuICAgICAgYXdhaXQgaW5pdEkxOE4odGhpcy5jcmVhdGVUcmFuc2xhdGlvbnNNYXAoKSk7XG4gICAgICB0aGlzLnBsdWdpbkNvbnRleHRDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luQ29udGV4dENvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChcbiAgICAgICAgbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFzeW5jRXJyb3JIYW5kbGVyQ29tcG9uZW50ID0gdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChuZXcgQXN5bmNFcnJvckhhbmRsZXJDb21wb25lbnQodGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQpKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBBYm9ydFNpZ25hbENvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLmNvbnNvbGVEZWJ1Z0NvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IENvbnNvbGVEZWJ1Z0NvbXBvbmVudCh0aGlzLm1hbmlmZXN0LmlkKSk7XG4gICAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQobmV3IFJlc291cmNlTG9ja0NvbXBvbmVudCh0aGlzLmFwcCwgdGhpcy5tYW5pZmVzdC5pZCkpO1xuICAgICAgLy8gYE5vdGVib29rIE5hdmlnYXRvcmAgZHJhd3MgaXRzIG93biBmaWxlIHRyZWUgYW5kIG5ldmVyIHJhaXNlcyBPYnNpZGlhbidzIGBmaWxlLW1lbnVgIC9cbiAgICAgIC8vIGBmaWxlcy1tZW51YCBldmVudHMsIHNvIGV2ZXJ5IHBsdWdpbidzIGNvbnRleHQtbWVudSBpdGVtcyB3b3VsZCB2YW5pc2ggZm9yIGFueW9uZSBicm93c2luZ1xuICAgICAgLy8gdGhyb3VnaCBpdC4gV2lyZWQgaGVyZSByYXRoZXIgdGhhbiBwZXItcGx1Z2luOiB0aGUgYnJpZGdlIHN0YXlzIGRvcm1hbnQgd2hlbiBOb3RlYm9va1xuICAgICAgLy8gTmF2aWdhdG9yIGlzIG5vdCBpbnN0YWxsZWQsIGFuZCBhIHBsdWdpbiB3aXRoIG5vIGZpbGUvZm9sZGVyIGhhbmRsZXJzIGNvbnRyaWJ1dGVzIG5vdGhpbmcuXG4gICAgICBjb25zdCBub3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCA9IHRoaXMuYWRkVW5pdmVyc2FsQ2hpbGQoXG4gICAgICAgIG5ldyBOb3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudCh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWUsXG4gICAgICAgICAgc3VibWVudUljb246IHRoaXMuZ2V0Tm90ZWJvb2tOYXZpZ2F0b3JNZW51U3VibWVudUljb24oKVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuY29tbWFuZEhhbmRsZXJDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgQ29tbWFuZEhhbmRsZXJDb21wb25lbnQoe1xuICAgICAgICAgIGFjdGl2ZUZpbGVQcm92aWRlcjogbmV3IEFwcEFjdGl2ZUZpbGVQcm92aWRlcih0aGlzLmFwcCksXG4gICAgICAgICAgYWRkaXRpb25hbE1lbnVFdmVudFJlZ2lzdHJhcnM6IFtub3RlYm9va05hdmlnYXRvck1lbnVFdmVudFJlZ2lzdHJhckNvbXBvbmVudF0sXG4gICAgICAgICAgLy8gVGhlIGNvbXBvbmVudCBpcyB1bml2ZXJzYWw7IHRoZSBjb21tYW5kcyByZWdpc3RlcmVkIFRIUk9VR0ggaXQgYXJlIG5vdC4gQSBzdWJjbGFzcyByZWdpc3RlcnNcbiAgICAgICAgICAvLyBpdHMgb3duIGZyb20gYG9ubG9hZEltcGxgLCBjbG9zaW5nIG92ZXIgY29sbGFib3JhdG9ycyB0aGF0IGJlbG9uZyB0byB0aGUgZmVhdHVyZSBzdXJmYWNlIOKAlCBzb1xuICAgICAgICAgIC8vIHRob3NlIGNvbW1hbmRzIG11c3QgZ28gZG93biB3aXRoIHRoZSBzdXJmYWNlIHdoZW4gdGhlIGdhdGUgY2xvc2VzLCBvciB0aGV5IHNpdCBpbiB0aGUgcGFsZXR0ZVxuICAgICAgICAgIC8vIGNhbGxpbmcgaW50byB0b3JuLWRvd24gb2JqZWN0cywgYW5kIGFyZSByZWdpc3RlcmVkIGEgc2Vjb25kIHRpbWUgd2hlbiB0aGUgZ2F0ZSByZW9wZW5zIGFuZFxuICAgICAgICAgIC8vIGBvbmxvYWRJbXBsYCBydW5zIGFnYWluLlxuICAgICAgICAgIC8vIFJlc29sdmVkIG9uIGV2ZXJ5IGNhbGwgcmF0aGVyIHRoYW4gY2FwdHVyZWQgaGVyZSwgYmVjYXVzZSBgdW5sb2FkRmVhdHVyZVN1cmZhY2VgIFJFUExBQ0VTIHRoZVxuICAgICAgICAgIC8vIHdyYXBwZXIgaW5zdGVhZCBvZiBlbXB0eWluZyBpdDogZWFjaCBjeWNsZSdzIGNvbW1hbmRzIGJlbG9uZyB0byB0aGF0IGN5Y2xlJ3Mgd3JhcHBlci5cbiAgICAgICAgICBjb21tYW5kTGlmZXRpbWVPd25lclByb3ZpZGVyOiAoKTogQ29tcG9uZW50RXggPT4gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQsXG4gICAgICAgICAgY29tbWFuZFJlZ2lzdHJhcjogbmV3IFBsdWdpbkNvbW1hbmRSZWdpc3RyYXIodGhpcyksXG4gICAgICAgICAgbWVudUV2ZW50UmVnaXN0cmFyOiB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKG5ldyBNZW51RXZlbnRSZWdpc3RyYXJDb21wb25lbnQodGhpcy5hcHApKSxcbiAgICAgICAgICBwbHVnaW5OYW1lOiB0aGlzLm1hbmlmZXN0Lm5hbWVcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICAvLyBBbHdheXMgYXZhaWxhYmxlOyB0aGUgY29tbWFuZCdzIG93biBgY2FuRXhlY3V0ZWAgaGlkZXMgaXQgdW5sZXNzIHRoZSBhY3RpdmUgbm90ZSBpcyBsb2NrZWQuXG4gICAgICAvLyBUaGUgb25lIGNvbW1hbmQgdGhhdCBuYW1lcyBpdHMgb3duZXIgZXhwbGljaXRseSwgb3B0aW5nIE9VVCBvZiB0aGUgc3VyZmFjZS1zY29wZWQgZGVmYXVsdCBhYm92ZTpcbiAgICAgIC8vIEl0IGlzIHRoZSByZXNjdWUgZm9yIGEgbm90ZSBsZWZ0IGxvY2tlZCwgaXQgY2xvc2VzIG92ZXIgbm90aGluZyBidXQgdGhlIHVuaXZlcnNhbCByZXNvdXJjZS1sb2NrXG4gICAgICAvLyBjb21wb25lbnQsIGFuZCBhIGJsb2NrZWQgcGx1Z2luIGlzIGV4YWN0bHkgd2hlbiBhIHVzZXIgbWF5IG5lZWQgaXQuXG4gICAgICBhd2FpdCB0aGlzLmNvbW1hbmRIYW5kbGVyQ29tcG9uZW50LnJlZ2lzdGVyQ29tbWFuZEhhbmRsZXJzKCgpID0+IFtcbiAgICAgICAgbmV3IFVubG9ja0FjdGl2ZU5vdGVDb21tYW5kSGFuZGxlcih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50XG4gICAgICAgIH0pXG4gICAgICBdLCB7IGxpZmV0aW1lT3duZXI6IHRoaXMuY29tbWFuZEhhbmRsZXJDb21wb25lbnQgfSk7XG5cbiAgICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQgPSB0aGlzLmFkZFVuaXZlcnNhbENoaWxkKFxuICAgICAgICBuZXcgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPG9iamVjdD4oe1xuICAgICAgICAgIGRhdGFIYW5kbGVyOiBuZXcgUGx1Z2luRGF0YUhhbmRsZXIodGhpcyksXG4gICAgICAgICAgcGx1Z2luRXZlbnRTb3VyY2U6IG5ldyBQbHVnaW5FdmVudFNvdXJjZUltcGwodGhpcyksXG4gICAgICAgICAgcGx1Z2luU2V0dGluZ3NDbGFzczogT2JqZWN0XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBUaGUgZ2F0ZS4gSXQgbG9hZHMgdGhlIGZlYXR1cmUgc3VyZmFjZSBpdHNlbGYgb25jZSBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGlzIHNhdGlzZmllZCBhbmQgbm9cbiAgICAgIC8vIGRlY2xhcmVkIGNvbmZsaWN0IGhvbGRzIOKAlCB3aGljaCBmb3IgYSBwbHVnaW4gZGVjbGFyaW5nIG5laXRoZXIgaXMgaW1tZWRpYXRlbHksIHN5bmNocm9ub3VzbHksXG4gICAgICAvLyBiZWZvcmUgdGhpcyBsaW5lIHJldHVybnMg4oCUIGFuZCB1bmxvYWRzIGl0IGFnYWluIGlmIGEgZGVwZW5kZW5jeSBpcyBsYXRlciBkaXNhYmxlZCBvciB1bmluc3RhbGxlZCxcbiAgICAgIC8vIG9yIGEgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQuIEEgcGx1Z2luIHRoYXQgaXMgYmxvY2tlZCB0aGVyZWZvcmUgcmVhY2hlcyBgbG9hZFdpdGhQcm9taXNlc2BcbiAgICAgIC8vIGJlbG93IGhhdmluZyByZWdpc3RlcmVkIG5vdGhpbmcgb2YgaXRzIG93biwgd2l0aCBvbmx5IHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBhYm92ZSBydW5uaW5nIHRvXG4gICAgICAvLyBleHBsYWluIHdoeSBhbmQgdG8gb2ZmZXIgdGhlIHJlcGFpci5cbiAgICAgIC8vIEFzc2lnbmVkIEJFRk9SRSB0aGUgYWRkLCB1bmxpa2UgZXZlcnkgdW5pdmVyc2FsIGNvbXBvbmVudCBhYm92ZSwgYW5kIHRoYXQgb3JkZXIgaXMgdGhlIHdob2xlXG4gICAgICAvLyBwb2ludC4gQWRkaW5nIHRoaXMgb25lIGlzIHdoYXQgcnVucyBgb25sb2FkSW1wbGAsIHBlciB0aGUgcGFyYWdyYXBoIGFib3ZlLCBzbyB0aGUgYXNzaWdubWVudFxuICAgICAgLy8gc3RhdGVtZW50IGhhcyBub3QgcmV0dXJuZWQgeWV0IHdoaWxlIHRoZSBzdWJjbGFzcyBpcyBydW5uaW5nIOKAlCBhbmQgYSBzZXR0aW5ncyB0YWIgYnVpbHQgdGhlcmVcbiAgICAgIC8vIHJlYWRzIGB0aGlzLnBsdWdpbkdhdGVDb21wb25lbnRgIHRvIHJlbmRlciB0aGUgYFdhcm5gIGJhbm5lci4gQXNzaWduaW5nIGFmdGVyIHRoZSBhZGQgd291bGRcbiAgICAgIC8vIG1ha2UgdGhhdCByZWFkIHRocm93IGBWYWx1ZSBpcyB1bmRlZmluZWRgIG91dCBvZiB0aGUgZ2V0dGVyLCB3aGljaCBpcyBhbiBvcGFxdWUgd2F5IHRvIHNheVxuICAgICAgLy8gXCJ0b28gZWFybHlcIi4gTm90aGluZyBhYm91dCBjaGlsZC1hZGQgb3JkZXIgbW92ZXM6IHRoZSBzZXF1ZW5jZSBvZiBgYWRkVW5pdmVyc2FsQ2hpbGRgIGNhbGxzIGlzXG4gICAgICAvLyB1bmNoYW5nZWQsIGFuZCBgc2V0Q29tcG9uZW50YCBpcyBhIHBsYWluIHN0b3JlLlxuICAgICAgY29uc3QgcGx1Z2luR2F0ZUNvbXBvbmVudCA9IG5ldyBQbHVnaW5HYXRlQ29tcG9uZW50KHtcbiAgICAgICAgY29uZmxpY3RzOiB0aGlzLmdldFBsdWdpbkNvbmZsaWN0cygpLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IHRoaXMuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzKCksXG4gICAgICAgIGxvYWRGZWF0dXJlU3VyZmFjZTogKCk6IFByb21pc2U8dm9pZD4gPT4gdGhpcy5sb2FkRmVhdHVyZVN1cmZhY2UoKSxcbiAgICAgICAgcGx1Z2luOiB0aGlzLFxuICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgICB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLnBsdWdpbkdhdGVDb21wb25lbnQgPSBwbHVnaW5HYXRlQ29tcG9uZW50O1xuICAgICAgdGhpcy5hZGRVbml2ZXJzYWxDaGlsZChwbHVnaW5HYXRlQ29tcG9uZW50KTtcblxuICAgICAgLy8gRXZlcnkgY2hpbGQgaGFzIGFscmVhZHkgbG9hZGVkIGFzIGl0IHdhcyBhZGRlZDsgdGhpcyBhd2FpdHMgdGhlaXIgYWNjdW11bGF0ZWQgYXN5bmMgdGFpbHMgYW5kXG4gICAgICAvLyByZXBvcnRzIGFueSBmYWlsdXJlIGFzIGEgc2luZ2xlIGBBZ2dyZWdhdGVFcnJvcmAuXG4gICAgICBhd2FpdCB0aGlzLnVuaXZlcnNhbFdyYXBwZXJDb21wb25lbnQubG9hZFdpdGhQcm9taXNlcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUaGUgcGx1Z2luIHdhcyB1bmxvYWRlZCB3aGlsZSBpdHMgb3duIGxvYWQgd2FzIHN1c3BlbmRlZCBvbiBhbiBhd2FpdCAoYW4gdXBkYXRlLCBvciBIb3QgUmVsb2FkLCBkaXNhYmxlcyBhbmRcbiAgICAgIC8vIHJlLWVuYWJsZXMgaXQpLCBhbmQgdGhlIHJlc3VtZWQgbG9hZCB1bndvdW5kIG9uIHRoZSBgU2lsZW50RXJyb3JgIGFuIHVubG9hZGVkIGNvbXBvbmVudCB0aHJvd3MsIHdoaWNoIGlzIHRoYXRcbiAgICAgIC8vIGVycm9yJ3MgcHVycG9zZS4gUmVwb3J0aW5nIGl0IHdvdWxkIG1ha2UgT2JzaWRpYW4gbG9nIGBQbHVnaW4gZmFpbHVyZWAgYW5kIHNob3cgYEZhaWxlZCB0byBsb2FkIHBsdWdpbmAgZm9yIGFuXG4gICAgICAvLyBpbnN0YW5jZSB0aGF0IHdhcyB0b3JuIGRvd24gY29ycmVjdGx5IGFuZCBpcyBhbHJlYWR5IHJlcGxhY2VkLiBBbnkgb3RoZXIgZmFpbHVyZSBpbiB0aGUgdHJlZSBzdGlsbCByZXBvcnRzLlxuICAgICAgaWYgKGhhc0xvYWRlZFVuaXZlcnNhbFdyYXBwZXIgJiYgIXRoaXMudW5pdmVyc2FsV3JhcHBlckNvbXBvbmVudC5fbG9hZGVkICYmIGlzU2lsZW50RXJyb3JUcmVlKGVycm9yKSkge1xuICAgICAgICBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyKCdQbHVnaW5CYXNlOm9ubG9hZCcpKGBQbHVnaW4gJHt0aGlzLm1hbmlmZXN0Lm5hbWV9ICgke3RoaXMubWFuaWZlc3QuaWR9KSB3YXMgdW5sb2FkZWQgZHVyaW5nIGl0cyBvd24gbG9hZGApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHByaW50RXJyb3IobmV3IEVycm9yKGBFcnJvciBsb2FkaW5nIHBsdWdpbiAke3RoaXMubWFuaWZlc3QubmFtZX0gKCR7dGhpcy5tYW5pZmVzdC5pZH0pYCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gaXMgdW5sb2FkZWQuXG4gICAqXG4gICAqIEFubm91bmNlcyB0aGUgZGVwYXJ0dXJlIG9uIGBhcHAud29ya3NwYWNlYCBzbyBhbnl0aGluZyBkZXBlbmRpbmcgb24gdGhpcyBwbHVnaW4gbGVhcm5zIG9mIGl0IGF0IHRoZVxuICAgKiBtb21lbnQgaXQgaGFwcGVucywgcmF0aGVyIHRoYW4gZGlzY292ZXJpbmcgaXQgbGF0ZXIgdGhyb3VnaCBiZWhhdmlvciB0aGF0IHF1aWV0bHkgc3RvcHBlZC5cbiAgICpcbiAgICogRG8gTk9UIG92ZXJyaWRlIHRoaXMgbWV0aG9kOyBwdXQgdGVhcmRvd24gb24gYSBjb21wb25lbnQgaW5zdGVhZCwgd2hpY2ggdW5sb2FkcyB3aXRoIHRoZSBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5icm9hZGNhc3RVbmxvYWRlZCgpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVtb3ZlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgLy8gUm91dGVkIGJ5IG93bmVyc2hpcCByYXRoZXIgdGhhbiBieSB3aGljaCB0aWVyIGBhZGRDaGlsZGAgd291bGQgaGF2ZSBjaG9zZW4sIGJlY2F1c2UgdGhlIHR3byBkbyBub3RcbiAgICAvLyBhbHdheXMgYWdyZWU6IGEgdW5pdmVyc2FsIGNvbXBvbmVudCBpcyBwYXJlbnRlZCBkaXJlY3RseSBvbiB0aGUgdW5pdmVyc2FsIHdyYXBwZXIsIHlldCBhIHN1YmNsYXNzXG4gICAgLy8gcmVwbGFjaW5nIG9uZSBnb2VzIHRocm91Z2ggdGhlIHNhbWUgcHVibGljIGByZW1vdmVDaGlsZGAgYXMgaXQgd291bGQgZm9yIGl0cyBvd24gY2hpbGRyZW4uXG4gICAgcmV0dXJuIHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50Lmhhc0NoaWxkKGNvbXBvbmVudCkgPyB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudC5yZW1vdmVDaGlsZChjb21wb25lbnQpIDogdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHRyYW5zbGF0aW9ucyBtYXAgdXNlZCB0byBpbml0aWFsaXplIGkxOG4gZHVyaW5nIHtAbGluayBvbmxvYWR9LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBzdXBwbHkgcGx1Z2luLXNwZWNpZmljIHRyYW5zbGF0aW9ucy4gVGhlIGRlZmF1bHQgcmV0dXJucyB0aGUgYnVpbHQtaW5cbiAgICogYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgIHRyYW5zbGF0aW9ucy4gQSBsYW5ndWFnZSBtYXkgbWFwIHRvIGEgYExvY2FsZUxvYWRlcmAgaW5zdGVhZCBvZiBpdHMgdHJhbnNsYXRpb25zLCBzb1xuICAgKiBvbmx5IHRoZSBzaG93biBsYW5ndWFnZSBpcyBpbml0aWFsaXplZDsgc2VlIHtAbGluayBodHRwczovL21uYW91bW92LmRldi9vYnNpZGlhbi1saWIvZ3VpZGVzL3RyYW5zbGF0aW9ucy99LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNsYXRpb25zIG1hcC5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2xhdGlvbnNNYXAoKTogVHJhbnNsYXRpb25zTWFwIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zbGF0aW9uc01hcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBob3cgbG9uZyBhIG5ldyBpbnN0YW5jZSB3YWl0cyBmb3IgdGhlIHByZXZpb3VzIGluc3RhbmNlJ3MgYXN5bmMgY2xlYW51cHMgYmVmb3JlIGl0IHRlbGxzIHRoZSB1c2VyIHRoYXRcbiAgICogaXRzIGxvYWQgaXMgcGF1c2VkLlxuICAgKlxuICAgKiBNb3N0IGNsZWFudXBzIHNldHRsZSB3aXRoaW4gbWlsbGlzZWNvbmRzLCBzbyBhIG5vdGljZSBvbiBldmVyeSByZWxvYWQgd291bGQgb25seSBmbGFzaC4gT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG9cbiAgICogY2hhbmdlIGl0LiBUaGUgZGVmYXVsdCBpcyA1MDAgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzeW5jQ2xlYW51cE5vdGljZURlbGF5SW5NaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gREVGQVVMVF9QTFVHSU5fQVNZTkNfQ0xFQU5VUF9OT1RJQ0VfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGhvdyBsb25nIGEgbmV3IGluc3RhbmNlIHdhaXRzIGZvciB0aGUgcHJldmlvdXMgaW5zdGFuY2UncyBhc3luYyBjbGVhbnVwcyBiZWZvcmUgbG9hZGluZyBhbnl3YXkuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGNoYW5nZSBpdC4gVGhlIGRlZmF1bHQgaXMgMTAgc2Vjb25kcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEFzeW5jQ2xlYW51cFRpbWVvdXRJbk1pbGxpc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHRoZSBpY29uIHNob3duIG9uIHRoZSBwbHVnaW4ncyBwYXJlbnQgZW50cnkgaW4gYE5vdGVib29rIE5hdmlnYXRvcmAncyBjb250ZXh0IG1lbnVzLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBicmFuZCB0aGF0IGVudHJ5OyB0aGUgZGVmYXVsdCBsZWF2ZXMgaXQgd2l0aG91dCBhbiBpY29uLiBUaGUgZW50cnkgaXNcbiAgICogdGl0bGVkIHdpdGggdGhlIHBsdWdpbiBuYW1lIGFuZCBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5IOKAlCBzZWVcbiAgICoge0BsaW5rIE5vdGVib29rTmF2aWdhdG9yTWVudUV2ZW50UmVnaXN0cmFyQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGljb24sIG9yIGAnJ2AgZm9yIG5vIGljb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Tm90ZWJvb2tOYXZpZ2F0b3JNZW51U3VibWVudUljb24oKTogSWNvbk5hbWUge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgQVBJcyB0aGlzIHBsdWdpbiBleHBvc2VzIHRvIG90aGVyIHBsdWdpbnMuXG4gICAqXG4gICAqIE92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHB1Ymxpc2ggb25lLiBUaGUgZGVmYXVsdCBwdWJsaXNoZXMgbm9uZS4gQ2FsbGVkIGFmdGVyIHtAbGluayBvbmxvYWRJbXBsfSwgc28gYVxuICAgKiBkZWNsYXJhdGlvbiBtYXkgcmVmZXJlbmNlIGFueXRoaW5nIGl0IGNyZWF0ZWQ7IHRoZSByZXR1cm5lZCBkZWNsYXJhdGlvbnMgYXJlIHB1Ymxpc2hlZCB0aHJvdWdoXG4gICAqIGBwdWJsaXNoUGx1Z2luQXBpYCBhbmQgcmV2b2tlZCB3aGVuIHRoZSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UgdW5sb2Fkcy5cbiAgICpcbiAgICogUmV0dXJuaW5nIGEgTElTVCByYXRoZXIgdGhhbiBhIHNpbmdsZSBBUEkgaXMgZGVsaWJlcmF0ZTogdGhlIHJlZ2lzdHJ5IHN1cHBvcnRzIHNldmVyYWwgY29udHJhY3RcbiAgICogdmVyc2lvbnMgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgd2hpY2ggaXMgaG93IGEgcHJvdmlkZXIgc2hpcHMgYSBicmVha2luZyBgMi4wLjBgIHdpdGhvdXQgc3RyYW5kaW5nXG4gICAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAgICpcbiAgICogRXZlcnkgZGVjbGFyYXRpb24gaGVyZSBpcyBwdWJsaXNoZWQgQkVGT1JFIHRoZSBgb2JzaWRpYW4tbGliOnBsdWdpbi1sb2FkZWRgIGJyb2FkY2FzdCwgd2hpY2ggaXNcbiAgICogd2hhdCBsZXRzIGEgbGlzdGVuZXIgY2FsbCB0aGVzZSBBUElzIHRoZSBtb21lbnQgaXQgaGVhcnMgdGhhdCBldmVudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIEFQSSBkZWNsYXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQXBpcygpOiBQbHVnaW5BcGlEZWNsYXJhdGlvbltdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIHBsdWdpbnMgdGhpcyBvbmUgcmVmdXNlcywgb3Igd2FybnMgYWJvdXQsIHJ1bm5pbmcgYmVzaWRlLlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGFuIG92ZXJsYXAuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUuXG4gICAqXG4gICAqIEEgYEJsb2NrYCBjb25mbGljdCBpcyB0aGUgbWlycm9yIGltYWdlIG9mIGEgZGVwZW5kZW5jeTogd2hpbGUgYSBjb25mbGljdGluZyBwbHVnaW4gaXMgZW5hYmxlZCBhdCBhXG4gICAqIGNvbmZsaWN0aW5nIHZlcnNpb24sIHtAbGluayBvbmxvYWRJbXBsfSBkb2VzIG5vdCBydW4gYXQgYWxsIGFuZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBub3RoaW5nLiBEZWNsYXJlXG4gICAqIGl0IHdoZW4gYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQg4oCUIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byB3aW5cbiAgICogdGhhdCByYWNlLCBiZWNhdXNlIHdoaWNoZXZlciBwbHVnaW4gbG9hZGVkIGZpcnN0IGtlZXBzIGEgaGFuZCBvbiB0aGUgd2hlZWwsIHNvIHJlZnVzaW5nIGRldGVybWluaXN0aWNhbGx5XG4gICAqIGJlYXRzIGNvbXBldGluZyB1bnByZWRpY3RhYmx5LiBBIGBXYXJuYCBjb25mbGljdCBkZWNsYXJlcyBhbiBvdmVybGFwIHRoYXQgaXMgbWVyZWx5IGFubm95aW5nLCBzdWNoIGFzIGFcbiAgICogZHVwbGljYXRlZCBjb21tYW5kOiBib3RoIHBsdWdpbnMga2VlcCBydW5uaW5nIGFuZCB0aGUgdXNlciBpcyB0b2xkLlxuICAgKlxuICAgKiBVbmxpa2UgYSBkZXBlbmRlbmN5LCBhIGNvbmZsaWN0aW5nIHBsdWdpbiBuZWVkIG5vdCBwdWJsaXNoIGFueXRoaW5nIOKAlCBpdCBpcyBkZXRlY3RlZCBieSByZWFkaW5nIGl0c1xuICAgKiBpbnN0YWxsZWQgdmVyc2lvbiwgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgYWJvdXQgYW5vdGhlciBwbHVnaW4gdGhhdCByZWFkcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIGxvYWRcbiAgICogb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWNsYXJlZCBjb25mbGljdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0UGx1Z2luQ29uZmxpY3RzKCk6IFBsdWdpbkNvbmZsaWN0W10ge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyB0aGUgcGx1Z2lucyB0aGlzIG9uZSBjYW5ub3Qgd29yayB3aXRob3V0LlxuICAgKlxuICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBkZWNsYXJlIGEgbWFuZGF0b3J5IGRlcGVuZGVuY3kuIFRoZSBkZWZhdWx0IGRlY2xhcmVzIG5vbmUsIGFuZCBzdWNoIGEgcGx1Z2luXG4gICAqIGxvYWRzIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcy5cbiAgICpcbiAgICogQSBkZWNsYXJlZCBkZXBlbmRlbmN5IGlzIE1BTkRBVE9SWSwgdW5saWtlIHRoZSBvZmZlciBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAgbWFrZXM6IHdoaWxlIG9uZSBpc1xuICAgKiBtaXNzaW5nLCBkaXNhYmxlZCwgb3IgdG9vIG9sZCwge0BsaW5rIG9ubG9hZEltcGx9IGRvZXMgbm90IHJ1biBhdCBhbGwgYW5kIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIG5vdGhpbmdcbiAgICog4oCUIG5vIGNvbW1hbmRzLCBubyBoYW5kbGVycywgbm8gcGF0Y2hlcy4gSXQgc3RheXMgZW5hYmxlZCBpbiBPYnNpZGlhbidzIGxpc3QgcmF0aGVyIHRoYW4gZGlzYWJsaW5nXG4gICAqIGl0c2VsZiwgYmVjYXVzZSB0aGUgZW5hYmxlZCBzZXQgaXMgdGhlIHVzZXIncyB0byBjaGFuZ2UsIGFuZCBpdCBleHBsYWlucyBpdHNlbGYgdGhyb3VnaCBhIG5vdGljZSBhbmQgYVxuICAgKiBzZXR0aW5ncyBiYW5uZXIgdGhhdCBpbnN0YWxscyB0aGUgbWlzc2luZyBwbHVnaW4gaW4gb25lIGNsaWNrLiBUaGUgbG9hZCBjb21wbGV0ZXMgdGhlIG1vbWVudCB0aGVcbiAgICogZGVwZW5kZW5jeSBhcnJpdmVzLCB3aXRoIG5vIHJlc3RhcnQuXG4gICAqXG4gICAqIEEgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeSBpcyBkZWNsYXJlZCBhcyBhIGBQbHVnaW5EZXBlbmRlbmN5YDogaXQgbXVzdCBwdWJsaXNoIGFuIEFQSSB0aHJvdWdoXG4gICAqIGBwdWJsaXNoUGx1Z2luQXBpYCwgd2hpY2ggaXMgd2hhdCBtYWtlcyBpdHMgcHJlc2VuY2UsIGFic2VuY2UsIHZlcnNpb24gYW5kIGRlcGFydHVyZSBhbGwgb2JzZXJ2YWJsZVxuICAgKiB0aHJvdWdoIG9uZSBtZWNoYW5pc20uIEEgcGx1Z2luIHdpdGggbm90aGluZyB0byBleHBvc2UgY2FuIHB1Ymxpc2ggYW4gZW1wdHkgQVBJIHB1cmVseSBzbyBpdCBjYW4gYmVcbiAgICogZGVwZW5kZWQgdXBvbi4gQSBUSElSRC1QQVJUWSBwbHVnaW4sIHdoaWNoIHB1Ymxpc2hlcyBub3RoaW5nIHRoZXJlLCBpcyBkZWNsYXJlZCB0aHJvdWdoIGl0cyBhZGFwdGVyIHdpdGhcbiAgICogYGNyZWF0ZVRoaXJkUGFydHlQbHVnaW5EZXBlbmRlbmN5YCwgYW5kIHRoZSBnYXRlIHJlYWRzIGl0cyBBUEkgdGhlIHdheSB0aGUgYWRhcHRlciBzYXlzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFBsdWdpbkRlcGVuZGVuY2llcygpOiBEZWNsYXJlZFBsdWdpbkRlcGVuZGVuY3lbXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBkdXJpbmcge0BsaW5rIG9ubG9hZH0gdG8gd2lyZSBwbHVnaW4tc3BlY2lmaWMgY2hpbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3MgdG8gYWRkIGNoaWxkIGNvbXBvbmVudHMgdmlhIHtAbGluayBhZGRDaGlsZH0uIFRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBhcmVcbiAgICogYXZhaWxhYmxlIGhlcmUuIENoaWxkcmVuIGFyZSBsb2FkZWQgc2VxdWVudGlhbGx5IGluIHRoZSBvcmRlciB0aGV5IGFyZSBhZGRlZCAoY2hpbGRyZW4tZmlyc3QpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YmNsYXNzIGxvYWQgbG9naWMgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25sb2FkSW1wbCgpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGFzeW5jIGNsZWFudXAgdGhhdCB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbiBhd2FpdHMgYmVmb3JlIGl0IHN0YXJ0cy5cbiAgICpcbiAgICogVXNlIGl0IGZvciB0ZWFyZG93biB0aGF0IGNhbm5vdCBmaW5pc2ggc3luY2hyb25vdXNseSBhbmQgbXVzdCBmaW5pc2ggYmVmb3JlIHRoZSByZXNvdXJjZSBpcyBvcGVuZWQgYWdhaW4sIHN1Y2hcbiAgICogYXMgY2xvc2luZyBhbiBJbmRleGVkREIgY29ubmVjdGlvbi4gT2JzaWRpYW4ncyBgb251bmxvYWRgIGlzIHN5bmNocm9ub3VzIGFuZCBhd2FpdHMgbm90aGluZywgc28gd2l0aG91dCB0aGlzIGFcbiAgICogcmVsb2FkIHN0YXJ0cyB0aGUgbmV3IGluc3RhbmNlIHdoaWxlIHRoZSBvbGQgb25lIHN0aWxsIGhvbGRzIHRoZSBkYXRhYmFzZS5cbiAgICpcbiAgICogU2NvcGVkIGxpa2Uge0BsaW5rIGFkZENoaWxkfTogdGhlIGNsZWFudXAgc3RhcnRzIHdoZW4gdGhlIHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZSB1bmxvYWRzLCB3aGljaCBpcyBvbiBwbHVnaW5cbiAgICogdW5sb2FkIGFuZCB3aGVuZXZlciB0aGUgZ2F0ZSBjbG9zZXMuIFRoZSBuZXh0IGxvYWQgb2YgdGhlIHBsdWdpbiwgYW5kIHRoZSBuZXh0IG9wZW5pbmcgb2YgdGhlIGdhdGUsIGF3YWl0IGl0LFxuICAgKiBib3VuZGVkIGJ5IHtAbGluayBnZXRBc3luY0NsZWFudXBUaW1lb3V0SW5NaWxsaXNlY29uZHN9LiBBIGNsZWFudXAgdGhhdCB0aHJvd3MgaXMgcHJpbnRlZCwgbmV2ZXIgcmV0aHJvd24uXG4gICAqXG4gICAqIEBwYXJhbSBjbGVhbnVwIC0gVGhlIGNsZWFudXAgdG8gcnVuLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyQXN5bmNDbGVhbnVwKGNsZWFudXA6ICgpID0+IFByb21pc2FibGU8dm9pZD4pOiB2b2lkIHtcbiAgICByZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cCh7XG4gICAgICBjbGVhbnVwLFxuICAgICAgY29tcG9uZW50OiB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCxcbiAgICAgIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmVzIGEgdW5pdmVyc2FsIGNvbXBvbmVudCwgdW5sb2FkaW5nIHdoaWNoZXZlciBjb21wb25lbnQgdGhlIGtleSBoZWxkIGJlZm9yZS5cbiAgICpcbiAgICogS2V5ZWQgYnkgbmFtZSByYXRoZXIgdGhhbiBoYW5kZWQgdGhlIHByZXZpb3VzIHZhbHVlIGJlY2F1c2UgYGtleW9mIHRoaXNgIGV4Y2x1ZGVzIHByaXZhdGVcbiAgICogbWVtYmVycywgc28gdGhlIGNvbXBvbmVudHMgbGl2ZSBpbiBhIHNpbmdsZSB7QGxpbmsgUGx1Z2luQmFzZUNvbXBvbmVudHN9IGJhZyB3aG9zZSBrZXlzIEFSRVxuICAgKiBpbmRleGFibGUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVEtleSAtIFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICogQHBhcmFtIGtleSAtIFRoZSBrZXkgb2YgdGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGNvbXBvbmVudCB0byBzdG9yZS5cbiAgICovXG4gIC8qKlxuICAgKiBBZGRzIGEgY29tcG9uZW50IHRvIHRoZSB1bml2ZXJzYWwgdGllciwgd2hpY2ggb3V0bGl2ZXMgYW55IGRlcGVuZGVuY3kuXG4gICAqXG4gICAqIFByaXZhdGUgb24gcHVycG9zZTogb25seSB0aGlzIGNsYXNzIGRlY2lkZXMgd2hhdCBpcyB1bml2ZXJzYWwuIEEgc3ViY2xhc3MgYWRkaW5nIG9uZSBvZiBpdHMgb3duIGdvZXNcbiAgICogdGhyb3VnaCB7QGxpbmsgYWRkQ2hpbGR9IGFuZCBsYW5kcyBpbiB0aGUgZ2F0ZWQgdGllciwgd2hlcmUgaXQgYmVsb25ncy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIGFkZC5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYWRkZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRVbml2ZXJzYWxDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmFkZENoaWxkKGNvbXBvbmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2VzIG9uIGBhcHAud29ya3NwYWNlYCB0aGF0IHRoaXMgcGx1Z2luIGlzIGxvYWRlZCBhbmQgaXRzIEFQSXMgYXJlIGNhbGxhYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3RMb2FkZWQoKTogdm9pZCB7XG4gICAgdGhpcy5saWZlY3ljbGVFdmVudFBheWxvYWQgPSB7XG4gICAgICBhcGlWZXJzaW9uczogdGhpcy5nZXRQbHVnaW5BcGlzKCkubWFwKChkZWNsYXJhdGlvbikgPT4gZGVjbGFyYXRpb24uYXBpVmVyc2lvbiksXG4gICAgICBkZXBlbmRlbmN5UGx1Z2luSWRzOiB0aGlzLmdldFBsdWdpbkRlcGVuZGVuY2llcygpLm1hcCgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5wbHVnaW5JZCksXG4gICAgICBwbHVnaW5JZDogdGhpcy5tYW5pZmVzdC5pZCxcbiAgICAgIHBsdWdpbk5hbWU6IHRoaXMubWFuaWZlc3QubmFtZSxcbiAgICAgIHBsdWdpblZlcnNpb246IHRoaXMubWFuaWZlc3QudmVyc2lvblxuICAgIH07XG5cbiAgICB0cmlnZ2VyUGx1Z2luTGlmZWN5Y2xlRXZlbnQoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIG5hbWU6IFBMVUdJTl9MT0FERURfRVZFTlRfTkFNRSxcbiAgICAgIHBheWxvYWQ6IHRoaXMubGlmZWN5Y2xlRXZlbnRQYXlsb2FkXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2VzIG9uIGBhcHAud29ya3NwYWNlYCB0aGF0IHRoaXMgcGx1Z2luJ3Mgc3VyZmFjZSBoYXMgZ29uZSBhd2F5LlxuICAgKlxuICAgKiBTaWxlbnQgdW5sZXNzIGEgbG9hZGVkIGJyb2FkY2FzdCBpcyBvdXRzdGFuZGluZywgc28gdGhlIHR3byBldmVudHMgc3RheSBwYWlyZWQ6IGEgcGx1Z2luIHRoYXQgbmV2ZXJcbiAgICogZ290IHBhc3QgaXRzIGRlcGVuZGVuY3kgZ2F0ZSBuZXZlciBhbm5vdW5jZWQgaXRzZWxmLCBhbmQgbXVzdCBub3QgYW5ub3VuY2UgYSBkZXBhcnR1cmUgZWl0aGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBicm9hZGNhc3RVbmxvYWRlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5saWZlY3ljbGVFdmVudFBheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5saWZlY3ljbGVFdmVudFBheWxvYWQgPSBudWxsO1xuICAgIHRyaWdnZXJQbHVnaW5MaWZlY3ljbGVFdmVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgbmFtZTogUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUUsXG4gICAgICBwYXlsb2FkXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgdGhlIG5vdGljZSBjb21wb25lbnQgZm9yIHRoZSBjbGVhbnVwIHdhaXQuXG4gICAqXG4gICAqIFRoZSB3YWl0IGluIHtAbGluayBvbmxvYWR9IHJ1bnMgYmVmb3JlIHRoZSB1bml2ZXJzYWwgbm90aWNlIGNvbXBvbmVudCBleGlzdHMsIHNvIHRoYXQgcGF0aCBnZXRzIGEgc3RhbmRhbG9uZVxuICAgKiBvbmUuIEl0IGlzIG5ldmVyIHVubG9hZGVkLCBiZWNhdXNlIHVubG9hZGluZyBoaWRlcyBpdHMgbm90aWNlLCBhbmQgdGhlIHRpbWVvdXQgbm90aWNlIG11c3Qgc3RheSByZWFkYWJsZSBhZnRlciB0aGVcbiAgICogd2FpdC4gSXQgaG9sZHMgbm90aGluZyBidXQgdGhlIG5vdGljZXMgaXQgc2hvd3MsIHdoaWNoIGhpZGUgdGhlbXNlbHZlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5vdGljZSBjb21wb25lbnQuXG4gICAqL1xuICBwcml2YXRlIGdldEFzeW5jQ2xlYW51cE5vdGljZUNvbXBvbmVudCgpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnQge1xuICAgIGNvbnN0IHBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgaWYgKHBsdWdpbk5vdGljZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFuZGFsb25lUGx1Z2luTm90aWNlQ29tcG9uZW50ID0gbmV3IFBsdWdpbk5vdGljZUNvbXBvbmVudCh7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luTmFtZTogdGhpcy5tYW5pZmVzdC5uYW1lXG4gICAgfSk7XG4gICAgc3RhbmRhbG9uZVBsdWdpbk5vdGljZUNvbXBvbmVudC5sb2FkKCk7XG4gICAgcmV0dXJuIHN0YW5kYWxvbmVQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBmZWF0dXJlIHN1cmZhY2Ugd2hvc2UgbG9hZCBpcyBpbiBwcm9ncmVzcyBoYXMgc2luY2UgYmVlbiB0b3JuIGRvd24gb3IgcmVwbGFjZWQuXG4gICAqXG4gICAqIEBwYXJhbSBnYXRlZFdyYXBwZXJDb21wb25lbnQgLSBUaGUgc3VyZmFjZSBiZWluZyBsb2FkZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzdXJmYWNlIGlzIG5vIGxvbmdlciB0aGUgcGx1Z2luJ3MgbGl2ZSBvbmUuXG4gICAqL1xuICBwcml2YXRlIGlzRmVhdHVyZVN1cmZhY2VHb25lKGdhdGVkV3JhcHBlckNvbXBvbmVudDogQ29tcG9uZW50RXgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWdhdGVkV3JhcHBlckNvbXBvbmVudC5fbG9hZGVkIHx8IHRoaXMuZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ICE9PSBnYXRlZFdyYXBwZXJDb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCBsb2FkcyB0aGUgc3ViY2xhc3MncyBmZWF0dXJlIHN1cmZhY2UsIHRoZW4gcHVibGlzaGVzIGl0cyBBUElzIGFuZCBhbm5vdW5jZXMgaXRzZWxmLlxuICAgKlxuICAgKiBOT1QgaWRlbXBvdGVudCwgZGVsaWJlcmF0ZWx5LiBgUGx1Z2luR2F0ZUNvbXBvbmVudGAgb3ducyB0aGUgdXAvZG93biBzdGF0ZSBtYWNoaW5lIGFuZCBjYWxsc1xuICAgKiB0aGlzIG9ubHkgb24gYSByZWFsIHRyYW5zaXRpb247IGEgc2Vjb25kIGd1YXJkIGhlcmUgd291bGQgYmUgYSBzZWNvbmQgY29weSBvZiB0aGF0IHN0YXRlLCB3aGljaCBpcyB0aGVcbiAgICoga2luZCBvZiBkdXBsaWNhdGUgdGhhdCBkcmlmdHMuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3VyZmFjZSBpcyBsb2FkZWQgYW5kIHRoZSBicm9hZGNhc3QgaGFzIGJlZW4gbWFkZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEZlYXR1cmVTdXJmYWNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIExvYWRlZCBleHBsaWNpdGx5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlIHVuaXZlcnNhbCB3cmFwcGVyIGlzOiBgYWRkQ2hpbGRgIGxvYWRzIGEgY2hpbGQgb25seSBvbmNlXG4gICAgLy8gaXRzIHBhcmVudCBpcyBsb2FkZWQsIGFuZCB0aGUgc3VyZmFjZSBoYXMgdG8gYmUgbGl2ZSBiZWZvcmUgYG9ubG9hZEltcGxgIHN0YXJ0cyBhZGRpbmcgdG8gaXQuXG4gICAgY29uc3QgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50ID0gdGhpcy5nYXRlZFdyYXBwZXJDb21wb25lbnQ7XG4gICAgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LmFkZENoaWxkKGdhdGVkV3JhcHBlckNvbXBvbmVudCk7XG4gICAgZ2F0ZWRXcmFwcGVyQ29tcG9uZW50LmxvYWQoKTtcblxuICAgIC8vIEEgc3VyZmFjZSByZW9wZW5lZCBhZnRlciB0aGUgZ2F0ZSBjbG9zZWQgd2FpdHMgZm9yIHRoZSBjbGVhbnVwcyB0aGUgcHJldmlvdXMgc3VyZmFjZSBzdGFydGVkLiBPbmx5IHdoZW4gc29tZVxuICAgIC8vIGFyZSBwZW5kaW5nLCBzbyBhIHN1cmZhY2Ugd2l0aCBub3RoaW5nIHRvIHdhaXQgZm9yIHN0aWxsIHJ1bnMgYG9ubG9hZEltcGxgIHN5bmNocm9ub3VzbHkuIE5ldmVyIG9uIHRoZSBmaXJzdFxuICAgIC8vIGxvYWQsIHdoZXJlIGFueXRoaW5nIHBlbmRpbmcgaXMgdGhlIHByZXZpb3VzIGluc3RhbmNlJ3MgYW5kIGBvbmxvYWRgIGFscmVhZHkgd2FpdGVkIGZvciBpdC5cbiAgICBpZiAodGhpcy5oYXNVbmxvYWRlZEZlYXR1cmVTdXJmYWNlICYmIGhhc1BlbmRpbmdQbHVnaW5Bc3luY0NsZWFudXBzKHRoaXMubWFuaWZlc3QuaWQpKSB7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JQcmV2aW91c0FzeW5jQ2xlYW51cHMoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9ubG9hZEltcGwoKTtcblxuICAgIC8vIFRoZSBzdXJmYWNlIG1heSBoYXZlIGJlZW4gdG9ybiBkb3duIHdoaWxlIGFuIGF3YWl0IHdhcyBzdXNwZW5kZWQ6IHRoZSBwbHVnaW4gdW5sb2FkZWQgaW4gdGhlIG1pZGRsZSBvZiBpdHNcbiAgICAvLyBvd24gbG9hZCAoYW4gdXBkYXRlLCBvciBIb3QgUmVsb2FkLCBkaXNhYmxlcyBhbmQgcmUtZW5hYmxlcyBpdCB3aGlsZSBgb25sb2FkSW1wbGAgaXMgc3RpbGwgYXdhaXRpbmcpLCBvciB0aGVcbiAgICAvLyBnYXRlIGNsb3NlZC4gQ2hlY2tlZCBiZWZvcmUgYGxvYWRXaXRoUHJvbWlzZXNgLCB3aGljaCB3b3VsZCBvdGhlcndpc2UgTE9BRCB0aGUgdW5sb2FkZWQgc3VyZmFjZSBhZ2FpbiwgYW5kXG4gICAgLy8gYWZ0ZXIgaXQuIFB1Ymxpc2hpbmcgdGhlbiByZWdpc3RlcnMgZWFjaCByZWNvcmQncyByZXZva2Ugb24gYSBjb21wb25lbnQgdGhhdCBoYXMgYWxyZWFkeSB1bmxvYWRlZCwgc28gdGhlXG4gICAgLy8gcmV2b2tlIG5ldmVyIHJ1bnMsIGFuZCB0aGUgcmVjb3JkIG91dGxpdmVzIHRoaXMgaW5zdGFuY2UgYW5kIGJsb2NrcyB0aGUgbmV4dCBvbmUgZnJvbSBwdWJsaXNoaW5nIHRoZSBzYW1lIEFQSVxuICAgIC8vIHZlcnNpb24uIEFubm91bmNpbmcgYSBsb2FkIHRoYXQgbm8gbG9uZ2VyIGhvbGRzIHdvdWxkIGJlIGp1c3QgYXMgd3JvbmcuXG4gICAgaWYgKHRoaXMuaXNGZWF0dXJlU3VyZmFjZUdvbmUoZ2F0ZWRXcmFwcGVyQ29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGdhdGVkV3JhcHBlckNvbXBvbmVudC5sb2FkV2l0aFByb21pc2VzKCk7XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlR29uZShnYXRlZFdyYXBwZXJDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBkZWNsYXJhdGlvbiBvZiB0aGlzLmdldFBsdWdpbkFwaXMoKSkge1xuICAgICAgcHVibGlzaFBsdWdpbkFwaSh7XG4gICAgICAgIC4uLmRlY2xhcmF0aW9uLFxuICAgICAgICAvLyBSZXZva2VkIHdpdGggdGhlIFNVUkZBQ0UsIG5vdCB3aXRoIHRoZSBwbHVnaW46IGEgcGx1Z2luIHdob3NlIGRlcGVuZGVuY3kgZ29lcyBhd2F5IGtlZXBzIHJ1bm5pbmdcbiAgICAgICAgLy8gaXRzIHVuaXZlcnNhbCBjb21wb25lbnRzLCBhbmQgYSBjb25zdW1lciBtdXN0IG5vdCBiZSBsZWZ0IGhvbGRpbmcgYSBoYW5kbGUgaW50byB0aGUgaGFsZiBvZiBpdFxuICAgICAgICAvLyB0aGF0IHdhcyBqdXN0IHRvcm4gZG93bi5cbiAgICAgICAgY29tcG9uZW50OiBnYXRlZFdyYXBwZXJDb21wb25lbnQsXG4gICAgICAgIHBsdWdpbjogdGhpc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5icm9hZGNhc3RMb2FkZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29tcG9uZW50PFRLZXkgZXh0ZW5kcyBrZXlvZiBQbHVnaW5CYXNlQ29tcG9uZW50cz4oa2V5OiBUS2V5LCB2YWx1ZTogTm9uTnVsbGFibGU8UGx1Z2luQmFzZUNvbXBvbmVudHNbVEtleV0+KTogdm9pZCB7XG4gICAgY29uc3Qgb2xkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzW2tleV07XG4gICAgaWYgKG9sZENvbXBvbmVudCkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZChvbGRDb21wb25lbnQpO1xuICAgIH1cbiAgICB0aGlzLmNvbXBvbmVudHNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXJzIHRoZSBzdWJjbGFzcydzIGZlYXR1cmUgc3VyZmFjZSBkb3duLCBsZWF2aW5nIHRoZSB1bml2ZXJzYWwgY29tcG9uZW50cyBydW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB1bmxvYWRGZWF0dXJlU3VyZmFjZSgpOiB2b2lkIHtcbiAgICBjb25zdCBnYXRlZFdyYXBwZXJDb21wb25lbnQgPSB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudDtcblxuICAgIC8vIFJlcGxhY2VkIEJFRk9SRSB0aGUgb2xkIG9uZSBpcyB1bmxvYWRlZCwgc28gYW55dGhpbmcgdGhhdCByZXN1bWVzIG1pZC10ZWFyZG93biBhbmQgY2FsbHMgYGFkZENoaWxkYFxuICAgIC8vIHBhcmtzIGl0cyBjaGlsZCBvbiB0aGUgZnJlc2ggc3VyZmFjZSByYXRoZXIgdGhhbiBvbiB0aGUgb25lIGJlaW5nIHRvcm4gZG93biDigJQgd2hlcmUgYENvbXBvbmVudEV4YFxuICAgIC8vIHdvdWxkIHJlZnVzZSBpdCBvdXRyaWdodCwgc2luY2UgaXQgcmVmdXNlcyBjaGlsZHJlbiBhZGRlZCB0byBhbiBhbHJlYWR5LXVubG9hZGVkIGNvbXBvbmVudC5cbiAgICB0aGlzLmdhdGVkV3JhcHBlckNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRFeCgpO1xuICAgIHRoaXMuaGFzVW5sb2FkZWRGZWF0dXJlU3VyZmFjZSA9IHRydWU7XG4gICAgdGhpcy51bml2ZXJzYWxXcmFwcGVyQ29tcG9uZW50LnJlbW92ZUNoaWxkKGdhdGVkV3JhcHBlckNvbXBvbmVudCk7XG5cbiAgICB0aGlzLmJyb2FkY2FzdFVubG9hZGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JQcmV2aW91c0FzeW5jQ2xlYW51cHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZW91dEluTWlsbGlzZWNvbmRzID0gdGhpcy5nZXRBc3luY0NsZWFudXBUaW1lb3V0SW5NaWxsaXNlY29uZHMoKTtcbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLmdldEFzeW5jQ2xlYW51cE5vdGljZUNvbXBvbmVudCgpO1xuICAgIC8vIFNob3duIG9ubHkgb25jZSB0aGUgd2FpdCBvdXRsYXN0cyB0aGUgZGVsYXksIHNvIHRoZSB1c3VhbCB3YWl0IG9mIGEgZmV3IG1pbGxpc2Vjb25kcyBzaG93cyBub3RoaW5nLiBTZXBhcmF0ZSwgc29cbiAgICAvLyBpdCBuZXZlciB0YWtlcyB0aGUgc2xvdCBvZiBhIG5vdGljZSB0aGUgZ2F0ZSBzaG93cyBhYm91dCB0aGUgc2FtZSBwbHVnaW4uXG4gICAgY29uc3QgcGF1c2VkTm90aWNlID0gcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5KHtcbiAgICAgIGNvbnRlbnQ6ICgpID0+IHQoKCQpID0+ICQub2JzaWRpYW5MaWIubm90aWNlcy5wbHVnaW5Mb2FkUGF1c2VkKSxcbiAgICAgIGRlbGF5SW5NaWxsaXNlY29uZHM6IHRoaXMuZ2V0QXN5bmNDbGVhbnVwTm90aWNlRGVsYXlJbk1pbGxpc2Vjb25kcygpLFxuICAgICAgbW9kZTogUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZVxuICAgIH0pO1xuXG4gICAgbGV0IGRpZFNldHRsZTogYm9vbGVhbjtcbiAgICB0cnkge1xuICAgICAgZGlkU2V0dGxlID0gYXdhaXQgZGlkUGx1Z2luQXN5bmNDbGVhbnVwc1NldHRsZSh7IHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHBhdXNlZE5vdGljZS5kaXNwb3NlKCk7XG4gICAgfVxuXG4gICAgaWYgKGRpZFNldHRsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybihgUGx1Z2luICR7dGhpcy5tYW5pZmVzdC5pZH06IHRoZSBwcmV2aW91cyBpbnN0YW5jZSdzIGFzeW5jIGNsZWFudXBzIGRpZCBub3QgZmluaXNoIGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1zOyBsb2FkaW5nIGFueXdheS5gKTtcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm5vdGljZXMucGx1Z2luTG9hZFBhdXNlVGltZWRPdXQpLCB7IG1vZGU6IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBzcGVjaWZpZWQgcGx1Z2luIGJ5IGRpc2FibGluZyBhbmQgdGhlbiByZS1lbmFibGluZyBpdC5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byByZWxvYWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHBsdWdpbiBpcyByZWxvYWRlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFBsdWdpbkVuYWJsZVJlZnVzZWRFcnJvcn0gSWYgT2JzaWRpYW4gcmVmdXNlZCB0byBlbmFibGUgdGhlIHBsdWdpbiBhZ2Fpbiwgd2hpY2ggbGVhdmVzIGl0XG4gKiBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZFBsdWdpbihwbHVnaW46IFBsdWdpbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwbHVnaW5zID0gcGx1Z2luLmFwcC5wbHVnaW5zO1xuICBjb25zdCBwbHVnaW5JZCA9IHBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgYXdhaXQgcGx1Z2lucy5kaXNhYmxlUGx1Z2luKHBsdWdpbklkKTtcbiAgaWYgKCFhd2FpdCBwbHVnaW5zLmVuYWJsZVBsdWdpbihwbHVnaW5JZCkpIHtcbiAgICB0aHJvdyBuZXcgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yKHBsdWdpbklkKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UgYXMgYSBub3RpY2UsIGxvZ3MgaXQgdG8gdGhlIGNvbnNvbGUsIGFuZCBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBkaXNhYmxlLlxuICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IGFuZCBsb2cuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHBsdWdpbiBpcyBkaXNhYmxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNob3dFcnJvckFuZERpc2FibGVQbHVnaW4ocGx1Z2luOiBQbHVnaW4sIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBuZXcgUGx1Z2luTm90aWNlQ29tcG9uZW50KHtcbiAgICBhcHA6IHBsdWdpbi5hcHAsXG4gICAgcGx1Z2luTmFtZTogcGx1Z2luLm1hbmlmZXN0Lm5hbWVcbiAgfSk7XG4gIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKG1lc3NhZ2UpO1xuICBwcmludEVycm9yKG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gIGF3YWl0IHBsdWdpbi5hcHAucGx1Z2lucy5kaXNhYmxlUGx1Z2luKHBsdWdpbi5tYW5pZmVzdC5pZCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZXZlcnkgZmFpbHVyZSBpbiBhbiBlcnJvciB0cmVlIGlzIGEge0BsaW5rIFNpbGVudEVycm9yfS5cbiAqXG4gKiBXYWxrcyBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCBhbmQgYGNhdXNlYCwgc28gdGhlIGBBZ2dyZWdhdGVFcnJvcmAgbmVzdGluZyB0aGF0IHRoZSBjb21wb25lbnQgbG9hZHMgd3JhcCBhIHNpbmdsZVxuICogdGhyb3cgaW4gaXMgc2VlbiB0aHJvdWdoLiBBbiBlcnJvciB0aGF0IGlzIG5laXRoZXIgYSB7QGxpbmsgU2lsZW50RXJyb3J9LCBhbiBhZ2dyZWdhdGUgbm9yIGEgd3JhcHBlciB3aXRoIGEgY2F1c2UgaXNcbiAqIGEgcmVhbCBmYWlsdXJlLCBhbmQgc28gaXMgYW4gZW1wdHkgYWdncmVnYXRlLCB3aGljaCBzYXlzIG5vdGhpbmcgYWJvdXQgd2hhdCB3ZW50IHdyb25nLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB0cmVlIGhvbGRzIGF0IGxlYXN0IG9uZSB7QGxpbmsgU2lsZW50RXJyb3J9IGFuZCBub3RoaW5nIGVsc2UuXG4gKi9cbmZ1bmN0aW9uIGlzU2lsZW50RXJyb3JUcmVlKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBlbmRpbmdFcnJvcnM6IHVua25vd25bXSA9IFtlcnJvcl07XG5cbiAgd2hpbGUgKHBlbmRpbmdFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHBlbmRpbmdFcnJvciA9IHBlbmRpbmdFcnJvcnMucG9wKCk7XG4gICAgaWYgKHBlbmRpbmdFcnJvciBpbnN0YW5jZW9mIFNpbGVudEVycm9yKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ0Vycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gcGVuZGluZ0Vycm9yLmVycm9ycztcbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHBlbmRpbmdFcnJvcnMucHVzaCguLi5lcnJvcnMpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdFcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIHBlbmRpbmdFcnJvci5jYXVzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwZW5kaW5nRXJyb3JzLnB1c2gocGVuZGluZ0Vycm9yLmNhdXNlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEV2ZXJ5IGxlYWYgd2FzIGEgYFNpbGVudEVycm9yYCwgYW5kIHRoZXJlIHdhcyBhdCBsZWFzdCBvbmUsIHNpbmNlIHRoZSB3YWxrIHN0YXJ0cyBmcm9tIG9uZSBlcnJvciBhbmQgYW4gZW1wdHlcbiAgLy8gYWdncmVnYXRlIHJldHVybnMgYWJvdmUuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBLDBCQUFpQztBQUNqQyxtQkFHTztBQUNQLHNCQUEwQjtBQUMxQix5QkFBa0M7QUFDbEMsc0JBQXVCO0FBY3ZCLGtDQUFzQztBQUN0Qyx1Q0FBd0M7QUFDeEMsZ0RBQStDO0FBQy9DLCtCQUF1QztBQUN2QywrQkFBeUM7QUFDekMsb0NBQXFDO0FBQ3JDLDJDQUEyQztBQUMzQywwQkFBNEI7QUFDNUIscUNBQXNDO0FBQ3RDLDRDQUE0QztBQUM1QywrREFBNkQ7QUFDN0Qsc0NBQXVDO0FBQ3ZDLG1DQUFvQztBQUNwQyxxQ0FHTztBQUNQLHVDQUE0QztBQUM1QywwQkFBa0M7QUFDbEMsbUJBQXVDO0FBQ3ZDLGtCQUdPO0FBQ1AsOEJBQXVDO0FBQ3ZDLDJCQUFzQztBQUN0Qyx3QkFBaUM7QUFDakMsa0NBTU87QUFDUCxpQ0FBc0M7QUFDdEMscUNBSU87QUF5QkEsTUFBZSx1QkFBbUIsc0NBQWlDLEVBQUUsc0JBQU0sRUFBK0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNL0csSUFBYyx1QkFBNkM7QUFDekQsZUFBTyxzQ0FBa0IsS0FBSyxXQUFXLG9CQUFvQjtBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsSUFBYyxxQkFBcUIsT0FBNkI7QUFDOUQsU0FBSyxhQUFhLHdCQUF3QixLQUFLO0FBQUEsRUFDakQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFjLDZCQUF5RDtBQUNyRSxlQUFPLHNDQUFrQixLQUFLLFdBQVcsMEJBQTBCO0FBQUEsRUFD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
@@ -9,7 +9,7 @@
9
9
  import type { Component, IconName } from 'obsidian' with { 'resolution-mode': 'import' };
10
10
  import type { Promisable } from 'type-fest' with { 'resolution-mode': 'import' };
11
11
  import { Plugin } from 'obsidian';
12
- import type { PluginConflict, PluginDependency } from '../components/plugin-gate-component.cjs';
12
+ import type { DeclaredPluginDependency, PluginConflict } from '../components/plugin-gate-component.cjs';
13
13
  import type { TranslationsMap } from '../i18n/i18n.cjs';
14
14
  import type { PluginApiDeclaration } from './plugin-api.cjs';
15
15
  import type { PluginEventMap, PluginEventSource } from './plugin-event-source.cjs';
@@ -152,6 +152,7 @@ export declare abstract class PluginBase extends PluginBase_base implements Plug
152
152
  protected set resourceLockComponent(value: ResourceLockComponent);
153
153
  private readonly components;
154
154
  private gatedWrapperComponent;
155
+ private hasUnloadedFeatureSurface;
155
156
  private lifecycleEventPayload;
156
157
  private readonly universalWrapperComponent;
157
158
  /**
@@ -222,6 +223,16 @@ export declare abstract class PluginBase extends PluginBase_base implements Plug
222
223
  * @returns The translations map.
223
224
  */
224
225
  protected createTranslationsMap(): TranslationsMap;
226
+ /**
227
+ * Provides how long a new instance waits for the previous instance's async cleanups before it tells the user that
228
+ * its load is paused.
229
+ *
230
+ * Most cleanups settle within milliseconds, so a notice on every reload would only flash. Override in subclass to
231
+ * change it. The default is 500 milliseconds.
232
+ *
233
+ * @returns The delay in milliseconds.
234
+ */
235
+ protected getAsyncCleanupNoticeDelayInMilliseconds(): number;
225
236
  /**
226
237
  * Provides how long a new instance waits for the previous instance's async cleanups before loading anyway.
227
238
  *
@@ -289,13 +300,15 @@ export declare abstract class PluginBase extends PluginBase_base implements Plug
289
300
  * settings banner that installs the missing plugin in one click. The load completes the moment the
290
301
  * dependency arrives, with no restart.
291
302
  *
292
- * A dependency must publish an API through `publishPluginApi`, which is what makes its presence,
293
- * absence, version and departure all observable through one mechanism. A plugin with nothing to expose
294
- * can publish an empty API purely so it can be depended upon.
303
+ * A plugin built on this library is declared as a `PluginDependency`: it must publish an API through
304
+ * `publishPluginApi`, which is what makes its presence, absence, version and departure all observable
305
+ * through one mechanism. A plugin with nothing to expose can publish an empty API purely so it can be
306
+ * depended upon. A THIRD-PARTY plugin, which publishes nothing there, is declared through its adapter with
307
+ * `createThirdPartyPluginDependency`, and the gate reads its API the way the adapter says.
295
308
  *
296
309
  * @returns The declared dependencies.
297
310
  */
298
- protected getPluginDependencies(): PluginDependency[];
311
+ protected getPluginDependencies(): DeclaredPluginDependency[];
299
312
  /**
300
313
  * Called during {@link onload} to wire plugin-specific child components.
301
314
  *
@@ -352,6 +365,23 @@ export declare abstract class PluginBase extends PluginBase_base implements Plug
352
365
  * got past its dependency gate never announced itself, and must not announce a departure either.
353
366
  */
354
367
  private broadcastUnloaded;
368
+ /**
369
+ * Provides the notice component for the cleanup wait.
370
+ *
371
+ * The wait in {@link onload} runs before the universal notice component exists, so that path gets a standalone
372
+ * one. It is never unloaded, because unloading hides its notice, and the timeout notice must stay readable after the
373
+ * wait. It holds nothing but the notices it shows, which hide themselves.
374
+ *
375
+ * @returns The notice component.
376
+ */
377
+ private getAsyncCleanupNoticeComponent;
378
+ /**
379
+ * Checks whether a feature surface whose load is in progress has since been torn down or replaced.
380
+ *
381
+ * @param gatedWrapperComponent - The surface being loaded.
382
+ * @returns `true` when the surface is no longer the plugin's live one.
383
+ */
384
+ private isFeatureSurfaceGone;
355
385
  /**
356
386
  * Builds and loads the subclass's feature surface, then publishes its APIs and announces itself.
357
387
  *