obsidian-dev-utils 85.1.0 → 86.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/@types/obsidian-integration-testing/package.json +4 -0
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +14 -8
  4. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +18 -0
  5. package/dist/lib/cjs/__merged.cjs +1291 -0
  6. package/dist/lib/cjs/__merged.d.cts +165 -0
  7. package/dist/lib/cjs/abort-controller.cjs +3 -4
  8. package/dist/lib/cjs/async.cjs +13 -7
  9. package/dist/lib/cjs/async.d.cts +6 -0
  10. package/dist/lib/cjs/disposable.cjs +224 -3
  11. package/dist/lib/cjs/disposable.d.cts +222 -2
  12. package/dist/lib/cjs/error.cjs +41 -3
  13. package/dist/lib/cjs/error.d.cts +50 -1
  14. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  15. package/dist/lib/cjs/index.cjs +4 -1
  16. package/dist/lib/cjs/index.d.cts +1 -0
  17. package/dist/lib/cjs/obsidian/attachment-path.cjs +3 -3
  18. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +27 -11
  19. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +14 -9
  20. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +4 -1
  21. package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
  22. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +195 -0
  23. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +65 -0
  24. package/dist/lib/cjs/obsidian/community-plugins.cjs +156 -0
  25. package/dist/lib/cjs/obsidian/community-plugins.d.cts +22 -0
  26. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +8 -8
  27. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +9 -3
  28. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +17 -2
  29. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +17 -0
  30. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +161 -22
  31. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +81 -8
  32. package/dist/lib/cjs/obsidian/css-class.cjs +4 -1
  33. package/dist/lib/cjs/obsidian/css-class.d.cts +13 -0
  34. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +239 -0
  35. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +45 -0
  36. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +215 -0
  37. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +135 -0
  38. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +3 -1
  39. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +2 -0
  40. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +2 -0
  41. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  42. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  43. package/dist/lib/cjs/obsidian/link.cjs +2 -2
  44. package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
  45. package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
  46. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +15 -2
  47. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +18 -3
  48. package/dist/lib/cjs/obsidian/modals/select-option.cjs +182 -0
  49. package/dist/lib/cjs/obsidian/modals/select-option.d.cts +65 -0
  50. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +4 -1
  51. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +6 -0
  52. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +50 -3
  53. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +17 -0
  54. package/dist/lib/cjs/obsidian/workspace.cjs +8 -1
  55. package/dist/lib/cjs/obsidian/workspace.d.cts +10 -0
  56. package/dist/lib/cjs/path.cjs +4 -4
  57. package/dist/lib/cjs/path.d.cts +1 -1
  58. package/dist/lib/cjs/script-utils/demo-vault.cjs +177 -0
  59. package/dist/lib/cjs/script-utils/demo-vault.d.cts +23 -0
  60. package/dist/lib/cjs/script-utils/exec.cjs +75 -34
  61. package/dist/lib/cjs/script-utils/exec.d.cts +34 -0
  62. package/dist/lib/cjs/script-utils/index.cjs +9 -3
  63. package/dist/lib/cjs/script-utils/index.d.cts +2 -0
  64. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -5
  65. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +5 -1
  66. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +8 -0
  67. package/dist/lib/cjs/script-utils/version.cjs +8 -1
  68. package/dist/lib/cjs/script-utils/version.d.cts +8 -0
  69. package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +157 -0
  70. package/dist/lib/cjs/script-utils/warnings-as-errors.d.cts +27 -0
  71. package/dist/lib/cjs/setup.cjs +75 -4
  72. package/dist/lib/cjs/setup.d.cts +29 -7
  73. package/dist/lib/cjs/string.cjs +7 -4
  74. package/dist/lib/cjs/string.d.cts +11 -1
  75. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +18 -0
  76. package/dist/lib/esm/__merged.d.mts +165 -0
  77. package/dist/lib/esm/__merged.mjs +1134 -0
  78. package/dist/lib/esm/abort-controller.mjs +7 -5
  79. package/dist/lib/esm/async.d.mts +6 -0
  80. package/dist/lib/esm/async.mjs +13 -7
  81. package/dist/lib/esm/disposable.d.mts +222 -2
  82. package/dist/lib/esm/disposable.mjs +215 -2
  83. package/dist/lib/esm/error.d.mts +50 -1
  84. package/dist/lib/esm/error.mjs +41 -4
  85. package/dist/lib/esm/generated-during-build.mjs +2 -2
  86. package/dist/lib/esm/index.d.mts +1 -0
  87. package/dist/lib/esm/index.mjs +3 -1
  88. package/dist/lib/esm/obsidian/attachment-path.mjs +4 -4
  89. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +14 -9
  90. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +31 -11
  91. package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
  92. package/dist/lib/esm/obsidian/command-handlers/index.mjs +3 -1
  93. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +65 -0
  94. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +77 -0
  95. package/dist/lib/esm/obsidian/community-plugins.d.mts +22 -0
  96. package/dist/lib/esm/obsidian/community-plugins.mjs +48 -0
  97. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +9 -3
  98. package/dist/lib/esm/obsidian/components/disposable-component.mjs +8 -8
  99. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +17 -0
  100. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +17 -2
  101. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +81 -8
  102. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +163 -23
  103. package/dist/lib/esm/obsidian/css-class.d.mts +13 -0
  104. package/dist/lib/esm/obsidian/css-class.mjs +4 -1
  105. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +45 -0
  106. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +121 -0
  107. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +135 -0
  108. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +103 -0
  109. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +2 -0
  110. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +3 -1
  111. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +2 -0
  112. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  113. package/dist/lib/esm/obsidian/index.mjs +7 -1
  114. package/dist/lib/esm/obsidian/link.mjs +3 -3
  115. package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
  116. package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
  117. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +18 -3
  118. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +17 -3
  119. package/dist/lib/esm/obsidian/modals/select-option.d.mts +65 -0
  120. package/dist/lib/esm/obsidian/modals/select-option.mjs +77 -0
  121. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +6 -0
  122. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +4 -1
  123. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +17 -0
  124. package/dist/lib/esm/obsidian/plugin/plugin.mjs +50 -3
  125. package/dist/lib/esm/obsidian/workspace.d.mts +10 -0
  126. package/dist/lib/esm/obsidian/workspace.mjs +7 -1
  127. package/dist/lib/esm/path.d.mts +1 -1
  128. package/dist/lib/esm/path.mjs +3 -3
  129. package/dist/lib/esm/script-utils/demo-vault.d.mts +23 -0
  130. package/dist/lib/esm/script-utils/demo-vault.mjs +63 -0
  131. package/dist/lib/esm/script-utils/exec.d.mts +34 -0
  132. package/dist/lib/esm/script-utils/exec.mjs +73 -34
  133. package/dist/lib/esm/script-utils/index.d.mts +2 -0
  134. package/dist/lib/esm/script-utils/index.mjs +6 -2
  135. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -5
  136. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +8 -0
  137. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +5 -1
  138. package/dist/lib/esm/script-utils/version.d.mts +8 -0
  139. package/dist/lib/esm/script-utils/version.mjs +8 -1
  140. package/dist/lib/esm/script-utils/warnings-as-errors.d.mts +27 -0
  141. package/dist/lib/esm/script-utils/warnings-as-errors.mjs +38 -0
  142. package/dist/lib/esm/setup.d.mts +29 -7
  143. package/dist/lib/esm/setup.mjs +78 -4
  144. package/dist/lib/esm/string.d.mts +11 -1
  145. package/dist/lib/esm/string.mjs +5 -3
  146. package/dist/styles.css +33 -3
  147. package/obsidian/command-handlers/open-demo-vault-command-handler/package.json +6 -0
  148. package/obsidian/community-plugins/package.json +6 -0
  149. package/obsidian/desktop-demo-vault-opener/package.json +6 -0
  150. package/obsidian/desktop-trusted-input/package.json +6 -0
  151. package/obsidian/modals/select-option/package.json +6 -0
  152. package/package.json +22 -9
  153. package/script-utils/demo-vault/package.json +6 -0
  154. package/script-utils/warnings-as-errors/package.json +6 -0
  155. package/dist/dev/main.js +0 -32702
  156. package/dist/dev/manifest.json +0 -9
  157. /package/obsidian/@types/{Dataview → dataview}/api/data-array/package.json +0 -0
  158. /package/obsidian/@types/{Dataview → dataview}/api/extensions/package.json +0 -0
  159. /package/obsidian/@types/{Dataview → dataview}/api/inline-api/package.json +0 -0
  160. /package/obsidian/@types/{Dataview → dataview}/api/plugin-api/package.json +0 -0
  161. /package/obsidian/@types/{Dataview → dataview}/api/result/package.json +0 -0
  162. /package/obsidian/@types/{Dataview → dataview}/data-import/common/package.json +0 -0
  163. /package/obsidian/@types/{Dataview → dataview}/data-import/csv/package.json +0 -0
  164. /package/obsidian/@types/{Dataview → dataview}/data-import/inline-field/package.json +0 -0
  165. /package/obsidian/@types/{Dataview → dataview}/data-import/markdown-file/package.json +0 -0
  166. /package/obsidian/@types/{Dataview → dataview}/data-import/persister/package.json +0 -0
  167. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-entry/package.json +0 -0
  168. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-impl/package.json +0 -0
  169. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-manager/package.json +0 -0
  170. /package/obsidian/@types/{Dataview → dataview}/data-index/index/package.json +0 -0
  171. /package/obsidian/@types/{Dataview → dataview}/data-index/package.json +0 -0
  172. /package/obsidian/@types/{Dataview → dataview}/data-index/resolver/package.json +0 -0
  173. /package/obsidian/@types/{Dataview → dataview}/data-index/source/package.json +0 -0
  174. /package/obsidian/@types/{Dataview → dataview}/data-model/markdown/package.json +0 -0
  175. /package/obsidian/@types/{Dataview → dataview}/data-model/serialized/markdown/package.json +0 -0
  176. /package/obsidian/@types/{Dataview → dataview}/data-model/transferable/package.json +0 -0
  177. /package/obsidian/@types/{Dataview → dataview}/data-model/value/package.json +0 -0
  178. /package/obsidian/@types/{Dataview → dataview}/expression/binaryop/package.json +0 -0
  179. /package/obsidian/@types/{Dataview → dataview}/expression/context/package.json +0 -0
  180. /package/obsidian/@types/{Dataview → dataview}/expression/field/package.json +0 -0
  181. /package/obsidian/@types/{Dataview → dataview}/expression/functions/package.json +0 -0
  182. /package/obsidian/@types/{Dataview → dataview}/expression/parse/package.json +0 -0
  183. /package/obsidian/@types/{Dataview → dataview}/index/package.json +0 -0
  184. /package/obsidian/@types/{Dataview → dataview}/main/package.json +0 -0
  185. /package/obsidian/@types/{Dataview → dataview}/package.json +0 -0
  186. /package/obsidian/@types/{Dataview → dataview}/query/engine/package.json +0 -0
  187. /package/obsidian/@types/{Dataview → dataview}/query/parse/package.json +0 -0
  188. /package/obsidian/@types/{Dataview → dataview}/query/query/package.json +0 -0
  189. /package/obsidian/@types/{Dataview → dataview}/settings/package.json +0 -0
  190. /package/obsidian/@types/{Dataview → dataview}/typings/obsidian-ex/package.json +0 -0
  191. /package/obsidian/@types/{Dataview → dataview}/typings/workers/package.json +0 -0
  192. /package/obsidian/@types/{Dataview → dataview}/ui/export/markdown/package.json +0 -0
  193. /package/obsidian/@types/{Dataview → dataview}/ui/lp-render/package.json +0 -0
  194. /package/obsidian/@types/{Dataview → dataview}/ui/markdown/package.json +0 -0
  195. /package/obsidian/@types/{Dataview → dataview}/ui/refreshable-view/package.json +0 -0
  196. /package/obsidian/@types/{Dataview → dataview}/ui/render/package.json +0 -0
  197. /package/obsidian/@types/{Dataview → dataview}/ui/views/calendar-view/package.json +0 -0
  198. /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-field-live-preview/package.json +0 -0
  199. /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-view/package.json +0 -0
  200. /package/obsidian/@types/{Dataview → dataview}/ui/views/js-view/package.json +0 -0
  201. /package/obsidian/@types/{Dataview → dataview}/ui/views/list-view/package.json +0 -0
  202. /package/obsidian/@types/{Dataview → dataview}/ui/views/table-view/package.json +0 -0
  203. /package/obsidian/@types/{Dataview → dataview}/ui/views/task-view/package.json +0 -0
  204. /package/obsidian/@types/{Dataview → dataview}/util/hash/package.json +0 -0
  205. /package/obsidian/@types/{Dataview → dataview}/util/locale/package.json +0 -0
  206. /package/obsidian/@types/{Dataview → dataview}/util/media/package.json +0 -0
  207. /package/obsidian/@types/{Dataview → dataview}/util/normalize/package.json +0 -0
  208. /package/obsidian/{App → app}/package.json +0 -0
  209. /package/obsidian/{Backlink → backlink}/package.json +0 -0
  210. /package/obsidian/{Callout → callout}/package.json +0 -0
  211. /package/obsidian/{Components → components}/abort-signal-component/package.json +0 -0
  212. /package/obsidian/{Components → components}/all-windows-event-component/package.json +0 -0
  213. /package/obsidian/{Components → components}/async-error-handler-component/package.json +0 -0
  214. /package/obsidian/{Components → components}/async-events-component/package.json +0 -0
  215. /package/obsidian/{Components → components}/case-insensitive-file-index-component/package.json +0 -0
  216. /package/obsidian/{Components → components}/component-ex/package.json +0 -0
  217. /package/obsidian/{Components → components}/console-debug-component/package.json +0 -0
  218. /package/obsidian/{Components → components}/disposable-component/package.json +0 -0
  219. /package/obsidian/{Components → components}/embed-extensions-component/package.json +0 -0
  220. /package/obsidian/{Components → components}/generate-markdown-link-default-params-component/package.json +0 -0
  221. /package/obsidian/{Components → components}/index/package.json +0 -0
  222. /package/obsidian/{Components → components}/layout-ready-component/package.json +0 -0
  223. /package/obsidian/{Components → components}/menu-event-registrar-component/package.json +0 -0
  224. /package/obsidian/{Components → components}/monkey-around-component/package.json +0 -0
  225. /package/obsidian/{Components → components}/package.json +0 -0
  226. /package/obsidian/{Components → components}/plugin-context-component/package.json +0 -0
  227. /package/obsidian/{Components → components}/plugin-notice-component/package.json +0 -0
  228. /package/obsidian/{Components → components}/plugin-settings-component/package.json +0 -0
  229. /package/obsidian/{Components → components}/plugin-settings-tab-component/package.json +0 -0
  230. /package/obsidian/{Components → components}/registry-component/package.json +0 -0
  231. /package/obsidian/{Components → components}/rename-delete-handler-component/package.json +0 -0
  232. /package/obsidian/{Dataview → dataview}/package.json +0 -0
  233. /package/obsidian/{Editor → editor}/package.json +0 -0
  234. /package/obsidian/{Frontmatter → frontmatter}/package.json +0 -0
  235. /package/obsidian/{Link → link}/package.json +0 -0
  236. /package/obsidian/{Logger → logger}/package.json +0 -0
  237. /package/obsidian/{Loop → loop}/package.json +0 -0
  238. /package/obsidian/{Markdown → markdown}/package.json +0 -0
  239. /package/obsidian/{Modals/Alert → modals/alert}/package.json +0 -0
  240. /package/obsidian/{Modals/Confirm → modals/confirm}/package.json +0 -0
  241. /package/obsidian/{Modals → modals}/index/package.json +0 -0
  242. /package/obsidian/{Modals → modals}/minimizable-modal/package.json +0 -0
  243. /package/obsidian/{Modals → modals}/modal/package.json +0 -0
  244. /package/obsidian/{Modals → modals}/package.json +0 -0
  245. /package/obsidian/{Modals/Prompt → modals/prompt}/package.json +0 -0
  246. /package/obsidian/{Modals → modals}/select-item/package.json +0 -0
  247. /package/obsidian/{Modals → modals}/suggest-modal-command-builder/package.json +0 -0
  248. /package/obsidian/{Pdf → pdf}/package.json +0 -0
  249. /package/obsidian/{Plugin → plugin}/index/package.json +0 -0
  250. /package/obsidian/{Plugin → plugin}/obsidian-plugin-repo-paths/package.json +0 -0
  251. /package/obsidian/{Plugin → plugin}/package.json +0 -0
  252. /package/obsidian/{Plugin/Plugin → plugin/plugin}/package.json +0 -0
  253. /package/obsidian/{Plugin → plugin}/plugin-context/package.json +0 -0
  254. /package/obsidian/{Plugin → plugin}/plugin-event-source/package.json +0 -0
  255. /package/obsidian/{Plugin → plugin}/plugin-settings-tab/package.json +0 -0
  256. /package/obsidian/{Queue → queue}/package.json +0 -0
  257. /package/obsidian/{React → react}/app-context/package.json +0 -0
  258. /package/obsidian/{React → react}/index/package.json +0 -0
  259. /package/obsidian/{React → react}/package.json +0 -0
  260. /package/obsidian/{Reference → reference}/package.json +0 -0
  261. /package/obsidian/{Validation → validation}/package.json +0 -0
  262. /package/obsidian/{Vault → vault}/package.json +0 -0
  263. /package/obsidian/{Workspace → workspace}/package.json +0 -0
  264. /package/{Transformers → transformers}/date-transformer/package.json +0 -0
  265. /package/{Transformers → transformers}/duration-transformer/package.json +0 -0
  266. /package/{Transformers → transformers}/group-transformer/package.json +0 -0
  267. /package/{Transformers → transformers}/index/package.json +0 -0
  268. /package/{Transformers → transformers}/map-transformer/package.json +0 -0
  269. /package/{Transformers → transformers}/package.json +0 -0
  270. /package/{Transformers → transformers}/set-transformer/package.json +0 -0
  271. /package/{Transformers → transformers}/skip-private-property-transformer/package.json +0 -0
  272. /package/{Transformers/Transformer → transformers/transformer}/package.json +0 -0
  273. /package/{Transformers → transformers}/two-way-map-transformer/package.json +0 -0
  274. /package/{Transformers → transformers}/typed-transformer/package.json +0 -0
