@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -1
  3. package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
  4. package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
  5. package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
  6. package/bundlers/esbuild-impl/index/package.json +6 -0
  7. package/bundlers/esbuild-impl/package.json +6 -0
  8. package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
  9. package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
  10. package/bundlers/index/package.json +6 -0
  11. package/bundlers/package.json +6 -0
  12. package/dist/lib/cjs/build.cjs +191 -0
  13. package/dist/lib/cjs/build.d.cts +59 -0
  14. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
  15. package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
  16. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
  18. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
  19. package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
  22. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
  24. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
  25. package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
  26. package/dist/lib/cjs/bundlers/index.cjs +99 -0
  27. package/dist/lib/cjs/bundlers/index.d.cts +2 -0
  28. package/dist/lib/cjs/check-project-types.cjs +163 -0
  29. package/dist/lib/cjs/check-project-types.d.cts +92 -0
  30. package/dist/lib/cjs/cli-utils.cjs +276 -0
  31. package/dist/lib/cjs/cli-utils.d.cts +123 -0
  32. package/dist/lib/cjs/code-generator.cjs +96 -0
  33. package/dist/lib/cjs/code-generator.d.cts +14 -0
  34. package/dist/lib/cjs/commitlint-config.cjs +110 -0
  35. package/dist/lib/cjs/commitlint-config.d.cts +14 -0
  36. package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
  37. package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
  38. package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
  39. package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
  40. package/dist/lib/cjs/env-toggle.cjs +133 -0
  41. package/dist/lib/cjs/env-toggle.d.cts +42 -0
  42. package/dist/lib/cjs/exec.cjs +455 -0
  43. package/dist/lib/cjs/exec.d.cts +162 -0
  44. package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
  45. package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
  46. package/dist/lib/cjs/formatters/dprint.cjs +108 -0
  47. package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
  48. package/dist/lib/cjs/formatters/index.cjs +99 -0
  49. package/dist/lib/cjs/formatters/index.d.cts +2 -0
  50. package/dist/lib/cjs/fs.cjs +123 -0
  51. package/dist/lib/cjs/fs.d.cts +80 -0
  52. package/dist/lib/cjs/gate.cjs +140 -0
  53. package/dist/lib/cjs/gate.d.cts +93 -0
  54. package/dist/lib/cjs/git.cjs +109 -0
  55. package/dist/lib/cjs/git.d.cts +37 -0
  56. package/dist/lib/cjs/index.cjs +186 -0
  57. package/dist/lib/cjs/index.d.cts +35 -0
  58. package/dist/lib/cjs/json.cjs +141 -0
  59. package/dist/lib/cjs/json.d.cts +102 -0
  60. package/dist/lib/cjs/library-build.cjs +475 -0
  61. package/dist/lib/cjs/library-build.d.cts +97 -0
  62. package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
  63. package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
  64. package/dist/lib/cjs/linters/cspell.cjs +103 -0
  65. package/dist/lib/cjs/linters/cspell.d.cts +36 -0
  66. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
  67. package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
  68. package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
  69. package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
  70. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
  71. package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
  72. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
  73. package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
  74. package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
  75. package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
  76. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
  77. package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
  78. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
  79. package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
  80. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
  81. package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
  82. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
  83. package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
  84. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
  85. package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
  86. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
  87. package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
  88. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
  89. package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
  90. package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
  91. package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
  92. package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
  93. package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
  94. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
  95. package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
  96. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
  97. package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
  98. package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
  99. package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
  100. package/dist/lib/cjs/linters/eslint.cjs +122 -0
  101. package/dist/lib/cjs/linters/eslint.d.cts +35 -0
  102. package/dist/lib/cjs/linters/index.cjs +138 -0
  103. package/dist/lib/cjs/linters/index.d.cts +15 -0
  104. package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
  105. package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
  106. package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
  107. package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
  108. package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
  109. package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
  110. package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
  111. package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
  112. package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
  113. package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
  114. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
  115. package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
  116. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
  117. package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
  118. package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
  119. package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
  120. package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
  121. package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
  122. package/dist/lib/cjs/nano-staged-config.cjs +148 -0
  123. package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
  124. package/dist/lib/cjs/npm-publish.cjs +93 -0
  125. package/dist/lib/cjs/npm-publish.d.cts +19 -0
  126. package/dist/lib/cjs/npm-run.cjs +120 -0
  127. package/dist/lib/cjs/npm-run.d.cts +34 -0
  128. package/dist/lib/cjs/npm.cjs +200 -0
  129. package/dist/lib/cjs/npm.d.cts +168 -0
  130. package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
  131. package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
  132. package/dist/lib/cjs/package-manager.cjs +291 -0
  133. package/dist/lib/cjs/package-manager.d.cts +93 -0
  134. package/dist/lib/cjs/released-issues.cjs +178 -0
  135. package/dist/lib/cjs/released-issues.d.cts +79 -0
  136. package/dist/lib/cjs/repo-paths.cjs +167 -0
  137. package/dist/lib/cjs/repo-paths.d.cts +318 -0
  138. package/dist/lib/cjs/root.cjs +150 -0
  139. package/dist/lib/cjs/root.d.cts +107 -0
  140. package/dist/lib/cjs/test-runners/index.cjs +102 -0
  141. package/dist/lib/cjs/test-runners/index.d.cts +3 -0
  142. package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
  143. package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
  144. package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
  145. package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
  146. package/dist/lib/cjs/validate-declarations.cjs +120 -0
  147. package/dist/lib/cjs/validate-declarations.d.cts +37 -0
  148. package/dist/lib/cjs/version.cjs +758 -0
  149. package/dist/lib/cjs/version.d.cts +418 -0
  150. package/dist/lib/esm/build.d.mts +59 -0
  151. package/dist/lib/esm/build.mjs +165 -0
  152. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
  153. package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
  154. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
  155. package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
  156. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
  157. package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
  158. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
  159. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
  160. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
  161. package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
  162. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
  163. package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
  164. package/dist/lib/esm/bundlers/index.d.mts +2 -0
  165. package/dist/lib/esm/bundlers/index.mjs +52 -0
  166. package/dist/lib/esm/check-project-types.d.mts +92 -0
  167. package/dist/lib/esm/check-project-types.mjs +123 -0
  168. package/dist/lib/esm/cli-utils.d.mts +123 -0
  169. package/dist/lib/esm/cli-utils.mjs +225 -0
  170. package/dist/lib/esm/code-generator.d.mts +14 -0
  171. package/dist/lib/esm/code-generator.mjs +59 -0
  172. package/dist/lib/esm/commitlint-config.d.mts +14 -0
  173. package/dist/lib/esm/commitlint-config.mjs +79 -0
  174. package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
  175. package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
  176. package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
  177. package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
  178. package/dist/lib/esm/env-toggle.d.mts +42 -0
  179. package/dist/lib/esm/env-toggle.mjs +84 -0
  180. package/dist/lib/esm/exec.d.mts +162 -0
  181. package/dist/lib/esm/exec.mjs +410 -0
  182. package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
  183. package/dist/lib/esm/forbidden-patterns.mjs +108 -0
  184. package/dist/lib/esm/formatters/dprint.d.mts +33 -0
  185. package/dist/lib/esm/formatters/dprint.mjs +75 -0
  186. package/dist/lib/esm/formatters/index.d.mts +2 -0
  187. package/dist/lib/esm/formatters/index.mjs +52 -0
  188. package/dist/lib/esm/fs.d.mts +80 -0
  189. package/dist/lib/esm/fs.mjs +89 -0
  190. package/dist/lib/esm/gate.d.mts +93 -0
  191. package/dist/lib/esm/gate.mjs +106 -0
  192. package/dist/lib/esm/git.d.mts +37 -0
  193. package/dist/lib/esm/git.mjs +72 -0
  194. package/dist/lib/esm/index.d.mts +35 -0
  195. package/dist/lib/esm/index.mjs +110 -0
  196. package/dist/lib/esm/json.d.mts +102 -0
  197. package/dist/lib/esm/json.mjs +106 -0
  198. package/dist/lib/esm/library-build.d.mts +97 -0
  199. package/dist/lib/esm/library-build.mjs +435 -0
  200. package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
  201. package/dist/lib/esm/linters/cspell-content.mjs +87 -0
  202. package/dist/lib/esm/linters/cspell.d.mts +36 -0
  203. package/dist/lib/esm/linters/cspell.mjs +69 -0
  204. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
  205. package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
  206. package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
  207. package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
  208. package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
  209. package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
  210. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
  211. package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
  212. package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
  213. package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
  214. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
  215. package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
  216. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
  217. package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
  218. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
  219. package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
  220. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
  221. package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
  222. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
  223. package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
  224. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
  225. package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
  226. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
  227. package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
  228. package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
  229. package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
  230. package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
  231. package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
  232. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
  233. package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
  234. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
  235. package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
  236. package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
  237. package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
  238. package/dist/lib/esm/linters/eslint.d.mts +35 -0
  239. package/dist/lib/esm/linters/eslint.mjs +88 -0
  240. package/dist/lib/esm/linters/index.d.mts +15 -0
  241. package/dist/lib/esm/linters/index.mjs +78 -0
  242. package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
  243. package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
  244. package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
  245. package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
  246. package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
  247. package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
  248. package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
  249. package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
  250. package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
  251. package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
  252. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
  253. package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
  254. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
  255. package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
  256. package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
  257. package/dist/lib/esm/linters/markdownlint.mjs +124 -0
  258. package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
  259. package/dist/lib/esm/linters/over-exposure.mjs +672 -0
  260. package/dist/lib/esm/nano-staged-config.d.mts +54 -0
  261. package/dist/lib/esm/nano-staged-config.mjs +103 -0
  262. package/dist/lib/esm/npm-publish.d.mts +19 -0
  263. package/dist/lib/esm/npm-publish.mjs +56 -0
  264. package/dist/lib/esm/npm-run.d.mts +34 -0
  265. package/dist/lib/esm/npm-run.mjs +81 -0
  266. package/dist/lib/esm/npm.d.mts +168 -0
  267. package/dist/lib/esm/npm.mjs +155 -0
  268. package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
  269. package/dist/lib/esm/package-lock-integrity.mjs +99 -0
  270. package/dist/lib/esm/package-manager.d.mts +93 -0
  271. package/dist/lib/esm/package-manager.mjs +245 -0
  272. package/dist/lib/esm/released-issues.d.mts +79 -0
  273. package/dist/lib/esm/released-issues.mjs +143 -0
  274. package/dist/lib/esm/repo-paths.d.mts +318 -0
  275. package/dist/lib/esm/repo-paths.mjs +130 -0
  276. package/dist/lib/esm/root.d.mts +107 -0
  277. package/dist/lib/esm/root.mjs +115 -0
  278. package/dist/lib/esm/test-runners/index.d.mts +3 -0
  279. package/dist/lib/esm/test-runners/index.mjs +54 -0
  280. package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
  281. package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
  282. package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
  283. package/dist/lib/esm/test-runners/vitest.mjs +76 -0
  284. package/dist/lib/esm/validate-declarations.d.mts +37 -0
  285. package/dist/lib/esm/validate-declarations.mjs +87 -0
  286. package/dist/lib/esm/version.d.mts +418 -0
  287. package/dist/lib/esm/version.mjs +723 -0
  288. package/formatters/dprint/package.json +6 -0
  289. package/formatters/index/package.json +6 -0
  290. package/formatters/package.json +6 -0
  291. package/linters/cspell/package.json +6 -0
  292. package/linters/cspell-content/package.json +6 -0
  293. package/linters/eslint/package.json +6 -0
  294. package/linters/eslint-agnostic-core-boundary/package.json +6 -0
  295. package/linters/eslint-config/package.json +6 -0
  296. package/linters/eslint-no-restricted-syntax/package.json +6 -0
  297. package/linters/eslint-rules/in-house-plugin/package.json +6 -0
  298. package/linters/eslint-rules/index/package.json +6 -0
  299. package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
  300. package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
  301. package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
  302. package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
  303. package/linters/eslint-rules/package.json +6 -0
  304. package/linters/eslint-rules/params-options-name-match/package.json +6 -0
  305. package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
  306. package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
  307. package/linters/eslint-rules/require-method-template/package.json +6 -0
  308. package/linters/eslint-rules/require-super-call/package.json +6 -0
  309. package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
  310. package/linters/eslint-rules/ts-estree-node/package.json +6 -0
  311. package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
  312. package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
  313. package/linters/index/package.json +6 -0
  314. package/linters/lint-ignores/package.json +6 -0
  315. package/linters/markdownlint/package.json +6 -0
  316. package/linters/markdownlint-cli2-config/package.json +6 -0
  317. package/linters/markdownlint-content/package.json +6 -0
  318. package/linters/markdownlint-ignores/package.json +6 -0
  319. package/linters/markdownlint-rules/index/package.json +6 -0
  320. package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
  321. package/linters/markdownlint-rules/package.json +6 -0
  322. package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
  323. package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
  324. package/linters/over-exposure/package.json +6 -0
  325. package/linters/package.json +6 -0
  326. package/package.json +329 -13
  327. package/test-runners/index/package.json +6 -0
  328. package/test-runners/package.json +6 -0
  329. package/test-runners/vitest/package.json +6 -0
  330. package/test-runners/vitest-config/package.json +6 -0
