@oneblink/release-cli 1.1.1 → 1.2.0-beta.3

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 (433) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/bin.js +59 -59
  3. package/dist/startReleaseProcess.js +170 -170
  4. package/node_modules/@yarnpkg/lockfile/README.md +22 -0
  5. package/node_modules/@yarnpkg/lockfile/index.js +10273 -0
  6. package/node_modules/@yarnpkg/lockfile/package.json +19 -0
  7. package/node_modules/ansi-styles/index.js +165 -0
  8. package/node_modules/ansi-styles/license +9 -0
  9. package/node_modules/ansi-styles/package.json +60 -0
  10. package/node_modules/ansi-styles/readme.md +147 -0
  11. package/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  12. package/node_modules/balanced-match/LICENSE.md +21 -0
  13. package/node_modules/balanced-match/README.md +97 -0
  14. package/node_modules/balanced-match/index.js +62 -0
  15. package/node_modules/balanced-match/package.json +52 -0
  16. package/node_modules/brace-expansion/LICENSE +21 -0
  17. package/node_modules/brace-expansion/README.md +129 -0
  18. package/node_modules/brace-expansion/index.js +201 -0
  19. package/node_modules/brace-expansion/package.json +51 -0
  20. package/node_modules/braces/CHANGELOG.md +184 -0
  21. package/node_modules/braces/LICENSE +21 -0
  22. package/node_modules/braces/README.md +593 -0
  23. package/node_modules/braces/index.js +170 -0
  24. package/node_modules/braces/lib/compile.js +57 -0
  25. package/node_modules/braces/lib/constants.js +57 -0
  26. package/node_modules/braces/lib/expand.js +113 -0
  27. package/node_modules/braces/lib/parse.js +333 -0
  28. package/node_modules/braces/lib/stringify.js +32 -0
  29. package/node_modules/braces/lib/utils.js +112 -0
  30. package/node_modules/braces/package.json +81 -0
  31. package/node_modules/chalk/index.js +228 -0
  32. package/node_modules/chalk/index.js.flow +93 -0
  33. package/node_modules/chalk/license +9 -0
  34. package/node_modules/chalk/package.json +75 -0
  35. package/node_modules/chalk/readme.md +314 -0
  36. package/node_modules/chalk/templates.js +128 -0
  37. package/node_modules/chalk/types/index.d.ts +97 -0
  38. package/node_modules/changelog-parser/.DS_Store +0 -0
  39. package/node_modules/changelog-parser/.travis.yml +7 -0
  40. package/node_modules/changelog-parser/CHANGELOG.md +128 -0
  41. package/node_modules/changelog-parser/CONTRIBUTING.md +55 -0
  42. package/node_modules/changelog-parser/LICENSE.md +15 -0
  43. package/node_modules/changelog-parser/README.md +247 -0
  44. package/node_modules/changelog-parser/bin/cli.js +19 -0
  45. package/node_modules/changelog-parser/index.js +201 -0
  46. package/node_modules/changelog-parser/package.json +54 -0
  47. package/node_modules/changelog-parser/test/fixtures/CHANGELOG.md +44 -0
  48. package/node_modules/changelog-parser/test/fixtures/expected.js +113 -0
  49. package/node_modules/changelog-parser/test/fixtures/remove-markdown-expected.js +113 -0
  50. package/node_modules/changelog-parser/test/index.js +105 -0
  51. package/node_modules/ci-info/CHANGELOG.md +78 -0
  52. package/node_modules/ci-info/LICENSE +21 -0
  53. package/node_modules/ci-info/README.md +108 -0
  54. package/node_modules/ci-info/index.js +66 -0
  55. package/node_modules/ci-info/package.json +40 -0
  56. package/node_modules/ci-info/vendors.json +153 -0
  57. package/node_modules/color-convert/CHANGELOG.md +54 -0
  58. package/node_modules/color-convert/LICENSE +21 -0
  59. package/node_modules/color-convert/README.md +68 -0
  60. package/node_modules/color-convert/conversions.js +868 -0
  61. package/node_modules/color-convert/index.js +78 -0
  62. package/node_modules/color-convert/package.json +50 -0
  63. package/node_modules/color-convert/route.js +97 -0
  64. package/node_modules/color-name/.eslintrc.json +43 -0
  65. package/node_modules/color-name/.npmignore +107 -0
  66. package/node_modules/color-name/LICENSE +8 -0
  67. package/node_modules/color-name/README.md +11 -0
  68. package/node_modules/color-name/index.js +152 -0
  69. package/node_modules/color-name/package.json +29 -0
  70. package/node_modules/color-name/test.js +7 -0
  71. package/node_modules/concat-map/.travis.yml +4 -0
  72. package/node_modules/concat-map/LICENSE +18 -0
  73. package/node_modules/concat-map/README.markdown +62 -0
  74. package/node_modules/concat-map/example/map.js +6 -0
  75. package/node_modules/concat-map/index.js +13 -0
  76. package/node_modules/concat-map/package.json +47 -0
  77. package/node_modules/concat-map/test/map.js +39 -0
  78. package/node_modules/escape-string-regexp/index.js +11 -0
  79. package/node_modules/escape-string-regexp/license +21 -0
  80. package/node_modules/escape-string-regexp/package.json +45 -0
  81. package/node_modules/escape-string-regexp/readme.md +27 -0
  82. package/node_modules/fill-range/LICENSE +21 -0
  83. package/node_modules/fill-range/README.md +237 -0
  84. package/node_modules/fill-range/index.js +249 -0
  85. package/node_modules/fill-range/package.json +73 -0
  86. package/node_modules/find-yarn-workspace-root/CHANGELOG.md +53 -0
  87. package/node_modules/find-yarn-workspace-root/LICENSE +201 -0
  88. package/node_modules/find-yarn-workspace-root/README.md +56 -0
  89. package/node_modules/find-yarn-workspace-root/index.d.ts +3 -0
  90. package/node_modules/find-yarn-workspace-root/index.js +53 -0
  91. package/node_modules/find-yarn-workspace-root/package.json +38 -0
  92. package/node_modules/fs-extra/CHANGELOG.md +842 -0
  93. package/node_modules/fs-extra/LICENSE +15 -0
  94. package/node_modules/fs-extra/README.md +261 -0
  95. package/node_modules/fs-extra/lib/copy/copy.js +246 -0
  96. package/node_modules/fs-extra/lib/copy/index.js +6 -0
  97. package/node_modules/fs-extra/lib/copy-sync/copy-sync.js +193 -0
  98. package/node_modules/fs-extra/lib/copy-sync/index.js +5 -0
  99. package/node_modules/fs-extra/lib/empty/index.js +48 -0
  100. package/node_modules/fs-extra/lib/ensure/file.js +49 -0
  101. package/node_modules/fs-extra/lib/ensure/index.js +23 -0
  102. package/node_modules/fs-extra/lib/ensure/link.js +61 -0
  103. package/node_modules/fs-extra/lib/ensure/symlink-paths.js +99 -0
  104. package/node_modules/fs-extra/lib/ensure/symlink-type.js +31 -0
  105. package/node_modules/fs-extra/lib/ensure/symlink.js +63 -0
  106. package/node_modules/fs-extra/lib/fs/index.js +104 -0
  107. package/node_modules/fs-extra/lib/index.js +28 -0
  108. package/node_modules/fs-extra/lib/json/index.js +16 -0
  109. package/node_modules/fs-extra/lib/json/jsonfile.js +12 -0
  110. package/node_modules/fs-extra/lib/json/output-json-sync.js +18 -0
  111. package/node_modules/fs-extra/lib/json/output-json.js +27 -0
  112. package/node_modules/fs-extra/lib/mkdirs/index.js +14 -0
  113. package/node_modules/fs-extra/lib/mkdirs/mkdirs-sync.js +54 -0
  114. package/node_modules/fs-extra/lib/mkdirs/mkdirs.js +63 -0
  115. package/node_modules/fs-extra/lib/mkdirs/win32.js +25 -0
  116. package/node_modules/fs-extra/lib/move/index.js +82 -0
  117. package/node_modules/fs-extra/lib/move-sync/index.js +117 -0
  118. package/node_modules/fs-extra/lib/output/index.js +40 -0
  119. package/node_modules/fs-extra/lib/path-exists/index.js +12 -0
  120. package/node_modules/fs-extra/lib/remove/index.js +9 -0
  121. package/node_modules/fs-extra/lib/remove/rimraf.js +314 -0
  122. package/node_modules/fs-extra/lib/util/buffer.js +12 -0
  123. package/node_modules/fs-extra/lib/util/utimes.js +79 -0
  124. package/node_modules/fs-extra/package.json +72 -0
  125. package/node_modules/fs.realpath/LICENSE +43 -0
  126. package/node_modules/fs.realpath/README.md +33 -0
  127. package/node_modules/fs.realpath/index.js +66 -0
  128. package/node_modules/fs.realpath/old.js +303 -0
  129. package/node_modules/fs.realpath/package.json +30 -0
  130. package/node_modules/glob/LICENSE +21 -0
  131. package/node_modules/glob/README.md +375 -0
  132. package/node_modules/glob/changelog.md +67 -0
  133. package/node_modules/glob/common.js +240 -0
  134. package/node_modules/glob/glob.js +790 -0
  135. package/node_modules/glob/package.json +50 -0
  136. package/node_modules/glob/sync.js +486 -0
  137. package/node_modules/graceful-fs/LICENSE +15 -0
  138. package/node_modules/graceful-fs/README.md +133 -0
  139. package/node_modules/graceful-fs/clone.js +23 -0
  140. package/node_modules/graceful-fs/graceful-fs.js +373 -0
  141. package/node_modules/graceful-fs/legacy-streams.js +118 -0
  142. package/node_modules/graceful-fs/package.json +54 -0
  143. package/node_modules/graceful-fs/polyfills.js +346 -0
  144. package/node_modules/has-flag/index.js +8 -0
  145. package/node_modules/has-flag/license +9 -0
  146. package/node_modules/has-flag/package.json +48 -0
  147. package/node_modules/has-flag/readme.md +70 -0
  148. package/node_modules/inflight/LICENSE +15 -0
  149. package/node_modules/inflight/README.md +37 -0
  150. package/node_modules/inflight/inflight.js +54 -0
  151. package/node_modules/inflight/package.json +33 -0
  152. package/node_modules/inherits/LICENSE +16 -0
  153. package/node_modules/inherits/README.md +42 -0
  154. package/node_modules/inherits/inherits.js +9 -0
  155. package/node_modules/inherits/inherits_browser.js +27 -0
  156. package/node_modules/inherits/package.json +33 -0
  157. package/node_modules/is-ci/CHANGELOG.md +14 -0
  158. package/node_modules/is-ci/LICENSE +21 -0
  159. package/node_modules/is-ci/README.md +50 -0
  160. package/node_modules/is-ci/bin.js +4 -0
  161. package/node_modules/is-ci/index.js +3 -0
  162. package/node_modules/is-ci/package.json +42 -0
  163. package/node_modules/is-docker/cli.js +5 -0
  164. package/node_modules/is-docker/index.d.ts +15 -0
  165. package/node_modules/is-docker/index.js +29 -0
  166. package/node_modules/is-docker/license +9 -0
  167. package/node_modules/is-docker/package.json +46 -0
  168. package/node_modules/is-docker/readme.md +27 -0
  169. package/node_modules/is-number/LICENSE +21 -0
  170. package/node_modules/is-number/README.md +187 -0
  171. package/node_modules/is-number/index.js +18 -0
  172. package/node_modules/is-number/package.json +86 -0
  173. package/node_modules/is-wsl/index.d.ts +15 -0
  174. package/node_modules/is-wsl/index.js +31 -0
  175. package/node_modules/is-wsl/license +9 -0
  176. package/node_modules/is-wsl/package.json +49 -0
  177. package/node_modules/is-wsl/readme.md +36 -0
  178. package/node_modules/isexe/.npmignore +2 -0
  179. package/node_modules/isexe/LICENSE +15 -0
  180. package/node_modules/isexe/README.md +51 -0
  181. package/node_modules/isexe/index.js +57 -0
  182. package/node_modules/isexe/mode.js +41 -0
  183. package/node_modules/isexe/package.json +35 -0
  184. package/node_modules/isexe/test/basic.js +221 -0
  185. package/node_modules/isexe/windows.js +42 -0
  186. package/node_modules/jsonfile/CHANGELOG.md +145 -0
  187. package/node_modules/jsonfile/LICENSE +15 -0
  188. package/node_modules/jsonfile/README.md +168 -0
  189. package/node_modules/jsonfile/index.js +134 -0
  190. package/node_modules/jsonfile/package.json +41 -0
  191. package/node_modules/klaw-sync/CHANGELOG.md +73 -0
  192. package/node_modules/klaw-sync/LICENSE +20 -0
  193. package/node_modules/klaw-sync/README.md +164 -0
  194. package/node_modules/klaw-sync/klaw-sync.js +29 -0
  195. package/node_modules/klaw-sync/package.json +51 -0
  196. package/node_modules/line-reader/LICENSE +20 -0
  197. package/node_modules/line-reader/README.md +75 -0
  198. package/node_modules/line-reader/lib/line_reader.js +174 -0
  199. package/node_modules/line-reader/package.json +18 -0
  200. package/node_modules/line-reader/test/data/empty_file.txt +0 -0
  201. package/node_modules/line-reader/test/data/multi_separator_file.txt +2 -0
  202. package/node_modules/line-reader/test/data/multibyte_file.txt +2 -0
  203. package/node_modules/line-reader/test/data/normal_file.txt +6 -0
  204. package/node_modules/line-reader/test/data/one_line_file.txt +1 -0
  205. package/node_modules/line-reader/test/data/separator_file.txt +2 -0
  206. package/node_modules/line-reader/test/data/three_line_file.txt +3 -0
  207. package/node_modules/line-reader/test/line_reader.js +222 -0
  208. package/node_modules/lru-cache/LICENSE +15 -0
  209. package/node_modules/lru-cache/README.md +166 -0
  210. package/node_modules/lru-cache/index.js +334 -0
  211. package/node_modules/lru-cache/package.json +38 -0
  212. package/node_modules/micromatch/CHANGELOG.md +109 -0
  213. package/node_modules/micromatch/LICENSE +21 -0
  214. package/node_modules/micromatch/README.md +1008 -0
  215. package/node_modules/micromatch/index.js +467 -0
  216. package/node_modules/micromatch/package.json +123 -0
  217. package/node_modules/minimatch/LICENSE +15 -0
  218. package/node_modules/minimatch/README.md +209 -0
  219. package/node_modules/minimatch/minimatch.js +923 -0
  220. package/node_modules/minimatch/package.json +34 -0
  221. package/node_modules/minimist/.travis.yml +8 -0
  222. package/node_modules/minimist/LICENSE +18 -0
  223. package/node_modules/minimist/example/parse.js +2 -0
  224. package/node_modules/minimist/index.js +245 -0
  225. package/node_modules/minimist/package.json +49 -0
  226. package/node_modules/minimist/readme.markdown +95 -0
  227. package/node_modules/minimist/test/all_bool.js +32 -0
  228. package/node_modules/minimist/test/bool.js +178 -0
  229. package/node_modules/minimist/test/dash.js +31 -0
  230. package/node_modules/minimist/test/default_bool.js +35 -0
  231. package/node_modules/minimist/test/dotted.js +22 -0
  232. package/node_modules/minimist/test/kv_short.js +16 -0
  233. package/node_modules/minimist/test/long.js +31 -0
  234. package/node_modules/minimist/test/num.js +36 -0
  235. package/node_modules/minimist/test/parse.js +197 -0
  236. package/node_modules/minimist/test/parse_modified.js +9 -0
  237. package/node_modules/minimist/test/proto.js +44 -0
  238. package/node_modules/minimist/test/short.js +67 -0
  239. package/node_modules/minimist/test/stop_early.js +15 -0
  240. package/node_modules/minimist/test/unknown.js +102 -0
  241. package/node_modules/minimist/test/whitespace.js +8 -0
  242. package/node_modules/nice-try/CHANGELOG.md +21 -0
  243. package/node_modules/nice-try/LICENSE +21 -0
  244. package/node_modules/nice-try/README.md +32 -0
  245. package/node_modules/nice-try/package.json +37 -0
  246. package/node_modules/nice-try/src/index.js +12 -0
  247. package/node_modules/once/LICENSE +15 -0
  248. package/node_modules/once/README.md +79 -0
  249. package/node_modules/once/once.js +42 -0
  250. package/node_modules/once/package.json +37 -0
  251. package/node_modules/open/index.d.ts +88 -0
  252. package/node_modules/open/index.js +195 -0
  253. package/node_modules/open/license +9 -0
  254. package/node_modules/open/package.json +64 -0
  255. package/node_modules/open/readme.md +154 -0
  256. package/node_modules/open/xdg-open +1066 -0
  257. package/node_modules/os-tmpdir/index.js +25 -0
  258. package/node_modules/os-tmpdir/license +21 -0
  259. package/node_modules/os-tmpdir/package.json +45 -0
  260. package/node_modules/os-tmpdir/readme.md +32 -0
  261. package/node_modules/patch-package/CHANGELOG.md +389 -0
  262. package/node_modules/patch-package/LICENSE +19 -0
  263. package/node_modules/patch-package/README.md +269 -0
  264. package/node_modules/patch-package/dist/PackageDetails.js +102 -0
  265. package/node_modules/patch-package/dist/PackageDetails.test.js +228 -0
  266. package/node_modules/patch-package/dist/applyPatches.js +261 -0
  267. package/node_modules/patch-package/dist/assertNever.js +8 -0
  268. package/node_modules/patch-package/dist/createIssue.js +83 -0
  269. package/node_modules/patch-package/dist/detectPackageManager.js +64 -0
  270. package/node_modules/patch-package/dist/filterFiles.js +17 -0
  271. package/node_modules/patch-package/dist/getAppRootPath.js +22 -0
  272. package/node_modules/patch-package/dist/getPackageResolution.js +85 -0
  273. package/node_modules/patch-package/dist/getPackageVersion.js +9 -0
  274. package/node_modules/patch-package/dist/index.js +161 -0
  275. package/node_modules/patch-package/dist/makePatch.js +231 -0
  276. package/node_modules/patch-package/dist/makeRegExp.js +28 -0
  277. package/node_modules/patch-package/dist/packageIsDevDependency.js +15 -0
  278. package/node_modules/patch-package/dist/packageIsDevDependency.test.js +32 -0
  279. package/node_modules/patch-package/dist/patch/apply.js +197 -0
  280. package/node_modules/patch-package/dist/patch/parse.js +330 -0
  281. package/node_modules/patch-package/dist/patch/read.js +49 -0
  282. package/node_modules/patch-package/dist/patch/reverse.js +96 -0
  283. package/node_modules/patch-package/dist/patchFs.js +20 -0
  284. package/node_modules/patch-package/dist/path.js +17 -0
  285. package/node_modules/patch-package/dist/resolveRelativeFileDependencies.js +21 -0
  286. package/node_modules/patch-package/dist/resolveRelativeFileDependencies.test.js +22 -0
  287. package/node_modules/patch-package/dist/spawnSafe.js +28 -0
  288. package/node_modules/patch-package/index.js +3 -0
  289. package/node_modules/patch-package/node_modules/cross-spawn/CHANGELOG.md +100 -0
  290. package/node_modules/patch-package/node_modules/cross-spawn/LICENSE +21 -0
  291. package/node_modules/patch-package/node_modules/cross-spawn/README.md +94 -0
  292. package/node_modules/patch-package/node_modules/cross-spawn/index.js +39 -0
  293. package/node_modules/patch-package/node_modules/cross-spawn/lib/enoent.js +59 -0
  294. package/node_modules/patch-package/node_modules/cross-spawn/lib/parse.js +125 -0
  295. package/node_modules/patch-package/node_modules/cross-spawn/lib/util/escape.js +45 -0
  296. package/node_modules/patch-package/node_modules/cross-spawn/lib/util/readShebang.js +32 -0
  297. package/node_modules/patch-package/node_modules/cross-spawn/lib/util/resolveCommand.js +47 -0
  298. package/node_modules/patch-package/node_modules/cross-spawn/package.json +80 -0
  299. package/node_modules/patch-package/node_modules/path-key/index.js +13 -0
  300. package/node_modules/patch-package/node_modules/path-key/license +21 -0
  301. package/node_modules/patch-package/node_modules/path-key/package.json +43 -0
  302. package/node_modules/patch-package/node_modules/path-key/readme.md +51 -0
  303. package/node_modules/patch-package/node_modules/rimraf/LICENSE +15 -0
  304. package/node_modules/patch-package/node_modules/rimraf/README.md +101 -0
  305. package/node_modules/patch-package/node_modules/rimraf/bin.js +50 -0
  306. package/node_modules/patch-package/node_modules/rimraf/package.json +33 -0
  307. package/node_modules/patch-package/node_modules/rimraf/rimraf.js +372 -0
  308. package/node_modules/patch-package/node_modules/semver/CHANGELOG.md +39 -0
  309. package/node_modules/patch-package/node_modules/semver/LICENSE +15 -0
  310. package/node_modules/patch-package/node_modules/semver/README.md +412 -0
  311. package/node_modules/patch-package/node_modules/semver/bin/semver +160 -0
  312. package/node_modules/patch-package/node_modules/semver/package.json +32 -0
  313. package/node_modules/patch-package/node_modules/semver/range.bnf +16 -0
  314. package/node_modules/patch-package/node_modules/semver/semver.js +1483 -0
  315. package/node_modules/patch-package/node_modules/shebang-command/index.js +19 -0
  316. package/node_modules/patch-package/node_modules/shebang-command/license +21 -0
  317. package/node_modules/patch-package/node_modules/shebang-command/package.json +43 -0
  318. package/node_modules/patch-package/node_modules/shebang-command/readme.md +39 -0
  319. package/node_modules/patch-package/node_modules/shebang-regex/index.js +2 -0
  320. package/node_modules/patch-package/node_modules/shebang-regex/license +21 -0
  321. package/node_modules/patch-package/node_modules/shebang-regex/package.json +36 -0
  322. package/node_modules/patch-package/node_modules/shebang-regex/readme.md +29 -0
  323. package/node_modules/patch-package/node_modules/slash/index.js +11 -0
  324. package/node_modules/patch-package/node_modules/slash/license +9 -0
  325. package/node_modules/patch-package/node_modules/slash/package.json +38 -0
  326. package/node_modules/patch-package/node_modules/slash/readme.md +44 -0
  327. package/node_modules/patch-package/node_modules/which/CHANGELOG.md +152 -0
  328. package/node_modules/patch-package/node_modules/which/LICENSE +15 -0
  329. package/node_modules/patch-package/node_modules/which/README.md +51 -0
  330. package/node_modules/patch-package/node_modules/which/bin/which +52 -0
  331. package/node_modules/patch-package/node_modules/which/package.json +34 -0
  332. package/node_modules/patch-package/node_modules/which/which.js +135 -0
  333. package/node_modules/patch-package/package.json +100 -0
  334. package/node_modules/path-is-absolute/index.js +20 -0
  335. package/node_modules/path-is-absolute/license +21 -0
  336. package/node_modules/path-is-absolute/package.json +47 -0
  337. package/node_modules/path-is-absolute/readme.md +59 -0
  338. package/node_modules/picomatch/CHANGELOG.md +120 -0
  339. package/node_modules/picomatch/LICENSE +21 -0
  340. package/node_modules/picomatch/README.md +691 -0
  341. package/node_modules/picomatch/index.js +3 -0
  342. package/node_modules/picomatch/lib/constants.js +179 -0
  343. package/node_modules/picomatch/lib/parse.js +1078 -0
  344. package/node_modules/picomatch/lib/picomatch.js +339 -0
  345. package/node_modules/picomatch/lib/scan.js +385 -0
  346. package/node_modules/picomatch/lib/utils.js +64 -0
  347. package/node_modules/picomatch/package.json +85 -0
  348. package/node_modules/remove-markdown/.npmignore +1 -0
  349. package/node_modules/remove-markdown/LICENSE +21 -0
  350. package/node_modules/remove-markdown/README.md +44 -0
  351. package/node_modules/remove-markdown/index.js +60 -0
  352. package/node_modules/remove-markdown/package.json +31 -0
  353. package/node_modules/remove-markdown/test/remove-markdown.js +139 -0
  354. package/node_modules/semver/CHANGELOG.md +111 -0
  355. package/node_modules/semver/LICENSE +15 -0
  356. package/node_modules/semver/README.md +566 -0
  357. package/node_modules/semver/bin/semver.js +173 -0
  358. package/node_modules/semver/classes/comparator.js +135 -0
  359. package/node_modules/semver/classes/index.js +5 -0
  360. package/node_modules/semver/classes/range.js +510 -0
  361. package/node_modules/semver/classes/semver.js +287 -0
  362. package/node_modules/semver/functions/clean.js +6 -0
  363. package/node_modules/semver/functions/cmp.js +48 -0
  364. package/node_modules/semver/functions/coerce.js +51 -0
  365. package/node_modules/semver/functions/compare-build.js +7 -0
  366. package/node_modules/semver/functions/compare-loose.js +3 -0
  367. package/node_modules/semver/functions/compare.js +5 -0
  368. package/node_modules/semver/functions/diff.js +23 -0
  369. package/node_modules/semver/functions/eq.js +3 -0
  370. package/node_modules/semver/functions/gt.js +3 -0
  371. package/node_modules/semver/functions/gte.js +3 -0
  372. package/node_modules/semver/functions/inc.js +15 -0
  373. package/node_modules/semver/functions/lt.js +3 -0
  374. package/node_modules/semver/functions/lte.js +3 -0
  375. package/node_modules/semver/functions/major.js +3 -0
  376. package/node_modules/semver/functions/minor.js +3 -0
  377. package/node_modules/semver/functions/neq.js +3 -0
  378. package/node_modules/semver/functions/parse.js +33 -0
  379. package/node_modules/semver/functions/patch.js +3 -0
  380. package/node_modules/semver/functions/prerelease.js +6 -0
  381. package/node_modules/semver/functions/rcompare.js +3 -0
  382. package/node_modules/semver/functions/rsort.js +3 -0
  383. package/node_modules/semver/functions/satisfies.js +10 -0
  384. package/node_modules/semver/functions/sort.js +3 -0
  385. package/node_modules/semver/functions/valid.js +6 -0
  386. package/node_modules/semver/index.js +48 -0
  387. package/node_modules/semver/internal/constants.js +17 -0
  388. package/node_modules/semver/internal/debug.js +9 -0
  389. package/node_modules/semver/internal/identifiers.js +23 -0
  390. package/node_modules/semver/internal/parse-options.js +11 -0
  391. package/node_modules/semver/internal/re.js +182 -0
  392. package/node_modules/semver/package.json +45 -0
  393. package/node_modules/semver/preload.js +2 -0
  394. package/node_modules/semver/range.bnf +16 -0
  395. package/node_modules/semver/ranges/gtr.js +4 -0
  396. package/node_modules/semver/ranges/intersects.js +7 -0
  397. package/node_modules/semver/ranges/ltr.js +4 -0
  398. package/node_modules/semver/ranges/max-satisfying.js +25 -0
  399. package/node_modules/semver/ranges/min-satisfying.js +24 -0
  400. package/node_modules/semver/ranges/min-version.js +60 -0
  401. package/node_modules/semver/ranges/outside.js +80 -0
  402. package/node_modules/semver/ranges/simplify.js +44 -0
  403. package/node_modules/semver/ranges/subset.js +222 -0
  404. package/node_modules/semver/ranges/to-comparators.js +8 -0
  405. package/node_modules/semver/ranges/valid.js +11 -0
  406. package/node_modules/supports-color/browser.js +5 -0
  407. package/node_modules/supports-color/index.js +131 -0
  408. package/node_modules/supports-color/license +9 -0
  409. package/node_modules/supports-color/package.json +57 -0
  410. package/node_modules/supports-color/readme.md +66 -0
  411. package/node_modules/tmp/LICENSE +21 -0
  412. package/node_modules/tmp/README.md +314 -0
  413. package/node_modules/tmp/lib/tmp.js +611 -0
  414. package/node_modules/tmp/package.json +42 -0
  415. package/node_modules/to-regex-range/LICENSE +21 -0
  416. package/node_modules/to-regex-range/README.md +305 -0
  417. package/node_modules/to-regex-range/index.js +288 -0
  418. package/node_modules/to-regex-range/package.json +92 -0
  419. package/node_modules/universalify/LICENSE +20 -0
  420. package/node_modules/universalify/README.md +76 -0
  421. package/node_modules/universalify/index.js +25 -0
  422. package/node_modules/universalify/package.json +38 -0
  423. package/node_modules/wrappy/LICENSE +15 -0
  424. package/node_modules/wrappy/README.md +36 -0
  425. package/node_modules/wrappy/package.json +33 -0
  426. package/node_modules/wrappy/wrappy.js +33 -0
  427. package/node_modules/yallist/LICENSE +15 -0
  428. package/node_modules/yallist/README.md +204 -0
  429. package/node_modules/yallist/iterator.js +8 -0
  430. package/node_modules/yallist/package.json +33 -0
  431. package/node_modules/yallist/yallist.js +426 -0
  432. package/package.json +8 -3
  433. package/patches/changelog-parser+2.8.0.patch +10 -0
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.executeEffects = void 0;
7
+ const fs_extra_1 = __importDefault(require("fs-extra"));
8
+ const path_1 = require("path");
9
+ const assertNever_1 = require("../assertNever");
10
+ const executeEffects = (effects, { dryRun }) => {
11
+ effects.forEach(eff => {
12
+ switch (eff.type) {
13
+ case "file deletion":
14
+ if (dryRun) {
15
+ if (!fs_extra_1.default.existsSync(eff.path)) {
16
+ throw new Error("Trying to delete file that doesn't exist: " + eff.path);
17
+ }
18
+ }
19
+ else {
20
+ // TODO: integrity checks
21
+ fs_extra_1.default.unlinkSync(eff.path);
22
+ }
23
+ break;
24
+ case "rename":
25
+ if (dryRun) {
26
+ // TODO: see what patch files look like if moving to exising path
27
+ if (!fs_extra_1.default.existsSync(eff.fromPath)) {
28
+ throw new Error("Trying to move file that doesn't exist: " + eff.fromPath);
29
+ }
30
+ }
31
+ else {
32
+ fs_extra_1.default.moveSync(eff.fromPath, eff.toPath);
33
+ }
34
+ break;
35
+ case "file creation":
36
+ if (dryRun) {
37
+ if (fs_extra_1.default.existsSync(eff.path)) {
38
+ throw new Error("Trying to create file that already exists: " + eff.path);
39
+ }
40
+ // todo: check file contents matches
41
+ }
42
+ else {
43
+ const fileContents = eff.hunk
44
+ ? eff.hunk.parts[0].lines.join("\n") +
45
+ (eff.hunk.parts[0].noNewlineAtEndOfFile ? "" : "\n")
46
+ : "";
47
+ fs_extra_1.default.ensureDirSync(path_1.dirname(eff.path));
48
+ fs_extra_1.default.writeFileSync(eff.path, fileContents, { mode: eff.mode });
49
+ }
50
+ break;
51
+ case "patch":
52
+ applyPatch(eff, { dryRun });
53
+ break;
54
+ case "mode change":
55
+ const currentMode = fs_extra_1.default.statSync(eff.path).mode;
56
+ if (((isExecutable(eff.newMode) && isExecutable(currentMode)) ||
57
+ (!isExecutable(eff.newMode) && !isExecutable(currentMode))) &&
58
+ dryRun) {
59
+ console.warn(`Mode change is not required for file ${eff.path}`);
60
+ }
61
+ fs_extra_1.default.chmodSync(eff.path, eff.newMode);
62
+ break;
63
+ default:
64
+ assertNever_1.assertNever(eff);
65
+ }
66
+ });
67
+ };
68
+ exports.executeEffects = executeEffects;
69
+ function isExecutable(fileMode) {
70
+ // tslint:disable-next-line:no-bitwise
71
+ return (fileMode & 64) > 0;
72
+ }
73
+ const trimRight = (s) => s.replace(/\s+$/, "");
74
+ function linesAreEqual(a, b) {
75
+ return trimRight(a) === trimRight(b);
76
+ }
77
+ /**
78
+ * How does noNewLineAtEndOfFile work?
79
+ *
80
+ * if you remove the newline from a file that had one without editing other bits:
81
+ *
82
+ * it creates an insertion/removal pair where the insertion has \ No new line at end of file
83
+ *
84
+ * if you edit a file that didn't have a new line and don't add one:
85
+ *
86
+ * both insertion and deletion have \ No new line at end of file
87
+ *
88
+ * if you edit a file that didn't have a new line and add one:
89
+ *
90
+ * deletion has \ No new line at end of file
91
+ * but not insertion
92
+ *
93
+ * if you edit a file that had a new line and leave it in:
94
+ *
95
+ * neither insetion nor deletion have the annoation
96
+ *
97
+ */
98
+ function applyPatch({ hunks, path }, { dryRun }) {
99
+ // modifying the file in place
100
+ const fileContents = fs_extra_1.default.readFileSync(path).toString();
101
+ const mode = fs_extra_1.default.statSync(path).mode;
102
+ const fileLines = fileContents.split(/\n/);
103
+ const result = [];
104
+ for (const hunk of hunks) {
105
+ let fuzzingOffset = 0;
106
+ while (true) {
107
+ const modifications = evaluateHunk(hunk, fileLines, fuzzingOffset);
108
+ if (modifications) {
109
+ result.push(modifications);
110
+ break;
111
+ }
112
+ fuzzingOffset =
113
+ fuzzingOffset < 0 ? fuzzingOffset * -1 : fuzzingOffset * -1 - 1;
114
+ if (Math.abs(fuzzingOffset) > 20) {
115
+ throw new Error(`Cant apply hunk ${hunks.indexOf(hunk)} for file ${path}`);
116
+ }
117
+ }
118
+ }
119
+ if (dryRun) {
120
+ return;
121
+ }
122
+ let diffOffset = 0;
123
+ for (const modifications of result) {
124
+ for (const modification of modifications) {
125
+ switch (modification.type) {
126
+ case "splice":
127
+ fileLines.splice(modification.index + diffOffset, modification.numToDelete, ...modification.linesToInsert);
128
+ diffOffset +=
129
+ modification.linesToInsert.length - modification.numToDelete;
130
+ break;
131
+ case "pop":
132
+ fileLines.pop();
133
+ break;
134
+ case "push":
135
+ fileLines.push(modification.line);
136
+ break;
137
+ default:
138
+ assertNever_1.assertNever(modification);
139
+ }
140
+ }
141
+ }
142
+ fs_extra_1.default.writeFileSync(path, fileLines.join("\n"), { mode });
143
+ }
144
+ function evaluateHunk(hunk, fileLines, fuzzingOffset) {
145
+ const result = [];
146
+ let contextIndex = hunk.header.original.start - 1 + fuzzingOffset;
147
+ // do bounds checks for index
148
+ if (contextIndex < 0) {
149
+ return null;
150
+ }
151
+ if (fileLines.length - contextIndex < hunk.header.original.length) {
152
+ return null;
153
+ }
154
+ for (const part of hunk.parts) {
155
+ switch (part.type) {
156
+ case "deletion":
157
+ case "context":
158
+ for (const line of part.lines) {
159
+ const originalLine = fileLines[contextIndex];
160
+ if (!linesAreEqual(originalLine, line)) {
161
+ return null;
162
+ }
163
+ contextIndex++;
164
+ }
165
+ if (part.type === "deletion") {
166
+ result.push({
167
+ type: "splice",
168
+ index: contextIndex - part.lines.length,
169
+ numToDelete: part.lines.length,
170
+ linesToInsert: [],
171
+ });
172
+ if (part.noNewlineAtEndOfFile) {
173
+ result.push({
174
+ type: "push",
175
+ line: "",
176
+ });
177
+ }
178
+ }
179
+ break;
180
+ case "insertion":
181
+ result.push({
182
+ type: "splice",
183
+ index: contextIndex,
184
+ numToDelete: 0,
185
+ linesToInsert: part.lines,
186
+ });
187
+ if (part.noNewlineAtEndOfFile) {
188
+ result.push({ type: "pop" });
189
+ }
190
+ break;
191
+ default:
192
+ assertNever_1.assertNever(part.type);
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvYXBwbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQXlCO0FBQ3pCLCtCQUE4QjtBQUU5QixnREFBNEM7QUFFckMsTUFBTSxjQUFjLEdBQUcsQ0FDNUIsT0FBd0IsRUFDeEIsRUFBRSxNQUFNLEVBQXVCLEVBQy9CLEVBQUU7SUFDRixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3BCLFFBQVEsR0FBRyxDQUFDLElBQUksRUFBRTtZQUNoQixLQUFLLGVBQWU7Z0JBQ2xCLElBQUksTUFBTSxFQUFFO29CQUNWLElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNENBQTRDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FDeEQsQ0FBQTtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCx5QkFBeUI7b0JBQ3pCLGtCQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtpQkFDeEI7Z0JBQ0QsTUFBSztZQUNQLEtBQUssUUFBUTtnQkFDWCxJQUFJLE1BQU0sRUFBRTtvQkFDVixpRUFBaUU7b0JBQ2pFLElBQUksQ0FBQyxrQkFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMENBQTBDLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FDMUQsQ0FBQTtxQkFDRjtpQkFDRjtxQkFBTTtvQkFDTCxrQkFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtpQkFDdEM7Z0JBQ0QsTUFBSztZQUNQLEtBQUssZUFBZTtnQkFDbEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsSUFBSSxrQkFBRSxDQUFD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QUksQ0FBQyxFQUFFO3dCQUN0QyxPQUFPLElBQUksQ0FBQTtxQkFDWjtvQkFDRCxZQUFZLEVBQUUsQ0FBQTtpQkFDZjtnQkFFRCxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO29CQUM1QixNQUFNLENBQUMsSUFBSSxDQUFDO3dCQUNWLElBQUksRUFBRSxRQUFRO3dCQUNkLEtBQUssRUFBRSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO3dCQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO3dCQUM5QixhQUFhLEVBQUUsRUFBRTtxQkFDbEIsQ0FBQyxDQUFBO29CQUVGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO3dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDOzRCQUNWLElBQUksRUFBRSxNQUFNOzRCQUNaLElBQUksRUFBRSxFQUFFO3lCQUNULENBQUMsQ0FBQTtxQkFDSDtpQkFDRjtnQkFDRCxNQUFLO1lBQ1AsS0FBSyxXQUFXO2dCQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLFlBQVk7b0JBQ25CLFdBQVcsRUFBRSxDQUFDO29CQUNkLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSztpQkFDMUIsQ0FBQyxDQUFBO2dCQUNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUE7aUJBQzdCO2dCQUNELE1BQUs7WUFDUDtnQkFDRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN6QjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcInBhdGhcIlxuaW1wb3J0IHsgUGFyc2VkUGF0Y2hGaWxlLCBGaWxlUGF0Y2gsIEh1bmsgfSBmcm9tIFwiLi9wYXJzZVwiXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gXCIuLi9hc3NlcnROZXZlclwiXG5cbmV4cG9ydCBjb25zdCBleGVjdXRlRWZmZWN0cyA9IChcbiAgZWZmZWN0czogUGFyc2VkUGF0Y2hGaWxlLFxuICB7IGRyeVJ1biB9OiB7IGRyeVJ1bjogYm9vbGVhbiB9LFxuKSA9PiB7XG4gIGVmZmVjdHMuZm9yRWFjaChlZmYgPT4ge1xuICAgIHN3aXRjaCAoZWZmLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJmaWxlIGRlbGV0aW9uXCI6XG4gICAgICAgIGlmIChkcnlSdW4pIHtcbiAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZWZmLnBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIFwiVHJ5aW5nIHRvIGRlbGV0ZSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdDogXCIgKyBlZmYucGF0aCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVE9ETzogaW50ZWdyaXR5IGNoZWNrc1xuICAgICAgICAgIGZzLnVubGlua1N5bmMoZWZmLnBhdGgpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJyZW5hbWVcIjpcbiAgICAgICAgaWYgKGRyeVJ1bikge1xuICAgICAgICAgIC8vIFRPRE86IHNlZSB3aGF0IHBhdGNoIGZpbGVzIGxvb2sgbGlrZSBpZiBtb3ZpbmcgdG8gZXhpc2luZyBwYXRoXG4gICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGVmZi5mcm9tUGF0aCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJUcnlpbmcgdG8gbW92ZSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdDogXCIgKyBlZmYuZnJvbVBhdGgsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZzLm1vdmVTeW5jKGVmZi5mcm9tUGF0aCwgZWZmLnRvUGF0aClcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImZpbGUgY3JlYXRpb25cIjpcbiAgICAgICAgaWYgKGRyeVJ1bikge1xuICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGVmZi5wYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcIlRyeWluZyB0byBjcmVhdGUgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzOiBcIiArIGVmZi5wYXRoLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmaWxlIGNvbnRlbnRzIG1hdGNoZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBmaWxlQ29udGVudHMgPSBlZmYuaHVua1xuICAgICAgICAgICAgPyBlZmYuaHVuay5wYXJ0c1swXS5saW5lcy5qb2luKFwiXFxuXCIpICtcbiAgICAgICAgICAgICAgKGVmZi5odW5rLnBhcnRzWzBdLm5vTmV3bGluZUF0RW5kT2ZGaWxlID8gXCJcIiA6IFwiXFxuXCIpXG4gICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICBmcy5lbnN1cmVEaXJTeW5jKGRpcm5hbWUoZWZmLnBhdGgpKVxuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZWZmLnBhdGgsIGZpbGVDb250ZW50cywgeyBtb2RlOiBlZmYubW9kZSB9KVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwicGF0Y2hcIjpcbiAgICAgICAgYXBwbHlQYXRjaChlZmYsIHsgZHJ5UnVuIH0pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIFwibW9kZSBjaGFuZ2VcIjpcbiAgICAgICAgY29uc3QgY3VycmVudE1vZGUgPSBmcy5zdGF0U3luYyhlZmYucGF0aCkubW9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKChpc0V4ZWN1dGFibGUoZWZmLm5ld01vZGUpICYmIGlzRXhlY3V0YWJsZShjdXJyZW50TW9kZSkpIHx8XG4gICAgICAgICAgICAoIWlzRXhlY3V0YWJsZShlZmYubmV3TW9kZSkgJiYgIWlzRXhlY3V0YWJsZShjdXJyZW50TW9kZSkpKSAmJlxuICAgICAgICAgIGRyeVJ1blxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYE1vZGUgY2hhbmdlIGlzIG5vdCByZXF1aXJlZCBmb3IgZmlsZSAke2VmZi5wYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgZnMuY2htb2RTeW5jKGVmZi5wYXRoLCBlZmYubmV3TW9kZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKGVmZilcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGlzRXhlY3V0YWJsZShmaWxlTW9kZTogbnVtYmVyKSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gIHJldHVybiAoZmlsZU1vZGUgJiAwYjAwMV8wMDBfMDAwKSA+IDBcbn1cblxuY29uc3QgdHJpbVJpZ2h0ID0gKHM6IHN0cmluZykgPT4gcy5yZXBsYWNlKC9cXHMrJC8sIFwiXCIpXG5mdW5jdGlvbiBsaW5lc0FyZUVxdWFsKGE6IHN0cmluZywgYjogc3RyaW5nKSB7XG4gIHJldHVybiB0cmltUmlnaHQoYSkgPT09IHRyaW1SaWdodChiKVxufVxuXG4vKipcbiAqIEhvdyBkb2VzIG5vTmV3TGluZUF0RW5kT2ZGaWxlIHdvcms/XG4gKlxuICogaWYgeW91IHJlbW92ZSB0aGUgbmV3bGluZSBmcm9tIGEgZmlsZSB0aGF0IGhhZCBvbmUgd2l0aG91dCBlZGl0aW5nIG90aGVyIGJpdHM6XG4gKlxuICogICAgaXQgY3JlYXRlcyBhbiBpbnNlcnRpb24vcmVtb3ZhbCBwYWlyIHdoZXJlIHRoZSBpbnNlcnRpb24gaGFzIFxcIE5vIG5ldyBsaW5lIGF0IGVuZCBvZiBmaWxlXG4gKlxuICogaWYgeW91IGVkaXQgYSBmaWxlIHRoYXQgZGlkbid0IGhhdmUgYSBuZXcgbGluZSBhbmQgZG9uJ3QgYWRkIG9uZTpcbiAqXG4gKiAgICBib3RoIGluc2VydGlvbiBhbmQgZGVsZXRpb24gaGF2ZSBcXCBObyBuZXcgbGluZSBhdCBlbmQgb2YgZmlsZVxuICpcbiAqIGlmIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGRpZG4ndCBoYXZlIGEgbmV3IGxpbmUgYW5kIGFkZCBvbmU6XG4gKlxuICogICAgZGVsZXRpb24gaGFzIFxcIE5vIG5ldyBsaW5lIGF0IGVuZCBvZiBmaWxlXG4gKiAgICBidXQgbm90IGluc2VydGlvblxuICpcbiAqIGlmIHlvdSBlZGl0IGEgZmlsZSB0aGF0IGhhZCBhIG5ldyBsaW5lIGFuZCBsZWF2ZSBpdCBpbjpcbiAqXG4gKiAgICBuZWl0aGVyIGluc2V0aW9uIG5vciBkZWxldGlvbiBoYXZlIHRoZSBhbm5vYXRpb25cbiAqXG4gKi9cblxuZnVuY3Rpb24gYXBwbHlQYXRjaChcbiAgeyBodW5rcywgcGF0aCB9OiBGaWxlUGF0Y2gsXG4gIHsgZHJ5UnVuIH06IHsgZHJ5UnVuOiBib29sZWFuIH0sXG4pOiB2b2lkIHtcbiAgLy8gbW9kaWZ5aW5nIHRoZSBmaWxlIGluIHBsYWNlXG4gIGNvbnN0IGZpbGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoKS50b1N0cmluZygpXG4gIGNvbnN0IG1vZGUgPSBmcy5zdGF0U3luYyhwYXRoKS5tb2RlXG5cbiAgY29uc3QgZmlsZUxpbmVzOiBzdHJpbmdbXSA9IGZpbGVDb250ZW50cy5zcGxpdCgvXFxuLylcblxuICBjb25zdCByZXN1bHQ6IE1vZGlmaWNhaXRvbltdW10gPSBbXVxuXG4gIGZvciAoY29uc3QgaHVuayBvZiBodW5rcykge1xuICAgIGxldCBmdXp6aW5nT2Zmc2V0ID0gMFxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBtb2RpZmljYXRpb25zID0gZXZhbHVhdGVIdW5rKGh1bmssIGZpbGVMaW5lcywgZnV6emluZ09mZnNldClcbiAgICAgIGlmIChtb2RpZmljYXRpb25zKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKG1vZGlmaWNhdGlvbnMpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGZ1enppbmdPZmZzZXQgPVxuICAgICAgICBmdXp6aW5nT2Zmc2V0IDwgMCA/IGZ1enppbmdPZmZzZXQgKiAtMSA6IGZ1enppbmdPZmZzZXQgKiAtMSAtIDFcblxuICAgICAgaWYgKE1hdGguYWJzKGZ1enppbmdPZmZzZXQpID4gMjApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW50IGFwcGx5IGh1bmsgJHtodW5rcy5pbmRleE9mKGh1bmspfSBmb3IgZmlsZSAke3BhdGh9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkcnlSdW4pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBkaWZmT2Zmc2V0ID0gMFxuXG4gIGZvciAoY29uc3QgbW9kaWZpY2F0aW9ucyBvZiByZXN1bHQpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWNhdGlvbiBvZiBtb2RpZmljYXRpb25zKSB7XG4gICAgICBzd2l0Y2ggKG1vZGlmaWNhdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzcGxpY2VcIjpcbiAgICAgICAgICBmaWxlTGluZXMuc3BsaWNlKFxuICAgICAgICAgICAgbW9kaWZpY2F0aW9uLmluZGV4ICsgZGlmZk9mZnNldCxcbiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi5udW1Ub0RlbGV0ZSxcbiAgICAgICAgICAgIC4uLm1vZGlmaWNhdGlvbi5saW5lc1RvSW5zZXJ0LFxuICAgICAgICAgIClcbiAgICAgICAgICBkaWZmT2Zmc2V0ICs9XG4gICAgICAgICAgICBtb2RpZmljYXRpb24ubGluZXNUb0luc2VydC5sZW5ndGggLSBtb2RpZmljYXRpb24ubnVtVG9EZWxldGVcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIFwicG9wXCI6XG4gICAgICAgICAgZmlsZUxpbmVzLnBvcCgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBcInB1c2hcIjpcbiAgICAgICAgICBmaWxlTGluZXMucHVzaChtb2RpZmljYXRpb24ubGluZSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKG1vZGlmaWNhdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUZpbGVTeW5jKHBhdGgsIGZpbGVMaW5lcy5qb2luKFwiXFxuXCIpLCB7IG1vZGUgfSlcbn1cblxuaW50ZXJmYWNlIFB1c2gge1xuICB0eXBlOiBcInB1c2hcIlxuICBsaW5lOiBzdHJpbmdcbn1cbmludGVyZmFjZSBQb3Age1xuICB0eXBlOiBcInBvcFwiXG59XG5pbnRlcmZhY2UgU3BsaWNlIHtcbiAgdHlwZTogXCJzcGxpY2VcIlxuICBpbmRleDogbnVtYmVyXG4gIG51bVRvRGVsZXRlOiBudW1iZXJcbiAgbGluZXNUb0luc2VydDogc3RyaW5nW11cbn1cblxudHlwZSBNb2RpZmljYWl0b24gPSBQdXNoIHwgUG9wIHwgU3BsaWNlXG5cbmZ1bmN0aW9uIGV2YWx1YXRlSHVuayhcbiAgaHVuazogSHVuayxcbiAgZmlsZUxpbmVzOiBzdHJpbmdbXSxcbiAgZnV6emluZ09mZnNldDogbnVtYmVyLFxuKTogTW9kaWZpY2FpdG9uW10gfCBudWxsIHtcbiAgY29uc3QgcmVzdWx0OiBNb2RpZmljYWl0b25bXSA9IFtdXG4gIGxldCBjb250ZXh0SW5kZXggPSBodW5rLmhlYWRlci5vcmlnaW5hbC5zdGFydCAtIDEgKyBmdXp6aW5nT2Zmc2V0XG4gIC8vIGRvIGJvdW5kcyBjaGVja3MgZm9yIGluZGV4XG4gIGlmIChjb250ZXh0SW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBpZiAoZmlsZUxpbmVzLmxlbmd0aCAtIGNvbnRleHRJbmRleCA8IGh1bmsuaGVhZGVyLm9yaWdpbmFsLmxlbmd0aCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgaHVuay5wYXJ0cykge1xuICAgIHN3aXRjaCAocGFydC50eXBlKSB7XG4gICAgICBjYXNlIFwiZGVsZXRpb25cIjpcbiAgICAgIGNhc2UgXCJjb250ZXh0XCI6XG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBwYXJ0LmxpbmVzKSB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lID0gZmlsZUxpbmVzW2NvbnRleHRJbmRleF1cbiAgICAgICAgICBpZiAoIWxpbmVzQXJlRXF1YWwob3JpZ2luYWxMaW5lLCBsaW5lKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGV4dEluZGV4KytcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZGVsZXRpb25cIikge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwic3BsaWNlXCIsXG4gICAgICAgICAgICBpbmRleDogY29udGV4dEluZGV4IC0gcGFydC5saW5lcy5sZW5ndGgsXG4gICAgICAgICAgICBudW1Ub0RlbGV0ZTogcGFydC5saW5lcy5sZW5ndGgsXG4gICAgICAgICAgICBsaW5lc1RvSW5zZXJ0OiBbXSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgaWYgKHBhcnQubm9OZXdsaW5lQXRFbmRPZkZpbGUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJwdXNoXCIsXG4gICAgICAgICAgICAgIGxpbmU6IFwiXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImluc2VydGlvblwiOlxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJzcGxpY2VcIixcbiAgICAgICAgICBpbmRleDogY29udGV4dEluZGV4LFxuICAgICAgICAgIG51bVRvRGVsZXRlOiAwLFxuICAgICAgICAgIGxpbmVzVG9JbnNlcnQ6IHBhcnQubGluZXMsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChwYXJ0Lm5vTmV3bGluZUF0RW5kT2ZGaWxlKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goeyB0eXBlOiBcInBvcFwiIH0pXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKHBhcnQudHlwZSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG4iXX0=
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyHunkIntegrity = exports.parsePatchFile = exports.interpretParsedPatchFile = exports.EXECUTABLE_FILE_MODE = exports.NON_EXECUTABLE_FILE_MODE = exports.parseHunkHeaderLine = void 0;
4
+ const assertNever_1 = require("../assertNever");
5
+ const parseHunkHeaderLine = (headerLine) => {
6
+ const match = headerLine
7
+ .trim()
8
+ .match(/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/);
9
+ if (!match) {
10
+ throw new Error(`Bad header line: '${headerLine}'`);
11
+ }
12
+ return {
13
+ original: {
14
+ start: Math.max(Number(match[1]), 1),
15
+ length: Number(match[3] || 1),
16
+ },
17
+ patched: {
18
+ start: Math.max(Number(match[4]), 1),
19
+ length: Number(match[6] || 1),
20
+ },
21
+ };
22
+ };
23
+ exports.parseHunkHeaderLine = parseHunkHeaderLine;
24
+ exports.NON_EXECUTABLE_FILE_MODE = 0o644;
25
+ exports.EXECUTABLE_FILE_MODE = 0o755;
26
+ const emptyFilePatch = () => ({
27
+ diffLineFromPath: null,
28
+ diffLineToPath: null,
29
+ oldMode: null,
30
+ newMode: null,
31
+ deletedFileMode: null,
32
+ newFileMode: null,
33
+ renameFrom: null,
34
+ renameTo: null,
35
+ beforeHash: null,
36
+ afterHash: null,
37
+ fromPath: null,
38
+ toPath: null,
39
+ hunks: null,
40
+ });
41
+ const emptyHunk = (headerLine) => ({
42
+ header: exports.parseHunkHeaderLine(headerLine),
43
+ parts: [],
44
+ });
45
+ const hunkLinetypes = {
46
+ "@": "header",
47
+ "-": "deletion",
48
+ "+": "insertion",
49
+ " ": "context",
50
+ "\\": "pragma",
51
+ // Treat blank lines as context
52
+ undefined: "context",
53
+ };
54
+ function parsePatchLines(lines, { supportLegacyDiffs }) {
55
+ const result = [];
56
+ let currentFilePatch = emptyFilePatch();
57
+ let state = "parsing header";
58
+ let currentHunk = null;
59
+ let currentHunkMutationPart = null;
60
+ function commitHunk() {
61
+ if (currentHunk) {
62
+ if (currentHunkMutationPart) {
63
+ currentHunk.parts.push(currentHunkMutationPart);
64
+ currentHunkMutationPart = null;
65
+ }
66
+ currentFilePatch.hunks.push(currentHunk);
67
+ currentHunk = null;
68
+ }
69
+ }
70
+ function commitFilePatch() {
71
+ commitHunk();
72
+ result.push(currentFilePatch);
73
+ currentFilePatch = emptyFilePatch();
74
+ }
75
+ for (let i = 0; i < lines.length; i++) {
76
+ const line = lines[i];
77
+ if (state === "parsing header") {
78
+ if (line.startsWith("@@")) {
79
+ state = "parsing hunks";
80
+ currentFilePatch.hunks = [];
81
+ i--;
82
+ }
83
+ else if (line.startsWith("diff --git ")) {
84
+ if (currentFilePatch && currentFilePatch.diffLineFromPath) {
85
+ commitFilePatch();
86
+ }
87
+ const match = line.match(/^diff --git a\/(.*?) b\/(.*?)\s*$/);
88
+ if (!match) {
89
+ throw new Error("Bad diff line: " + line);
90
+ }
91
+ currentFilePatch.diffLineFromPath = match[1];
92
+ currentFilePatch.diffLineToPath = match[2];
93
+ }
94
+ else if (line.startsWith("old mode ")) {
95
+ currentFilePatch.oldMode = line.slice("old mode ".length).trim();
96
+ }
97
+ else if (line.startsWith("new mode ")) {
98
+ currentFilePatch.newMode = line.slice("new mode ".length).trim();
99
+ }
100
+ else if (line.startsWith("deleted file mode ")) {
101
+ currentFilePatch.deletedFileMode = line
102
+ .slice("deleted file mode ".length)
103
+ .trim();
104
+ }
105
+ else if (line.startsWith("new file mode ")) {
106
+ currentFilePatch.newFileMode = line
107
+ .slice("new file mode ".length)
108
+ .trim();
109
+ }
110
+ else if (line.startsWith("rename from ")) {
111
+ currentFilePatch.renameFrom = line.slice("rename from ".length).trim();
112
+ }
113
+ else if (line.startsWith("rename to ")) {
114
+ currentFilePatch.renameTo = line.slice("rename to ".length).trim();
115
+ }
116
+ else if (line.startsWith("index ")) {
117
+ const match = line.match(/(\w+)\.\.(\w+)/);
118
+ if (!match) {
119
+ continue;
120
+ }
121
+ currentFilePatch.beforeHash = match[1];
122
+ currentFilePatch.afterHash = match[2];
123
+ }
124
+ else if (line.startsWith("--- ")) {
125
+ currentFilePatch.fromPath = line.slice("--- a/".length).trim();
126
+ }
127
+ else if (line.startsWith("+++ ")) {
128
+ currentFilePatch.toPath = line.slice("+++ b/".length).trim();
129
+ }
130
+ }
131
+ else {
132
+ if (supportLegacyDiffs && line.startsWith("--- a/")) {
133
+ state = "parsing header";
134
+ commitFilePatch();
135
+ i--;
136
+ continue;
137
+ }
138
+ // parsing hunks
139
+ const lineType = hunkLinetypes[line[0]] || null;
140
+ switch (lineType) {
141
+ case "header":
142
+ commitHunk();
143
+ currentHunk = emptyHunk(line);
144
+ break;
145
+ case null:
146
+ // unrecognized, bail out
147
+ state = "parsing header";
148
+ commitFilePatch();
149
+ i--;
150
+ break;
151
+ case "pragma":
152
+ if (!line.startsWith("\")) {
153
+ throw new Error("Unrecognized pragma in patch file: " + line);
154
+ }
155
+ if (!currentHunkMutationPart) {
156
+ throw new Error("Bad parser state: No newline at EOF pragma encountered without context");
157
+ }
158
+ currentHunkMutationPart.noNewlineAtEndOfFile = true;
159
+ break;
160
+ case "insertion":
161
+ case "deletion":
162
+ case "context":
163
+ if (!currentHunk) {
164
+ throw new Error("Bad parser state: Hunk lines encountered before hunk header");
165
+ }
166
+ if (currentHunkMutationPart &&
167
+ currentHunkMutationPart.type !== lineType) {
168
+ currentHunk.parts.push(currentHunkMutationPart);
169
+ currentHunkMutationPart = null;
170
+ }
171
+ if (!currentHunkMutationPart) {
172
+ currentHunkMutationPart = {
173
+ type: lineType,
174
+ lines: [],
175
+ noNewlineAtEndOfFile: false,
176
+ };
177
+ }
178
+ currentHunkMutationPart.lines.push(line.slice(1));
179
+ break;
180
+ default:
181
+ // exhausitveness check
182
+ assertNever_1.assertNever(lineType);
183
+ }
184
+ }
185
+ }
186
+ commitFilePatch();
187
+ for (const { hunks } of result) {
188
+ if (hunks) {
189
+ for (const hunk of hunks) {
190
+ verifyHunkIntegrity(hunk);
191
+ }
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+ function interpretParsedPatchFile(files) {
197
+ const result = [];
198
+ for (const file of files) {
199
+ const { diffLineFromPath, diffLineToPath, oldMode, newMode, deletedFileMode, newFileMode, renameFrom, renameTo, beforeHash, afterHash, fromPath, toPath, hunks, } = file;
200
+ const type = renameFrom
201
+ ? "rename"
202
+ : deletedFileMode
203
+ ? "file deletion"
204
+ : newFileMode
205
+ ? "file creation"
206
+ : hunks && hunks.length > 0
207
+ ? "patch"
208
+ : "mode change";
209
+ let destinationFilePath = null;
210
+ switch (type) {
211
+ case "rename":
212
+ if (!renameFrom || !renameTo) {
213
+ throw new Error("Bad parser state: rename from & to not given");
214
+ }
215
+ result.push({
216
+ type: "rename",
217
+ fromPath: renameFrom,
218
+ toPath: renameTo,
219
+ });
220
+ destinationFilePath = renameTo;
221
+ break;
222
+ case "file deletion": {
223
+ const path = diffLineFromPath || fromPath;
224
+ if (!path) {
225
+ throw new Error("Bad parse state: no path given for file deletion");
226
+ }
227
+ result.push({
228
+ type: "file deletion",
229
+ hunk: (hunks && hunks[0]) || null,
230
+ path,
231
+ mode: parseFileMode(deletedFileMode),
232
+ hash: beforeHash,
233
+ });
234
+ break;
235
+ }
236
+ case "file creation": {
237
+ const path = diffLineToPath || toPath;
238
+ if (!path) {
239
+ throw new Error("Bad parse state: no path given for file creation");
240
+ }
241
+ result.push({
242
+ type: "file creation",
243
+ hunk: (hunks && hunks[0]) || null,
244
+ path,
245
+ mode: parseFileMode(newFileMode),
246
+ hash: afterHash,
247
+ });
248
+ break;
249
+ }
250
+ case "patch":
251
+ case "mode change":
252
+ destinationFilePath = toPath || diffLineToPath;
253
+ break;
254
+ default:
255
+ assertNever_1.assertNever(type);
256
+ }
257
+ if (destinationFilePath && oldMode && newMode && oldMode !== newMode) {
258
+ result.push({
259
+ type: "mode change",
260
+ path: destinationFilePath,
261
+ oldMode: parseFileMode(oldMode),
262
+ newMode: parseFileMode(newMode),
263
+ });
264
+ }
265
+ if (destinationFilePath && hunks && hunks.length) {
266
+ result.push({
267
+ type: "patch",
268
+ path: destinationFilePath,
269
+ hunks,
270
+ beforeHash,
271
+ afterHash,
272
+ });
273
+ }
274
+ }
275
+ return result;
276
+ }
277
+ exports.interpretParsedPatchFile = interpretParsedPatchFile;
278
+ function parseFileMode(mode) {
279
+ // tslint:disable-next-line:no-bitwise
280
+ const parsedMode = parseInt(mode, 8) & 0o777;
281
+ if (parsedMode !== exports.NON_EXECUTABLE_FILE_MODE &&
282
+ parsedMode !== exports.EXECUTABLE_FILE_MODE) {
283
+ throw new Error("Unexpected file mode string: " + mode);
284
+ }
285
+ return parsedMode;
286
+ }
287
+ function parsePatchFile(file) {
288
+ const lines = file.split(/\n/g);
289
+ if (lines[lines.length - 1] === "") {
290
+ lines.pop();
291
+ }
292
+ try {
293
+ return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: false }));
294
+ }
295
+ catch (e) {
296
+ if (e instanceof Error &&
297
+ e.message === "hunk header integrity check failed") {
298
+ return interpretParsedPatchFile(parsePatchLines(lines, { supportLegacyDiffs: true }));
299
+ }
300
+ throw e;
301
+ }
302
+ }
303
+ exports.parsePatchFile = parsePatchFile;
304
+ function verifyHunkIntegrity(hunk) {
305
+ // verify hunk integrity
306
+ let originalLength = 0;
307
+ let patchedLength = 0;
308
+ for (const { type, lines } of hunk.parts) {
309
+ switch (type) {
310
+ case "context":
311
+ patchedLength += lines.length;
312
+ originalLength += lines.length;
313
+ break;
314
+ case "deletion":
315
+ originalLength += lines.length;
316
+ break;
317
+ case "insertion":
318
+ patchedLength += lines.length;
319
+ break;
320
+ default:
321
+ assertNever_1.assertNever(type);
322
+ }
323
+ }
324
+ if (originalLength !== hunk.header.original.length ||
325
+ patchedLength !== hunk.header.patched.length) {
326
+ throw new Error("hunk header integrity check failed");
327
+ }
328
+ }
329
+ exports.verifyHunkIntegrity = verifyHunkIntegrity;
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0Y2gvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTRDO0FBYXJDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxVQUFrQixFQUFjLEVBQUU7SUFDcEUsTUFBTSxLQUFLLEdBQUcsVUFBVTtTQUNyQixJQUFJLEVBQUU7U0FDTixLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsVUFBVSxHQUFHLENBQUMsQ0FBQTtLQUNwRDtJQUVELE9BQU87UUFDTCxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCO0tBQ0YsQ0FBQTtBQUNILENBQUMsQ0FBQTtBQWxCWSxRQUFBLG1CQUFtQix1QkFrQi9CO0FBRVksUUFBQSx3QkFBd0IsR0FBRyxLQUFLLENBQUE7QUFDaEMsUUFBQSxvQkFBb0IsR0FBRyxLQUFLLENBQUE7QUErRXpDLE1BQU0sY0FBYyxHQUFHLEdBQWMsRUFBRSxDQUFDLENBQUM7SUFDdkMsZ0JBQWdCLEVBQUUsSUFBSTtJQUN0QixjQUFjLEVBQUUsSUFBSTtJQUNwQixPQUFPLEVBQUUsSUFBSTtJQUNiLE9BQU8sRUFBRSxJQUFJO0lBQ2IsZUFBZSxFQUFFLElBQUk7SUFDckIsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLElBQUk7SUFDaEIsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsSUFBSTtJQUNmLFFBQVEsRUFBRSxJQUFJO0lBQ2QsTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsSUFBSTtDQUNaLENBQUMsQ0FBQTtBQUVGLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBa0IsRUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvQyxNQUFNLEVBQUUsMkJBQW1CLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLEtBQUssRUFBRSxFQUFFO0NBQ1YsQ0FBQyxDQUFBO0FBRUYsTUFBTSxhQUFhLEdBRWY7SUFDRixHQUFHLEVBQUUsUUFBUTtJQUNiLEdBQUcsRUFBRSxVQUFVO0lBQ2YsR0FBRyxFQUFFLFdBQVc7SUFDaEIsR0FBRyxFQUFFLFNBQVM7SUFDZCxJQUFJLEVBQUUsUUFBUTtJQUNkLCtCQUErQjtJQUMvQixTQUFTLEVBQUUsU0FBUztDQUNyQixDQUFBO0FBRUQsU0FBUyxlQUFlLENBQ3RCLEtBQWUsRUFDZixFQUFFLGtCQUFrQixFQUFtQztJQUV2RCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFBO0lBQzlCLElBQUksZ0JBQWdCLEdBQWMsY0FBYyxFQUFFLENBQUE7SUFDbEQsSUFBSSxLQUFLLEdBQVUsZ0JBQWdCLENBQUE7SUFDbkMsSUFBSSxXQUFXLEdBQWdCLElBQUksQ0FBQTtJQUNuQyxJQUFJLHVCQUF1QixHQUE2QixJQUFJLENBQUE7SUFFNUQsU0FBUyxVQUFVO1FBQ2pCLElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSx1QkFBdUIsRUFBRTtnQkFDM0IsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtnQkFDL0MsdUJBQXVCLEdBQUcsSUFBSSxDQUFBO2FBQy9CO1lBQ0QsZ0JBQWdCLENBQUMsS0FBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUN6QyxXQUFXLEdBQUcsSUFBSSxDQUFBO1NBQ25CO0lBQ0gsQ0FBQztJQUVELFNBQVMsZUFBZTtRQUN0QixVQUFVLEVBQUUsQ0FBQTtRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUM3QixnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsQ0FBQTtJQUNyQyxDQUFDO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXJCLElBQUksS0FBSyxLQUFLLGdCQUFnQixFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsS0FBSyxHQUFHLGVBQWUsQ0FBQTtnQkFDdkIsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQTtnQkFDM0IsQ0FBQyxFQUFFLENBQUE7YUFDSjtpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3pELGVBQWUsRUFBRSxDQUFBO2lCQUNsQjtnQkFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUE7Z0JBQzdELElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsQ0FBQTtpQkFDMUM7Z0JBQ0QsZ0JBQWdCLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1QyxnQkFBZ0IsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQzNDO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdkMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO2FBQ2pFO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDdkMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO2FBQ2pFO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO2dCQUNoRCxnQkFBZ0IsQ0FBQyxlQUFlLEdBQUcsSUFBSTtxQkFDcEMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztxQkFDbEMsSUFBSSxFQUFFLENBQUE7YUFDVjtpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDNUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLElBQUk7cUJBQ2hDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7cUJBQzlCLElBQUksRUFBRSxDQUFBO2FBQ1Y7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUMxQyxnQkFBZ0IsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7YUFDdkU7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUN4QyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUE7YUFDbkU7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7Z0JBQzFDLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ1YsU0FBUTtpQkFDVDtnQkFDRCxnQkFBZ0IsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN0QyxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ3RDO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO2FBQy9EO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbEMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO2FBQzdEO1NBQ0Y7YUFBTTtZQUNMLElBQUksa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDbkQsS0FBSyxHQUFHLGdCQUFnQixDQUFBO2dCQUN4QixlQUFlLEVBQUUsQ0FBQTtnQkFDakIsQ0FBQyxFQUFFLENBQUE7Z0JBQ0gsU0FBUTthQUNUO1lBQ0QsZ0JBQWdCO1lBQ2hCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUE7WUFDL0MsUUFBUSxRQUFRLEVBQUU7Z0JBQ2hCLEtBQUssUUFBUTtvQkFDWCxVQUFVLEVBQUUsQ0FBQTtvQkFDWixXQUFXLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUM3QixNQUFLO2dCQUNQLEtBQUssSUFBSTtvQkFDUCx5QkFBeUI7b0JBQ3pCLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQTtvQkFDeEIsZUFBZSxFQUFFLENBQUE7b0JBQ2pCLENBQUMsRUFBRSxDQUFBO29CQUNILE1BQUs7Z0JBQ1AsS0FBSyxRQUFRO29CQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLEVBQUU7d0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLEdBQUcsSUFBSSxDQUFDLENBQUE7cUJBQzlEO29CQUNELElBQUksQ0FBQyx1QkFBdUIsRUFBRTt3QkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDYix3RUFBd0UsQ0FDekUsQ0FBQTtxQkFDRjtvQkFDRCx1QkFBdUIsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUE7b0JBQ25ELE1BQUs7Z0JBQ1AsS0FBSyxXQUFXLENBQUM7Z0JBQ2pCLEtBQUssVUFBVSxDQUFDO2dCQUNoQixLQUFLLFNBQVM7b0JBQ1osSUFBSSxDQUFDLFdBQVcsRUFBRTt3QkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYiw2REFBNkQsQ0FDOUQsQ0FBQTtxQkFDRjtvQkFDRCxJQUNFLHVCQUF1Qjt3QkFDdkIsdUJBQXVCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFDekM7d0JBQ0EsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQTt3QkFDL0MsdUJBQXVCLEdBQUcsSUFBSSxDQUFBO3FCQUMvQjtvQkFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUU7d0JBQzVCLHVCQUF1QixHQUFHOzRCQUN4QixJQUFJLEVBQUUsUUFBUTs0QkFDZCxLQUFLLEVBQUUsRUFBRTs0QkFDVCxvQkFBb0IsRUFBRSxLQUFLO3lCQUM1QixDQUFBO3FCQUNGO29CQUNELHVCQUF1QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO29CQUNqRCxNQUFLO2dCQUNQO29CQUNFLHVCQUF1QjtvQkFDdkIseUJBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTthQUN4QjtTQUNGO0tBQ0Y7SUFFRCxlQUFlLEVBQUUsQ0FBQTtJQUVqQixLQUFLLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxNQUFNLEVBQUU7UUFDOUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtnQkFDeEIsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDMUI7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBZ0Isd0JBQXdCLENBQUMsS0FBa0I7SUFDekQsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQTtJQUVsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtRQUN4QixNQUFNLEVBQ0osZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxPQUFPLEVBQ1AsT0FBTyxFQUNQLGVBQWUsRUFDZixXQUFXLEVBQ1gsVUFBVSxFQUNWLFFBQVEsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxHQUNOLEdBQUcsSUFBSSxDQUFBO1FBQ1IsTUFBTSxJQUFJLEdBQTBCLFVBQVU7WUFDNUMsQ0FBQyxDQUFDLFFBQVE7WUFDVixDQUFDLENBQUMsZUFBZTtnQkFDakIsQ0FBQyxDQUFDLGVBQWU7Z0JBQ2pCLENBQUMsQ0FBQyxXQUFXO29CQUNiLENBQUMsQ0FBQyxlQUFlO29CQUNqQixDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDM0IsQ0FBQyxDQUFDLE9BQU87d0JBQ1QsQ0FBQyxDQUFDLGFBQWEsQ0FBQTtRQUVqQixJQUFJLG1CQUFtQixHQUFrQixJQUFJLENBQUE7UUFDN0MsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLFFBQVE7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO2lCQUNoRTtnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNWLElBQUksRUFBRSxRQUFRO29CQUNkLFFBQVEsRUFBRSxVQUFVO29CQUNwQixNQUFNLEVBQUUsUUFBUTtpQkFDakIsQ0FBQyxDQUFBO2dCQUNGLG1CQUFtQixHQUFHLFFBQVEsQ0FBQTtnQkFDOUIsTUFBSztZQUNQLEtBQUssZUFBZSxDQUFDLENBQUM7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixJQUFJLFFBQVEsQ0FBQTtnQkFDekMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7aUJBQ3BFO2dCQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7b0JBQ1YsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJO29CQUNqQyxJQUFJO29CQUNKLElBQUksRUFBRSxhQUFhLENBQUMsZUFBZ0IsQ0FBQztvQkFDckMsSUFBSSxFQUFFLFVBQVU7aUJBQ2pCLENBQUMsQ0FBQTtnQkFDRixNQUFLO2FBQ047WUFDRCxLQUFLLGVBQWUsQ0FBQyxDQUFDO2dCQUNwQixNQUFNLElBQUksR0FBRyxjQUFjLElBQUksTUFBTSxDQUFBO2dCQUNyQyxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQTtpQkFDcEU7Z0JBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQztvQkFDVixJQUFJLEVBQUUsZUFBZTtvQkFDckIsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7b0JBQ2pDLElBQUk7b0JBQ0osSUFBSSxFQUFFLGFBQWEsQ0FBQyxXQUFZLENBQUM7b0JBQ2pDLElBQUksRUFBRSxTQUFTO2lCQUNoQixDQUFDLENBQUE7Z0JBQ0YsTUFBSzthQUNOO1lBQ0QsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLGFBQWE7Z0JBQ2hCLG1CQUFtQixHQUFHLE1BQU0sSUFBSSxjQUFjLENBQUE7Z0JBQzlDLE1BQUs7WUFDUDtnQkFDRSx5QkFBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ3BCO1FBRUQsSUFBSSxtQkFBbUIsSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDcEUsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsYUFBYTtnQkFDbkIsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLE9BQU8sRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDO2FBQ2hDLENBQUMsQ0FBQTtTQUNIO1FBRUQsSUFBSSxtQkFBbUIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxPQUFPO2dCQUNiLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLEtBQUs7Z0JBQ0wsVUFBVTtnQkFDVixTQUFTO2FBQ1YsQ0FBQyxDQUFBO1NBQ0g7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQztBQW5HRCw0REFtR0M7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLHNDQUFzQztJQUN0QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQTtJQUM1QyxJQUNFLFVBQVUsS0FBSyxnQ0FBd0I7UUFDdkMsVUFBVSxLQUFLLDRCQUFvQixFQUNuQztRQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDLENBQUE7S0FDeEQ7SUFDRCxPQUFPLFVBQVUsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBZ0IsY0FBYyxDQUFDLElBQVk7SUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMvQixJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNsQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUE7S0FDWjtJQUNELElBQUk7UUFDRixPQUFPLHdCQUF3QixDQUM3QixlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDdEQsQ0FBQTtLQUNGO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixJQUNFLENBQUMsWUFBWSxLQUFLO1lBQ2xCLENBQUMsQ0FBQyxPQUFPLEtBQUssb0NBQW9DLEVBQ2xEO1lBQ0EsT0FBTyx3QkFBd0IsQ0FDN0IsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQ3JELENBQUE7U0FDRjtRQUNELE1BQU0sQ0FBQyxDQUFBO0tBQ1I7QUFDSCxDQUFDO0FBcEJELHdDQW9CQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLElBQVU7SUFDNUMsd0JBQXdCO0lBQ3hCLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQTtJQUN0QixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUE7SUFDckIsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDeEMsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLFNBQVM7Z0JBQ1osYUFBYSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUE7Z0JBQzdCLGNBQWMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO2dCQUM5QixNQUFLO1lBQ1AsS0FBSyxVQUFVO2dCQUNiLGNBQWMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO2dCQUM5QixNQUFLO1lBQ1AsS0FBSyxXQUFXO2dCQUNkLGFBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFBO2dCQUM3QixNQUFLO1lBQ1A7Z0JBQ0UseUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNwQjtLQUNGO0lBRUQsSUFDRSxjQUFjLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTTtRQUM5QyxhQUFhLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUM1QztRQUNBLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtLQUN0RDtBQUNILENBQUM7QUEzQkQsa0RBMkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiLi4vYXNzZXJ0TmV2ZXJcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEh1bmtIZWFkZXIge1xuICBvcmlnaW5hbDoge1xuICAgIHN0YXJ0OiBudW1iZXJcbiAgICBsZW5ndGg6IG51bWJlclxuICB9XG4gIHBhdGNoZWQ6IHtcbiAgICBzdGFydDogbnVtYmVyXG4gICAgbGVuZ3RoOiBudW1iZXJcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VIdW5rSGVhZGVyTGluZSA9IChoZWFkZXJMaW5lOiBzdHJpbmcpOiBIdW5rSGVhZGVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBoZWFkZXJMaW5lXG4gICAgLnRyaW0oKVxuICAgIC5tYXRjaCgvXkBAIC0oXFxkKykoLChcXGQrKSk/IFxcKyhcXGQrKSgsKFxcZCspKT8gQEAuKi8pXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEJhZCBoZWFkZXIgbGluZTogJyR7aGVhZGVyTGluZX0nYClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3JpZ2luYWw6IHtcbiAgICAgIHN0YXJ0OiBNYXRoLm1heChOdW1iZXIobWF0Y2hbMV0pLCAxKSxcbiAgICAgIGxlbmd0aDogTnVtYmVyKG1hdGNoWzNdIHx8IDEpLFxuICAgIH0sXG4gICAgcGF0Y2hlZDoge1xuICAgICAgc3RhcnQ6IE1hdGgubWF4KE51bWJlcihtYXRjaFs0XSksIDEpLFxuICAgICAgbGVuZ3RoOiBOdW1iZXIobWF0Y2hbNl0gfHwgMSksXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTk9OX0VYRUNVVEFCTEVfRklMRV9NT0RFID0gMG82NDRcbmV4cG9ydCBjb25zdCBFWEVDVVRBQkxFX0ZJTEVfTU9ERSA9IDBvNzU1XG5cbnR5cGUgRmlsZU1vZGUgPSB0eXBlb2YgTk9OX0VYRUNVVEFCTEVfRklMRV9NT0RFIHwgdHlwZW9mIEVYRUNVVEFCTEVfRklMRV9NT0RFXG5cbmludGVyZmFjZSBQYXRjaE11dGF0aW9uUGFydCB7XG4gIHR5cGU6IFwiY29udGV4dFwiIHwgXCJpbnNlcnRpb25cIiB8IFwiZGVsZXRpb25cIlxuICBsaW5lczogc3RyaW5nW11cbiAgbm9OZXdsaW5lQXRFbmRPZkZpbGU6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEZpbGVSZW5hbWUge1xuICB0eXBlOiBcInJlbmFtZVwiXG4gIGZyb21QYXRoOiBzdHJpbmdcbiAgdG9QYXRoOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIEZpbGVNb2RlQ2hhbmdlIHtcbiAgdHlwZTogXCJtb2RlIGNoYW5nZVwiXG4gIHBhdGg6IHN0cmluZ1xuICBvbGRNb2RlOiBGaWxlTW9kZVxuICBuZXdNb2RlOiBGaWxlTW9kZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXRjaCB7XG4gIHR5cGU6IFwicGF0Y2hcIlxuICBwYXRoOiBzdHJpbmdcbiAgaHVua3M6IEh1bmtbXVxuICBiZWZvcmVIYXNoOiBzdHJpbmcgfCBudWxsXG4gIGFmdGVySGFzaDogc3RyaW5nIHwgbnVsbFxufVxuXG5pbnRlcmZhY2UgRmlsZURlbGV0aW9uIHtcbiAgdHlwZTogXCJmaWxlIGRlbGV0aW9uXCJcbiAgcGF0aDogc3RyaW5nXG4gIG1vZGU6IEZpbGVNb2RlXG4gIGh1bms6IEh1bmsgfCBudWxsXG4gIGhhc2g6IHN0cmluZyB8IG51bGxcbn1cblxuaW50ZXJmYWNlIEZpbGVDcmVhdGlvbiB7XG4gIHR5cGU6IFwiZmlsZSBjcmVhdGlvblwiXG4gIG1vZGU6IEZpbGVNb2RlXG4gIHBhdGg6IHN0cmluZ1xuICBodW5rOiBIdW5rIHwgbnVsbFxuICBoYXNoOiBzdHJpbmcgfCBudWxsXG59XG5cbmV4cG9ydCB0eXBlIFBhdGNoRmlsZVBhcnQgPVxuICB8IEZpbGVQYXRjaFxuICB8IEZpbGVEZWxldGlvblxuICB8IEZpbGVDcmVhdGlvblxuICB8IEZpbGVSZW5hbWVcbiAgfCBGaWxlTW9kZUNoYW5nZVxuXG5leHBvcnQgdHlwZSBQYXJzZWRQYXRjaEZpbGUgPSBQYXRjaEZpbGVQYXJ0W11cblxudHlwZSBTdGF0ZSA9IFwicGFyc2luZyBoZWFkZXJcIiB8IFwicGFyc2luZyBodW5rc1wiXG5cbmludGVyZmFjZSBGaWxlRGVldHMge1xuICBkaWZmTGluZUZyb21QYXRoOiBzdHJpbmcgfCBudWxsXG4gIGRpZmZMaW5lVG9QYXRoOiBzdHJpbmcgfCBudWxsXG4gIG9sZE1vZGU6IHN0cmluZyB8IG51bGxcbiAgbmV3TW9kZTogc3RyaW5nIHwgbnVsbFxuICBkZWxldGVkRmlsZU1vZGU6IHN0cmluZyB8IG51bGxcbiAgbmV3RmlsZU1vZGU6IHN0cmluZyB8IG51bGxcbiAgcmVuYW1lRnJvbTogc3RyaW5nIHwgbnVsbFxuICByZW5hbWVUbzogc3RyaW5nIHwgbnVsbFxuICBiZWZvcmVIYXNoOiBzdHJpbmcgfCBudWxsXG4gIGFmdGVySGFzaDogc3RyaW5nIHwgbnVsbFxuICBmcm9tUGF0aDogc3RyaW5nIHwgbnVsbFxuICB0b1BhdGg6IHN0cmluZyB8IG51bGxcbiAgaHVua3M6IEh1bmtbXSB8IG51bGxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIdW5rIHtcbiAgaGVhZGVyOiBIdW5rSGVhZGVyXG4gIHBhcnRzOiBQYXRjaE11dGF0aW9uUGFydFtdXG59XG5cbmNvbnN0IGVtcHR5RmlsZVBhdGNoID0gKCk6IEZpbGVEZWV0cyA9PiAoe1xuICBkaWZmTGluZUZyb21QYXRoOiBudWxsLFxuICBkaWZmTGluZVRvUGF0aDogbnVsbCxcbiAgb2xkTW9kZTogbnVsbCxcbiAgbmV3TW9kZTogbnVsbCxcbiAgZGVsZXRlZEZpbGVNb2RlOiBudWxsLFxuICBuZXdGaWxlTW9kZTogbnVsbCxcbiAgcmVuYW1lRnJvbTogbnVsbCxcbiAgcmVuYW1lVG86IG51bGwsXG4gIGJlZm9yZUhhc2g6IG51bGwsXG4gIGFmdGVySGFzaDogbnVsbCxcbiAgZnJvbVBhdGg6IG51bGwsXG4gIHRvUGF0aDogbnVsbCxcbiAgaHVua3M6IG51bGwsXG59KVxuXG5jb25zdCBlbXB0eUh1bmsgPSAoaGVhZGVyTGluZTogc3RyaW5nKTogSHVuayA9PiAoe1xuICBoZWFkZXI6IHBhcnNlSHVua0hlYWRlckxpbmUoaGVhZGVyTGluZSksXG4gIHBhcnRzOiBbXSxcbn0pXG5cbmNvbnN0IGh1bmtMaW5ldHlwZXM6IHtcbiAgW2s6IHN0cmluZ106IFBhdGNoTXV0YXRpb25QYXJ0W1widHlwZVwiXSB8IFwicHJhZ21hXCIgfCBcImhlYWRlclwiXG59ID0ge1xuICBcIkBcIjogXCJoZWFkZXJcIixcbiAgXCItXCI6IFwiZGVsZXRpb25cIixcbiAgXCIrXCI6IFwiaW5zZXJ0aW9uXCIsXG4gIFwiIFwiOiBcImNvbnRleHRcIixcbiAgXCJcXFxcXCI6IFwicHJhZ21hXCIsXG4gIC8vIFRyZWF0IGJsYW5rIGxpbmVzIGFzIGNvbnRleHRcbiAgdW5kZWZpbmVkOiBcImNvbnRleHRcIixcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXRjaExpbmVzKFxuICBsaW5lczogc3RyaW5nW10sXG4gIHsgc3VwcG9ydExlZ2FjeURpZmZzIH06IHsgc3VwcG9ydExlZ2FjeURpZmZzOiBib29sZWFuIH0sXG4pOiBGaWxlRGVldHNbXSB7XG4gIGNvbnN0IHJlc3VsdDogRmlsZURlZXRzW10gPSBbXVxuICBsZXQgY3VycmVudEZpbGVQYXRjaDogRmlsZURlZXRzID0gZW1wdHlGaWxlUGF0Y2goKVxuICBsZXQgc3RhdGU6IFN0YXRlID0gXCJwYXJzaW5nIGhlYWRlclwiXG4gIGxldCBjdXJyZW50SHVuazogSHVuayB8IG51bGwgPSBudWxsXG4gIGxldCBjdXJyZW50SHVua011dGF0aW9uUGFydDogUGF0Y2hNdXRhdGlvblBhcnQgfCBudWxsID0gbnVsbFxuXG4gIGZ1bmN0aW9uIGNvbW1pdEh1bmsoKSB7XG4gICAgaWYgKGN1cnJlbnRIdW5rKSB7XG4gICAgICBpZiAoY3VycmVudEh1bmtNdXRhdGlvblBhcnQpIHtcbiAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcbiAgICAgICAgY3VycmVudEh1bmtNdXRhdGlvblBhcnQgPSBudWxsXG4gICAgICB9XG4gICAgICBjdXJyZW50RmlsZVBhdGNoLmh1bmtzIS5wdXNoKGN1cnJlbnRIdW5rKVxuICAgICAgY3VycmVudEh1bmsgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29tbWl0RmlsZVBhdGNoKCkge1xuICAgIGNvbW1pdEh1bmsoKVxuICAgIHJlc3VsdC5wdXNoKGN1cnJlbnRGaWxlUGF0Y2gpXG4gICAgY3VycmVudEZpbGVQYXRjaCA9IGVtcHR5RmlsZVBhdGNoKClcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBsaW5lID0gbGluZXNbaV1cblxuICAgIGlmIChzdGF0ZSA9PT0gXCJwYXJzaW5nIGhlYWRlclwiKSB7XG4gICAgICBpZiAobGluZS5zdGFydHNXaXRoKFwiQEBcIikpIHtcbiAgICAgICAgc3RhdGUgPSBcInBhcnNpbmcgaHVua3NcIlxuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLmh1bmtzID0gW11cbiAgICAgICAgaS0tXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcImRpZmYgLS1naXQgXCIpKSB7XG4gICAgICAgIGlmIChjdXJyZW50RmlsZVBhdGNoICYmIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVGcm9tUGF0aCkge1xuICAgICAgICAgIGNvbW1pdEZpbGVQYXRjaCgpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9eZGlmZiAtLWdpdCBhXFwvKC4qPykgYlxcLyguKj8pXFxzKiQvKVxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmFkIGRpZmYgbGluZTogXCIgKyBsaW5lKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVGcm9tUGF0aCA9IG1hdGNoWzFdXG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGlmZkxpbmVUb1BhdGggPSBtYXRjaFsyXVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJvbGQgbW9kZSBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5vbGRNb2RlID0gbGluZS5zbGljZShcIm9sZCBtb2RlIFwiLmxlbmd0aCkudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBtb2RlIFwiKSkge1xuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLm5ld01vZGUgPSBsaW5lLnNsaWNlKFwibmV3IG1vZGUgXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiZGVsZXRlZCBmaWxlIG1vZGUgXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZGVsZXRlZEZpbGVNb2RlID0gbGluZVxuICAgICAgICAgIC5zbGljZShcImRlbGV0ZWQgZmlsZSBtb2RlIFwiLmxlbmd0aClcbiAgICAgICAgICAudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcIm5ldyBmaWxlIG1vZGUgXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2gubmV3RmlsZU1vZGUgPSBsaW5lXG4gICAgICAgICAgLnNsaWNlKFwibmV3IGZpbGUgbW9kZSBcIi5sZW5ndGgpXG4gICAgICAgICAgLnRyaW0oKVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCJyZW5hbWUgZnJvbSBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5yZW5hbWVGcm9tID0gbGluZS5zbGljZShcInJlbmFtZSBmcm9tIFwiLmxlbmd0aCkudHJpbSgpXG4gICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aChcInJlbmFtZSB0byBcIikpIHtcbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5yZW5hbWVUbyA9IGxpbmUuc2xpY2UoXCJyZW5hbWUgdG8gXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiaW5kZXggXCIpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvKFxcdyspXFwuXFwuKFxcdyspLylcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5iZWZvcmVIYXNoID0gbWF0Y2hbMV1cbiAgICAgICAgY3VycmVudEZpbGVQYXRjaC5hZnRlckhhc2ggPSBtYXRjaFsyXVxuICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoXCItLS0gXCIpKSB7XG4gICAgICAgIGN1cnJlbnRGaWxlUGF0Y2guZnJvbVBhdGggPSBsaW5lLnNsaWNlKFwiLS0tIGEvXCIubGVuZ3RoKS50cmltKClcbiAgICAgIH0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKFwiKysrIFwiKSkge1xuICAgICAgICBjdXJyZW50RmlsZVBhdGNoLnRvUGF0aCA9IGxpbmUuc2xpY2UoXCIrKysgYi9cIi5sZW5ndGgpLnRyaW0oKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3VwcG9ydExlZ2FjeURpZmZzICYmIGxpbmUuc3RhcnRzV2l0aChcIi0tLSBhL1wiKSkge1xuICAgICAgICBzdGF0ZSA9IFwicGFyc2luZyBoZWFkZXJcIlxuICAgICAgICBjb21taXRGaWxlUGF0Y2goKVxuICAgICAgICBpLS1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIC8vIHBhcnNpbmcgaHVua3NcbiAgICAgIGNvbnN0IGxpbmVUeXBlID0gaHVua0xpbmV0eXBlc1tsaW5lWzBdXSB8fCBudWxsXG4gICAgICBzd2l0Y2ggKGxpbmVUeXBlKSB7XG4gICAgICAgIGNhc2UgXCJoZWFkZXJcIjpcbiAgICAgICAgICBjb21taXRIdW5rKClcbiAgICAgICAgICBjdXJyZW50SHVuayA9IGVtcHR5SHVuayhsaW5lKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgbnVsbDpcbiAgICAgICAgICAvLyB1bnJlY29nbml6ZWQsIGJhaWwgb3V0XG4gICAgICAgICAgc3RhdGUgPSBcInBhcnNpbmcgaGVhZGVyXCJcbiAgICAgICAgICBjb21taXRGaWxlUGF0Y2goKVxuICAgICAgICAgIGktLVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJwcmFnbWFcIjpcbiAgICAgICAgICBpZiAoIWxpbmUuc3RhcnRzV2l0aChcIlxcXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5yZWNvZ25pemVkIHByYWdtYSBpbiBwYXRjaCBmaWxlOiBcIiArIGxpbmUpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghY3VycmVudEh1bmtNdXRhdGlvblBhcnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJCYWQgcGFyc2VyIHN0YXRlOiBObyBuZXdsaW5lIGF0IEVPRiBwcmFnbWEgZW5jb3VudGVyZWQgd2l0aG91dCBjb250ZXh0XCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0Lm5vTmV3bGluZUF0RW5kT2ZGaWxlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcbiAgICAgICAgY2FzZSBcImRlbGV0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJjb250ZXh0XCI6XG4gICAgICAgICAgaWYgKCFjdXJyZW50SHVuaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBcIkJhZCBwYXJzZXIgc3RhdGU6IEh1bmsgbGluZXMgZW5jb3VudGVyZWQgYmVmb3JlIGh1bmsgaGVhZGVyXCIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ICYmXG4gICAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydC50eXBlICE9PSBsaW5lVHlwZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY3VycmVudEh1bmsucGFydHMucHVzaChjdXJyZW50SHVua011dGF0aW9uUGFydClcbiAgICAgICAgICAgIGN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWN1cnJlbnRIdW5rTXV0YXRpb25QYXJ0KSB7XG4gICAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydCA9IHtcbiAgICAgICAgICAgICAgdHlwZTogbGluZVR5cGUsXG4gICAgICAgICAgICAgIGxpbmVzOiBbXSxcbiAgICAgICAgICAgICAgbm9OZXdsaW5lQXRFbmRPZkZpbGU6IGZhbHNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50SHVua011dGF0aW9uUGFydC5saW5lcy5wdXNoKGxpbmUuc2xpY2UoMSkpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBleGhhdXNpdHZlbmVzcyBjaGVja1xuICAgICAgICAgIGFzc2VydE5ldmVyKGxpbmVUeXBlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbW1pdEZpbGVQYXRjaCgpXG5cbiAgZm9yIChjb25zdCB7IGh1bmtzIH0gb2YgcmVzdWx0KSB7XG4gICAgaWYgKGh1bmtzKSB7XG4gICAgICBmb3IgKGNvbnN0IGh1bmsgb2YgaHVua3MpIHtcbiAgICAgICAgdmVyaWZ5SHVua0ludGVncml0eShodW5rKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVycHJldFBhcnNlZFBhdGNoRmlsZShmaWxlczogRmlsZURlZXRzW10pOiBQYXJzZWRQYXRjaEZpbGUge1xuICBjb25zdCByZXN1bHQ6IFBhcnNlZFBhdGNoRmlsZSA9IFtdXG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGlmZkxpbmVGcm9tUGF0aCxcbiAgICAgIGRpZmZMaW5lVG9QYXRoLFxuICAgICAgb2xkTW9kZSxcbiAgICAgIG5ld01vZGUsXG4gICAgICBkZWxldGVkRmlsZU1vZGUsXG4gICAgICBuZXdGaWxlTW9kZSxcbiAgICAgIHJlbmFtZUZyb20sXG4gICAgICByZW5hbWVUbyxcbiAgICAgIGJlZm9yZUhhc2gsXG4gICAgICBhZnRlckhhc2gsXG4gICAgICBmcm9tUGF0aCxcbiAgICAgIHRvUGF0aCxcbiAgICAgIGh1bmtzLFxuICAgIH0gPSBmaWxlXG4gICAgY29uc3QgdHlwZTogUGF0Y2hGaWxlUGFydFtcInR5cGVcIl0gPSByZW5hbWVGcm9tXG4gICAgICA/IFwicmVuYW1lXCJcbiAgICAgIDogZGVsZXRlZEZpbGVNb2RlXG4gICAgICA/IFwiZmlsZSBkZWxldGlvblwiXG4gICAgICA6IG5ld0ZpbGVNb2RlXG4gICAgICA/IFwiZmlsZSBjcmVhdGlvblwiXG4gICAgICA6IGh1bmtzICYmIGh1bmtzLmxlbmd0aCA+IDBcbiAgICAgID8gXCJwYXRjaFwiXG4gICAgICA6IFwibW9kZSBjaGFuZ2VcIlxuXG4gICAgbGV0IGRlc3RpbmF0aW9uRmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwicmVuYW1lXCI6XG4gICAgICAgIGlmICghcmVuYW1lRnJvbSB8fCAhcmVuYW1lVG8pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcGFyc2VyIHN0YXRlOiByZW5hbWUgZnJvbSAmIHRvIG5vdCBnaXZlblwiKVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInJlbmFtZVwiLFxuICAgICAgICAgIGZyb21QYXRoOiByZW5hbWVGcm9tLFxuICAgICAgICAgIHRvUGF0aDogcmVuYW1lVG8sXG4gICAgICAgIH0pXG4gICAgICAgIGRlc3RpbmF0aW9uRmlsZVBhdGggPSByZW5hbWVUb1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSBcImZpbGUgZGVsZXRpb25cIjoge1xuICAgICAgICBjb25zdCBwYXRoID0gZGlmZkxpbmVGcm9tUGF0aCB8fCBmcm9tUGF0aFxuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYWQgcGFyc2Ugc3RhdGU6IG5vIHBhdGggZ2l2ZW4gZm9yIGZpbGUgZGVsZXRpb25cIilcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogXCJmaWxlIGRlbGV0aW9uXCIsXG4gICAgICAgICAgaHVuazogKGh1bmtzICYmIGh1bmtzWzBdKSB8fCBudWxsLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgbW9kZTogcGFyc2VGaWxlTW9kZShkZWxldGVkRmlsZU1vZGUhKSxcbiAgICAgICAgICBoYXNoOiBiZWZvcmVIYXNoLFxuICAgICAgICB9KVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBcImZpbGUgY3JlYXRpb25cIjoge1xuICAgICAgICBjb25zdCBwYXRoID0gZGlmZkxpbmVUb1BhdGggfHwgdG9QYXRoXG4gICAgICAgIGlmICghcGF0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJhZCBwYXJzZSBzdGF0ZTogbm8gcGF0aCBnaXZlbiBmb3IgZmlsZSBjcmVhdGlvblwiKVxuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcImZpbGUgY3JlYXRpb25cIixcbiAgICAgICAgICBodW5rOiAoaHVua3MgJiYgaHVua3NbMF0pIHx8IG51bGwsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBtb2RlOiBwYXJzZUZpbGVNb2RlKG5ld0ZpbGVNb2RlISksXG4gICAgICAgICAgaGFzaDogYWZ0ZXJIYXNoLFxuICAgICAgICB9KVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBcInBhdGNoXCI6XG4gICAgICBjYXNlIFwibW9kZSBjaGFuZ2VcIjpcbiAgICAgICAgZGVzdGluYXRpb25GaWxlUGF0aCA9IHRvUGF0aCB8fCBkaWZmTGluZVRvUGF0aFxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodHlwZSlcbiAgICB9XG5cbiAgICBpZiAoZGVzdGluYXRpb25GaWxlUGF0aCAmJiBvbGRNb2RlICYmIG5ld01vZGUgJiYgb2xkTW9kZSAhPT0gbmV3TW9kZSkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiBcIm1vZGUgY2hhbmdlXCIsXG4gICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uRmlsZVBhdGgsXG4gICAgICAgIG9sZE1vZGU6IHBhcnNlRmlsZU1vZGUob2xkTW9kZSksXG4gICAgICAgIG5ld01vZGU6IHBhcnNlRmlsZU1vZGUobmV3TW9kZSksXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkZXN0aW5hdGlvbkZpbGVQYXRoICYmIGh1bmtzICYmIGh1bmtzLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICB0eXBlOiBcInBhdGNoXCIsXG4gICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uRmlsZVBhdGgsXG4gICAgICAgIGh1bmtzLFxuICAgICAgICBiZWZvcmVIYXNoLFxuICAgICAgICBhZnRlckhhc2gsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWxlTW9kZShtb2RlOiBzdHJpbmcpOiBGaWxlTW9kZSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG4gIGNvbnN0IHBhcnNlZE1vZGUgPSBwYXJzZUludChtb2RlLCA4KSAmIDBvNzc3XG4gIGlmIChcbiAgICBwYXJzZWRNb2RlICE9PSBOT05fRVhFQ1VUQUJMRV9GSUxFX01PREUgJiZcbiAgICBwYXJzZWRNb2RlICE9PSBFWEVDVVRBQkxFX0ZJTEVfTU9ERVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmV4cGVjdGVkIGZpbGUgbW9kZSBzdHJpbmc6IFwiICsgbW9kZSlcbiAgfVxuICByZXR1cm4gcGFyc2VkTW9kZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaEZpbGUoZmlsZTogc3RyaW5nKTogUGFyc2VkUGF0Y2hGaWxlIHtcbiAgY29uc3QgbGluZXMgPSBmaWxlLnNwbGl0KC9cXG4vZylcbiAgaWYgKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdID09PSBcIlwiKSB7XG4gICAgbGluZXMucG9wKClcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoXG4gICAgICBwYXJzZVBhdGNoTGluZXMobGluZXMsIHsgc3VwcG9ydExlZ2FjeURpZmZzOiBmYWxzZSB9KSxcbiAgICApXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXG4gICAgICBlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgIGUubWVzc2FnZSA9PT0gXCJodW5rIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBpbnRlcnByZXRQYXJzZWRQYXRjaEZpbGUoXG4gICAgICAgIHBhcnNlUGF0Y2hMaW5lcyhsaW5lcywgeyBzdXBwb3J0TGVnYWN5RGlmZnM6IHRydWUgfSksXG4gICAgICApXG4gICAgfVxuICAgIHRocm93IGVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5SHVua0ludGVncml0eShodW5rOiBIdW5rKSB7XG4gIC8vIHZlcmlmeSBodW5rIGludGVncml0eVxuICBsZXQgb3JpZ2luYWxMZW5ndGggPSAwXG4gIGxldCBwYXRjaGVkTGVuZ3RoID0gMFxuICBmb3IgKGNvbnN0IHsgdHlwZSwgbGluZXMgfSBvZiBodW5rLnBhcnRzKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwiY29udGV4dFwiOlxuICAgICAgICBwYXRjaGVkTGVuZ3RoICs9IGxpbmVzLmxlbmd0aFxuICAgICAgICBvcmlnaW5hbExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJkZWxldGlvblwiOlxuICAgICAgICBvcmlnaW5hbExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJpbnNlcnRpb25cIjpcbiAgICAgICAgcGF0Y2hlZExlbmd0aCArPSBsaW5lcy5sZW5ndGhcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKHR5cGUpXG4gICAgfVxuICB9XG5cbiAgaWYgKFxuICAgIG9yaWdpbmFsTGVuZ3RoICE9PSBodW5rLmhlYWRlci5vcmlnaW5hbC5sZW5ndGggfHxcbiAgICBwYXRjaGVkTGVuZ3RoICE9PSBodW5rLmhlYWRlci5wYXRjaGVkLmxlbmd0aFxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJodW5rIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkXCIpXG4gIH1cbn1cbiJdfQ==