@@ -5,6 +5,36 @@
5
5
  * Disposable utilities for `using` / `await using` declarations.
6
6
  */
7
7
  import type { Promisable } from 'type-fest';
8
+ /**
9
+ * Determines the error semantics of a {@link CombineDisposable} or {@link CombineAsyncDisposable} when
10
+ * one of its children throws while being disposed.
11
+ */
12
+ export declare enum DisposeErrorBehavior {
13
+ /**
14
+ * Dispose every child even if some of them throw, collecting the thrown errors and re-throwing them
15
+ * as a single {@link AggregateError} once all children have been disposed.
16
+ */
17
+ Aggregate = 0,
18
+ /**
19
+ * Re-throw the first error a child throws immediately, leaving the remaining children undisposed.
20
+ */
21
+ FailFast = 1
22
+ }
23
+ /**
24
+ * Determines the order in which a {@link CombineDisposable} or {@link CombineAsyncDisposable} disposes
25
+ * its children.
26
+ */
27
+ export declare enum DisposeOrder {
28
+ /**
29
+ * Dispose the last-registered child first (last-in, first-out), like nested `using` declarations
30
+ * unwinding in reverse.
31
+ */
32
+ Lifo = 0,
33
+ /**
34
+ * Dispose the first-registered child first (first-in, first-out).
35
+ */
36
+ Fifo = 1
37
+ }
8
38
  /**
9
39
  * Determines how a {@link CallbackDisposable} or {@link AsyncCallbackDisposable} behaves when it is
10
40
  * disposed more than once.
@@ -38,6 +68,19 @@ export interface AsyncCallbackDisposableConstructorParams {
38
68
  */