@@ -0,0 +1,455 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ const existingProcess = globalThis.process;
23
+
24
+ if (!existingProcess) {
25
+ globalThis.process = browserProcess;
26
+ return;
27
+ }
28
+
29
+ if (existingProcess.versions?.node) {
30
+ return;
31
+ }
32
+
33
+ const existingProcessRecord = existingProcess;
34
+
35
+ for (const [key, value] of Object.entries(browserProcess)) {
36
+ existingProcessRecord[key] ??= value;
37
+ }
38
+
39
+ existingProcessRecord['browser'] = true;
40
+ }
41
+
42
+ function keepName($unknown) {
43
+ return $unknown;
44
+ }
45
+
46
+ (function initCjs() {
47
+ const globalThisRecord = globalThis;
48
+ ensureDisposeSymbols();
49
+ globalThisRecord['__name'] ??= keepName;
50
+ globalThisRecord['__extractDefault'] ??= extractDefault;
51
+
52
+ ensureBrowserProcess();
53
+
54
+ // eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
55
+ function extractDefault(module) {
56
+ return module && module.__esModule && 'default' in module ? module.default : module;
57
+ }
58
+ })();
59
+ })();
60
+
61
+ "use strict";
62
+ var __create = Object.create;
63
+ var __defProp = Object.defineProperty;
64
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
65
+ var __getOwnPropNames = Object.getOwnPropertyNames;
66
+ var __getProtoOf = Object.getPrototypeOf;
67
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
68
+ var __export = (target, all) => {
69
+ for (var name in all)
70
+ __defProp(target, name, { get: all[name], enumerable: true });
71
+ };
72
+ var __copyProps = (to, from, except, desc) => {
73
+ if (from && typeof from === "object" || typeof from === "function") {
74
+ for (let key of __getOwnPropNames(from))
75
+ if (!__hasOwnProp.call(to, key) && key !== except)
76
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
77
+ }
78
+ return to;
79
+ };
80
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
81
+ // If the importer is in node compatibility mode or this is not an ESM
82
+ // file that has been converted to a CommonJS file using a Babel-
83
+ // compatible transform (i.e. "__esModule" has not been set), then set
84
+ // "default" to the CommonJS "module.exports" for node compatibility.
85
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
86
+ mod
87
+ ));
88
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
89
+ var exec_exports = {};
90
+ __export(exec_exports, {
91
+ appendNodeOption: () => appendNodeOption,
92
+ buildChildEnv: () => buildChildEnv,
93
+ exec: () => exec
94
+ });
95
+ module.exports = __toCommonJS(exec_exports);
96
+ var import_debug = require('@mnaoumov/typescript-lib/debug');
97
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
98
+ var import_string = require('@mnaoumov/typescript-lib/string');
99
+ var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
100
+ var import_node_child_process = require('node:child_process');
101
+ var import_node_process = __toESM(__extractDefault(require('node:process')), 1);
102
+ var import_cli_utils = require('./cli-utils.cjs');
103
+ function appendNodeOption(existingNodeOptions, option) {
104
+ const trimmed = (existingNodeOptions ?? "").trim();
105
+ if (trimmed === "") {
106
+ return option;
107
+ }
108
+ return trimmed.split(/\s+/).includes(option) ? trimmed : `${trimmed} ${option}`;
109
+ }
110
+ function buildChildEnv(baseEnv, allowedNodeEnvironmentFlags) {
111
+ return {
112
+ DEBUG_COLORS: "1",
113
+ ...baseEnv,
114
+ ...allowedNodeEnvironmentFlags.has("--localstorage-file") && { NODE_OPTIONS: appendNodeOption(baseEnv["NODE_OPTIONS"], LOCAL_STORAGE_NODE_OPTION) }
115
+ };
116
+ }
117
+ function exec(command, options = {}) {
118
+ if (Array.isArray(command)) {
119
+ const batchResult = handleBatchedCommand(command, options);
120
+ if (batchResult) {
121
+ return batchResult;
122
+ }
123
+ const $arguments = command.filter((part) => typeof part === "string");
124
+ const commandLine = buildCommandLine($arguments);
125
+ const maxCommandLength2 = getMaxCommandLength();
126
+ const effectiveLength2 = getEffectiveCommandLineLength(commandLine);
127
+ return effectiveLength2 > maxCommandLength2 ? Promise.reject(
128
+ new Error(
129
+ `Command line is too long (${String(effectiveLength2)} chars once wrapped for the shell, max ${String(maxCommandLength2)} on ${import_node_process.default.platform}). Consider splitting into smaller batches or use ExecArg.`
130
+ )
131
+ ) : execString({
132
+ command: commandLine,
133
+ options,
134
+ rawArguments: $arguments
135
+ });
136
+ }
137
+ const maxCommandLength = getMaxCommandLength();
138
+ const effectiveLength = getEffectiveCommandLineLength(command);
139
+ return effectiveLength > maxCommandLength ? Promise.reject(
140
+ new Error(
141
+ `Command line is too long (${String(effectiveLength)} chars once wrapped for the shell, max ${String(maxCommandLength)} on ${import_node_process.default.platform}). Consider splitting into smaller batches or use ExecArg.`
142
+ )
143
+ ) : execString({
144
+ command,
145
+ options
146
+ });
147
+ }
148
+ function execString(params) {
149
+ const {
150
+ command,
151
+ options = {},
152
+ rawArguments
153
+ } = params;
154
+ const {
155
+ cwd = import_node_process.default.cwd(),
156
+ env,
157
+ isInteractive = false,
158
+ isQuiet: quiet = false,
159
+ shouldIgnoreExitCode: ignoreExitCode = false,
160
+ shouldIncludeDetails = false,
161
+ stdin = ""
162
+ } = options;
163
+ return new Promise((resolve, reject) => {
164
+ (0, import_debug.getLibDebugger)("Exec")(`Executing command: ${command}`);
165
+ const child = spawnViaShell((0, import_object_utils.normalizeOptionalProperties)({
166
+ command,
167
+ cwd,
168
+ env,
169
+ isInteractive,
170
+ rawArguments
171
+ }));
172
+ let stdout = "";
173
+ let stderr = "";
174
+ if (!isInteractive) {
175
+ const {
176
+ stderr: childStderr,
177
+ stdin: childStdin,
178
+ stdout: childStdout
179
+ } = child;
180
+ (0, import_type_guards.assertNonNullable)(childStdin, "Child process stdin is not available");
181
+ (0, import_type_guards.assertNonNullable)(childStdout, "Child process stdout is not available");
182
+ (0, import_type_guards.assertNonNullable)(childStderr, "Child process stderr is not available");
183
+ childStdin.write(stdin);
184
+ childStdin.end();
185
+ childStdout.on("data", (data) => {
186
+ if (!quiet) {
187
+ import_node_process.default.stdout.write(data);
188
+ }
189
+ stdout += data.toString("utf-8");
190
+ });
191
+ childStdout.on("end", () => {
192
+ stdout = (0, import_string.trimEnd)({
193
+ $string: stdout,
194
+ suffix: "\n"
195
+ });
196
+ });
197
+ childStderr.on("data", (data) => {
198
+ if (!quiet) {
199
+ import_node_process.default.stderr.write(data);
200
+ }
201
+ stderr += data.toString("utf-8");
202
+ });
203
+ childStderr.on("end", () => {
204
+ stderr = (0, import_string.trimEnd)({
205
+ $string: stderr,
206
+ suffix: "\n"
207
+ });
208
+ });
209
+ }
210
+ child.on("close", (exitCode, exitSignal) => {
211
+ if (exitCode !== 0 && !ignoreExitCode) {
212
+ reject(
213
+ new Error(describeExitFailure({
214
+ command,
215
+ exitCode,
216
+ exitSignal,
217
+ isInteractive,
218
+ isQuiet: quiet,
219
+ stderr,
220
+ stdout
221
+ }))
222
+ );
223
+ return;
224
+ }
225
+ if (!shouldIncludeDetails) {
226
+ resolve(stdout);
227
+ return;
228
+ }
229
+ resolve({
230
+ exitCode,
231
+ exitSignal,
232
+ stderr,
233
+ stdout
234
+ });
235
+ });
236
+ child.on("error", (error) => {
237
+ if (!ignoreExitCode) {
238
+ reject(new Error(`Could not run command: ${truncateCommand(command)}
239
+ ${error.message}`, { cause: error }));
240
+ return;
241
+ }
242
+ if (!shouldIncludeDetails) {
243
+ resolve(stdout);
244
+ return;
245
+ }
246
+ resolve({
247
+ exitCode: null,
248
+ exitSignal: null,
249
+ stderr,
250
+ stdout
251
+ });
252
+ });
253
+ });
254
+ }
255
+ const LOCAL_STORAGE_NODE_OPTION = "--localstorage-file=:memory:";
256
+ const MAX_COMMAND_LENGTH_IN_MESSAGE = 500;
257
+ const NTSTATUS_NAMES = /* @__PURE__ */ new Map([
258
+ ["0xC0000005", "STATUS_ACCESS_VIOLATION"],
259
+ ["0xC0000017", "STATUS_NO_MEMORY"],
260
+ ["0xC000001D", "STATUS_ILLEGAL_INSTRUCTION"],
261
+ ["0xC0000094", "STATUS_INTEGER_DIVIDE_BY_ZERO"],
262
+ ["0xC00000FD", "STATUS_STACK_OVERFLOW"],
263
+ ["0xC0000135", "STATUS_DLL_NOT_FOUND"],
264
+ ["0xC000013A", "STATUS_CONTROL_C_EXIT"],
265
+ ["0xC0000374", "STATUS_HEAP_CORRUPTION"],
266
+ ["0xC0000409", "STATUS_STACK_BUFFER_OVERRUN"]
267
+ ]);
268
+ const WINDOWS_CHILD_EXPANSION_RESERVE = 2048;
269
+ function buildCommandLine($arguments) {
270
+ return import_node_process.default.platform === "win32" ? (0, import_cli_utils.toCommandLine)($arguments) : (0, import_cli_utils.toPosixCommandLine)($arguments);
271
+ }
272
+ function describeExitFailure(params) {
273
+ const { command, exitCode, exitSignal, isInteractive, isQuiet, stderr, stdout } = params;
274
+ const ntStatus = toNtStatus(exitCode);
275
+ let status = `exit code ${exitCode === null ? "(null)" : String(exitCode)}`;
276
+ let abnormalReason = null;
277
+ if (ntStatus !== null) {
278
+ const HEX_RADIX = 16;
279
+ const hex = `0x${ntStatus.toString(HEX_RADIX).toUpperCase()}`;
280
+ const name = NTSTATUS_NAMES.get(hex);
281
+ status += ` (NTSTATUS ${name ? `${hex} ${name}` : hex})`;
282
+ abnormalReason = name === "STATUS_CONTROL_C_EXIT" ? "was interrupted" : "crashed";
283
+ } else if (exitSignal !== null) {
284
+ status += `, terminated by signal ${exitSignal}`;
285
+ abnormalReason = `was killed by ${exitSignal}`;
286
+ }
287
+ const lines = [`Command failed with ${status}`, `Command: ${truncateCommand(command)}`];
288
+ if (abnormalReason !== null) {
289
+ lines.push(
290
+ !isInteractive && stdout === "" && stderr === "" ? `The child process ${abnormalReason} before writing anything to stdout or stderr. This is not a failure the tool reported (not a lint finding, not a type error): re-run the command.` : `The child process ${abnormalReason} rather than exiting on its own, so any output it wrote may be incomplete.`
291
+ );
292
+ }
293
+ if (stdout !== "") {
294
+ lines.push(isQuiet ? `stdout:
295
+ ${stdout}` : `stdout: ${String(stdout.split("\n").length)} line(s), printed above.`);
296
+ }
297
+ if (stderr !== "") {
298
+ lines.push(`stderr:
299
+ ${stderr}`);
300
+ }
301
+ return lines.join("\n");
302
+ }
303
+ async function executeBatches(params) {
304
+ const { baseCommand, batches, options } = params;
305
+ const stdoutParts = [];
306
+ const stderrParts = [];
307
+ let failure = null;
308
+ for (const batch of batches) {
309
+ const batchCommand = `${baseCommand} ${buildCommandLine(batch)}`;
310
+ const result = await execString({
311
+ command: batchCommand,
312
+ options
313
+ });
314
+ if (typeof result === "string") {
315
+ pushIfNotEmpty(stdoutParts, result);
316
+ continue;
317
+ }
318
+ pushIfNotEmpty(stdoutParts, result.stdout);
319
+ pushIfNotEmpty(stderrParts, result.stderr);
320
+ if (result.exitCode !== 0 && (failure === null || !isAbnormalTermination(failure) && isAbnormalTermination(result))) {
321
+ failure = result;
322
+ }
323
+ }
324
+ return options.shouldIncludeDetails ? {
325
+ // Not `failure?.exitCode ?? 0`: a batch killed by a signal has a `null` code, which `??` would report as success.
326
+ exitCode: failure === null ? 0 : failure.exitCode,
327
+ exitSignal: failure?.exitSignal ?? null,
328
+ stderr: stderrParts.join("\n"),
329
+ stdout: stdoutParts.join("\n")
330
+ } : stdoutParts.join("\n");
331
+ }
332
+ function getChildEnv() {
333
+ return buildChildEnv(import_node_process.default.env, import_node_process.default.allowedNodeEnvironmentFlags);
334
+ }
335
+ function getEffectiveCommandLineLength(commandLine) {
336
+ if (import_node_process.default.platform !== "win32") {
337
+ return commandLine.length;
338
+ }
339
+ const comspec = import_node_process.default.env["comspec"] ?? "cmd.exe";
340
+ const CMD_WRAPPER = ' /d /s /c ""';
341
+ return comspec.length + CMD_WRAPPER.length + (0, import_cli_utils.cmdEscapeCommandLine)(commandLine).length;
342
+ }
343
+ function getMaxBatchCommandLength() {
344
+ return getMaxCommandLength() - (import_node_process.default.platform === "win32" ? WINDOWS_CHILD_EXPANSION_RESERVE : 0);
345
+ }
346
+ function getMaxCommandLength() {
347
+ const WINDOWS_MAX_COMMAND_LENGTH = 8191;
348
+ const UNIX_MAX_COMMAND_LENGTH = 131072;
349
+ return import_node_process.default.platform === "win32" ? WINDOWS_MAX_COMMAND_LENGTH : UNIX_MAX_COMMAND_LENGTH;
350
+ }
351
+ function handleBatchedCommand(parts, options) {
352
+ const execArguments = parts.filter(isExecArgument);
353
+ if (execArguments.length === 0) {
354
+ return void 0;
355
+ }
356
+ if (execArguments.length > 1) {
357
+ return Promise.reject(new Error("Only one ExecArg with batchedArguments is allowed per command"));
358
+ }
359
+ const execArgument = execArguments[0];
360
+ (0, import_type_guards.assertNonNullable)(execArgument);
361
+ const staticParts = parts.filter((part) => typeof part === "string");
362
+ const baseCommand = buildCommandLine(staticParts);
363
+ const maxCommandLength = getMaxBatchCommandLength();
364
+ const fullCommand = `${baseCommand} ${buildCommandLine([...execArgument.batchedArguments])}`;
365
+ if (getEffectiveCommandLineLength(fullCommand) <= maxCommandLength) {
366
+ return execString({
367
+ command: fullCommand,
368
+ options
369
+ });
370
+ }
371
+ const batches = [];
372
+ let currentBatch = [];
373
+ for (const argument of execArgument.batchedArguments) {
374
+ const tentative = `${baseCommand} ${buildCommandLine([...currentBatch, argument])}`;
375
+ if (getEffectiveCommandLineLength(tentative) > maxCommandLength) {
376
+ if (currentBatch.length === 0) {
377
+ return Promise.reject(
378
+ new Error(
379
+ `Cannot split command into batches: a single argument (${String(argument.length)} chars) plus the base command (${String(baseCommand.length)} chars) exceeds the max batch command length (${String(maxCommandLength)}).`
380
+ )
381
+ );
382
+ }
383
+ batches.push(currentBatch);
384
+ currentBatch = [argument];
385
+ } else {
386
+ currentBatch.push(argument);
387
+ }
388
+ }
389
+ if (currentBatch.length > 0) {
390
+ batches.push(currentBatch);
391
+ }
392
+ return executeBatches({
393
+ baseCommand,
394
+ batches,
395
+ options
396
+ });
397
+ }
398
+ function isAbnormalTermination(result) {
399
+ return result.exitSignal !== null || toNtStatus(result.exitCode) !== null;
400
+ }
401
+ function isExecArgument(part) {
402
+ return typeof part === "object" && "batchedArguments" in part;
403
+ }
404
+ function pushIfNotEmpty(accumulator, output) {
405
+ if (output !== "") {
406
+ accumulator.push(output);
407
+ }
408
+ }
409
+ function spawnViaShell(params) {
410
+ const { command, cwd, env: extraEnv, isInteractive = false, rawArguments } = params;
411
+ const env = {
412
+ ...getChildEnv(),
413
+ ...extraEnv
414
+ };
415
+ const stdio = isInteractive ? "inherit" : "pipe";
416
+ if (import_node_process.default.platform === "win32" && command.includes("\n")) {
417
+ if (!rawArguments) {
418
+ throw new Error("Commands containing newlines cannot be executed through cmd.exe on Windows. Pass an argument array instead of a string.");
419
+ }
420
+ const [program, ...$arguments] = rawArguments;
421
+ (0, import_type_guards.assertNonNullable)(program, "Command array must not be empty");
422
+ return (0, import_node_child_process.spawn)(program, $arguments, {
423
+ cwd,
424
+ env,
425
+ stdio
426
+ });
427
+ }
428
+ const shellCommand = import_node_process.default.platform === "win32" ? (0, import_cli_utils.cmdEscapeCommandLine)(command) : command;
429
+ return (0, import_node_child_process.spawn)(shellCommand, [], {
430
+ cwd,
431
+ env,
432
+ shell: true,
433
+ stdio
434
+ });
435
+ }
436
+ function toNtStatus(exitCode) {
437
+ if (exitCode === null || !Number.isSafeInteger(exitCode)) {
438
+ return null;
439
+ }
440
+ const NTSTATUS_ERROR_START = 3221225472;
441
+ const NTSTATUS_ERROR_END = 3758096384;
442
+ const UINT32_RANGE = 4294967296;
443
+ const unsigned = exitCode < 0 ? exitCode + UINT32_RANGE : exitCode;
444
+ return unsigned >= NTSTATUS_ERROR_START && unsigned < NTSTATUS_ERROR_END ? unsigned : null;
445
+ }
446
+ function truncateCommand(command) {
447
+ return command.length > MAX_COMMAND_LENGTH_IN_MESSAGE ? `${command.slice(0, MAX_COMMAND_LENGTH_IN_MESSAGE)}\u2026` : command;
448
+ }
449
+ // Annotate the CommonJS export names for ESM import in node:
450
+ 0 && (module.exports = {
451
+ appendNodeOption,
452
+ buildChildEnv,
453
+ exec
454
+ });
455
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V4ZWMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb250YWlucyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGVidWcnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyB0cmltRW5kIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3N0cmluZyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQge1xuICBjbWRFc2NhcGVDb21tYW5kTGluZSBhcyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUsXG4gIHRvQ29tbWFuZExpbmUsXG4gIHRvUG9zaXhDb21tYW5kTGluZVxufSBmcm9tICcuL2NsaS11dGlscy50cyc7XG5cbi8qKlxuICogQSBjb21tYW5kIHBhcnQ6IGVpdGhlciBhIHBsYWluIHN0cmluZyBvciBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSB3aXRoIGJhdGNoZWQgYXJndW1lbnRzLlxuICovXG5leHBvcnQgdHlwZSBDb21tYW5kUGFydCA9IEV4ZWNBcmd1bWVudCB8IHN0cmluZztcblxuLyoqXG4gKiBBIGNvbW1hbmQgYXJndW1lbnQgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgYXJncyB0byBiZSBiYXRjaGVkLlxuICogSWYgdGhlIGV4cGFuZGVkIGNvbW1hbmQgZXhjZWVkcyB0aGUgcGxhdGZvcm0ncyBtYXggY29tbWFuZCBsZW5ndGgsXG4gKiB0aGUgYmF0Y2hlZCBhcmdzIGFyZSBzcGxpdCBpbnRvIHNlcXVlbnRpYWwgZXhlY3V0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjQXJndW1lbnQge1xuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyB0byBiYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZWRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBleGVjfSB0aGF0IHJldHVybiBkZXRhaWxlZCByZXN1bHRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNEZXRhaWxlZE9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGB0cnVlYCB0byByZWNlaXZlIGRldGFpbGVkIHJlc3VsdHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlsczogdHJ1ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBleGVjdXRpbmcgYSBjb21tYW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY3VycmVudCB3b3JraW5nIGZvbGRlciBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY3dkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MsIG1lcmdlZCBvdmVyIHRoZSBpbmhlcml0ZWQgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB7fWBcbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCBwcm9jZXNzJ3Mgc3RkaW8gZGlyZWN0bHkgdG8gdGhlIHRlcm1pbmFsIChgc3RkaW86ICdpbmhlcml0J2ApIGluc3RlYWRcbiAgICogb2YgY2FwdHVyaW5nIGl0LiBVc2UgZm9yIGxvbmctcnVubmluZyBvciBpbnRlcmFjdGl2ZSBjb21tYW5kcyBzdWNoIGFzIGRldiBzZXJ2ZXJzIGFuZCB3YXRjaCBtb2RlLlxuICAgKiBCZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm90IGNhcHR1cmVkLCB0aGUgcmVzb2x2ZWQgc3Rkb3V0IGlzIGFuIGVtcHR5IHN0cmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGl2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNvbW1hbmQgZmFpbHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRmFpbElmQ2FsbGVkRnJvbU91dHNpZGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBpZ25vcmVzIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZElnbm9yZUV4aXRDb2RlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYGZhbHNlYCwgb25seSByZXR1cm5zIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVEZXRhaWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gaW5wdXQgdG8gYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdGRpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiB7QGxpbmsgZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQuIEEgdmFsdWUgb2YgYG51bGxgIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgcHJvY2VzcyB0byBiZSB0ZXJtaW5hdGVkLiBBIHZhbHVlIG9mIGBudWxsYCBpbmRpY2F0ZXMgdGhhdCBubyBzaWduYWwgd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdFNpZ25hbDogTm9kZUpTLlNpZ25hbHMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0YW5kYXJkIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhbmRhcmQgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZXhlY30gdGhhdCByZXR1cm4gb25seSBzdGRvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY1NpbXBsZU9wdGlvbnMgZXh0ZW5kcyBFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBNdXN0IGJlIGBmYWxzZWAgb3Igb21pdHRlZCB0byByZWNlaXZlIG9ubHkgc3Rkb3V0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRGV0YWlscz86IGZhbHNlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjU3RyaW5nfS5cbiAqL1xuaW50ZXJmYWNlIEV4ZWNTdHJpbmdQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhlYyBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9ucz86IEV4ZWNPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSksIHVzZWQgYnkgdGhlIFBvd2VyU2hlbGxcbiAgICogZmFsbGJhY2sgcGF0aCB0byBxdW90ZSBhcmd1bWVudHMgd2l0aCBQb3dlclNoZWxsLW5hdGl2ZSBzaW5nbGUgcXVvdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3QXJndW1lbnRzPzogc3RyaW5nW107XG59XG4vKipcbiAqIEFwcGVuZHMgYSBzaW5nbGUgYG5vZGVgIENMSSBvcHRpb24gdG8gYSBgTk9ERV9PUFRJT05TYCBzdHJpbmcsIHByZXNlcnZpbmcgYW55IG9wdGlvbnMgYWxyZWFkeSBwcmVzZW50LlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ05vZGVPcHRpb25zIC0gVGhlIGN1cnJlbnQgYE5PREVfT1BUSU9OU2AgdmFsdWUgKGUuZy4gYHByb2Nlc3MuZW52Lk5PREVfT1BUSU9OU2ApLCBpZiBhbnkuXG4gKiBAcGFyYW0gb3B0aW9uIC0gVGhlIGBub2RlYCBDTEkgb3B0aW9uIHRvIGFwcGVuZCAoZS5nLiBgLS1sb2NhbHN0b3JhZ2UtZmlsZT06bWVtb3J5OmApLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGBOT0RFX09QVElPTlNgIHN0cmluZy4gSWYgYG9wdGlvbmAgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kTm9kZU9wdGlvbihleGlzdGluZ05vZGVPcHRpb25zOiBzdHJpbmcgfCB1bmRlZmluZWQsIG9wdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbW1lZCA9IChleGlzdGluZ05vZGVPcHRpb25zID8/ICcnKS50cmltKCk7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiBvcHRpb247XG4gIH1cbiAgcmV0dXJuIHRyaW1tZWQuc3BsaXQoL1xccysvKS5pbmNsdWRlcyhvcHRpb24pID8gdHJpbW1lZCA6IGAke3RyaW1tZWR9ICR7b3B0aW9ufWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBlbnZpcm9ubWVudCBmb3IgY2hpbGQgcHJvY2Vzc2VzOiB0aGUgcGFyZW50IGVudmlyb25tZW50IHBsdXMgYERFQlVHX0NPTE9SU2AsIGFuZCBcdTIwMTQgd2hlblxuICogdGhlIHJ1bm5pbmcgYG5vZGVgIHN1cHBvcnRzIGl0IFx1MjAxNCB7QGxpbmsgTE9DQUxfU1RPUkFHRV9OT0RFX09QVElPTn0gYXBwZW5kZWQgdG8gYE5PREVfT1BUSU9OU2AuXG4gKlxuICogVGhlIHN1cHBvcnQgY2hlY2sgZ3VhcmRzIGFnYWluc3Qgb2xkZXIgYG5vZGVgICg8IDIyKTogcGFzc2luZyBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWFcbiAqIGBOT0RFX09QVElPTlNgIG1ha2VzIGl0IGV4aXQgYmVmb3JlIHJ1bm5pbmcsIHdoaWNoIHdvdWxkIGJyZWFrIGV2ZXJ5IHNwYXduZWQgdG9vbC5cbiAqXG4gKiBAcGFyYW0gYmFzZUVudiAtIFRoZSBwYXJlbnQgZW52aXJvbm1lbnQgdG8gZXh0ZW5kICh0eXBpY2FsbHkgYHByb2Nlc3MuZW52YCkuXG4gKiBAcGFyYW0gYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzIC0gVGhlIGBub2RlYCBvcHRpb25zIGFjY2VwdGVkIHZpYSBgTk9ERV9PUFRJT05TYCAodHlwaWNhbGx5IGBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFnc2ApLlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENoaWxkRW52KGJhc2VFbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBhbGxvd2VkTm9kZUVudmlyb25tZW50RmxhZ3M6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiB7XG4gICAgREVCVUdfQ09MT1JTOiAnMScsXG4gICAgLi4uYmFzZUVudixcbiAgICAuLi4oYWxsb3dlZE5vZGVFbnZpcm9ubWVudEZsYWdzLmhhcygnLS1sb2NhbHN0b3JhZ2UtZmlsZScpICYmIHsgTk9ERV9PUFRJT05TOiBhcHBlbmROb2RlT3B0aW9uKGJhc2VFbnZbJ05PREVfT1BUSU9OUyddLCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OKSB9KVxuICB9O1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kLlxuICogQHRocm93cyBJZiB0aGUgY29tbWFuZCBmYWlscyB3aXRoIGEgbm9uLXplcm8gZXhpdCBjb2RlIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgZmFsc2VgLlxuICogICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhpdCBjb2RlLCB0aGUgY29tbWFuZCwgc3RkZXJyLCBhbmQgc3Rkb3V0IChvciBhIG5vdGUgdGhhdCBpdCB3YXNcbiAqICAgICAgICAgcHJpbnRlZCksIGFuZCBzYXlzIHdoZW4gdGhlIGNoaWxkIGNyYXNoZWQgb3Igd2FzIGtpbGxlZCByYXRoZXIgdGhhbiBleGl0aW5nIG9uIGl0cyBvd24uXG4gKiAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBhbmQgaWdub3JlRXhpdENvZGUgaXMgYHRydWVgLFxuICogICAgICAgICB0aGUgZXJyb3IgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjKGNvbW1hbmQ6IENvbW1hbmRQYXJ0W10gfCBzdHJpbmcsIG9wdGlvbnM/OiBFeGVjU2ltcGxlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcbi8qKlxuICogRXhlY3V0ZXMgYSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY0RldGFpbGVkT3B0aW9ucyk6IFByb21pc2U8RXhlY1Jlc3VsdD47XG4vKipcbiAqIEV4ZWN1dGVzIGEgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGV4ZWN1dGUuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIG9yIGFuIEV4ZWNSZXN1bHQgb2JqZWN0LlxuICogICAgICAgICAgVGhlIEV4ZWNSZXN1bHQgb2JqZWN0IGNvbnRhaW5zIHRoZSBleGl0IGNvZGUsIGV4aXQgc2lnbmFsLCBzdGRlcnIsIGFuZCBzdGRvdXQuXG4gKiBAdGhyb3dzIElmIHRoZSBjb21tYW5kIGZhaWxzIHdpdGggYSBub24temVybyBleGl0IGNvZGUgYW5kIGlnbm9yZUV4aXRDb2RlIGlzIGBmYWxzZWAuXG4gKiAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGl0IGNvZGUsIHRoZSBjb21tYW5kLCBzdGRlcnIsIGFuZCBzdGRvdXQgKG9yIGEgbm90ZSB0aGF0IGl0IHdhc1xuICogICAgICAgICBwcmludGVkKSwgYW5kIHNheXMgd2hlbiB0aGUgY2hpbGQgY3Jhc2hlZCBvciB3YXMga2lsbGVkIHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93bi5cbiAqICAgICAgICAgSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgZXhlY3V0aW9uIGFuZCBpZ25vcmVFeGl0Q29kZSBpcyBgdHJ1ZWAsXG4gKiAgICAgICAgIHRoZSBlcnJvciBpcyByZXNvbHZlZCB3aXRoIHRoZSBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWMoY29tbWFuZDogQ29tbWFuZFBhcnRbXSB8IHN0cmluZywgb3B0aW9uczogRXhlY09wdGlvbnMgPSB7fSk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21tYW5kKSkge1xuICAgIGNvbnN0IGJhdGNoUmVzdWx0ID0gaGFuZGxlQmF0Y2hlZENvbW1hbmQoY29tbWFuZCwgb3B0aW9ucyk7XG4gICAgaWYgKGJhdGNoUmVzdWx0KSB7XG4gICAgICByZXR1cm4gYmF0Y2hSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0ICRhcmd1bWVudHMgPSBjb21tYW5kLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyk7XG4gICAgY29uc3QgY29tbWFuZExpbmUgPSBidWlsZENvbW1hbmRMaW5lKCRhcmd1bWVudHMpO1xuXG4gICAgY29uc3QgbWF4Q29tbWFuZExlbmd0aCA9IGdldE1heENvbW1hbmRMZW5ndGgoKTtcbiAgICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kTGluZSk7XG4gICAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICAgID8gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgOiBleGVjU3RyaW5nKHtcbiAgICAgICAgY29tbWFuZDogY29tbWFuZExpbmUsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIHJhd0FyZ3VtZW50czogJGFyZ3VtZW50c1xuICAgICAgfSk7XG4gIH1cblxuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4Q29tbWFuZExlbmd0aCgpO1xuICBjb25zdCBlZmZlY3RpdmVMZW5ndGggPSBnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChjb21tYW5kKTtcbiAgcmV0dXJuIGVmZmVjdGl2ZUxlbmd0aCA+IG1heENvbW1hbmRMZW5ndGhcbiAgICA/IFByb21pc2UucmVqZWN0KFxuICAgICAgbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBsaW5lIGlzIHRvbyBsb25nICgke1N0cmluZyhlZmZlY3RpdmVMZW5ndGgpfSBjaGFycyBvbmNlIHdyYXBwZWQgZm9yIHRoZSBzaGVsbCwgbWF4ICR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSBvbiAke3Byb2Nlc3MucGxhdGZvcm19KS4gQ29uc2lkZXIgc3BsaXR0aW5nIGludG8gc21hbGxlciBiYXRjaGVzIG9yIHVzZSBFeGVjQXJnLmBcbiAgICAgIClcbiAgICApXG4gICAgOiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQsXG4gICAgICBvcHRpb25zXG4gICAgfSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBzaW5nbGUgc3RyaW5nIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXhlY3V0aW9uLlxuICogQHJldHVybnMgQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0LlxuICovXG5mdW5jdGlvbiBleGVjU3RyaW5nKHBhcmFtczogRXhlY1N0cmluZ1BhcmFtcyk6IFByb21pc2U8RXhlY1Jlc3VsdCB8IHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBvcHRpb25zID0ge30sXG4gICAgcmF3QXJndW1lbnRzXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHtcbiAgICBjd2QgPSBwcm9jZXNzLmN3ZCgpLFxuICAgIGVudixcbiAgICBpc0ludGVyYWN0aXZlID0gZmFsc2UsXG4gICAgaXNRdWlldDogcXVpZXQgPSBmYWxzZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogaWdub3JlRXhpdENvZGUgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRGV0YWlscyA9IGZhbHNlLFxuICAgIHN0ZGluID0gJydcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignRXhlYycpKGBFeGVjdXRpbmcgY29tbWFuZDogJHtjb21tYW5kfWApO1xuXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3blZpYVNoZWxsKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTcGF3blZpYVNoZWxsUGFyYW1zPih7XG4gICAgICBjb21tYW5kLFxuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgaXNJbnRlcmFjdGl2ZSxcbiAgICAgIHJhd0FyZ3VtZW50c1xuICAgIH0pKTtcblxuICAgIGxldCBzdGRvdXQgPSAnJztcbiAgICBsZXQgc3RkZXJyID0gJyc7XG5cbiAgICAvLyBJbiBpbnRlcmFjdGl2ZSBtb2RlIHRoZSBjaGlsZCdzIHN0ZGlvIGlzIGluaGVyaXRlZCBieSB0aGUgdGVybWluYWwsIHNvIHRoZXJlIGFyZSBubyBzdHJlYW1zIHRvIHJlYWQgYW5kIG5vdGhpbmcgaXMgY2FwdHVyZWQuXG4gICAgaWYgKCFpc0ludGVyYWN0aXZlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHN0ZGVycjogY2hpbGRTdGRlcnIsXG4gICAgICAgIHN0ZGluOiBjaGlsZFN0ZGluLFxuICAgICAgICBzdGRvdXQ6IGNoaWxkU3Rkb3V0XG4gICAgICB9ID0gY2hpbGQ7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZGluLCAnQ2hpbGQgcHJvY2VzcyBzdGRpbiBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShjaGlsZFN0ZG91dCwgJ0NoaWxkIHByb2Nlc3Mgc3Rkb3V0IGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKGNoaWxkU3RkZXJyLCAnQ2hpbGQgcHJvY2VzcyBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZScpO1xuXG4gICAgICBjaGlsZFN0ZGluLndyaXRlKHN0ZGluKTtcbiAgICAgIGNoaWxkU3RkaW4uZW5kKCk7XG5cbiAgICAgIGNoaWxkU3Rkb3V0Lm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoIXF1aWV0KSB7XG4gICAgICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc3Rkb3V0ICs9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRvdXQub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgc3Rkb3V0ID0gdHJpbUVuZCh7XG4gICAgICAgICAgJHN0cmluZzogc3Rkb3V0LFxuICAgICAgICAgIHN1ZmZpeDogJ1xcbidcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRTdGRlcnIub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGlmICghcXVpZXQpIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZGVyci53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGRlcnIgKz0gZGF0YS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZFN0ZGVyci5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICBzdGRlcnIgPSB0cmltRW5kKHtcbiAgICAgICAgICAkc3RyaW5nOiBzdGRlcnIsXG4gICAgICAgICAgc3VmZml4OiAnXFxuJ1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoaWxkLm9uKCdjbG9zZScsIChleGl0Q29kZSwgZXhpdFNpZ25hbCkgPT4ge1xuICAgICAgaWYgKGV4aXRDb2RlICE9PSAwICYmICFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKGRlc2NyaWJlRXhpdEZhaWx1cmUoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGV4aXRDb2RlLFxuICAgICAgICAgICAgZXhpdFNpZ25hbCxcbiAgICAgICAgICAgIGlzSW50ZXJhY3RpdmUsXG4gICAgICAgICAgICBpc1F1aWV0OiBxdWlldCxcbiAgICAgICAgICAgIHN0ZGVycixcbiAgICAgICAgICAgIHN0ZG91dFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghc2hvdWxkSW5jbHVkZURldGFpbHMpIHtcbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhpdENvZGUsXG4gICAgICAgIGV4aXRTaWduYWwsXG4gICAgICAgIHN0ZGVycixcbiAgICAgICAgc3Rkb3V0XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgaWYgKCFpZ25vcmVFeGl0Q29kZSkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBDb3VsZCBub3QgcnVuIGNvbW1hbmQ6ICR7dHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQpfVxcbiR7ZXJyb3IubWVzc2FnZX1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzaG91bGRJbmNsdWRlRGV0YWlscykge1xuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4aXRDb2RlOiBudWxsLFxuICAgICAgICBleGl0U2lnbmFsOiBudWxsLFxuICAgICAgICBzdGRlcnIsXG4gICAgICAgIHN0ZG91dFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEEgYG5vZGVgIENMSSBvcHRpb24gKHBhc3NlZCB2aWEgYE5PREVfT1BUSU9OU2ApIHRoYXQgcHJvdmlkZXMgYW4gaW4tbWVtb3J5IGBsb2NhbFN0b3JhZ2VgIHRvIGV2ZXJ5XG4gKiBzcGF3bmVkIGBub2RlYCBwcm9jZXNzLiBOb2RlIDIyKyBleHBvc2VzIGFuIGV4cGVyaW1lbnRhbCBXZWIgU3RvcmFnZSBgbG9jYWxTdG9yYWdlYCwgYnV0IGFjY2Vzc2luZyBpdFxuICogd2l0aG91dCBgLS1sb2NhbHN0b3JhZ2UtZmlsZWAgZW1pdHMgYW4gYEV4cGVyaW1lbnRhbFdhcm5pbmdgIGFuZCBsZWF2ZXMgYGxvY2FsU3RvcmFnZWAgdW5hdmFpbGFibGUuXG4gKiBQb2ludGluZyBpdCBhdCB0aGUgc3BlY2lhbCBgOm1lbW9yeTpgIGRhdGFiYXNlIGdpdmVzIGVhY2ggcHJvY2VzcyBhIHdvcmtpbmcsIG5vbi1wZXJzaXN0ZW50XG4gKiBgbG9jYWxTdG9yYWdlYCAobm8gZmlsZSBvbiBkaXNrLCBubyBzdGF0ZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMpIFx1MjAxNCBtYXRjaGluZyB0aGUgcmVhbCBPYnNpZGlhblxuICogKEVsZWN0cm9uKSBydW50aW1lIGFuZCBzaWxlbmNpbmcgdGhlIHdhcm5pbmcgYnkgYWRkcmVzc2luZyBpdHMgcm9vdCBjYXVzZSByYXRoZXIgdGhhbiBzdXBwcmVzc2luZyBpdC5cbiAqXG4gKiBJdCBpcyBhcHBsaWVkIG9ubHkgd2hlbiB0aGUgcnVubmluZyBgbm9kZWAgYWN0dWFsbHkgc3VwcG9ydHMgaXQgKHNlZSB7QGxpbmsgYnVpbGRDaGlsZEVudn0pOiBwYXNzaW5nXG4gKiBhbiBvcHRpb24gYG5vZGVgIGRvZXMgbm90IHJlY29nbml6ZSB2aWEgYE5PREVfT1BUSU9OU2AgbWFrZXMgaXQgcmVmdXNlIHRvIHN0YXJ0LCBzbyBhbiBvbGRlciBgbm9kZWBcbiAqICg8IDIyKSBtdXN0IGJlIGxlZnQgdW50b3VjaGVkLlxuICovXG5jb25zdCBMT0NBTF9TVE9SQUdFX05PREVfT1BUSU9OID0gJy0tbG9jYWxzdG9yYWdlLWZpbGU9Om1lbW9yeTonO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IGNvbW1hbmQgYSBmYWlsdXJlIG1lc3NhZ2UgcXVvdGVzIGJlZm9yZSB0cnVuY2F0aW5nIGl0LiBBIGJhdGNoZWQgY29tbWFuZCBjYW4gcnVuIHRvIHNldmVyYWxcbiAqIHRob3VzYW5kIGNoYXJhY3RlcnMgb2YgcGF0aHMsIHdoaWNoIHdvdWxkIGJ1cnkgdGhlIG9uZSBsaW5lIG9mIHRoZSBtZXNzYWdlIHRoYXQgc2F5cyB3aGF0IHdlbnQgd3JvbmcuXG4gKi9cbmNvbnN0IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID0gNTAwO1xuXG4vKipcbiAqIE5hbWVzIG9mIHRoZSBXaW5kb3dzIE5UU1RBVFVTIGNvZGVzIGEgY3Jhc2hlZCBjaGlsZCBtb3N0IG9mdGVuIGV4aXRzIHdpdGgsIGZvciB0aGUgZmFpbHVyZSBtZXNzYWdlLiBBIGNvZGVcbiAqIG91dHNpZGUgdGhpcyBsaXN0IGlzIHN0aWxsIHJlY29nbml6ZWQgYXMgYW4gTlRTVEFUVVMgZmFpbHVyZSAoc2VlIHtAbGluayB0b050U3RhdHVzfSkgYW5kIHNob3duIGluIGhleDsgdGhlXG4gKiBuYW1lIGlzIGEgY291cnRlc3ksIG5vdCB0aGUgY2xhc3NpZmljYXRpb24uXG4gKi9cbmNvbnN0IE5UU1RBVFVTX05BTUVTOiBSZWFkb25seU1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgWycweEMwMDAwMDA1JywgJ1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OJ10sXG4gIFsnMHhDMDAwMDAxNycsICdTVEFUVVNfTk9fTUVNT1JZJ10sXG4gIFsnMHhDMDAwMDAxRCcsICdTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiddLFxuICBbJzB4QzAwMDAwOTQnLCAnU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8nXSxcbiAgWycweEMwMDAwMEZEJywgJ1NUQVRVU19TVEFDS19PVkVSRkxPVyddLFxuICBbJzB4QzAwMDAxMzUnLCAnU1RBVFVTX0RMTF9OT1RfRk9VTkQnXSxcbiAgWycweEMwMDAwMTNBJywgJ1NUQVRVU19DT05UUk9MX0NfRVhJVCddLFxuICBbJzB4QzAwMDAzNzQnLCAnU1RBVFVTX0hFQVBfQ09SUlVQVElPTiddLFxuICBbJzB4QzAwMDA0MDknLCAnU1RBVFVTX1NUQUNLX0JVRkZFUl9PVkVSUlVOJ11cbl0pO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgaGVsZCBiYWNrIGZyb20gdGhlIFdpbmRvd3MgY29tbWFuZC1saW5lIGJ1ZGdldCB3aGVuIHNpemluZyBhbiB7QGxpbmsgRXhlY0FyZ3VtZW50fSBiYXRjaCwgdG9cbiAqIGNvdmVyIGV4cGFuc2lvbnMgdGhhdCBoYXBwZW4gSU5TSURFIHRoZSBjb21tYW5kIHdlIHNwYXduIGFuZCBhcmUgdGhlcmVmb3JlIGludmlzaWJsZSBmcm9tIGhlcmUuXG4gKlxuICogQSBzaGltbWVkIGA8dG9vbD4gPGFyZ3NcdTIwMjY+YCBpbnZvY2F0aW9uIGlzIG5vdCBvbmUgYGNtZC5leGVgIGNvbW1hbmQgbGluZSBidXQgYSBjaGFpbiBvZiB0aGVtOiB0aGVcbiAqIGAuYmluLzx0b29sPi5jbWRgIHNoaW0gcmUtZXhwYW5kcyBgJSpgIGludG8gYSBmcmVzaCBgbm9kZSBcdTIwMjYgPHRvb2w+LWNsaS5qcyA8YXJnc1x1MjAyNj5gIGxpbmUsIGFuZCBlYWNoIGhvcFxuICogcmUtcXVvdGVzIHdoYXQgaXQgZm9yd2FyZHMuIEV2ZXJ5IG9uZSBvZiB0aG9zZSBsaW5lcyBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIDgxOTEgbGltaXQsIGFuZCBldmVyeSBvbmUgaXNcbiAqIGxvbmdlciB0aGFuIHRoZSBsaW5lIHdlIGFzc2VtYmxlZCBcdTIwMTQgYnV0IGJ5IGhvdyBtdWNoIGlzIHRoZSBjaGlsZCdzIGJ1c2luZXNzLCBub3Qgb3Vycywgc28gbm8gZm9ybXVsYSBjYW5cbiAqIGJlIHJpZ2h0LiBPbmx5IHRoZSBkZWxpYmVyYXRlIHNsYWNrIGJlbG93IGNhbi5cbiAqXG4gKiBgMjA0OGAgaXMgcm91Z2hseSBkb3VibGUgdGhlIG92ZXJoZWFkIG1lYXN1cmVkIHdoZW4gdGhpcyB3YXMgZm91bmQsIGJhY2sgd2hlbiBldmVyeSB0b29sIHdhc1xuICogYWRkaXRpb25hbGx5IGZyb250ZWQgYnkgYG5weGAgYW5kIHNvIHBhaWQgb25lIG1vcmUgcmUtZXhwYW5zaW9uIGhvcCB0aGFuIGl0IGRvZXMgbm93LiBPdmVyIGEgcmVwb3NpdG9yeSdzXG4gKiAxODcgbWFya2Rvd24gcGF0aHMsIGEgYG1hcmtkb3dubGludC1jbGkyIFx1MjAyNmAgbGluZSAqKmFzc2VtYmxlZCBhdCA3MDUxIGNoYXJzKiogXHUyMDE0IDExNDAgdW5kZXIgdGhlIGxpbWl0IFx1MjAxNFxuICogc3RpbGwgZGllZCB3aXRoIGBUaGUgY29tbWFuZCBsaW5lIGlzIHRvbyBsb25nLmA7IHRoZSBzYW1lIHBheWxvYWQgc3BsaXQgaW4gdHdvIHJ1bnMgY2xlYW4uIE5vdGUgdGhlIHRvb2w6XG4gKiB0aGlzIGlzIG5vdCBzcGVjaWZpYyB0byBgbGlua2luYXRvcmAsIGl0IGlzIHRoZSBzaGFwZSBvZiBldmVyeSBzaGltLWZyb250ZWQgaW52b2NhdGlvbi5cbiAqXG4gKiBPdmVyLXJlc2VydmluZyBjb3N0cyBvbmUgZXh0cmEgc2VxdWVudGlhbCBpbnZvY2F0aW9uIG9mIGEgY29tbWFuZCB0aGF0IHdhcyBhbHJlYWR5IGdvaW5nIHRvIGJlIGJhdGNoZWQ7XG4gKiB1bmRlci1yZXNlcnZpbmcgY29zdHMgYSBsaW50IGZhaWx1cmUgdGhhdCBuYW1lcyBub3RoaW5nIHdyb25nIHdpdGggdGhlIGNvbnRlbnQuIFJhaXNlIGl0LCBuZXZlciBsb3dlciBpdCxcbiAqIGlmIHRoZSBzeW1wdG9tIHJldHVybnMuXG4gKi9cbmNvbnN0IFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkUgPSAyMDQ4O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXNjcmliZUV4aXRGYWlsdXJlfS5cbiAqL1xuaW50ZXJmYWNlIERlc2NyaWJlRXhpdEZhaWx1cmVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdGhhdCB3YXMgZXhlY3V0ZWQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleGl0IGNvZGUgdGhlIGNoaWxkIHJlcG9ydGVkLCBvciBgbnVsbGAgd2hlbiBpdCBkaWQgbm90IGV4aXQgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoYXQgdGVybWluYXRlZCB0aGUgY2hpbGQsIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRTaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2hpbGQncyBzdGRpbyB3YXMgYXR0YWNoZWQgdG8gdGhlIHRlcm1pbmFsLCBzbyBub3RoaW5nIHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNoaWxkJ3Mgb3V0cHV0IHdhcyBzdXBwcmVzc2VkLCBzbyB0aGUgdXNlciBoYXMgbm90IHNlZW4gaXQuXG4gICAqL1xuICByZWFkb25seSBpc1F1aWV0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNhcHR1cmVkIHN0YW5kYXJkIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleGVjdXRlQmF0Y2hlc30uXG4gKi9cbmludGVyZmFjZSBFeGVjdXRlQmF0Y2hlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYmFzZSBjb21tYW5kIHdpdGhvdXQgYmF0Y2hlZCBhcmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUNvbW1hbmQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGJhdGNoZXMgb2YgYXJncy5cbiAgICovXG4gIHJlYWRvbmx5IGJhdGNoZXM6IHN0cmluZ1tdW107XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBvcHRpb25zOiBFeGVjT3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3Bhd25WaWFTaGVsbH0uXG4gKi9cbmludGVyZmFjZSBTcGF3blZpYVNoZWxsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWVyZ2VkIG92ZXIgdGhlIGluaGVyaXRlZCBjaGlsZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGF0dGFjaGVzIHRoZSBjaGlsZCdzIHN0ZGlvIHRvIHRoZSB0ZXJtaW5hbCBpbnN0ZWFkIG9mIHBpcGluZyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpdmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYXJyYXkgKGlmIGF2YWlsYWJsZSkuXG4gICAqL1xuICByZWFkb25seSByYXdBcmd1bWVudHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBjb21tYW5kLWxpbmUgc3RyaW5nIGZyb20gYW4gYXJndW1lbnQgYXJyYXksIHF1b3RlZCBmb3IgdGhlIHNoZWxsIHRoYXRcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSB3aWxsIHJvdXRlIHRocm91Z2ggb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKlxuICogT24gV2luZG93cyB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYGNtZC5leGVgLCBzbyBpdCB1c2VzIHRoZVxuICogYENvbW1hbmRMaW5lVG9Bcmd2V2AgY29udmVudGlvbiAoe0BsaW5rIHRvQ29tbWFuZExpbmV9KTsge0BsaW5rIHNwYXduVmlhU2hlbGx9XG4gKiB0aGVuIGFwcGxpZXMge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBvbiB0b3AgZm9yIGBjbWQuZXhlYCBtZXRhY2hhcmFjdGVycy5cbiAqIEVsc2V3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYHNoIC1jYCwgc28gaXQgdXNlcyBQT1NJWCBzaW5nbGUtcXVvdGVcbiAqIHF1b3RpbmcgKHtAbGluayB0b1Bvc2l4Q29tbWFuZExpbmV9KSBhbmQgbmVlZHMgbm8gZnVydGhlciBlc2NhcGluZy5cbiAqXG4gKiBUaGUgcGxhdGZvcm0gYnJhbmNoIGhlcmUgTVVTVCBzdGF5IGluIHN5bmMgd2l0aCB0aGUgb25lIGluIHtAbGluayBzcGF3blZpYVNoZWxsfS5cbiAqXG4gKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBhcnJheSB0byBxdW90ZSBhbmQgam9pbi5cbiAqIEByZXR1cm5zIFRoZSBxdW90ZWQgY29tbWFuZC1saW5lIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0ncyBzaGVsbC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDb21tYW5kTGluZSgkYXJndW1lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gdG9Db21tYW5kTGluZSgkYXJndW1lbnRzKSA6IHRvUG9zaXhDb21tYW5kTGluZSgkYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgY29tbWFuZCByZWplY3RzIHdpdGgsIHNheWluZyBub3Qgb25seSBUSEFUIGl0IGZhaWxlZCBidXQgSE9XLlxuICpcbiAqIFRoZSBtZXNzYWdlIHVzZWQgdG8gYmUgYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDxuPmAgcGx1cyBzdGRlcnIsIHdoYXRldmVyIHRoZSBjb2RlLiBTbyBhIGNoaWxkIHRoYXRcbiAqIGNyYXNoZWQgYmVmb3JlIHdyaXRpbmcgYSBieXRlIGFuZCBhIGxpbnRlciB0aGF0IGZvdW5kIHJlYWwgcHJvYmxlbXMgcmVhZCB0aGUgc2FtZSwgZGlmZmVyaW5nIG9ubHkgaW4gYVxuICogbnVtYmVyIG5vYm9keSByZWFkcyBhcyBhIHN0YXR1czogYSBXaW5kb3dzIGFjY2VzcyB2aW9sYXRpb24gYXJyaXZlcyBhcyBgZXhpdCBjb2RlIDMyMjEyMjU0NzdgIHdpdGggbm90aGluZ1xuICogYWZ0ZXIgaXQsIGFuZCB3aG9ldmVyIHJlYWRzIGl0IGdvZXMgbG9va2luZyBmb3IgYSBmaW5kaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgdGhhdFxuICogY2FuIHRlbGwgdGhlIHR3byBhcGFydCBcdTIwMTQgdGhlIGAuY21kYCBzaGltIGlzIHNwYXduZWQgZGlyZWN0bHksIHNvIHRoZSBjaGlsZCdzIHJhdyBjb2RlIGlzIHZpc2libGUgaGVyZSwgd2hpbGVcbiAqIGFuIGBucG0gcnVuYCBsYXllciBmdXJ0aGVyIG91dCBpcyBrbm93biB0byBsYXVuZGVyIGl0IGludG8gYSBwbGFpbiBgMWAuXG4gKlxuICogVHdvIHNpZ25hbHMgYXJlIHJlYWQsIGFuZCB0aGVpciBjb25qdW5jdGlvbiBpcyB3aGF0IGVhcm5zIHRoZSB3b3JkIFwiY3Jhc2hlZFwiOiB0aGUgdGVybWluYXRpb24gd2FzIGFibm9ybWFsXG4gKiAoYW4gTlRTVEFUVVMgZXJyb3IgY29kZSwgb3IgYSBzaWduYWwpLCBhbmQgbmVpdGhlciBzdHJlYW0gY2FycmllZCBhbnl0aGluZy4gQSB0b29sIGZhaWxpbmcgb24gaXRzIG93biB0ZXJtc1xuICogc2F5cyBzb21ldGhpbmc7IGEgY2hpbGQgdGhhdCBkaWVkIG1pZC1pbnN0cnVjdGlvbiBkb2VzIG5vdC4gVGhlIENBVVNFIG9mIHN1Y2ggYSBjcmFzaCBpcyBub3QgdGhpc1xuICogZnVuY3Rpb24ncyBidXNpbmVzcywgc28gdGhlIG1lc3NhZ2Ugb25seSBuYW1lcyBpdCBhbmQgc2F5cyB3aGF0IHRvIGRvLlxuICpcbiAqIFRoZSBgQ29tbWFuZCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgPG4+YCBwcmVmaXggaXMga2VwdCwgc28gYSBjYWxsZXIgbWF0Y2hpbmcgb24gaXQgc3RpbGwgbWF0Y2hlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZGVzY3JpYmluZyB0aGUgZmFpbGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmYWlsdXJlIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdEZhaWx1cmUocGFyYW1zOiBEZXNjcmliZUV4aXRGYWlsdXJlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb21tYW5kLCBleGl0Q29kZSwgZXhpdFNpZ25hbCwgaXNJbnRlcmFjdGl2ZSwgaXNRdWlldCwgc3RkZXJyLCBzdGRvdXQgfSA9IHBhcmFtcztcbiAgY29uc3QgbnRTdGF0dXMgPSB0b050U3RhdHVzKGV4aXRDb2RlKTtcblxuICBsZXQgc3RhdHVzID0gYGV4aXQgY29kZSAke2V4aXRDb2RlID09PSBudWxsID8gJyhudWxsKScgOiBTdHJpbmcoZXhpdENvZGUpfWA7XG4gIGxldCBhYm5vcm1hbFJlYXNvbjogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGlmIChudFN0YXR1cyAhPT0gbnVsbCkge1xuICAgIGNvbnN0IEhFWF9SQURJWCA9IDE2O1xuICAgIGNvbnN0IGhleCA9IGAweCR7bnRTdGF0dXMudG9TdHJpbmcoSEVYX1JBRElYKS50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgbmFtZSA9IE5UU1RBVFVTX05BTUVTLmdldChoZXgpO1xuICAgIHN0YXR1cyArPSBgIChOVFNUQVRVUyAke25hbWUgPyBgJHtoZXh9ICR7bmFtZX1gIDogaGV4fSlgO1xuICAgIGFibm9ybWFsUmVhc29uID0gbmFtZSA9PT0gJ1NUQVRVU19DT05UUk9MX0NfRVhJVCcgPyAnd2FzIGludGVycnVwdGVkJyA6ICdjcmFzaGVkJztcbiAgfSBlbHNlIGlmIChleGl0U2lnbmFsICE9PSBudWxsKSB7XG4gICAgc3RhdHVzICs9IGAsIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7ZXhpdFNpZ25hbH1gO1xuICAgIGFibm9ybWFsUmVhc29uID0gYHdhcyBraWxsZWQgYnkgJHtleGl0U2lnbmFsfWA7XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtgQ29tbWFuZCBmYWlsZWQgd2l0aCAke3N0YXR1c31gLCBgQ29tbWFuZDogJHt0cnVuY2F0ZUNvbW1hbmQoY29tbWFuZCl9YF07XG5cbiAgaWYgKGFibm9ybWFsUmVhc29uICE9PSBudWxsKSB7XG4gICAgbGluZXMucHVzaChcbiAgICAgICFpc0ludGVyYWN0aXZlICYmIHN0ZG91dCA9PT0gJycgJiYgc3RkZXJyID09PSAnJ1xuICAgICAgICA/IGBUaGUgY2hpbGQgcHJvY2VzcyAke2Fibm9ybWFsUmVhc29ufSBiZWZvcmUgd3JpdGluZyBhbnl0aGluZyB0byBzdGRvdXQgb3Igc3RkZXJyLiBUaGlzIGlzIG5vdCBhIGZhaWx1cmUgdGhlIHRvb2wgcmVwb3J0ZWQgKG5vdCBhIGxpbnQgZmluZGluZywgbm90IGEgdHlwZSBlcnJvcik6IHJlLXJ1biB0aGUgY29tbWFuZC5gXG4gICAgICAgIDogYFRoZSBjaGlsZCBwcm9jZXNzICR7YWJub3JtYWxSZWFzb259IHJhdGhlciB0aGFuIGV4aXRpbmcgb24gaXRzIG93biwgc28gYW55IG91dHB1dCBpdCB3cm90ZSBtYXkgYmUgaW5jb21wbGV0ZS5gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChzdGRvdXQgIT09ICcnKSB7XG4gICAgbGluZXMucHVzaChpc1F1aWV0ID8gYHN0ZG91dDpcXG4ke3N0ZG91dH1gIDogYHN0ZG91dDogJHtTdHJpbmcoc3Rkb3V0LnNwbGl0KCdcXG4nKS5sZW5ndGgpfSBsaW5lKHMpLCBwcmludGVkIGFib3ZlLmApO1xuICB9XG5cbiAgaWYgKHN0ZGVyciAhPT0gJycpIHtcbiAgICBsaW5lcy5wdXNoKGBzdGRlcnI6XFxuJHtzdGRlcnJ9YCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYmF0Y2hlZCBjb21tYW5kcyBzZXF1ZW50aWFsbHkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciBvdXRwdXQuXG4gKlxuICogYGV4ZWNTdHJpbmdgIHJldHVybnMgYSBgc3RyaW5nYCBvciBhbiB7QGxpbmsgRXhlY1Jlc3VsdH0gZGVwZW5kaW5nIG9uIGBvcHRpb25zLnNob3VsZEluY2x1ZGVEZXRhaWxzYCwgc29cbiAqIGJvdGggc2hhcGVzIGFyZSB1bnBhY2tlZCBcdTIwMTQgcmVhZGluZyBvbmx5IHRoZSBgc3RyaW5nYCBvbmUgc2lsZW50bHkgdGhyZXcgYXdheSBldmVyeSBiYXRjaCdzIG91dHB1dCBpblxuICogZXhhY3RseSB0aGUgbW9kZSB0aGF0IGFza2VkIGZvciBpdC5cbiAqXG4gKiBBIGJhdGNoIHRoYXQgZXhpdHMgbm9uLXplcm8gbm9ybWFsbHkgcmVqZWN0czsgaXQgb25seSByZWFjaGVzIGhlcmUgd2hlbiBgc2hvdWxkSWdub3JlRXhpdENvZGVgIGFza2VkIGZvclxuICogaXQgdG8gYmUgcmVwb3J0ZWQgaW5zdGVhZC4gVGhlIGZpcnN0IHN1Y2ggZmFpbHVyZSBpcyB3aGF0IHRoZSBhZ2dyZWdhdGUgcmVwb3J0cywgc28gc3BsaXR0aW5nIGEgY29tbWFuZFxuICogaW50byBiYXRjaGVzIGNhbm5vdCB0dXJuIGEgZmFpbHVyZSBpbnRvIGEgc3VjY2VzcyBcdTIwMTQgZXhjZXB0IHRoYXQgYW4gYWJub3JtYWwgdGVybWluYXRpb24gKGEgY3Jhc2gsIGFcbiAqIHNpZ25hbCkgaW4gYSBsYXRlciBiYXRjaCBvdXRyYW5rcyBhbiBvcmRpbmFyeSBmYWlsdXJlIGluIGFuIGVhcmxpZXIgb25lLiBPdGhlcndpc2UgYSBjcmFzaCBpbiBiYXRjaCAyIGFmdGVyXG4gKiByZWFsIGZpbmRpbmdzIGluIGJhdGNoIDEgd291bGQgYWdncmVnYXRlIHRvIHRoZSBmaW5kaW5ncycgZXhpdCBjb2RlLCBhbmQgYSBjYWxsZXIgY2xhc3NpZnlpbmcgdGhlIHJlc3VsdFxuICogd291bGQgbmV2ZXIgbGVhcm4gdGhhdCBwYXJ0IG9mIHRoZSBpbnB1dCB3YXMgbm90IGNoZWNrZWQgYXQgYWxsLlxuICpcbiAqIFNpbGVudCBiYXRjaGVzIGNvbnRyaWJ1dGUgbm90aGluZyB0byB0aGUgam9pbmVkIG91dHB1dC4gYGV4ZWNTdHJpbmdgIGFscmVhZHkgdHJpbXMgZWFjaCByZXN1bHQncyB0cmFpbGluZ1xuICogbmV3bGluZSwgc28gam9pbmluZyBlbXB0eSBvbmVzIGJhY2sgaW4gd291bGQgcmVpbnRyb2R1Y2UgZXhhY3RseSB0aGUgYmxhbmstbGluZSBub2lzZSBpdCByZW1vdmVkIFx1MjAxNCBhXG4gKiBjb21tYW5kIHRoYXQgcHJpbnRlZCBub3RoaW5nIG11c3QgYWdncmVnYXRlIHRvIGAnJ2AsIG5vdCB0byBhIHJ1biBvZiBuZXdsaW5lcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBiYXRjaGVkIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGNvbmNhdGVuYXRlZCByZXN1bHQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVCYXRjaGVzKHBhcmFtczogRXhlY3V0ZUJhdGNoZXNQYXJhbXMpOiBQcm9taXNlPEV4ZWNSZXN1bHQgfCBzdHJpbmc+IHtcbiAgY29uc3QgeyBiYXNlQ29tbWFuZCwgYmF0Y2hlcywgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBzdGRvdXRQYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc3RkZXJyUGFydHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBmYWlsdXJlOiBFeGVjUmVzdWx0IHwgbnVsbCA9IG51bGw7XG5cbiAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgY29uc3QgYmF0Y2hDb21tYW5kID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShiYXRjaCl9YDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGJhdGNoQ29tbWFuZCxcbiAgICAgIG9wdGlvbnNcbiAgICB9KTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHB1c2hJZk5vdEVtcHR5KHN0ZG91dFBhcnRzLCByZXN1bHQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcHVzaElmTm90RW1wdHkoc3Rkb3V0UGFydHMsIHJlc3VsdC5zdGRvdXQpO1xuICAgIHB1c2hJZk5vdEVtcHR5KHN0ZGVyclBhcnRzLCByZXN1bHQuc3RkZXJyKTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwICYmIChmYWlsdXJlID09PSBudWxsIHx8ICghaXNBYm5vcm1hbFRlcm1pbmF0aW9uKGZhaWx1cmUpICYmIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQpKSkpIHtcbiAgICAgIGZhaWx1cmUgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkSW5jbHVkZURldGFpbHNcbiAgICA/IHtcbiAgICAgIC8vIE5vdCBgZmFpbHVyZT8uZXhpdENvZGUgPz8gMGA6IGEgYmF0Y2gga2lsbGVkIGJ5IGEgc2lnbmFsIGhhcyBhIGBudWxsYCBjb2RlLCB3aGljaCBgPz9gIHdvdWxkIHJlcG9ydCBhcyBzdWNjZXNzLlxuICAgICAgZXhpdENvZGU6IGZhaWx1cmUgPT09IG51bGwgPyAwIDogZmFpbHVyZS5leGl0Q29kZSxcbiAgICAgIGV4aXRTaWduYWw6IGZhaWx1cmU/LmV4aXRTaWduYWwgPz8gbnVsbCxcbiAgICAgIHN0ZGVycjogc3RkZXJyUGFydHMuam9pbignXFxuJyksXG4gICAgICBzdGRvdXQ6IHN0ZG91dFBhcnRzLmpvaW4oJ1xcbicpXG4gICAgfVxuICAgIDogc3Rkb3V0UGFydHMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3NlcywgcmVzb2x2ZWQgYXQgc3Bhd24gdGltZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGEgbW9kdWxlLWxldmVsIGNvbnN0YW50LiBgLmVudmAgaXMgbG9hZGVkIGJ5IGBsb2FkRW52RmlsZUlmRXhpc3RzYCBmcm9tIGluc2lkZVxuICogYHdyYXBDbGlUYXNrYCwgYW5kIEVTTSBldmFsdWF0ZXMgZXZlcnkgaW1wb3J0IGJlZm9yZSB0aGUgZW50cnkgbW9kdWxlJ3MgZmlyc3Qgc3RhdGVtZW50IFx1MjAxNCBzbyBhXG4gKiBzbmFwc2hvdCB0YWtlbiBoZXJlIHdvdWxkIGFsd2F5cyBwcmVkYXRlIHRoZSBsb2FkLCBhbmQgZXZlcnkgc3Bhd25lZCBjaGlsZCB3b3VsZCBydW4gd2l0aG91dCB0aGVcbiAqIHJlcG8ncyBvd24gYC5lbnZgLiBOb3RoaW5nIHN1cmZhY2VkIHRoYXQgd2hpbGUgVml0ZXN0IDMgY29waWVkIHRoZSBgLmVudmAgaXQgbG9hZGVkIGludG8gdGhlXG4gKiB3b3JrZXIncyBgcHJvY2Vzcy5lbnZgOyBWaXRlc3QgNCB3cml0ZXMgdGhvc2UgdG8gYGltcG9ydC5tZXRhLmVudmAgb25seSwgbGVhdmluZyB0aGlzIHRoZSBzb2xlXG4gKiBwYXRoIGFuZCBhbiBlbXB0eSBvbmUuXG4gKlxuICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IHRvIHBhc3MgdG8gc3Bhd25lZCBjaGlsZCBwcm9jZXNzZXMsIHJlZmxlY3RpbmcgYHByb2Nlc3MuZW52YCBhcyBpdCBzdGFuZHMgbm93LlxuICovXG5mdW5jdGlvbiBnZXRDaGlsZEVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIHJldHVybiBidWlsZENoaWxkRW52KHByb2Nlc3MuZW52LCBwcm9jZXNzLmFsbG93ZWROb2RlRW52aXJvbm1lbnRGbGFncyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmUgYXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gd2lsbCBhY3R1YWxseSBzZWUgaXQsIHdoaWNoIG9uIFdpbmRvd3MgaXNcbiAqIE5PVCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcGFzc2VkIGluLlxuICpcbiAqIHtAbGluayBzcGF3blZpYVNoZWxsfSByb3V0ZXMgdGhlIGNvbW1hbmQgdGhyb3VnaCBgY21kLmV4ZWAsIGFuZCB0d28gdGhpbmdzIGFyZSBzcGVudCBiZXR3ZWVuIGhlcmUgYW5kXG4gKiB0aGVyZSwgbmVpdGhlciBvZiB0aGVtIHZpc2libGUgaW4gdGhlIGFzc2VtYmxlZCBjb21tYW5kOlxuICogLSBOb2RlJ3MgYHNwYXduKFx1MjAyNiwgeyBzaGVsbDogdHJ1ZSB9KWAgd3JhcHMgaXQgYXMgYDxjb21zcGVjPiAvZCAvcyAvYyBcIjxjb21tYW5kPlwiYC5cbiAqIC0ge0BsaW5rIGNtZEVzY2FwZUNvbW1hbmRMaW5lfSBgXmAtZXNjYXBlcyBldmVyeSBvbmUgb2YgYGNtZC5leGVgJ3MgbWV0YWNoYXJhY3RlcnMsIHdoaWNoIG9uIGEgbGlzdCBvZlxuICogICBxdW90ZWQgcGF0aHMgaXMgYSBmZXcgcGVyY2VudCBvZiB0aGUgd2hvbGUgKG1lYXN1cmVkOiArMjM2IGNoYXJzIG9uIGEgNzIxNi1jaGFyIGludm9jYXRpb24pLlxuICpcbiAqIEJvdGggYXJlIG91cnMgdG8gY29tcHV0ZSwgc28gdGhleSBhcmUgY29tcHV0ZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZC4gV2hhdCBpcyBOT1QgY29tcHV0YWJsZSBmcm9tIGhlcmUgaXNcbiAqIHdoYXQgdGhlIHNwYXduZWQgY29tbWFuZCBkb2VzIHRvIGl0cyBvd24gYXJndW1lbnRzIFx1MjAxNCBzZWUge0BsaW5rIFdJTkRPV1NfQ0hJTERfRVhQQU5TSU9OX1JFU0VSVkV9LlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBicmFuY2ggaGVyZSBNVVNUIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4ge0BsaW5rIHNwYXduVmlhU2hlbGx9LlxuICpcbiAqIEBwYXJhbSBjb21tYW5kTGluZSAtIFRoZSBhc3NlbWJsZWQgY29tbWFuZCBsaW5lLCBiZWZvcmUgYW55IHNoZWxsIHdyYXBwaW5nLlxuICogQHJldHVybnMgVGhlIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHdoYXQgcmVhY2hlcyB0aGUgb3BlcmF0aW5nIHN5c3RlbS5cbiAqL1xuZnVuY3Rpb24gZ2V0RWZmZWN0aXZlQ29tbWFuZExpbmVMZW5ndGgoY29tbWFuZExpbmU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtICE9PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGNvbW1hbmRMaW5lLmxlbmd0aDtcbiAgfVxuXG4gIGNvbnN0IGNvbXNwZWMgPSBwcm9jZXNzLmVudlsnY29tc3BlYyddID8/ICdjbWQuZXhlJztcbiAgY29uc3QgQ01EX1dSQVBQRVIgPSAnIC9kIC9zIC9jIFwiXCInO1xuICByZXR1cm4gY29tc3BlYy5sZW5ndGggKyBDTURfV1JBUFBFUi5sZW5ndGggKyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZExpbmUpLmxlbmd0aDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggY29tbWFuZCBsaW5lIGxlbmd0aCB0byBzaXplIGFuIHtAbGluayBFeGVjQXJndW1lbnR9IGJhdGNoIGFnYWluc3QgXHUyMDE0IHRoZSBwbGF0Zm9ybSBtYXhpbXVtXG4gKiBsZXNzIHtAbGluayBXSU5ET1dTX0NISUxEX0VYUEFOU0lPTl9SRVNFUlZFfS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbW9yZSBjb25zZXJ2YXRpdmUgdGhhbiB7QGxpbmsgZ2V0TWF4Q29tbWFuZExlbmd0aH0sIGJlY2F1c2UgdGhlIHR3byBhbnN3ZXIgZGlmZmVyZW50XG4gKiBxdWVzdGlvbnMuIEV4Y2VlZGluZyB0aGUgcGxhaW4tY29tbWFuZCBsaW1pdCBpcyBhIGhhcmQgZmFpbHVyZSB0aGUgY2FsbGVyIGNhbm5vdCBhdm9pZCwgc28gdGhhdCBjaGVja1xuICogc3RheXMgZXhhY3QuIEV4Y2VlZGluZyB0aGUgYmF0Y2hpbmcgbGltaXQgb25seSBjb3N0cyBvbmUgZXh0cmEgaW52b2NhdGlvbiwgc28gdGhhdCBjaGVjayBtYXkgXHUyMDE0IGFuZFxuICogc2hvdWxkIFx1MjAxNCBsZWF2ZSByb29tIHRvIHNwYXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggbGVuZ3RoIGluIGNoYXJhY3RlcnMgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIGJhdGNoLlxuICovXG5mdW5jdGlvbiBnZXRNYXhCYXRjaENvbW1hbmRMZW5ndGgoKTogbnVtYmVyIHtcbiAgcmV0dXJuIGdldE1heENvbW1hbmRMZW5ndGgoKSAtIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gV0lORE9XU19DSElMRF9FWFBBTlNJT05fUkVTRVJWRSA6IDApO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIG1heCBjb21tYW5kIGxpbmUgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm5zIFRoZSBtYXggY29tbWFuZCBsZW5ndGggaW4gY2hhcmFjdGVycy5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF4Q29tbWFuZExlbmd0aCgpOiBudW1iZXIge1xuICBjb25zdCBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA9IDgxOTE7XG4gIGNvbnN0IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIID0gMTMxXzA3MjtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBXSU5ET1dTX01BWF9DT01NQU5EX0xFTkdUSCA6IFVOSVhfTUFYX0NPTU1BTkRfTEVOR1RIO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgYSBjb21tYW5kIGFycmF5IHRoYXQgbWF5IGNvbnRhaW4gYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBuZWVkZWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBjb21tYW5kXG4gKiBoYXMgbm8gRXhlY0FyZyBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCBub3JtYWxseS5cbiAqXG4gKiBAcGFyYW0gcGFydHMgLSBUaGUgY29tbWFuZCBwYXJ0cy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGV4ZWMgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgUHJvbWlzZSBpZiBiYXRjaGluZyBpcyBoYW5kbGVkLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlQmF0Y2hlZENvbW1hbmQocGFydHM6IENvbW1hbmRQYXJ0W10sIG9wdGlvbnM6IEV4ZWNPcHRpb25zKTogUHJvbWlzZTxFeGVjUmVzdWx0IHwgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4ZWNBcmd1bWVudHMgPSBwYXJ0cy5maWx0ZXIoaXNFeGVjQXJndW1lbnQpO1xuICBpZiAoZXhlY0FyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChleGVjQXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdPbmx5IG9uZSBFeGVjQXJnIHdpdGggYmF0Y2hlZEFyZ3VtZW50cyBpcyBhbGxvd2VkIHBlciBjb21tYW5kJykpO1xuICB9XG5cbiAgY29uc3QgZXhlY0FyZ3VtZW50ID0gZXhlY0FyZ3VtZW50c1swXTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhlY0FyZ3VtZW50KTtcbiAgY29uc3Qgc3RhdGljUGFydHMgPSBwYXJ0cy5maWx0ZXIoKHBhcnQpOiBwYXJ0IGlzIHN0cmluZyA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpO1xuICBjb25zdCBiYXNlQ29tbWFuZCA9IGJ1aWxkQ29tbWFuZExpbmUoc3RhdGljUGFydHMpO1xuICBjb25zdCBtYXhDb21tYW5kTGVuZ3RoID0gZ2V0TWF4QmF0Y2hDb21tYW5kTGVuZ3RoKCk7XG5cbiAgLy8gVHJ5IGV4cGFuZGluZyBhbGwgYXJncyBpbmxpbmVcbiAgY29uc3QgZnVsbENvbW1hbmQgPSBgJHtiYXNlQ29tbWFuZH0gJHtidWlsZENvbW1hbmRMaW5lKFsuLi5leGVjQXJndW1lbnQuYmF0Y2hlZEFyZ3VtZW50c10pfWA7XG4gIGlmIChnZXRFZmZlY3RpdmVDb21tYW5kTGluZUxlbmd0aChmdWxsQ29tbWFuZCkgPD0gbWF4Q29tbWFuZExlbmd0aCkge1xuICAgIHJldHVybiBleGVjU3RyaW5nKHtcbiAgICAgIGNvbW1hbmQ6IGZ1bGxDb21tYW5kLFxuICAgICAgb3B0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLy8gU3BsaXQgaW50byBiYXRjaGVzXG4gIGNvbnN0IGJhdGNoZXM6IHN0cmluZ1tdW10gPSBbXTtcbiAgbGV0IGN1cnJlbnRCYXRjaDogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIGV4ZWNBcmd1bWVudC5iYXRjaGVkQXJndW1lbnRzKSB7XG4gICAgY29uc3QgdGVudGF0aXZlID0gYCR7YmFzZUNvbW1hbmR9ICR7YnVpbGRDb21tYW5kTGluZShbLi4uY3VycmVudEJhdGNoLCBhcmd1bWVudF0pfWA7XG4gICAgaWYgKGdldEVmZmVjdGl2ZUNvbW1hbmRMaW5lTGVuZ3RoKHRlbnRhdGl2ZSkgPiBtYXhDb21tYW5kTGVuZ3RoKSB7XG4gICAgICBpZiAoY3VycmVudEJhdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBzcGxpdCBjb21tYW5kIGludG8gYmF0Y2hlczogYSBzaW5nbGUgYXJndW1lbnQgKCR7U3RyaW5nKGFyZ3VtZW50Lmxlbmd0aCl9IGNoYXJzKSBwbHVzIHRoZSBiYXNlIGNvbW1hbmQgKCR7U3RyaW5nKGJhc2VDb21tYW5kLmxlbmd0aCl9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXggYmF0Y2ggY29tbWFuZCBsZW5ndGggKCR7U3RyaW5nKG1heENvbW1hbmRMZW5ndGgpfSkuYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJhdGNoZXMucHVzaChjdXJyZW50QmF0Y2gpO1xuICAgICAgY3VycmVudEJhdGNoID0gW2FyZ3VtZW50XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEJhdGNoLnB1c2goYXJndW1lbnQpO1xuICAgIH1cbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWx3YXlzIHRydWUgYWZ0ZXIgdGhlIGxvb3A7IGJhdGNoZWRBcmd1bWVudHMgaXMgbm9uLWVtcHR5IGF0IHRoaXMgcG9pbnQuICovXG4gIGlmIChjdXJyZW50QmF0Y2gubGVuZ3RoID4gMCkge1xuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgYmF0Y2hlcy5wdXNoKGN1cnJlbnRCYXRjaCk7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZUJhdGNoZXMoe1xuICAgIGJhc2VDb21tYW5kLFxuICAgIGJhdGNoZXMsXG4gICAgb3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHJlc3VsdCByZWNvcmRzIGFuIGFibm9ybWFsIHRlcm1pbmF0aW9uIFx1MjAxNCBhbiBOVFNUQVRVUyBlcnJvciBjb2RlIG9yIGEgc2lnbmFsIFx1MjAxNCByYXRoZXIgdGhhblxuICogdGhlIGNoaWxkIGV4aXRpbmcgb24gaXRzIG93biB3aXRoIGEgY29kZSBvZiBpdHMgY2hvb3NpbmcuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjaGlsZCB0ZXJtaW5hdGVkIGFibm9ybWFsbHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWJub3JtYWxUZXJtaW5hdGlvbihyZXN1bHQ6IEV4ZWNSZXN1bHQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlc3VsdC5leGl0U2lnbmFsICE9PSBudWxsIHx8IHRvTnRTdGF0dXMocmVzdWx0LmV4aXRDb2RlKSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBjb21tYW5kIHBhcnQgaXMgYW4ge0BsaW5rIEV4ZWNBcmd1bWVudH0uXG4gKlxuICogQHBhcmFtIHBhcnQgLSBUaGUgY29tbWFuZCBwYXJ0IHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgcGFydCBpcyBhbiBFeGVjQXJnLlxuICovXG5mdW5jdGlvbiBpc0V4ZWNBcmd1bWVudChwYXJ0OiBDb21tYW5kUGFydCk6IHBhcnQgaXMgRXhlY0FyZ3VtZW50IHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJ0ID09PSAnb2JqZWN0JyAmJiAnYmF0Y2hlZEFyZ3VtZW50cycgaW4gcGFydDtcbn1cblxuLyoqXG4gKiBBcHBlbmRzIGEgYmF0Y2gncyBjYXB0dXJlZCBvdXRwdXQgdG8gdGhlIGFjY3VtdWxhdG9yLCBza2lwcGluZyBhbiBlbXB0eSBvbmUgc28gdGhlIGV2ZW50dWFsIGpvaW4gZG9lcyBub3RcbiAqIGZhYnJpY2F0ZSBibGFuayBsaW5lcyBmb3IgYmF0Y2hlcyB0aGF0IHByaW50ZWQgbm90aGluZy5cbiAqXG4gKiBAcGFyYW0gYWNjdW11bGF0b3IgLSBUaGUgY29sbGVjdGVkIG91dHB1dHMgc28gZmFyLlxuICogQHBhcmFtIG91dHB1dCAtIFRoZSBvdXRwdXQgb2YgYSBzaW5nbGUgYmF0Y2guXG4gKi9cbmZ1bmN0aW9uIHB1c2hJZk5vdEVtcHR5KGFjY3VtdWxhdG9yOiBzdHJpbmdbXSwgb3V0cHV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKG91dHB1dCAhPT0gJycpIHtcbiAgICBhY2N1bXVsYXRvci5wdXNoKG91dHB1dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTcGF3bnMgYSBjaGlsZCBwcm9jZXNzIHZpYSB0aGUgYXBwcm9wcmlhdGUgc2hlbGwuXG4gKlxuICogT24gV2luZG93cywgaWYgdGhlIGNvbW1hbmQgY29udGFpbnMgbmV3bGluZXMgKHdoaWNoIGBjbWQuZXhlYCBjYW5ub3QgaGFuZGxlKVxuICogYW5kIHRoZSByYXcgYXJncyBhcnJheSBpcyBhdmFpbGFibGUsIHNwYXducyB0aGUgcHJvY2VzcyBkaXJlY3RseSB3aXRob3V0XG4gKiBhbnkgc2hlbGwgXHUyMDE0IHBhc3NpbmcgYXJncyB2aWEgYENyZWF0ZVByb2Nlc3NgLCB3aGljaCBhdm9pZHMgYWxsIHF1b3RpbmcgaXNzdWVzLlxuICpcbiAqIE9uIFdpbmRvd3MgKGNtZC5leGUgcGF0aCksIGFwcGxpZXMgYF5gLWVzY2FwaW5nIGZvciBjbWQgbWV0YWNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBzcGF3bmluZyB0aGUgY2hpbGQgcHJvY2Vzcy5cbiAqIEByZXR1cm5zIFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHNwYXduVmlhU2hlbGwocGFyYW1zOiBTcGF3blZpYVNoZWxsUGFyYW1zKTogQ2hpbGRQcm9jZXNzIHtcbiAgY29uc3QgeyBjb21tYW5kLCBjd2QsIGVudjogZXh0cmFFbnYsIGlzSW50ZXJhY3RpdmUgPSBmYWxzZSwgcmF3QXJndW1lbnRzIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgLi4uZ2V0Q2hpbGRFbnYoKSxcbiAgICAuLi5leHRyYUVudlxuICB9O1xuICBjb25zdCBzdGRpbzogJ2luaGVyaXQnIHwgJ3BpcGUnID0gaXNJbnRlcmFjdGl2ZSA/ICdpbmhlcml0JyA6ICdwaXBlJztcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgY29tbWFuZC5pbmNsdWRlcygnXFxuJykpIHtcbiAgICBpZiAoIXJhd0FyZ3VtZW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kcyBjb250YWluaW5nIG5ld2xpbmVzIGNhbm5vdCBiZSBleGVjdXRlZCB0aHJvdWdoIGNtZC5leGUgb24gV2luZG93cy4gUGFzcyBhbiBhcmd1bWVudCBhcnJheSBpbnN0ZWFkIG9mIGEgc3RyaW5nLicpO1xuICAgIH1cbiAgICBjb25zdCBbcHJvZ3JhbSwgLi4uJGFyZ3VtZW50c10gPSByYXdBcmd1bWVudHM7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0NvbW1hbmQgYXJyYXkgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICByZXR1cm4gc3Bhd24ocHJvZ3JhbSwgJGFyZ3VtZW50cywge1xuICAgICAgY3dkLFxuICAgICAgZW52LFxuICAgICAgc3RkaW9cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBjb21tYW5kRXNjYXBlQ29tbWFuZExpbmUoY29tbWFuZCkgOiBjb21tYW5kO1xuICByZXR1cm4gc3Bhd24oc2hlbGxDb21tYW5kLCBbXSwge1xuICAgIGN3ZCxcbiAgICBlbnYsXG4gICAgc2hlbGw6IHRydWUsXG4gICAgc3RkaW9cbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYW4gZXhpdCBjb2RlIGFzIGEgV2luZG93cyBOVFNUQVRVUyBlcnJvciwgaWYgaXQgaXMgb25lLlxuICpcbiAqIEEgY3Jhc2hlZCBwcm9jZXNzIG9uIFdpbmRvd3MgZXhpdHMgd2l0aCB0aGUgTlRTVEFUVVMgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGtpbGxlZCBpdCwgYW5kIGEgYC5jbWRgIHNoaW1cbiAqIGZvcndhcmRzIGl0cyBpbm5lciBwcm9jZXNzJ3MgY29kZSwgc28gYSBjcmFzaGVkIGBub2RlLmV4ZWAgYXJyaXZlcyBoZXJlIGludGFjdCBcdTIwMTQgYDB4QzAwMDAwMDVgIGFzXG4gKiBgMzIyMTIyNTQ3N2AuIFRoZSB0ZXN0IGlzIHRoZSBOVFNUQVRVUyBsYXlvdXQgcmF0aGVyIHRoYW4gYSBiYXJlIGA+PSAweEMwMDAwMDAwYDogdGhlIHRvcCB0d28gYml0cyBhcmUgdGhlXG4gKiBlcnJvciBzZXZlcml0eSBhbmQgdGhlIG5leHQgb25lIGlzIHRoZSBjdXN0b21lciBmbGFnLCB3aGljaCBtdXN0IGJlIGNsZWFyLiBUaGF0IGtlZXBzIG91dCB0d28gY29kZXMgYSBiYXJlXG4gKiByYW5nZSB3b3VsZCBtaXNyZWFkIFx1MjAxNCBgcHJvY2Vzcy5leGl0KC0xKWAsIHdoaWNoIFdpbmRvd3MgcmVwb3J0cyBhcyBgMHhGRkZGRkZGRmAsIGFuZCB0aGUgYDB4RTA2RDczNjNgIG9mIGFuXG4gKiB1bmhhbmRsZWQgQysrIGV4Y2VwdGlvbiwgd2hpY2ggaXMgYSBjcmFzaCBidXQgbm90IGFuIE5UU1RBVFVTLiBBIHNpZ25lZCByZWFkaW5nIG9mIHRoZSBzYW1lIGNvZGUgaXMgYWNjZXB0ZWRcbiAqIHRvby4gTm8gbGludGVyLCBjb21waWxlciBvciB0ZXN0IHJ1bm5lciByZXR1cm5zIGEgY29kZSBvZiB0aGlzIHNoYXBlIGFzIGEgY291bnQgb2YgZmluZGluZ3MuXG4gKlxuICogQHBhcmFtIGV4aXRDb2RlIC0gVGhlIGV4aXQgY29kZSB0aGUgY2hpbGQgcmVwb3J0ZWQuXG4gKiBAcmV0dXJucyBUaGUgY29kZSBhcyBhbiB1bnNpZ25lZCBOVFNUQVRVUywgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGFuIE5UU1RBVFVTIGVycm9yLlxuICovXG5mdW5jdGlvbiB0b050U3RhdHVzKGV4aXRDb2RlOiBudWxsIHwgbnVtYmVyKTogbnVsbCB8IG51bWJlciB7XG4gIGlmIChleGl0Q29kZSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIoZXhpdENvZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBFcnJvciBzZXZlcml0eSAodG9wIHR3byBiaXRzIHNldCkgd2l0aCB0aGUgY3VzdG9tZXIgYml0IGNsZWFyIGlzIGV4YWN0bHkgdGhlIHJhbmdlIFsweEMwMDAwMDAwLCAweEUwMDAwMDAwKS5cbiAgY29uc3QgTlRTVEFUVVNfRVJST1JfU1RBUlQgPSAweEMwXzAwXzAwXzAwO1xuICBjb25zdCBOVFNUQVRVU19FUlJPUl9FTkQgPSAweEUwXzAwXzAwXzAwO1xuICBjb25zdCBVSU5UMzJfUkFOR0UgPSAweDFfMDBfMDBfMDBfMDA7XG4gIGNvbnN0IHVuc2lnbmVkID0gZXhpdENvZGUgPCAwID8gZXhpdENvZGUgKyBVSU5UMzJfUkFOR0UgOiBleGl0Q29kZTtcbiAgcmV0dXJuIHVuc2lnbmVkID49IE5UU1RBVFVTX0VSUk9SX1NUQVJUICYmIHVuc2lnbmVkIDwgTlRTVEFUVVNfRVJST1JfRU5EID8gdW5zaWduZWQgOiBudWxsO1xufVxuXG4vKipcbiAqIFNob3J0ZW5zIGEgY29tbWFuZCBmb3IgcXVvdGluZyBpbiBhbiBlcnJvciBtZXNzYWdlLCBrZWVwaW5nIGl0cyBzdGFydCwgd2hpY2ggbmFtZXMgdGhlIHByb2dyYW0uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBzaG9ydGVuLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQsIGN1dCB0byB7QGxpbmsgTUFYX0NPTU1BTkRfTEVOR1RIX0lOX01FU1NBR0V9IGNoYXJhY3RlcnMgcGx1cyBhbiBlbGxpcHNpcyB3aGVuIGxvbmdlci5cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb21tYW5kLmxlbmd0aCA+IE1BWF9DT01NQU5EX0xFTkdUSF9JTl9NRVNTQUdFID8gYCR7Y29tbWFuZC5zbGljZSgwLCBNQVhfQ09NTUFORF9MRU5HVEhfSU5fTUVTU0FHRSl9XHUyMDI2YCA6IGNvbW1hbmQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxtQkFBK0I7QUFDL0IsMEJBQTRDO0FBQzVDLG9CQUF3QjtBQUN4Qix5QkFBa0M7QUFDbEMsZ0NBQXNCO0FBQ3RCLDBCQUFvQjtBQUVwQix1QkFJTztBQTBKQSxTQUFTLGlCQUFpQixxQkFBeUMsUUFBd0I7QUFDaEcsUUFBTSxXQUFXLHVCQUF1QixJQUFJLEtBQUs7QUFDakQsTUFBSSxZQUFZLElBQUk7QUFDbEIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPLFFBQVEsTUFBTSxLQUFLLEVBQUUsU0FBUyxNQUFNLElBQUksVUFBVSxHQUFHLE9BQU8sSUFBSSxNQUFNO0FBQy9FO0FBYU8sU0FBUyxjQUFjLFNBQTRCLDZCQUFxRTtBQUM3SCxTQUFPO0FBQUEsSUFDTCxjQUFjO0FBQUEsSUFDZCxHQUFHO0FBQUEsSUFDSCxHQUFJLDRCQUE0QixJQUFJLHFCQUFxQixLQUFLLEVBQUUsY0FBYyxpQkFBaUIsUUFBUSxjQUFjLEdBQUcseUJBQXlCLEVB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