39
69
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
40
70
  }
71
+ /**
72
+ * An {@link AsyncDisposable} that additionally exposes a convenience {@link AsyncDisposableEx.asyncDispose}
73
+ * method, so a stored handle can be disposed as `handle.asyncDispose()` instead of the clunkier
74
+ * `handle[Symbol.asyncDispose]()`.
75
+ */
76
+ export interface AsyncDisposableEx extends AsyncDisposable {
77
+ /**
78
+ * Disposes the object. Delegates to `this[Symbol.asyncDispose]()`.
79
+ *
80
+ * @returns A {@link Promise} that resolves once disposal completes.
81
+ */
82
+ asyncDispose(): Promise<void>;
83
+ }
41
84
  /**
42
85
  * A callback invoked when an {@link AsyncCallbackDisposable} is disposed.
43
86
  */
@@ -57,6 +100,70 @@ export interface CallbackDisposableConstructorParams {
57
100
  */
58
101
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
59
102
  }
103
+ /**
104
+ * The parameters for constructing a {@link CombineAsyncDisposable}.
105
+ */
106
+ export interface CombineAsyncDisposableConstructorParams {
107
+ /**
108
+ * The async disposables to dispose when the combiner is disposed.
109
+ */
110
+ readonly asyncDisposables: Iterable<AsyncDisposable>;
111
+ /**
112
+ * The order in which the children are disposed.
113
+ *
114
+ * @default {@link DisposeOrder.Lifo}
115
+ */
116
+ readonly disposeOrder?: DisposeOrder;
117
+ /**
118
+ * How the combiner behaves when one of its children throws while being disposed.
119
+ *
120
+ * @default {@link DisposeErrorBehavior.Aggregate}
121
+ */
122
+ readonly errorBehavior?: DisposeErrorBehavior;
123
+ /**
124
+ * How the combiner behaves when it is disposed more than once.
125
+ *
126
+ * @default {@link MultipleDisposeBehavior.Invoke}
127
+ */
128
+ readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
129
+ }
130
+ /**
131
+ * The parameters for constructing a {@link CombineDisposable}.
132
+ */
133
+ export interface CombineDisposableConstructorParams {
134
+ /**
135
+ * The disposables to dispose when the combiner is disposed.
136
+ */
137
+ readonly disposables: Iterable<Disposable>;
138
+ /**
139
+ * The order in which the children are disposed.
140
+ *
141
+ * @default {@link DisposeOrder.Lifo}
142
+ */
143
+ readonly disposeOrder?: DisposeOrder;
144
+ /**
145
+ * How the combiner behaves when one of its children throws while being disposed.
146
+ *
147
+ * @default {@link DisposeErrorBehavior.Aggregate}
148
+ */
149
+ readonly errorBehavior?: DisposeErrorBehavior;
150
+ /**
151
+ * How the combiner behaves when it is disposed more than once.
152
+ *
153
+ * @default {@link MultipleDisposeBehavior.Invoke}
154
+ */
155
+ readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
156
+ }
157
+ /**
158
+ * A {@link Disposable} that additionally exposes a convenience {@link DisposableEx.dispose} method, so a
159
+ * stored handle can be disposed as `handle.dispose()` instead of the clunkier `handle[Symbol.dispose]()`.
160
+ */
161
+ export interface DisposableEx extends Disposable {
162
+ /**
163
+ * Disposes the object. Delegates to `this[Symbol.dispose]()`.
164
+ */
165
+ dispose(): void;
166
+ }
60
167
  /**
61
168
  * A callback invoked when a {@link CallbackDisposable} is disposed.
62
169
  */
@@ -65,7 +172,7 @@ export type DisposeCallback = (this: void) => void;
65
172
  * An async disposable that executes a callback when disposed via `await using` (or a manual
66
173
  * `await disposable[Symbol.asyncDispose]()`).
67
174
  */
68
- export declare class AsyncCallbackDisposable implements AsyncDisposable {
175
+ export declare class AsyncCallbackDisposable implements AsyncDisposableEx {
69
176
  private readonly callback;
70
177
  private isDisposed;
71
178
  private readonly multipleDisposeBehavior;
@@ -75,6 +182,13 @@ export declare class AsyncCallbackDisposable implements AsyncDisposable {
75
182
  * @param params - The parameters.
76
183
  */
77
184
  constructor(params: AsyncCallbackDisposableConstructorParams);
185
+ /**
186
+ * Disposes the object by executing the callback. Convenience alias that delegates to
187
+ * `this[Symbol.asyncDispose]()`.
188
+ *
189
+ * @returns A {@link Promise} that resolves once the callback completes.
190
+ */
191
+ asyncDispose(): Promise<void>;
78
192
  /**
79
193
  * Disposes the object by executing the callback.
80
194
  *
@@ -89,7 +203,7 @@ export declare class AsyncCallbackDisposable implements AsyncDisposable {
89
203
  /**
90
204
  * A disposable that executes a callback when disposed.
91
205
  */
92
- export declare class CallbackDisposable implements Disposable {
206
+ export declare class CallbackDisposable implements DisposableEx {
93
207
  private readonly callback;
94
208
  private isDisposed;
95
209
  private readonly multipleDisposeBehavior;
@@ -99,6 +213,11 @@ export declare class CallbackDisposable implements Disposable {
99
213
  * @param params - The parameters.
100
214
  */
101
215
  constructor(params: CallbackDisposableConstructorParams);
216
+ /**
217
+ * Disposes the object by executing the callback. Convenience alias that delegates to
218
+ * `this[Symbol.dispose]()`.
219
+ */
220
+ dispose(): void;
102
221
  /**
103
222
  * Disposes the object by executing the callback.
104
223
  *
@@ -108,6 +227,73 @@ export declare class CallbackDisposable implements Disposable {
108
227
  */
109
228
  [Symbol.dispose](): void;
110
229
  }
230
+ /**
231
+ * An {@link AsyncDisposableEx} that combines multiple async disposables and disposes all of them when it
232
+ * is disposed.
233
+ */
234
+ export declare class CombineAsyncDisposable implements AsyncDisposableEx {
235
+ private readonly children;
236
+ private readonly disposeOrder;
237
+ private readonly errorBehavior;
238
+ private isDisposed;
239
+ private readonly multipleDisposeBehavior;
240
+ /**
241
+ * Creates a new instance of {@link CombineAsyncDisposable}.
242
+ *
243
+ * @param params - The parameters.
244
+ */
245
+ constructor(params: CombineAsyncDisposableConstructorParams);
246
+ /**
247
+ * Disposes all combined children. Convenience alias that delegates to
248
+ * `this[Symbol.asyncDispose]()`.
249
+ *
250
+ * @returns A {@link Promise} that resolves once all children have been disposed.
251
+ */
252
+ asyncDispose(): Promise<void>;
253
+ /**
254
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
255
+ * {@link DisposeErrorBehavior} when a child throws.
256
+ *
257
+ * This method is called automatically when the object is used in an `await using` declaration. It can
258
+ * also be called manually. The behavior on a second and later dispose is controlled by
259
+ * {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
260
+ *
261
+ * @returns A {@link Promise} that resolves once all children have been disposed.
262
+ */
263
+ [Symbol.asyncDispose](): Promise<void>;
264
+ private getOrderedChildren;
265
+ }
266
+ /**
267
+ * A {@link DisposableEx} that combines multiple disposables and disposes all of them when it is
268
+ * disposed.
269
+ */
270
+ export declare class CombineDisposable implements DisposableEx {
271
+ private readonly children;
272
+ private readonly disposeOrder;
273
+ private readonly errorBehavior;
274
+ private isDisposed;
275
+ private readonly multipleDisposeBehavior;
276
+ /**
277
+ * Creates a new instance of {@link CombineDisposable}.
278
+ *
279
+ * @param params - The parameters.
280
+ */
281
+ constructor(params: CombineDisposableConstructorParams);
282
+ /**
283
+ * Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
284
+ */
285
+ dispose(): void;
286
+ /**
287
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
288
+ * {@link DisposeErrorBehavior} when a child throws.
289
+ *
290
+ * This method is called automatically when the object is used in a `using` declaration. It can also
291
+ * be called manually. The behavior on a second and later dispose is controlled by
292
+ * {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
293
+ */
294
+ [Symbol.dispose](): void;
295
+ private getOrderedChildren;
296
+ }
111
297
  /**
112
298
  * Type guard to check if an object implements the {@link AsyncDisposable} interface.
113
299
  *
@@ -115,6 +301,13 @@ export declare class CallbackDisposable implements Disposable {
115
301
  * @returns Whether the object implements the {@link AsyncDisposable} interface
116
302
  */
117
303
  export declare function isAsyncDisposable(obj: unknown): obj is AsyncDisposable;
304
+ /**
305
+ * Type guard to check if an object implements the {@link AsyncDisposableEx} interface.
306
+ *
307
+ * @param obj - the object to check for the {@link AsyncDisposableEx} interface
308
+ * @returns Whether the object implements the {@link AsyncDisposableEx} interface
309
+ */
310
+ export declare function isAsyncDisposableEx(obj: unknown): obj is AsyncDisposableEx;
118
311
  /**
119
312
  * Type guard to check if an object implements the {@link Disposable} interface.
120
313
  *
@@ -122,3 +315,30 @@ export declare function isAsyncDisposable(obj: unknown): obj is AsyncDisposable;
122
315
  * @returns Whether the object implements the {@link Disposable} interface
123
316
  */
124
317
  export declare function isDisposable(obj: unknown): obj is Disposable;
318
+ /**
319
+ * Type guard to check if an object implements the {@link DisposableEx} interface.
320
+ *
321
+ * @param obj - the object to check for the {@link DisposableEx} interface
322
+ * @returns Whether the object implements the {@link DisposableEx} interface
323
+ */
324
+ export declare function isDisposableEx(obj: unknown): obj is DisposableEx;
325
+ /**
326
+ * Adapts a plain {@link AsyncDisposable} into an {@link AsyncDisposableEx} by adding a convenience
327
+ * {@link AsyncDisposableEx.asyncDispose} method that delegates to `Symbol.asyncDispose`.
328
+ *
329
+ * If the object already implements {@link AsyncDisposableEx}, it is returned unchanged.
330
+ *
331
+ * @param asyncDisposable - the async disposable to adapt
332
+ * @returns An {@link AsyncDisposableEx} wrapping the async disposable.
333
+ */
334
+ export declare function toAsyncDisposableEx(asyncDisposable: AsyncDisposable): AsyncDisposableEx;
335
+ /**
336
+ * Adapts a plain {@link Disposable} into a {@link DisposableEx} by adding a convenience
337
+ * {@link DisposableEx.dispose} method that delegates to `Symbol.dispose`.
338
+ *
339
+ * If the object already implements {@link DisposableEx}, it is returned unchanged.
340
+ *
341
+ * @param disposable - the disposable to adapt
342
+ * @returns A {@link DisposableEx} wrapping the disposable.
343
+ */
344
+ export declare function toDisposableEx(disposable: Disposable): DisposableEx;
@@ -22,6 +22,16 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { assertNever } from "./type-guards.mjs";
25
+ var DisposeErrorBehavior = /* @__PURE__ */ ((DisposeErrorBehavior2) => {
26
+ DisposeErrorBehavior2[DisposeErrorBehavior2["Aggregate"] = 0] = "Aggregate";
27
+ DisposeErrorBehavior2[DisposeErrorBehavior2["FailFast"] = 1] = "FailFast";
28
+ return DisposeErrorBehavior2;
29
+ })(DisposeErrorBehavior || {});
30
+ var DisposeOrder = /* @__PURE__ */ ((DisposeOrder2) => {
31
+ DisposeOrder2[DisposeOrder2["Lifo"] = 0] = "Lifo";
32
+ DisposeOrder2[DisposeOrder2["Fifo"] = 1] = "Fifo";
33
+ return DisposeOrder2;
34
+ })(DisposeOrder || {});
25
35
  var MultipleDisposeBehavior = /* @__PURE__ */ ((MultipleDisposeBehavior2) => {
26
36
  MultipleDisposeBehavior2[MultipleDisposeBehavior2["Invoke"] = 0] = "Invoke";
27
37
  MultipleDisposeBehavior2[MultipleDisposeBehavior2["Ignore"] = 1] = "Ignore";
@@ -41,6 +51,15 @@ class AsyncCallbackDisposable {
41
51
  this.callback = params.callback;
42
52
  this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
43
53
  }
54
+ /**
55
+ * Disposes the object by executing the callback. Convenience alias that delegates to
56
+ * `this[Symbol.asyncDispose]()`.
57
+ *
58
+ * @returns A {@link Promise} that resolves once the callback completes.
59
+ */
60
+ asyncDispose() {
61
+ return this[Symbol.asyncDispose]();
62
+ }
44
63
  /**
45
64
  * Disposes the object by executing the callback.
46
65
  *
@@ -80,6 +99,13 @@ class CallbackDisposable {
80
99
  this.callback = params.callback;
81
100
  this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
82
101
  }
102
+ /**
103
+ * Disposes the object by executing the callback. Convenience alias that delegates to
104
+ * `this[Symbol.dispose]()`.
105
+ */
106
+ dispose() {
107
+ this[Symbol.dispose]();
108
+ }
83
109
  /**
84
110
  * Disposes the object by executing the callback.
85
111
  *
@@ -104,19 +130,206 @@ class CallbackDisposable {
104
130
  this.callback();
105
131
  }
106
132
  }
133
+ class CombineAsyncDisposable {
134
+ children;
135
+ disposeOrder;
136
+ errorBehavior;
137
+ isDisposed = false;
138
+ multipleDisposeBehavior;
139
+ /**
140
+ * Creates a new instance of {@link CombineAsyncDisposable}.
141
+ *
142
+ * @param params - The parameters.
143
+ */
144
+ constructor(params) {
145
+ this.children = [...params.asyncDisposables];
146
+ this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
147
+ this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
148
+ this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
149
+ }
150
+ /**
151
+ * Disposes all combined children. Convenience alias that delegates to
152
+ * `this[Symbol.asyncDispose]()`.
153
+ *
154
+ * @returns A {@link Promise} that resolves once all children have been disposed.
155
+ */
156
+ asyncDispose() {
157
+ return this[Symbol.asyncDispose]();
158
+ }
159
+ /**
160
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
161
+ * {@link DisposeErrorBehavior} when a child throws.
162
+ *
163
+ * This method is called automatically when the object is used in an `await using` declaration. It can
164
+ * also be called manually. The behavior on a second and later dispose is controlled by
165
+ * {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
166
+ *
167
+ * @returns A {@link Promise} that resolves once all children have been disposed.
168
+ */
169
+ async [Symbol.asyncDispose]() {
170
+ if (this.isDisposed) {
171
+ switch (this.multipleDisposeBehavior) {
172
+ case 1 /* Ignore */:
173
+ return;
174
+ case 0 /* Invoke */:
175
+ break;
176
+ case 2 /* Throw */:
177
+ throw new Error("This CombineAsyncDisposable has already been disposed.");
178
+ default:
179
+ assertNever(this.multipleDisposeBehavior);
180
+ }
181
+ }
182
+ this.isDisposed = true;
183
+ const errors = [];
184
+ for (const child of this.getOrderedChildren()) {
185
+ try {
186
+ await child[Symbol.asyncDispose]();
187
+ } catch (error) {
188
+ if (this.errorBehavior === 1 /* FailFast */) {
189
+ throw error;
190
+ }
191
+ errors.push(error);
192
+ }
193
+ }
194
+ if (errors.length > 0) {
195
+ throw new AggregateError(errors);
196
+ }
197
+ }
198
+ getOrderedChildren() {
199
+ switch (this.disposeOrder) {
200
+ case 1 /* Fifo */:
201
+ return this.children;
202
+ case 0 /* Lifo */:
203
+ return [...this.children].reverse();
204
+ default:
205
+ assertNever(this.disposeOrder);
206
+ }
207
+ }
208
+ }
209
+ class CombineDisposable {
210
+ children;
211
+ disposeOrder;
212
+ errorBehavior;
213
+ isDisposed = false;
214
+ multipleDisposeBehavior;
215
+ /**
216
+ * Creates a new instance of {@link CombineDisposable}.
217
+ *
218
+ * @param params - The parameters.
219
+ */
220
+ constructor(params) {
221
+ this.children = [...params.disposables];
222
+ this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
223
+ this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
224
+ this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
225
+ }
226
+ /**
227
+ * Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
228
+ */
229
+ dispose() {
230
+ this[Symbol.dispose]();
231
+ }
232
+ /**
233
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
234
+ * {@link DisposeErrorBehavior} when a child throws.
235
+ *
236
+ * This method is called automatically when the object is used in a `using` declaration. It can also
237
+ * be called manually. The behavior on a second and later dispose is controlled by
238
+ * {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
239
+ */
240
+ [Symbol.dispose]() {
241
+ if (this.isDisposed) {
242
+ switch (this.multipleDisposeBehavior) {
243
+ case 1 /* Ignore */:
244
+ return;
245
+ case 0 /* Invoke */:
246
+ break;
247
+ case 2 /* Throw */:
248
+ throw new Error("This CombineDisposable has already been disposed.");
249
+ default:
250
+ assertNever(this.multipleDisposeBehavior);
251
+ }
252
+ }
253
+ this.isDisposed = true;
254
+ const errors = [];
255
+ for (const child of this.getOrderedChildren()) {
256
+ try {
257
+ child[Symbol.dispose]();
258
+ } catch (error) {
259
+ if (this.errorBehavior === 1 /* FailFast */) {
260
+ throw error;
261
+ }
262
+ errors.push(error);
263
+ }
264
+ }
265
+ if (errors.length > 0) {
266
+ throw new AggregateError(errors);
267
+ }
268
+ }
269
+ getOrderedChildren() {
270
+ switch (this.disposeOrder) {
271
+ case 1 /* Fifo */:
272
+ return this.children;
273
+ case 0 /* Lifo */:
274
+ return [...this.children].reverse();
275
+ default:
276
+ assertNever(this.disposeOrder);
277
+ }
278
+ }
279
+ }
107
280
  function isAsyncDisposable(obj) {
108
281
  const asyncDisposable = obj;
109
282
  return !!asyncDisposable[Symbol.asyncDispose];
110
283
  }
284
+ function isAsyncDisposableEx(obj) {
285
+ const asyncDisposableEx = obj;
286
+ return isAsyncDisposable(obj) && typeof asyncDisposableEx.asyncDispose === "function";
287
+ }
111
288
  function isDisposable(obj) {
112
289
  const disposable = obj;
113
290
  return !!disposable[Symbol.dispose];
114
291
  }
292
+ function isDisposableEx(obj) {
293
+ const disposableEx = obj;
294
+ return isDisposable(obj) && typeof disposableEx.dispose === "function";
295
+ }
296
+ function toAsyncDisposableEx(asyncDisposable) {
297
+ if (isAsyncDisposableEx(asyncDisposable)) {
298
+ return asyncDisposable;
299
+ }
300
+ return {
301
+ asyncDispose,
302
+ [Symbol.asyncDispose]: asyncDispose
303
+ };
304
+ function asyncDispose() {
305
+ return Promise.resolve(asyncDisposable[Symbol.asyncDispose]());
306
+ }
307
+ }
308
+ function toDisposableEx(disposable) {
309
+ if (isDisposableEx(disposable)) {
310
+ return disposable;
311
+ }
312
+ return {
313
+ dispose,
314
+ [Symbol.dispose]: dispose
315
+ };
316
+ function dispose() {
317
+ disposable[Symbol.dispose]();
318
+ }
319
+ }
115
320
  export {
116
321
  AsyncCallbackDisposable,
117
322
  CallbackDisposable,
323
+ CombineAsyncDisposable,
324
+ CombineDisposable,
325
+ DisposeErrorBehavior,
326
+ DisposeOrder,
118
327
  MultipleDisposeBehavior,
119
328
  isAsyncDisposable,
120
- isDisposable
329
+ isAsyncDisposableEx,
330
+ isDisposable,
331
+ isDisposableEx,
332
+ toAsyncDisposableEx,
333
+ toDisposableEx
121
334
  };
122
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfSBvciB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGJlaGF2ZXMgd2hlbiBpdCBpc1xuICogZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gKi9cbmV4cG9ydCBlbnVtIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gZXZlcnkgZGlzcG9zZS5cbiAgICovXG4gIEludm9rZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIGFyZSBuby1vcHMuXG4gICAqL1xuICBJZ25vcmUsXG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gdGhlIGZpcnN0IGRpc3Bvc2Ugb25seTsgc3Vic2VxdWVudCBkaXNwb3NlcyB0aHJvdy5cbiAgICovXG4gIFRocm93XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBBc3luY0Rpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4ge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfSBpcyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQXN5bmNEaXNwb3NlQ2FsbGJhY2sgPSAodGhpczogdm9pZCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBEaXNwb3NlQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIGFzeW5jIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQgdmlhIGBhd2FpdCB1c2luZ2AgKG9yIGEgbWFudWFsXG4gKiBgYXdhaXQgZGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCBieSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhbiBgYXdhaXQgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdFxuICAgKiBjYW4gYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjYWxsYmFjayBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5jYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogQSBkaXNwb3NhYmxlIHRoYXQgZXhlY3V0ZXMgYSBjYWxsYmFjayB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tEaXNwb3NhYmxlIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcbiAgcHJpdmF0ZSBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCBieSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhIGB1c2luZ2AgZGVjbGFyYXRpb24uIEl0IGNhbiBhbHNvXG4gICAqIGJlIGNhbGxlZCBtYW51YWxseS4gVGhlIGJlaGF2aW9yIG9uIGEgc2Vjb25kIGFuZCBsYXRlciBkaXNwb3NlIGlzIGNvbnRyb2xsZWQgYnlcbiAgICoge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBDYWxsYmFja0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhc3NlcnROZXZlcih0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZSA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWFzeW5jRGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzcG9zYWJsZShvYmo6IHVua25vd24pOiBvYmogaXMgRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBvYmogYXMgUGFydGlhbDxEaXNwb3NhYmxlPjtcbiAgcmV0dXJuICEhZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLFNBQVMsbUJBQW1CO0FBTXJCLElBQUssMEJBQUwsa0JBQUtBLDZCQUFMO0FBSUwsRUFBQUEsa0RBQUE7QUFLQSxFQUFBQSxrREFBQTtBQUtBLEVBQUFBLGtEQUFBO0FBZFUsU0FBQUE7QUFBQSxHQUFBO0FBaUVMLE1BQU0sd0JBQW1EO0FBQUEsRUFDN0M7QUFBQSxFQUNULGFBQWE7QUFBQSxFQUNKO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUFrRDtBQUNuRSxTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLDBCQUEwQixPQUFPLDJCQUEyQjtBQUFBLEVBQ25FO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxRQUFJLEtBQUssWUFBWTtBQUNuQixjQUFRLEtBQUsseUJBQXlCO0FBQUEsUUFDcEMsS0FBSztBQUNIO0FBQUEsUUFDRixLQUFLO0FBQ0g7QUFBQSxRQUNGLEtBQUs7QUFDSCxnQkFBTSxJQUFJLE1BQU0seURBQXlEO0FBQUEsUUFDM0U7QUFDRSxzQkFBWSxLQUFLLHVCQUF1QjtBQUFBLE1BQzVDO0FBQUEsSUFDRjtBQUVBLFNBQUssYUFBYTtBQUNsQixVQUFNLEtBQUssU0FBUztBQUFBLEVBQ3RCO0FBQ0Y7QUFLTyxNQUFNLG1CQUF5QztBQUFBLEVBQ25DO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBNkM7QUFDOUQsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSywwQkFBMEIsT0FBTywyQkFBMkI7QUFBQSxFQUNuRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTQSxDQUFRLE9BQU8sT0FBTyxJQUFVO0FBQzlCLFFBQUksS0FBSyxZQUFZO0FBQ25CLGNBQVEsS0FBSyx5QkFBeUI7QUFBQSxRQUNwQyxLQUFLO0FBQ0g7QUFBQSxRQUNGLEtBQUs7QUFDSDtBQUFBLFFBQ0YsS0FBSztBQUNILGdCQUFNLElBQUksTUFBTSxvREFBb0Q7QUFBQSxRQUN0RTtBQUNFLHNCQUFZLEtBQUssdUJBQXVCO0FBQUEsTUFDNUM7QUFBQSxJQUNGO0FBRUEsU0FBSyxhQUFhO0FBQ2xCLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQ0Y7QUFRTyxTQUFTLGtCQUFrQixLQUFzQztBQUN0RSxRQUFNLGtCQUFrQjtBQUN4QixTQUFPLENBQUMsQ0FBQyxnQkFBZ0IsT0FBTyxZQUFZO0FBQzlDO0FBUU8sU0FBUyxhQUFhLEtBQWlDO0FBQzVELFFBQU0sYUFBYTtBQUNuQixTQUFPLENBQUMsQ0FBQyxXQUFXLE9BQU8sT0FBTztBQUNwQzsiLAogICJuYW1lcyI6IFsiTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IiXQp9Cg==
335
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZXJyb3Igc2VtYW50aWNzIG9mIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gd2hlblxuICogb25lIG9mIGl0cyBjaGlsZHJlbiB0aHJvd3Mgd2hpbGUgYmVpbmcgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBlbnVtIERpc3Bvc2VFcnJvckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgZXZlcnkgY2hpbGQgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3csIGNvbGxlY3RpbmcgdGhlIHRocm93biBlcnJvcnMgYW5kIHJlLXRocm93aW5nIHRoZW1cbiAgICogYXMgYSBzaW5nbGUge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfSBvbmNlIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBBZ2dyZWdhdGUsXG5cbiAgLyoqXG4gICAqIFJlLXRocm93IHRoZSBmaXJzdCBlcnJvciBhIGNoaWxkIHRocm93cyBpbW1lZGlhdGVseSwgbGVhdmluZyB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHVuZGlzcG9zZWQuXG4gICAqL1xuICBGYWlsRmFzdFxufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIG9yZGVyIGluIHdoaWNoIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gZGlzcG9zZXNcbiAqIGl0cyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGVudW0gRGlzcG9zZU9yZGVyIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGxhc3QtcmVnaXN0ZXJlZCBjaGlsZCBmaXJzdCAobGFzdC1pbiwgZmlyc3Qtb3V0KSwgbGlrZSBuZXN0ZWQgYHVzaW5nYCBkZWNsYXJhdGlvbnNcbiAgICogdW53aW5kaW5nIGluIHJldmVyc2UuXG4gICAqL1xuICBMaWZvLFxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSBmaXJzdC1yZWdpc3RlcmVkIGNoaWxkIGZpcnN0IChmaXJzdC1pbiwgZmlyc3Qtb3V0KS5cbiAgICovXG4gIEZpZm9cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyBhIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9IG9yIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0gYmVoYXZlcyB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGVudW0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Ige1xuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiBldmVyeSBkaXNwb3NlLlxuICAgKi9cbiAgSW52b2tlLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBmaXJzdCBkaXNwb3NlIG9ubHk7IHN1YnNlcXVlbnQgZGlzcG9zZXMgYXJlIG5vLW9wcy5cbiAgICovXG4gIElnbm9yZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIHRocm93LlxuICAgKi9cbiAgVGhyb3dcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRpc3Bvc2FibGUgYmVoYXZlcyB3aGVuIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSB0aGF0IGFkZGl0aW9uYWxseSBleHBvc2VzIGEgY29udmVuaWVuY2Uge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZX1cbiAqIG1ldGhvZCwgc28gYSBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmFzeW5jRGlzcG9zZSgpYCBpbnN0ZWFkIG9mIHRoZSBjbHVua2llclxuICogYGhhbmRsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0Rpc3Bvc2FibGVFeCBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgdHlwZSBBc3luY0Rpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFzeW5jIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBhc3luY0Rpc3Bvc2FibGVzOiBJdGVyYWJsZTxBc3luY0Rpc3Bvc2FibGU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNoaWxkcmVuIGFyZSBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VPcmRlci5MaWZvfVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcG9zZU9yZGVyPzogRGlzcG9zZU9yZGVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBvbmUgb2YgaXRzIGNoaWxkcmVuIHRocm93cyB3aGlsZSBiZWluZyBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yLkFnZ3JlZ2F0ZX1cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I/OiBEaXNwb3NlRXJyb3JCZWhhdmlvcjtcblxuICAvKipcbiAgICogSG93IHRoZSBjb21iaW5lciBiZWhhdmVzIHdoZW4gaXQgaXMgZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNwb3NhYmxlczogSXRlcmFibGU8RGlzcG9zYWJsZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4gYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZU9yZGVyLkxpZm99XG4gICAqL1xuICByZWFkb25seSBkaXNwb3NlT3JkZXI/OiBEaXNwb3NlT3JkZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIG9uZSBvZiBpdHMgY2hpbGRyZW4gdGhyb3dzIHdoaWxlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlfVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcj86IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBpdCBpcyBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBhZGRpdGlvbmFsbHkgZXhwb3NlcyBhIGNvbnZlbmllbmNlIHtAbGluayBEaXNwb3NhYmxlRXguZGlzcG9zZX0gbWV0aG9kLCBzbyBhXG4gKiBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmRpc3Bvc2UoKWAgaW5zdGVhZCBvZiB0aGUgY2x1bmtpZXIgYGhhbmRsZVtTeW1ib2wuZGlzcG9zZV0oKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zYWJsZUV4IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIGFzeW5jIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQgdmlhIGBhd2FpdCB1c2luZ2AgKG9yIGEgbWFudWFsXG4gKiBgYXdhaXQgZGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogQXN5bmNEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suIENvbnZlbmllbmNlIGFsaWFzIHRoYXQgZGVsZWdhdGVzIHRvXG4gICAqIGB0aGlzW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGFuIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb24uIEl0XG4gICAqIGNhbiBhbHNvIGJlIGNhbGxlZCBtYW51YWxseS4gVGhlIGJlaGF2aW9yIG9uIGEgc2Vjb25kIGFuZCBsYXRlciBkaXNwb3NlIGlzIGNvbnRyb2xsZWQgYnlcbiAgICoge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLmNhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBEaXNwb3NhYmxlRXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiBEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gcGFyYW1zLmNhbGxiYWNrO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgZXhlY3V0aW5nIHRoZSBjYWxsYmFjay4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGEgYHVzaW5nYCBkZWNsYXJhdGlvbi4gSXQgY2FuIGFsc29cbiAgICogYmUgY2FsbGVkIG1hbnVhbGx5LiBUaGUgYmVoYXZpb3Igb24gYSBzZWNvbmQgYW5kIGxhdGVyIGRpc3Bvc2UgaXMgY29udHJvbGxlZCBieVxuICAgKiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKi9cbiAgcHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENhbGxiYWNrRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGFzeW5jIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0XG4gKiBpcyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVBc3luY0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLnBhcmFtcy5hc3luY0Rpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jRGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhbiBgYXdhaXQgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW5cbiAgICogYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhc3NlcnROZXZlcih0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZ2V0T3JkZXJlZENoaWxkcmVuKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoaWxkW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgQXN5bmNEaXNwb3NhYmxlW10ge1xuICAgIHN3aXRjaCAodGhpcy5kaXNwb3NlT3JkZXIpIHtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkZpZm86XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICAgICAgY2FzZSBEaXNwb3NlT3JkZXIuTGlmbzpcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXS5yZXZlcnNlKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcih0aGlzLmRpc3Bvc2VPcmRlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVEaXNwb3NhYmxlIGltcGxlbWVudHMgRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbjogcmVhZG9ubHkgRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZURpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4ucGFyYW1zLmRpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBhbGwgY29tYmluZWQgY2hpbGRyZW4gaW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIERpc3Bvc2VPcmRlcn0sIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkXG4gICAqIHtAbGluayBEaXNwb3NlRXJyb3JCZWhhdmlvcn0gd2hlbiBhIGNoaWxkIHRocm93cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQgaW4gYSBgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW4gYWxzb1xuICAgKiBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBDb21iaW5lRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cbiAgICBjb25zdCBlcnJvcnM6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5nZXRPcmRlcmVkQ2hpbGRyZW4oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgRGlzcG9zYWJsZVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZGlzcG9zZU9yZGVyKSB7XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5GaWZvOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkxpZm86XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0ucmV2ZXJzZSgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5kaXNwb3NlT3JkZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZSA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWFzeW5jRGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXN5bmNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgY29uc3QgYXN5bmNEaXNwb3NhYmxlRXggPSBvYmogYXMgUGFydGlhbDxBc3luY0Rpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0FzeW5jRGlzcG9zYWJsZShvYmopICYmIHR5cGVvZiBhc3luY0Rpc3Bvc2FibGVFeC5hc3luY0Rpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGUge1xuICBjb25zdCBkaXNwb3NhYmxlID0gb2JqIGFzIFBhcnRpYWw8RGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGRpc3Bvc2FibGVFeCA9IG9iaiBhcyBQYXJ0aWFsPERpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0Rpc3Bvc2FibGUob2JqKSAmJiB0eXBlb2YgZGlzcG9zYWJsZUV4LmRpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50byBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGJ5IGFkZGluZyBhIGNvbnZlbmllbmNlXG4gKiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXguYXN5bmNEaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5hc3luY0Rpc3Bvc2VgLlxuICpcbiAqIElmIHRoZSBvYmplY3QgYWxyZWFkeSBpbXBsZW1lbnRzIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNEaXNwb3NhYmxlIC0gdGhlIGFzeW5jIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGFzeW5jIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FzeW5jRGlzcG9zYWJsZUV4KGFzeW5jRGlzcG9zYWJsZTogQXN5bmNEaXNwb3NhYmxlKTogQXN5bmNEaXNwb3NhYmxlRXgge1xuICBpZiAoaXNBc3luY0Rpc3Bvc2FibGVFeChhc3luY0Rpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGFzeW5jRGlzcG9zYWJsZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmNEaXNwb3NlLFxuICAgIFtTeW1ib2wuYXN5bmNEaXNwb3NlXTogYXN5bmNEaXNwb3NlXG4gIH07XG5cbiAgZnVuY3Rpb24gYXN5bmNEaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXN5bmNEaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkpO1xuICB9XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIERpc3Bvc2FibGV9IGludG8gYSB7QGxpbmsgRGlzcG9zYWJsZUV4fSBieSBhZGRpbmcgYSBjb252ZW5pZW5jZVxuICoge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5kaXNwb3NlYC5cbiAqXG4gKiBJZiB0aGUgb2JqZWN0IGFscmVhZHkgaW1wbGVtZW50cyB7QGxpbmsgRGlzcG9zYWJsZUV4fSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gdGhlIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGVFeChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZUV4IHtcbiAgaWYgKGlzRGlzcG9zYWJsZUV4KGRpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRpc3Bvc2UsXG4gICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLG1CQUFtQjtBQU1yQixJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUtMLEVBQUFBLDRDQUFBO0FBS0EsRUFBQUEsNENBQUE7QUFWVSxTQUFBQTtBQUFBLEdBQUE7QUFpQkwsSUFBSyxlQUFMLGtCQUFLQyxrQkFBTDtBQUtMLEVBQUFBLDRCQUFBO0FBS0EsRUFBQUEsNEJBQUE7QUFWVSxTQUFBQTtBQUFBLEdBQUE7QUFpQkwsSUFBSywwQkFBTCxrQkFBS0MsNkJBQUw7QUFJTCxFQUFBQSxrREFBQTtBQUtBLEVBQUFBLGtEQUFBO0FBS0EsRUFBQUEsa0RBQUE7QUFkVSxTQUFBQTtBQUFBLEdBQUE7QUF3SkwsTUFBTSx3QkFBcUQ7QUFBQSxFQUMvQztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQWtEO0FBQ25FLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssMEJBQTBCLE9BQU8sMkJBQTJCO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFPLGVBQThCO0FBQ25DLFdBQU8sS0FBSyxPQUFPLFlBQVksRUFBRTtBQUFBLEVBQ25DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtB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