@bitgo-beta/abstract-utxo 1.1.1-beta.21 → 1.1.1-beta.2100

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 (829) hide show
  1. package/README.md +76 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts +461 -0
  3. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  4. package/dist/cjs/src/abstractUtxoCoin.js +651 -0
  5. package/dist/cjs/src/address/fixedScript.d.ts +44 -0
  6. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  7. package/dist/cjs/src/address/fixedScript.js +108 -0
  8. package/dist/cjs/src/address/index.d.ts +2 -0
  9. package/dist/cjs/src/address/index.d.ts.map +1 -0
  10. package/dist/cjs/src/address/index.js +8 -0
  11. package/dist/{src → cjs/src}/config.d.ts +1 -0
  12. package/dist/cjs/src/config.d.ts.map +1 -0
  13. package/dist/cjs/src/config.js +14 -0
  14. package/dist/cjs/src/deriveKeyWithSeed.d.ts +12 -0
  15. package/dist/cjs/src/deriveKeyWithSeed.d.ts.map +1 -0
  16. package/dist/cjs/src/deriveKeyWithSeed.js +17 -0
  17. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
  18. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -0
  20. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  21. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  22. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
  23. package/dist/cjs/src/descriptor/builder/builder.d.ts +17 -0
  24. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  25. package/dist/cjs/src/descriptor/builder/builder.js +54 -0
  26. package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
  27. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  28. package/dist/cjs/src/descriptor/builder/index.js +8 -0
  29. package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
  30. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/builder/parse.js +148 -0
  32. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  33. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  34. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  35. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  36. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  37. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  38. package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
  39. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  40. package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
  41. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
  42. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  43. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  44. package/dist/cjs/src/descriptor/index.d.ts +9 -0
  45. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  46. package/dist/cjs/src/descriptor/index.js +53 -0
  47. package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
  48. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  49. package/dist/cjs/src/descriptor/validatePolicy.js +94 -0
  50. package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
  51. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  52. package/dist/cjs/src/impl/bch/bch.js +43 -0
  53. package/dist/cjs/src/impl/bch/index.d.ts +3 -0
  54. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  55. package/dist/cjs/src/impl/bch/index.js +19 -0
  56. package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
  57. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  58. package/dist/cjs/src/impl/bch/tbch.js +15 -0
  59. package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
  60. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  61. package/dist/cjs/src/impl/bcha/bcha.js +15 -0
  62. package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
  63. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  64. package/dist/cjs/src/impl/bcha/index.js +19 -0
  65. package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
  66. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  67. package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
  68. package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
  69. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  70. package/dist/cjs/src/impl/bsv/bsv.js +15 -0
  71. package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
  72. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  73. package/dist/cjs/src/impl/bsv/index.js +19 -0
  74. package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
  75. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  76. package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
  77. package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
  78. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  79. package/dist/cjs/src/impl/btc/btc.js +22 -0
  80. package/dist/cjs/src/impl/btc/index.d.ts +7 -0
  81. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  82. package/dist/cjs/src/impl/btc/index.js +23 -0
  83. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
  84. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  85. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +170 -0
  86. package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
  87. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  88. package/dist/cjs/src/impl/btc/tbtc.js +15 -0
  89. package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
  90. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  91. package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
  92. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
  93. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  94. package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
  95. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
  96. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  97. package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
  98. package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
  99. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  100. package/dist/cjs/src/impl/btg/btg.js +15 -0
  101. package/dist/cjs/src/impl/btg/index.d.ts +2 -0
  102. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  103. package/dist/cjs/src/impl/btg/index.js +18 -0
  104. package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
  105. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  106. package/dist/cjs/src/impl/dash/dash.js +15 -0
  107. package/dist/cjs/src/impl/dash/index.d.ts +3 -0
  108. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  109. package/dist/cjs/src/impl/dash/index.js +19 -0
  110. package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
  111. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  112. package/dist/cjs/src/impl/dash/tdash.js +15 -0
  113. package/dist/cjs/src/impl/doge/doge.d.ts +33 -0
  114. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  115. package/dist/cjs/src/impl/doge/doge.js +76 -0
  116. package/dist/cjs/src/impl/doge/index.d.ts +3 -0
  117. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  118. package/dist/cjs/src/impl/doge/index.js +19 -0
  119. package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
  120. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  121. package/dist/cjs/src/impl/doge/tdoge.js +15 -0
  122. package/dist/cjs/src/impl/index.d.ts +10 -0
  123. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  124. package/dist/cjs/src/impl/index.js +46 -0
  125. package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
  126. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  127. package/dist/cjs/src/impl/ltc/index.js +19 -0
  128. package/dist/cjs/src/impl/ltc/ltc.d.ts +8 -0
  129. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  130. package/dist/cjs/src/impl/ltc/ltc.js +15 -0
  131. package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
  132. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  133. package/dist/cjs/src/impl/ltc/tltc.js +15 -0
  134. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  135. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  136. package/dist/cjs/src/impl/zec/index.js +19 -0
  137. package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
  138. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  139. package/dist/cjs/src/impl/zec/tzec.js +15 -0
  140. package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
  141. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  142. package/dist/cjs/src/impl/zec/zec.js +15 -0
  143. package/dist/cjs/src/index.d.ts +22 -0
  144. package/dist/cjs/src/index.d.ts.map +1 -0
  145. package/dist/cjs/src/index.js +61 -0
  146. package/dist/cjs/src/keychains.d.ts +55 -0
  147. package/dist/cjs/src/keychains.d.ts.map +1 -0
  148. package/dist/cjs/src/keychains.js +143 -0
  149. package/dist/cjs/src/names.d.ts +13 -0
  150. package/dist/cjs/src/names.d.ts.map +1 -0
  151. package/dist/cjs/src/names.js +93 -0
  152. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  153. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  154. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +22 -0
  155. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  156. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  157. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  158. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
  159. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  160. package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
  161. package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
  162. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  163. package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
  164. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +39 -0
  165. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  166. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  167. package/dist/cjs/src/offlineVault/index.d.ts +6 -0
  168. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  169. package/dist/cjs/src/offlineVault/index.js +44 -0
  170. package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +6 -7
  171. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  172. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  173. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +158 -0
  174. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  175. package/dist/cjs/src/recovery/backupKeyRecovery.js +411 -0
  176. package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
  177. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  178. package/dist/cjs/src/recovery/baseApi.js +73 -0
  179. package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
  180. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  181. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  182. package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +30 -30
  183. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  184. package/dist/cjs/src/recovery/crossChainRecovery.js +299 -0
  185. package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
  186. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  187. package/dist/{src → cjs/src}/recovery/index.js +6 -3
  188. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  189. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  190. package/dist/cjs/src/recovery/psbt.d.ts +62 -0
  191. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
  192. package/dist/cjs/src/recovery/psbt.js +153 -0
  193. package/dist/cjs/src/tnumber.d.ts +4 -0
  194. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  195. package/dist/cjs/src/tnumber.js +12 -0
  196. package/dist/cjs/src/transaction/bip322.d.ts +27 -0
  197. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  198. package/dist/cjs/src/transaction/bip322.js +139 -0
  199. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  200. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  201. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  202. package/dist/cjs/src/transaction/decode.d.ts +21 -0
  203. package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
  204. package/dist/cjs/src/transaction/decode.js +45 -0
  205. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  206. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  207. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +47 -0
  208. package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
  209. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  210. package/dist/cjs/src/transaction/descriptor/index.js +14 -0
  211. package/dist/cjs/src/transaction/descriptor/parse.d.ts +18 -0
  212. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  213. package/dist/cjs/src/transaction/descriptor/parse.js +86 -0
  214. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
  215. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  216. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  217. package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
  218. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  219. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  220. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +25 -0
  221. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  222. package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
  223. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +36 -0
  224. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  225. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +90 -0
  226. package/dist/cjs/src/transaction/explainTransaction.d.ts +18 -0
  227. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  228. package/dist/cjs/src/transaction/explainTransaction.js +84 -0
  229. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
  230. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
  231. package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
  232. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  233. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  234. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +149 -0
  235. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +47 -0
  236. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  237. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +3 -0
  238. package/dist/cjs/src/transaction/fixedScript/index.d.ts +8 -0
  239. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  240. package/dist/cjs/src/transaction/fixedScript/index.js +30 -0
  241. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
  242. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
  243. package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
  244. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
  245. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  246. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
  247. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
  248. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  249. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +227 -0
  250. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
  251. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  252. package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
  253. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  254. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  255. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +118 -0
  256. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +22 -0
  257. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  258. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +46 -0
  259. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  260. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  261. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +182 -0
  262. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  263. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  264. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
  265. package/dist/cjs/src/transaction/index.d.ts +9 -0
  266. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  267. package/dist/cjs/src/transaction/index.js +52 -0
  268. package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
  269. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  270. package/dist/cjs/src/transaction/outputDifference.js +51 -0
  271. package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
  272. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  273. package/dist/cjs/src/transaction/parseTransaction.js +48 -0
  274. package/dist/cjs/src/transaction/recipient.d.ts +34 -0
  275. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  276. package/dist/cjs/src/transaction/recipient.js +69 -0
  277. package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
  278. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  279. package/dist/cjs/src/transaction/signTransaction.js +105 -0
  280. package/dist/cjs/src/transaction/types.d.ts +47 -0
  281. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  282. package/dist/cjs/src/transaction/types.js +3 -0
  283. package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
  284. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  285. package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
  286. package/dist/cjs/src/unspent.d.ts +59 -0
  287. package/dist/cjs/src/unspent.d.ts.map +1 -0
  288. package/dist/cjs/src/unspent.js +20 -0
  289. package/dist/cjs/src/verifyKey.d.ts +26 -0
  290. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  291. package/dist/cjs/src/verifyKey.js +125 -0
  292. package/dist/cjs/src/wallet.d.ts +15 -0
  293. package/dist/cjs/src/wallet.d.ts.map +1 -0
  294. package/dist/cjs/src/wallet.js +8 -0
  295. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  296. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  297. package/dist/cjs/test/integration/impl/bch/bch.js +76 -0
  298. package/dist/cjs/test/unit/address.d.ts +2 -0
  299. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  300. package/dist/cjs/test/unit/address.js +201 -0
  301. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  302. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  303. package/dist/cjs/test/unit/bip322.js +481 -0
  304. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
  305. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
  306. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +99 -0
  307. package/dist/cjs/test/unit/coins.d.ts +2 -0
  308. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  309. package/dist/cjs/test/unit/coins.js +161 -0
  310. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  311. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  312. package/dist/cjs/test/unit/customChangeWallet.js +204 -0
  313. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
  314. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
  315. package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
  316. package/dist/cjs/test/unit/customSigner.d.ts +2 -0
  317. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  318. package/dist/cjs/test/unit/customSigner.js +99 -0
  319. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts +2 -0
  320. package/dist/cjs/test/unit/deriveKeyWithSeed.d.ts.map +1 -0
  321. package/dist/cjs/test/unit/deriveKeyWithSeed.js +56 -0
  322. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  323. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  324. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +51 -0
  325. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  326. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  327. package/dist/cjs/test/unit/descriptor/builder.js +92 -0
  328. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  329. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  330. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +53 -0
  331. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  332. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  333. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +62 -0
  334. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  335. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  336. package/dist/cjs/test/unit/descriptorAddress.js +103 -0
  337. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  338. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  339. package/dist/cjs/test/unit/explainTransaction.js +37 -0
  340. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  341. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  342. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  343. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  344. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  345. package/dist/cjs/test/unit/impl/bch/unit/bch.js +71 -0
  346. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  347. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  348. package/dist/cjs/test/unit/impl/bcha/unit/index.js +41 -0
  349. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  350. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  351. package/dist/cjs/test/unit/impl/bsv/unit/index.js +34 -0
  352. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  353. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  354. package/dist/cjs/test/unit/impl/btg/unit/index.js +33 -0
  355. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  356. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  357. package/dist/cjs/test/unit/impl/dash/unit/index.js +34 -0
  358. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  359. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  360. package/dist/cjs/test/unit/impl/doge/unit/index.js +34 -0
  361. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  362. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  363. package/dist/cjs/test/unit/impl/zec/unit/index.js +30 -0
  364. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  365. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  366. package/dist/cjs/test/unit/keySignatures.js +54 -0
  367. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  368. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  369. package/dist/cjs/test/unit/keychains.js +87 -0
  370. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  371. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  372. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  373. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  374. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  375. package/dist/cjs/test/unit/parseTransaction.js +155 -0
  376. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
  377. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
  378. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
  379. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  380. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  381. package/dist/cjs/test/unit/postProcessPrebuild.js +65 -0
  382. package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
  383. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  384. package/dist/cjs/test/unit/prebuildAndSign.js +218 -0
  385. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  386. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  387. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +136 -0
  388. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  389. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  390. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  391. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  392. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  393. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +297 -0
  394. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  395. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  396. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
  397. package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
  398. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  399. package/dist/cjs/test/unit/recovery/mock.js +111 -0
  400. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  401. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  402. package/dist/cjs/test/unit/signTransaction.js +223 -0
  403. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  404. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  405. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  406. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  407. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  408. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +64 -0
  409. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  410. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  411. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +51 -0
  412. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  413. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  414. package/dist/cjs/test/unit/transaction/descriptor/parse.js +138 -0
  415. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  416. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  417. package/dist/cjs/test/unit/transaction/descriptor/sign.js +76 -0
  418. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts +2 -0
  419. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.d.ts.map +1 -0
  420. package/dist/cjs/test/unit/transaction/descriptor/signTransactionE2E.js +100 -0
  421. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts +2 -0
  422. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.d.ts.map +1 -0
  423. package/dist/cjs/test/unit/transaction/descriptor/signTransactionGuard.js +84 -0
  424. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  425. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  426. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +81 -0
  427. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts +2 -0
  428. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.d.ts.map +1 -0
  429. package/dist/cjs/test/unit/transaction/descriptor/verifyTransactionQr.js +102 -0
  430. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  431. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  432. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +171 -0
  433. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  434. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  435. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +222 -0
  436. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
  437. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  438. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
  439. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
  440. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
  441. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +98 -0
  442. package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
  443. package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
  444. package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
  445. package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
  446. package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
  447. package/dist/cjs/test/unit/transaction/recipient.js +52 -0
  448. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  449. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  450. package/dist/cjs/test/unit/transaction.js +301 -0
  451. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  452. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  453. package/dist/cjs/test/unit/txFormat.js +161 -0
  454. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  455. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  456. package/dist/cjs/test/unit/util/address.js +15 -0
  457. package/dist/cjs/test/unit/util/assert.d.ts +3 -0
  458. package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
  459. package/dist/cjs/test/unit/util/assert.js +24 -0
  460. package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
  461. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  462. package/dist/cjs/test/unit/util/fixtures.js +105 -0
  463. package/dist/cjs/test/unit/util/index.d.ts +11 -0
  464. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  465. package/dist/cjs/test/unit/util/index.js +27 -0
  466. package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
  467. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  468. package/dist/cjs/test/unit/util/keychains.js +122 -0
  469. package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
  470. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  471. package/dist/cjs/test/unit/util/nockBitGo.js +27 -0
  472. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  473. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  474. package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
  475. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  476. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  477. package/dist/cjs/test/unit/util/psbt.js +21 -0
  478. package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
  479. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  480. package/dist/cjs/test/unit/util/transaction.js +131 -0
  481. package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
  482. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  483. package/dist/cjs/test/unit/util/unspents.js +224 -0
  484. package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
  485. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  486. package/dist/cjs/test/unit/util/utxoCoins.js +175 -0
  487. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  488. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  489. package/dist/cjs/test/unit/util/wallet.js +9 -0
  490. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  491. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  492. package/dist/cjs/test/unit/verifyTransaction.js +536 -0
  493. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  494. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  495. package/dist/cjs/test/unit/wallet.js +251 -0
  496. package/dist/cjs/test/unit/webauthn.d.ts +2 -0
  497. package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
  498. package/dist/cjs/test/unit/webauthn.js +73 -0
  499. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  500. package/dist/esm/abstractUtxoCoin.d.ts +461 -0
  501. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  502. package/dist/esm/abstractUtxoCoin.js +643 -0
  503. package/dist/esm/address/fixedScript.d.ts +44 -0
  504. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  505. package/dist/esm/address/fixedScript.js +100 -0
  506. package/dist/esm/address/index.d.ts +2 -0
  507. package/dist/esm/address/index.d.ts.map +1 -0
  508. package/dist/esm/address/index.js +2 -0
  509. package/dist/esm/config.d.ts +9 -0
  510. package/dist/{src → esm}/config.d.ts.map +1 -1
  511. package/dist/esm/config.js +11 -0
  512. package/dist/esm/deriveKeyWithSeed.d.ts +12 -0
  513. package/dist/esm/deriveKeyWithSeed.d.ts.map +1 -0
  514. package/dist/esm/deriveKeyWithSeed.js +14 -0
  515. package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
  516. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
  517. package/dist/esm/descriptor/NamedDescriptor.js +37 -0
  518. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  519. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  520. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  521. package/dist/esm/descriptor/builder/builder.d.ts +17 -0
  522. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
  523. package/dist/esm/descriptor/builder/builder.js +51 -0
  524. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  525. package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
  526. package/dist/esm/descriptor/builder/index.js +3 -0
  527. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  528. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
  529. package/dist/esm/descriptor/builder/parse.js +144 -0
  530. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  531. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  532. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  533. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  534. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  535. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  536. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  537. package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
  538. package/dist/esm/descriptor/createWallet/index.js +3 -0
  539. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  540. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
  541. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  542. package/dist/esm/descriptor/index.d.ts +9 -0
  543. package/dist/esm/descriptor/index.d.ts.map +1 -0
  544. package/dist/esm/descriptor/index.js +7 -0
  545. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  546. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
  547. package/dist/esm/descriptor/validatePolicy.js +82 -0
  548. package/dist/esm/impl/bch/bch.d.ts +22 -0
  549. package/dist/esm/impl/bch/bch.d.ts.map +1 -0
  550. package/dist/esm/impl/bch/bch.js +39 -0
  551. package/dist/esm/impl/bch/index.d.ts +3 -0
  552. package/dist/esm/impl/bch/index.d.ts.map +1 -0
  553. package/dist/esm/impl/bch/index.js +3 -0
  554. package/dist/esm/impl/bch/tbch.d.ts +12 -0
  555. package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
  556. package/dist/esm/impl/bch/tbch.js +11 -0
  557. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  558. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
  559. package/dist/esm/impl/bcha/bcha.js +11 -0
  560. package/dist/esm/impl/bcha/index.d.ts +3 -0
  561. package/dist/esm/impl/bcha/index.d.ts.map +1 -0
  562. package/dist/esm/impl/bcha/index.js +3 -0
  563. package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
  564. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
  565. package/dist/esm/impl/bcha/tbcha.js +11 -0
  566. package/dist/esm/impl/bsv/bsv.d.ts +9 -0
  567. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
  568. package/dist/esm/impl/bsv/bsv.js +11 -0
  569. package/dist/esm/impl/bsv/index.d.ts +3 -0
  570. package/dist/esm/impl/bsv/index.d.ts.map +1 -0
  571. package/dist/esm/impl/bsv/index.js +3 -0
  572. package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
  573. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
  574. package/dist/esm/impl/bsv/tbsv.js +11 -0
  575. package/dist/esm/impl/btc/btc.d.ts +15 -0
  576. package/dist/esm/impl/btc/btc.d.ts.map +1 -0
  577. package/dist/esm/impl/btc/btc.js +18 -0
  578. package/dist/esm/impl/btc/index.d.ts +7 -0
  579. package/dist/esm/impl/btc/index.d.ts.map +1 -0
  580. package/dist/esm/impl/btc/index.js +7 -0
  581. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
  582. package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  583. package/dist/esm/impl/btc/inscriptionBuilder.js +163 -0
  584. package/dist/esm/impl/btc/tbtc.d.ts +12 -0
  585. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
  586. package/dist/esm/impl/btc/tbtc.js +11 -0
  587. package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
  588. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
  589. package/dist/esm/impl/btc/tbtc4.js +11 -0
  590. package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
  591. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
  592. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  593. package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
  594. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
  595. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  596. package/dist/esm/impl/btg/btg.d.ts +9 -0
  597. package/dist/esm/impl/btg/btg.d.ts.map +1 -0
  598. package/dist/esm/impl/btg/btg.js +11 -0
  599. package/dist/esm/impl/btg/index.d.ts +2 -0
  600. package/dist/esm/impl/btg/index.d.ts.map +1 -0
  601. package/dist/esm/impl/btg/index.js +2 -0
  602. package/dist/esm/impl/dash/dash.d.ts +9 -0
  603. package/dist/esm/impl/dash/dash.d.ts.map +1 -0
  604. package/dist/esm/impl/dash/dash.js +11 -0
  605. package/dist/esm/impl/dash/index.d.ts +3 -0
  606. package/dist/esm/impl/dash/index.d.ts.map +1 -0
  607. package/dist/esm/impl/dash/index.js +3 -0
  608. package/dist/esm/impl/dash/tdash.d.ts +12 -0
  609. package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
  610. package/dist/esm/impl/dash/tdash.js +11 -0
  611. package/dist/esm/impl/doge/doge.d.ts +33 -0
  612. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  613. package/dist/esm/impl/doge/doge.js +72 -0
  614. package/dist/esm/impl/doge/index.d.ts +3 -0
  615. package/dist/esm/impl/doge/index.d.ts.map +1 -0
  616. package/dist/esm/impl/doge/index.js +3 -0
  617. package/dist/esm/impl/doge/tdoge.d.ts +12 -0
  618. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
  619. package/dist/esm/impl/doge/tdoge.js +11 -0
  620. package/dist/esm/impl/index.d.ts +10 -0
  621. package/dist/esm/impl/index.d.ts.map +1 -0
  622. package/dist/esm/impl/index.js +10 -0
  623. package/dist/esm/impl/ltc/index.d.ts +3 -0
  624. package/dist/esm/impl/ltc/index.d.ts.map +1 -0
  625. package/dist/esm/impl/ltc/index.js +3 -0
  626. package/dist/esm/impl/ltc/ltc.d.ts +8 -0
  627. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
  628. package/dist/esm/impl/ltc/ltc.js +11 -0
  629. package/dist/esm/impl/ltc/tltc.d.ts +8 -0
  630. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
  631. package/dist/esm/impl/ltc/tltc.js +11 -0
  632. package/dist/esm/impl/zec/index.d.ts +3 -0
  633. package/dist/esm/impl/zec/index.d.ts.map +1 -0
  634. package/dist/esm/impl/zec/index.js +3 -0
  635. package/dist/esm/impl/zec/tzec.d.ts +9 -0
  636. package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
  637. package/dist/esm/impl/zec/tzec.js +11 -0
  638. package/dist/esm/impl/zec/zec.d.ts +12 -0
  639. package/dist/esm/impl/zec/zec.d.ts.map +1 -0
  640. package/dist/esm/impl/zec/zec.js +11 -0
  641. package/dist/esm/index.d.ts +22 -0
  642. package/dist/esm/index.d.ts.map +1 -0
  643. package/dist/esm/index.js +22 -0
  644. package/dist/esm/keychains.d.ts +55 -0
  645. package/dist/esm/keychains.d.ts.map +1 -0
  646. package/dist/esm/keychains.js +98 -0
  647. package/dist/esm/names.d.ts +13 -0
  648. package/dist/esm/names.d.ts.map +1 -0
  649. package/dist/esm/names.js +83 -0
  650. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  651. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  652. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +19 -0
  653. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  654. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  655. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  656. package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
  657. package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
  658. package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
  659. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  660. package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
  661. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  662. package/dist/esm/offlineVault/descriptor/transaction.d.ts +39 -0
  663. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
  664. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  665. package/dist/esm/offlineVault/index.d.ts +6 -0
  666. package/dist/esm/offlineVault/index.d.ts.map +1 -0
  667. package/dist/esm/offlineVault/index.js +4 -0
  668. package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
  669. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
  670. package/dist/esm/recovery/RecoveryProvider.js +19 -0
  671. package/dist/esm/recovery/backupKeyRecovery.d.ts +158 -0
  672. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  673. package/dist/esm/recovery/backupKeyRecovery.js +400 -0
  674. package/dist/esm/recovery/baseApi.d.ts +24 -0
  675. package/dist/esm/recovery/baseApi.d.ts.map +1 -0
  676. package/dist/esm/recovery/baseApi.js +64 -0
  677. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  678. package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
  679. package/dist/esm/recovery/coingeckoApi.js +40 -0
  680. package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
  681. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
  682. package/dist/esm/recovery/crossChainRecovery.js +292 -0
  683. package/dist/esm/recovery/index.d.ts +7 -0
  684. package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
  685. package/dist/esm/recovery/index.js +7 -0
  686. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  687. package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
  688. package/dist/esm/recovery/mempoolApi.js +29 -0
  689. package/dist/esm/recovery/psbt.d.ts +62 -0
  690. package/dist/esm/recovery/psbt.d.ts.map +1 -0
  691. package/dist/esm/recovery/psbt.js +145 -0
  692. package/dist/esm/tnumber.d.ts +4 -0
  693. package/dist/esm/tnumber.d.ts.map +1 -0
  694. package/dist/esm/tnumber.js +9 -0
  695. package/dist/esm/transaction/bip322.d.ts +27 -0
  696. package/dist/esm/transaction/bip322.d.ts.map +1 -0
  697. package/dist/esm/transaction/bip322.js +100 -0
  698. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  699. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  700. package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
  701. package/dist/esm/transaction/decode.d.ts +21 -0
  702. package/dist/esm/transaction/decode.d.ts.map +1 -0
  703. package/dist/esm/transaction/decode.js +39 -0
  704. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  705. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  706. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  707. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  708. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
  709. package/dist/esm/transaction/descriptor/index.js +6 -0
  710. package/dist/esm/transaction/descriptor/parse.d.ts +18 -0
  711. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  712. package/dist/esm/transaction/descriptor/parse.js +82 -0
  713. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  714. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  715. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  716. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  717. package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
  718. package/dist/esm/transaction/descriptor/recipient.js +2 -0
  719. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  720. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
  721. package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
  722. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  723. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  724. package/dist/esm/transaction/descriptor/verifyTransaction.js +80 -0
  725. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  726. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  727. package/dist/esm/transaction/explainTransaction.js +48 -0
  728. package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
  729. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
  730. package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
  731. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  732. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  733. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +144 -0
  734. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +47 -0
  735. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  736. package/dist/esm/transaction/fixedScript/explainTransaction.js +2 -0
  737. package/dist/esm/transaction/fixedScript/index.d.ts +8 -0
  738. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  739. package/dist/esm/transaction/fixedScript/index.js +7 -0
  740. package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
  741. package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
  742. package/dist/esm/transaction/fixedScript/musig2.js +2 -0
  743. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  744. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  745. package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
  746. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  747. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  748. package/dist/esm/transaction/fixedScript/parseTransaction.js +221 -0
  749. package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
  750. package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  751. package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
  752. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  753. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  754. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +111 -0
  755. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +22 -0
  756. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  757. package/dist/esm/transaction/fixedScript/signTransaction.js +39 -0
  758. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  759. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  760. package/dist/esm/transaction/fixedScript/verifyTransaction.js +176 -0
  761. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  762. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  763. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  764. package/dist/esm/transaction/index.d.ts +9 -0
  765. package/dist/esm/transaction/index.d.ts.map +1 -0
  766. package/dist/esm/transaction/index.js +9 -0
  767. package/dist/esm/transaction/outputDifference.d.ts +44 -0
  768. package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
  769. package/dist/esm/transaction/outputDifference.js +45 -0
  770. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  771. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  772. package/dist/esm/transaction/parseTransaction.js +12 -0
  773. package/dist/esm/transaction/recipient.d.ts +34 -0
  774. package/dist/esm/transaction/recipient.d.ts.map +1 -0
  775. package/dist/esm/transaction/recipient.js +61 -0
  776. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  777. package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
  778. package/dist/esm/transaction/signTransaction.js +66 -0
  779. package/dist/esm/transaction/types.d.ts +47 -0
  780. package/dist/esm/transaction/types.d.ts.map +1 -0
  781. package/dist/esm/transaction/types.js +2 -0
  782. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  783. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
  784. package/dist/esm/transaction/verifyTransaction.js +14 -0
  785. package/dist/esm/unspent.d.ts +59 -0
  786. package/dist/esm/unspent.d.ts.map +1 -0
  787. package/dist/esm/unspent.js +15 -0
  788. package/dist/esm/verifyKey.d.ts +26 -0
  789. package/dist/esm/verifyKey.d.ts.map +1 -0
  790. package/dist/esm/verifyKey.js +116 -0
  791. package/dist/esm/wallet.d.ts +15 -0
  792. package/dist/esm/wallet.d.ts.map +1 -0
  793. package/dist/esm/wallet.js +5 -0
  794. package/package.json +50 -20
  795. package/.eslintignore +0 -5
  796. package/CHANGELOG.md +0 -106
  797. package/dist/src/abstractUtxoCoin.d.ts +0 -383
  798. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  799. package/dist/src/abstractUtxoCoin.js +0 -960
  800. package/dist/src/config.js +0 -13
  801. package/dist/src/index.d.ts +0 -6
  802. package/dist/src/index.d.ts.map +0 -1
  803. package/dist/src/index.js +0 -18
  804. package/dist/src/parseOutput.d.ts +0 -22
  805. package/dist/src/parseOutput.d.ts.map +0 -1
  806. package/dist/src/parseOutput.js +0 -169
  807. package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
  808. package/dist/src/recovery/RecoveryProvider.js +0 -24
  809. package/dist/src/recovery/backupKeyRecovery.d.ts +0 -59
  810. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  811. package/dist/src/recovery/backupKeyRecovery.js +0 -290
  812. package/dist/src/recovery/baseApi.d.ts.map +0 -1
  813. package/dist/src/recovery/baseApi.js +0 -73
  814. package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
  815. package/dist/src/recovery/coingeckoApi.js +0 -47
  816. package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
  817. package/dist/src/recovery/crossChainRecovery.js +0 -338
  818. package/dist/src/recovery/mempoolApi.js +0 -33
  819. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  820. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  821. package/dist/src/recovery/smartbitApi.js +0 -36
  822. package/dist/src/replayProtection.d.ts +0 -4
  823. package/dist/src/replayProtection.d.ts.map +0 -1
  824. package/dist/src/replayProtection.js +0 -21
  825. package/dist/src/sign.d.ts +0 -31
  826. package/dist/src/sign.d.ts.map +0 -1
  827. package/dist/src/sign.js +0 -104
  828. package/dist/tsconfig.tsbuildinfo +0 -7600
  829. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
@@ -0,0 +1,643 @@
1
+ import assert from 'assert';
2
+ import { randomBytes } from 'crypto';
3
+ import _ from 'lodash';
4
+ import { address as wasmAddress, BIP32, fixedScriptWallet, hasPsbtMagic } from '@bitgo/wasm-utxo';
5
+ import { BaseCoin, isBolt11Invoice, InvalidAddressDerivationPropertyError, InvalidAddressError, isTriple, KeyIndices, multisigTypes, TxIntentMismatchError, TxIntentMismatchRecipientError, isValidPrv, isValidXprv, } from '@bitgo-beta/sdk-core';
6
+ import { backupKeyRecovery, forCoin, recoverCrossChain, v1BackupKeyRecovery, v1Sweep, } from './recovery';
7
+ import { getReplayProtectionPubkeys, isReplayProtectionUnspent } from './transaction/fixedScript/replayProtection';
8
+ import { supportedCrossChainRecoveries } from './config';
9
+ import { assertValidTransactionRecipient, explainTx, fromExtendedAddressFormat, isScriptRecipient, parseTransaction, verifyTransaction, } from './transaction';
10
+ import { AggregateValidationError, ErrorMissingOutputs, ErrorImplicitExternalOutputs, } from './transaction/descriptor/verifyTransaction';
11
+ import { assertDescriptorWalletAddress, getDescriptorMapFromWallet, isDescriptorWallet } from './descriptor';
12
+ import { getFullNameFromCoinName, getMainnetCoinName, isMainnetCoin } from './names';
13
+ import { assertFixedScriptWalletAddress, generateAddress } from './address/fixedScript';
14
+ import { decodeDescriptorPsbt, decodePsbt, encodeTransaction, stringToBufferTryFormats } from './transaction/decode';
15
+ import { fetchKeychains, toBip32Triple } from './keychains';
16
+ import { verifyKeySignature, verifyUserPublicKey, verifyUserPublicKeyAsync } from './verifyKey';
17
+ import { getPolicyForEnv } from './descriptor/validatePolicy';
18
+ import { signTransaction } from './transaction/signTransaction';
19
+ import { isUtxoWalletData } from './wallet';
20
+ import { isDescriptorWalletData } from './descriptor/descriptorWallet';
21
+ export class ErrorDeprecatedTxFormat extends Error {
22
+ constructor(txFormat) {
23
+ super(`SDK support for txFormat=${txFormat} is deprecated on this environment. Please use psbt instead.`);
24
+ }
25
+ }
26
+ /**
27
+ * Check if a decoded transaction has at least one taproot key path spend (MuSig2) input.
28
+ */
29
+ function hasKeyPathSpendInput(tx, pubs, coinName) {
30
+ assert(pubs && isTriple(pubs), 'pub triple is required to check for key path spend inputs in wasm-utxo PSBT');
31
+ const rootWalletKeys = fixedScriptWallet.RootWalletKeys.fromXpubs(pubs);
32
+ const replayProtection = { publicKeys: getReplayProtectionPubkeys(coinName) };
33
+ const parsed = tx.parseTransactionWithWalletKeys(rootWalletKeys, { replayProtection });
34
+ return parsed.inputs.some((input) => input.scriptType === 'p2trMusig2KeyPath');
35
+ }
36
+ /**
37
+ * Convert ValidationError to TxIntentMismatchRecipientError with structured data
38
+ *
39
+ * This preserves the structured error information from the original ValidationError
40
+ * by extracting the mismatched outputs and converting them to the standardized format.
41
+ * The original error is preserved as the `cause` for debugging purposes.
42
+ */
43
+ function convertValidationErrorToTxIntentMismatch(error, reqId, txParams, txHex, txExplanation) {
44
+ const mismatchedRecipients = [];
45
+ for (const err of error.errors) {
46
+ if (err instanceof ErrorMissingOutputs) {
47
+ mismatchedRecipients.push(...err.missingOutputs.map((output) => ({
48
+ address: output.address,
49
+ amount: output.amount.toString(),
50
+ })));
51
+ }
52
+ else if (err instanceof ErrorImplicitExternalOutputs) {
53
+ mismatchedRecipients.push(...err.implicitExternalOutputs.map((output) => ({
54
+ address: output.address,
55
+ amount: output.amount.toString(),
56
+ })));
57
+ }
58
+ }
59
+ const txIntentError = new TxIntentMismatchRecipientError(error.message, reqId, [txParams], txHex, mismatchedRecipients, txExplanation);
60
+ // Preserve the original structured error as the cause for debugging
61
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
62
+ txIntentError.cause = error;
63
+ return txIntentError;
64
+ }
65
+ export class AbstractUtxoCoin extends BaseCoin {
66
+ /**
67
+ * Returns whether this coin is a mainnet coin.
68
+ * Default implementation uses the name property.
69
+ * Can be overridden by subclasses.
70
+ */
71
+ isMainnet() {
72
+ return isMainnetCoin(this.name);
73
+ }
74
+ constructor(bitgo, amountType = 'number') {
75
+ super(bitgo);
76
+ this.amountType = amountType;
77
+ }
78
+ getChain() {
79
+ return this.name;
80
+ }
81
+ getFamily() {
82
+ return getMainnetCoinName(this.name);
83
+ }
84
+ getFullName() {
85
+ return getFullNameFromCoinName(this.name);
86
+ }
87
+ /** Indicates whether the coin supports a block target */
88
+ supportsBlockTarget() {
89
+ // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is
90
+ const mainnet = getMainnetCoinName(this.name);
91
+ return mainnet === 'btc' || mainnet === 'doge';
92
+ }
93
+ sweepWithSendMany() {
94
+ return true;
95
+ }
96
+ /** @deprecated */
97
+ static get validAddressTypes() {
98
+ return ['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2'];
99
+ }
100
+ /**
101
+ * Returns the factor between the base unit and its smallest subdivison
102
+ * @return {number}
103
+ */
104
+ getBaseFactor() {
105
+ return 1e8;
106
+ }
107
+ /**
108
+ * Check if an address is valid
109
+ * @param address
110
+ * @param param
111
+ */
112
+ isValidAddress(address, param) {
113
+ if (typeof param === 'boolean' && param) {
114
+ throw new Error('deprecated');
115
+ }
116
+ const allowLightning = param?.allowLightning ?? false;
117
+ if (allowLightning) {
118
+ if (/^(02|03)[0-9a-fA-F]{64}$/.test(address)) {
119
+ return true;
120
+ }
121
+ if (isBolt11Invoice(address)) {
122
+ return true;
123
+ }
124
+ }
125
+ // By default, allow all address formats.
126
+ // At the time of writing, the only additional address format is bch cashaddr.
127
+ const anyFormat = param?.anyFormat ?? true;
128
+ try {
129
+ const script = wasmAddress.toOutputScriptWithCoin(address, this.name);
130
+ // Determine which format the input address was in by round-tripping
131
+ // through each candidate and checking byte-equality. 'default' is tried
132
+ // first so canonical default-format addresses early-exit.
133
+ for (const format of ['default', 'cashaddr']) {
134
+ try {
135
+ if (wasmAddress.fromOutputScriptWithCoin(script, this.name, format) === address) {
136
+ return anyFormat || format === 'default';
137
+ }
138
+ }
139
+ catch {
140
+ // coin doesn't support this format; try the next one
141
+ }
142
+ }
143
+ return false;
144
+ }
145
+ catch (e) {
146
+ return false;
147
+ }
148
+ }
149
+ /**
150
+ * Return boolean indicating whether input is valid public key for the coin.
151
+ *
152
+ * @param {String} pub the pub to be checked
153
+ * @returns {Boolean} is it valid?
154
+ */
155
+ isValidPub(pub) {
156
+ try {
157
+ return BIP32.fromBase58(pub).isNeutered();
158
+ }
159
+ catch (e) {
160
+ return false;
161
+ }
162
+ }
163
+ /**
164
+ * This is called before crafting the HTTP request to the BitGo API.
165
+ * It converts the recipient address `scriptPubKey:...` to { script: string } | { address: string }.
166
+ */
167
+ preprocessBuildParams(params) {
168
+ if (params.recipients !== undefined) {
169
+ params.recipients =
170
+ params.recipients instanceof Array
171
+ ? params?.recipients?.map((recipient) => {
172
+ const { address, ...rest } = recipient;
173
+ if (address === undefined) {
174
+ return recipient; // Already { script, amount } — pass through unchanged
175
+ }
176
+ return { ...rest, ...fromExtendedAddressFormat(address) };
177
+ })
178
+ : params.recipients;
179
+ }
180
+ return params;
181
+ }
182
+ /**
183
+ * Get the latest block height
184
+ * @param reqId
185
+ */
186
+ async getLatestBlockHeight(reqId) {
187
+ if (reqId) {
188
+ this.bitgo.setRequestTracer(reqId);
189
+ }
190
+ const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
191
+ return chainhead.height;
192
+ }
193
+ checkRecipient(recipient) {
194
+ assertValidTransactionRecipient(recipient);
195
+ if (recipient.address && !isScriptRecipient(recipient.address)) {
196
+ super.checkRecipient({ address: recipient.address, amount: recipient.amount });
197
+ }
198
+ }
199
+ /**
200
+ * Run custom coin logic after a transaction prebuild has been received from BitGo
201
+ * @param prebuild
202
+ */
203
+ async postProcessPrebuild(prebuild) {
204
+ const tx = this.decodeTransactionFromPrebuild(prebuild);
205
+ if (_.isUndefined(prebuild.blockHeight)) {
206
+ prebuild.blockHeight = (await this.getLatestBlockHeight());
207
+ }
208
+ return _.extend({}, prebuild, { txHex: encodeTransaction(tx).toString('hex') });
209
+ }
210
+ /**
211
+ * @deprecated - will be removed when we drop support for utxolib
212
+ * Determine an address' type based on its witness and redeem script presence
213
+ * @param addressDetails
214
+ */
215
+ static inferAddressType(addressDetails) {
216
+ return fixedScriptWallet.ChainCode.is(addressDetails.chain)
217
+ ? fixedScriptWallet.ChainCode.scriptType(addressDetails.chain)
218
+ : null;
219
+ }
220
+ decodeTransaction(input) {
221
+ const buffer = typeof input === 'string' ? stringToBufferTryFormats(input, ['hex', 'base64']) : input;
222
+ if (!hasPsbtMagic(buffer)) {
223
+ throw new ErrorDeprecatedTxFormat('legacy');
224
+ }
225
+ return decodePsbt(buffer, this.name);
226
+ }
227
+ decodeTransactionAsPsbt(input) {
228
+ return this.decodeTransaction(input);
229
+ }
230
+ decodeTransactionFromPrebuild(prebuild) {
231
+ const string = prebuild.txHexPsbt ?? prebuild.txHex ?? prebuild.txBase64;
232
+ if (!string) {
233
+ throw new Error('missing required txHex or txBase64 property');
234
+ }
235
+ return this.decodeTransaction(string);
236
+ }
237
+ /**
238
+ * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
239
+ * @param params
240
+ * @returns {*}
241
+ */
242
+ async parseTransaction(params) {
243
+ return parseTransaction(this, params);
244
+ }
245
+ /**
246
+ * @deprecated - use function verifyUserPublicKey instead
247
+ */
248
+ verifyUserPublicKey(params) {
249
+ return verifyUserPublicKey(this.bitgo, params);
250
+ }
251
+ /**
252
+ * @deprecated - use function verifyUserPublicKeyAsync instead
253
+ */
254
+ async verifyUserPublicKeyAsync(params) {
255
+ return await verifyUserPublicKeyAsync(this.bitgo, params);
256
+ }
257
+ /**
258
+ * @deprecated - use function verifyKeySignature instead
259
+ */
260
+ verifyKeySignature(params) {
261
+ return verifyKeySignature(params);
262
+ }
263
+ /**
264
+ * Verify that a transaction prebuild complies with the original intention
265
+ *
266
+ * @param params
267
+ * @param params.txParams params object passed to send
268
+ * @param params.txPrebuild prebuild object returned by server
269
+ * @param params.txPrebuild.txHex prebuilt transaction's txHex form
270
+ * @param params.wallet Wallet object to obtain keys to verify against
271
+ * @param params.verification Object specifying some verification parameters
272
+ * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
273
+ * @param params.verification.keychains Pass keychains manually rather than fetching them by id
274
+ * @param params.verification.addresses Address details to pass in for out-of-band verification
275
+ * @returns {boolean} True if verification passes
276
+ * @throws {TxIntentMismatchError} if transaction validation fails
277
+ * @throws {TxIntentMismatchRecipientError} if transaction recipients don't match user intent
278
+ */
279
+ async verifyTransaction(params) {
280
+ try {
281
+ return await verifyTransaction(this, this.bitgo, params);
282
+ }
283
+ catch (error) {
284
+ if (error instanceof AggregateValidationError) {
285
+ const txExplanation = await TxIntentMismatchError.tryGetTxExplanation(this, params.txPrebuild);
286
+ throw convertValidationErrorToTxIntentMismatch(error, params.reqId, params.txParams, params.txPrebuild.txHex, txExplanation);
287
+ }
288
+ throw error;
289
+ }
290
+ }
291
+ /**
292
+ * Make sure an address is valid and throw an error if it's not.
293
+ * @param params.address The address string on the network
294
+ * @param params.addressType
295
+ * @param params.keychains Keychain objects with xpubs
296
+ * @param params.coinSpecific Coin-specific details for the address such as a witness script
297
+ * @param params.chain Derivation chain
298
+ * @param params.index Derivation index
299
+ * @throws {InvalidAddressError}
300
+ * @throws {InvalidAddressDerivationPropertyError}
301
+ * @throws {UnexpectedAddressError}
302
+ */
303
+ async isWalletAddress(params, wallet) {
304
+ const { address, keychains, chain, index } = params;
305
+ if (!this.isValidAddress(address)) {
306
+ throw new InvalidAddressError(`invalid address: ${address}`);
307
+ }
308
+ if (wallet && isDescriptorWallet(wallet)) {
309
+ if (!keychains) {
310
+ throw new Error('missing required param keychains');
311
+ }
312
+ if (!isTriple(keychains)) {
313
+ throw new Error('keychains must be a triple');
314
+ }
315
+ assertDescriptorWalletAddress(this.name, params, getDescriptorMapFromWallet(wallet, toBip32Triple(keychains), getPolicyForEnv(this.bitgo.env)));
316
+ return true;
317
+ }
318
+ if ((_.isUndefined(chain) && _.isUndefined(index)) || !(_.isFinite(chain) && _.isFinite(index))) {
319
+ throw new InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
320
+ }
321
+ if (!keychains) {
322
+ throw new Error('missing required param keychains');
323
+ }
324
+ assertFixedScriptWalletAddress(this.name, {
325
+ address,
326
+ keychains,
327
+ format: params.format ?? 'base58',
328
+ chain,
329
+ index,
330
+ });
331
+ return true;
332
+ }
333
+ /**
334
+ * Locally derive a fixed-script (2-of-3 multisig) wallet receive address from the xpub triple
335
+ * and a chain/index, using public keys only (no private keys, no network access). This is the
336
+ * inverse of {@link isWalletAddress}, delegating to the same `generateAddress` used by the
337
+ * verification path, so derive and verify can never diverge.
338
+ *
339
+ * The `chain` code selects the script type (e.g. 0/1 = P2SH, 20/21 = P2WSH/bech32, 30/31 = P2TR);
340
+ * an optional `format` overrides the address encoding.
341
+ * @param params keychains (xpub triple via `pub`), chain, index, and optional format
342
+ * @returns the derived address and the chain/index used
343
+ */
344
+ async deriveAddress(params) {
345
+ const { keychains, chain, index, format } = params;
346
+ if (!keychains) {
347
+ throw new Error('missing required param keychains');
348
+ }
349
+ const address = generateAddress(this.name, {
350
+ // fixed-script (multisig) coins derive from the xpub triple via `pub`
351
+ keychains: keychains,
352
+ chain,
353
+ index,
354
+ format,
355
+ });
356
+ return { address, chain, index };
357
+ }
358
+ /**
359
+ * @param addressType
360
+ * @returns true iff coin supports spending from unspentType
361
+ */
362
+ supportsAddressType(addressType) {
363
+ return fixedScriptWallet.supportsScriptType(this.name, addressType);
364
+ }
365
+ /** inherited doc */
366
+ getDefaultMultisigType() {
367
+ return multisigTypes.onchain;
368
+ }
369
+ /**
370
+ * @param chain
371
+ * @return true iff coin supports spending from chain
372
+ */
373
+ supportsAddressChain(chain) {
374
+ return (fixedScriptWallet.ChainCode.is(chain) &&
375
+ this.supportsAddressType(fixedScriptWallet.ChainCode.scriptType(chain)));
376
+ }
377
+ keyIdsForSigning() {
378
+ return [KeyIndices.USER, KeyIndices.BACKUP, KeyIndices.BITGO];
379
+ }
380
+ /**
381
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
382
+ * @param psbt all MuSig2 inputs should contain user MuSig2 nonce
383
+ * @param walletId
384
+ */
385
+ async getMusig2Nonces(psbt, walletId) {
386
+ const buffer = encodeTransaction(psbt);
387
+ const response = await this.bitgo
388
+ .post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
389
+ .send({ psbt: buffer.toString('hex') })
390
+ .result();
391
+ return decodePsbt(response.psbt, this.name);
392
+ }
393
+ /**
394
+ * @deprecated Use getMusig2Nonces instead
395
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
396
+ * @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
397
+ * @param walletId
398
+ */
399
+ async signPsbt(psbtHex, walletId) {
400
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(psbtHex), walletId);
401
+ return { psbt: encodeTransaction(psbt).toString('hex') };
402
+ }
403
+ /**
404
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs from OVC.
405
+ * @param ovcJson JSON object provided by OVC with fields psbtHex and walletId
406
+ */
407
+ async signPsbtFromOVC(ovcJson) {
408
+ assert(ovcJson['psbtHex'], 'ovcJson must contain psbtHex');
409
+ assert(ovcJson['walletId'], 'ovcJson must contain walletId');
410
+ const hex = ovcJson['psbtHex'];
411
+ const walletId = ovcJson['walletId'];
412
+ const psbt = await this.getMusig2Nonces(this.decodeTransactionAsPsbt(hex), walletId);
413
+ return _.extend(ovcJson, { txHex: encodeTransaction(psbt).toString('hex') });
414
+ }
415
+ /**
416
+ * Assemble keychain and half-sign prebuilt transaction
417
+ * @param params - {@see SignTransactionOptions}
418
+ * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
419
+ */
420
+ async signTransaction(params) {
421
+ return signTransaction(this, this.bitgo, params);
422
+ }
423
+ /**
424
+ * Sign a transaction with a custom signing function. Example use case is express external signer
425
+ * @param customSigningFunction custom signing function that returns a single signed transaction
426
+ * @param signTransactionParams parameters for custom signing function. Includes txPrebuild and pubs
427
+ *
428
+ * @returns signed transaction as hex string
429
+ */
430
+ async signWithCustomSigningFunction(customSigningFunction, signTransactionParams) {
431
+ const txHex = signTransactionParams.txPrebuild.txHex;
432
+ assert(txHex, 'missing txHex parameter');
433
+ const tx = this.decodeTransaction(txHex);
434
+ const isTxWithKeyPathSpendInput = hasKeyPathSpendInput(tx, signTransactionParams.pubs, this.name);
435
+ if (!isTxWithKeyPathSpendInput) {
436
+ return await customSigningFunction({ ...signTransactionParams, coin: this });
437
+ }
438
+ const getTxHex = (v) => {
439
+ if ('txHex' in v) {
440
+ return v.txHex;
441
+ }
442
+ throw new Error('txHex not found in signTransaction result');
443
+ };
444
+ const signerNonceTx = await customSigningFunction({
445
+ ...signTransactionParams,
446
+ signingStep: 'signerNonce',
447
+ coin: this,
448
+ });
449
+ const { pubs } = signTransactionParams;
450
+ assert(pubs === undefined || isTriple(pubs));
451
+ const cosignerNonceTx = await this.signTransaction({
452
+ ...signTransactionParams,
453
+ pubs,
454
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(signerNonceTx) },
455
+ signingStep: 'cosignerNonce',
456
+ });
457
+ return await customSigningFunction({
458
+ ...signTransactionParams,
459
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(cosignerNonceTx) },
460
+ signingStep: 'signerSignature',
461
+ coin: this,
462
+ });
463
+ }
464
+ /**
465
+ * @param unspent
466
+ * @returns {boolean}
467
+ */
468
+ isBitGoTaintedUnspent(unspent) {
469
+ return isReplayProtectionUnspent(unspent, this.name);
470
+ }
471
+ /**
472
+ * Decompose a raw psbt/transaction into useful information, such as the total amounts,
473
+ * change amounts, and transaction outputs.
474
+ * @param params
475
+ */
476
+ async explainTransaction(params, wallet) {
477
+ if (!params.pubs) {
478
+ // if no pubs are provided, opportunistically fetch the keychains from the wallet
479
+ if (wallet) {
480
+ const keychains = await fetchKeychains(this, wallet);
481
+ params.pubs = toBip32Triple(keychains).map((k) => k.neutered().toBase58());
482
+ }
483
+ }
484
+ if (wallet && isDescriptorWallet(wallet)) {
485
+ // Descriptor wallets decode prebuild bytes straight into the wasm-utxo
486
+ // descriptor Psbt, skipping the fixedScriptWallet.BitGoPsbt intermediate.
487
+ return explainTx(decodeDescriptorPsbt(params), { ...params, wallet }, this.name);
488
+ }
489
+ return explainTx(this.decodeTransactionFromPrebuild(params), { ...params, wallet }, this.name);
490
+ }
491
+ /**
492
+ * @deprecated - use {@see backupKeyRecovery}
493
+ * Builds a funds recovery transaction without BitGo
494
+ * @param params - {@see backupKeyRecovery}
495
+ */
496
+ async recover(params) {
497
+ return backupKeyRecovery(this, this.bitgo, params);
498
+ }
499
+ async recoverV1(params) {
500
+ return v1BackupKeyRecovery(this, this.bitgo, params);
501
+ }
502
+ async sweepV1(params) {
503
+ return v1Sweep(this, this.bitgo, params);
504
+ }
505
+ /**
506
+ * Recover coin that was sent to wrong chain
507
+ * @param params
508
+ * @param params.txid The txid of the faulty transaction
509
+ * @param params.recoveryAddress address to send recovered funds to
510
+ * @param params.wallet the wallet that received the funds
511
+ * @param params.recoveryCoin the coin type of the wallet that received the funds
512
+ * @param params.signed return a half-signed transaction (default=true)
513
+ * @param params.walletPassphrase the wallet passphrase
514
+ * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
515
+ * @param params.apiKey for utxo coins other than [BTC,TBTC] this is a Block Chair api key
516
+ * @returns {*}
517
+ */
518
+ async recoverFromWrongChain(params) {
519
+ const { txid, recoveryAddress, wallet, walletPassphrase, xprv, apiKey } = params;
520
+ // params.recoveryCoin used to be params.coin, backwards compatibility
521
+ const recoveryCoin = params.coin || params.recoveryCoin;
522
+ if (!recoveryCoin) {
523
+ throw new Error('missing required object recoveryCoin');
524
+ }
525
+ // signed should default to true, and only be disabled if explicitly set to false (not undefined)
526
+ const signed = params.signed !== false;
527
+ const sourceCoinFamily = this.getFamily();
528
+ const recoveryCoinFamily = recoveryCoin.getFamily();
529
+ const supportedRecoveryCoins = supportedCrossChainRecoveries[sourceCoinFamily];
530
+ if (_.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
531
+ throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
532
+ }
533
+ return await recoverCrossChain(this.bitgo, {
534
+ sourceCoin: this,
535
+ recoveryCoin,
536
+ walletId: wallet,
537
+ txid,
538
+ recoveryAddress,
539
+ walletPassphrase: signed ? walletPassphrase : undefined,
540
+ xprv: signed ? xprv : undefined,
541
+ apiKey,
542
+ });
543
+ }
544
+ /**
545
+ * Generate bip32 key pair
546
+ *
547
+ * @param seed
548
+ * @returns {Object} object with generated pub and prv
549
+ */
550
+ generateKeyPair(seed) {
551
+ if (!seed) {
552
+ // An extended private key has both a normal 256 bit private key and a 256
553
+ // bit chain code, both of which must be random. 512 bits is therefore the
554
+ // maximum entropy and gives us maximum security against cracking.
555
+ seed = randomBytes(512 / 8);
556
+ }
557
+ const extendedKey = BIP32.fromSeed(seed);
558
+ return {
559
+ pub: extendedKey.neutered().toBase58(),
560
+ prv: extendedKey.toBase58(),
561
+ };
562
+ }
563
+ /**
564
+ * Determines the default transaction format based on wallet properties and network
565
+ * @param wallet - The wallet to check
566
+ * @param requestedFormat - Optional explicitly requested format
567
+ * @returns The transaction format to use, or undefined if no default applies
568
+ */
569
+ getDefaultTxFormat(wallet, requestedFormat) {
570
+ if (requestedFormat === 'legacy') {
571
+ return 'psbt-lite';
572
+ }
573
+ return requestedFormat ?? 'psbt-lite';
574
+ }
575
+ async getExtraPrebuildParams(buildParams) {
576
+ const requestedFormat = buildParams.txFormat;
577
+ const txFormat = this.getDefaultTxFormat(buildParams.wallet, requestedFormat);
578
+ let changeAddressType = buildParams.changeAddressType;
579
+ // if the addressType is not specified, we need to default to p2trMusig2 for testnet hot wallets for staged rollout of p2trMusig2
580
+ if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
581
+ buildParams.changeAddressType === undefined &&
582
+ buildParams.changeAddress === undefined &&
583
+ buildParams.wallet.type() === 'hot') {
584
+ changeAddressType = ['p2trMusig2', 'p2wsh', 'p2shP2wsh', 'p2sh', 'p2tr'];
585
+ }
586
+ // getHalfSignedLegacyFormat() only supports p2ms-based types (p2sh, p2shP2wsh, p2wsh).
587
+ // Filter change outputs and restrict input selection to these types.
588
+ const legacyCompatibleTypes = ['p2sh', 'p2shP2wsh', 'p2wsh'];
589
+ let allowedInputScriptTypes;
590
+ if (requestedFormat === 'legacy') {
591
+ allowedInputScriptTypes = legacyCompatibleTypes;
592
+ if (Array.isArray(changeAddressType)) {
593
+ changeAddressType = changeAddressType.filter((t) => legacyCompatibleTypes.includes(t));
594
+ }
595
+ else if (changeAddressType !== undefined && !legacyCompatibleTypes.includes(changeAddressType)) {
596
+ changeAddressType = legacyCompatibleTypes;
597
+ }
598
+ }
599
+ return {
600
+ txFormat,
601
+ changeAddressType,
602
+ allowedInputScriptTypes,
603
+ };
604
+ }
605
+ preCreateBitGo(params) {
606
+ return;
607
+ }
608
+ async presignTransaction(params) {
609
+ if (params.walletData && isUtxoWalletData(params.walletData) && isDescriptorWalletData(params.walletData)) {
610
+ return params;
611
+ }
612
+ const returnLegacyFormat = params.txFormat === 'legacy';
613
+ return { ...params, returnLegacyFormat };
614
+ }
615
+ async supplementGenerateWallet(walletParams, keychains) {
616
+ return walletParams;
617
+ }
618
+ transactionDataAllowed() {
619
+ return false;
620
+ }
621
+ valuelessTransferAllowed() {
622
+ return false;
623
+ }
624
+ getRecoveryProvider(apiToken) {
625
+ return forCoin(this.getChain(), apiToken);
626
+ }
627
+ /** @inheritDoc */
628
+ auditDecryptedKey({ multiSigType, publicKey, prv, }) {
629
+ if (multiSigType === 'tss') {
630
+ throw new Error('tss auditing is not supported for this coin');
631
+ }
632
+ if (!isValidPrv(prv) && !isValidXprv(prv)) {
633
+ throw new Error('invalid private key');
634
+ }
635
+ if (publicKey) {
636
+ const genPubKey = BIP32.fromBase58(prv).neutered().toBase58();
637
+ if (genPubKey !== publicKey) {
638
+ throw new Error('public key does not match private key');
639
+ }
640
+ }
641
+ }
642
+ }
643
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXJDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEcsT0FBTyxFQUVMLFFBQVEsRUFNUixlQUFlLEVBQ2YscUNBQXFDLEVBQ3JDLG1CQUFtQixFQUVuQixRQUFRLEVBR1IsVUFBVSxFQUdWLGFBQWEsRUFPYixxQkFBcUIsRUFNckIsOEJBQThCLEVBSzlCLFVBQVUsRUFDVixXQUFXLEdBR1osTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQ0wsaUJBQWlCLEVBR2pCLE9BQU8sRUFDUCxpQkFBaUIsRUFHakIsbUJBQW1CLEVBRW5CLE9BQU8sR0FFUixNQUFNLFlBQVksQ0FBQztBQUNwQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuSCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekQsT0FBTyxFQUNMLCtCQUErQixFQUMvQixTQUFTLEVBQ1QseUJBQXlCLEVBQ3pCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLDRCQUE0QixHQUM3QixNQUFNLDRDQUE0QyxDQUFDO0FBQ3BELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FB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QztZQUM5RCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcywgQklQMzIsIGZpeGVkU2NyaXB0V2FsbGV0LCBoYXNQc2J0TWFnaWMgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIENyZWF0ZUFkZHJlc3NGb3JtYXQsXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJQmFzZUNvaW4sXG4gIGlzQm9sdDExSW52b2ljZSxcbiAgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcixcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIGlzVHJpcGxlLFxuICBJV2FsbGV0LFxuICBLZXljaGFpbnNUcmlwbGV0LFxuICBLZXlJbmRpY2VzLFxuICBNaXNtYXRjaGVkUmVjaXBpZW50LFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUHJlY3JlYXRlQml0R29PcHRpb25zLFxuICBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBCcmlkZ2luZ1BhcmFtcyxcbiAgUmVxdWVzdFRyYWNlcixcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFR4SW50ZW50TWlzbWF0Y2hFcnJvcixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25QYXJhbXMgYXMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zLFxuICBUcmFuc2FjdGlvblByZWJ1aWxkIGFzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBUcmlwbGUsXG4gIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcixcbiAgVmVyaWZpY2F0aW9uT3B0aW9ucyxcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMgYXMgQmFzZVZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgV2FsbGV0LFxuICBpc1ZhbGlkUHJ2LFxuICBpc1ZhbGlkWHBydixcbiAgRGVyaXZlQWRkcmVzc09wdGlvbnMsXG4gIERlcml2ZUFkZHJlc3NSZXN1bHQsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHtcbiAgYmFja3VwS2V5UmVjb3ZlcnksXG4gIENyb3NzQ2hhaW5SZWNvdmVyeVNpZ25lZCxcbiAgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQsXG4gIGZvckNvaW4sXG4gIHJlY292ZXJDcm9zc0NoYWluLFxuICBSZWNvdmVyUGFyYW1zLFxuICBSZWNvdmVyeVByb3ZpZGVyLFxuICB2MUJhY2t1cEtleVJlY292ZXJ5LFxuICBWMVJlY292ZXJQYXJhbXMsXG4gIHYxU3dlZXAsXG4gIFYxU3dlZXBQYXJhbXMsXG59IGZyb20gJy4vcmVjb3ZlcnknO1xuaW1wb3J0IHsgZ2V0UmVwbGF5UHJvdGVjdGlvblB1YmtleXMsIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQgfSBmcm9tICcuL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXMgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBleHBsYWluVHgsXG4gIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXQsXG4gIGlzU2NyaXB0UmVjaXBpZW50LFxuICBwYXJzZVRyYW5zYWN0aW9uLFxuICB2ZXJpZnlUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L2V4cGxhaW5UcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBNdXNpZzJQYXJ0aWNpcGFudCB9IGZyb20gJy4vdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvbXVzaWcyJztcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcixcbiAgRXJyb3JNaXNzaW5nT3V0cHV0cyxcbiAgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cyxcbn0gZnJvbSAnLi90cmFuc2FjdGlvbi9kZXNjcmlwdG9yL3ZlcmlmeVRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGFzc2VydERlc2NyaXB0b3JXYWxsZXRBZGRyZXNzLCBnZXREZXNjcmlwdG9yTWFwRnJvbVdhbGxldCwgaXNEZXNjcmlwdG9yV2FsbGV0IH0gZnJvbSAnLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGdldEZ1bGxOYW1lRnJvbUNvaW5OYW1lLCBnZXRNYWlubmV0Q29pbk5hbWUsIGlzTWFpbm5ldENvaW4sIFV0eG9Db2luTmFtZSwgVXR4b0NvaW5OYW1lTWFpbm5ldCB9IGZyb20gJy4vbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0Rml4ZWRTY3JpcHRXYWxsZXRBZGRyZXNzLCBnZW5lcmF0ZUFkZHJlc3MgfSBmcm9tICcuL2FkZHJlc3MvZml4ZWRTY3JpcHQnO1xuaW1wb3J0IHsgUGFyc2VkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uL3R5cGVzJztcbmltcG9ydCB7IGRlY29kZURlc2NyaXB0b3JQc2J0LCBkZWNvZGVQc2J0LCBlbmNvZGVUcmFuc2FjdGlvbiwgc3RyaW5nVG9CdWZmZXJUcnlGb3JtYXRzIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9kZWNvZGUnO1xuaW1wb3J0IHsgZmV0Y2hLZXljaGFpbnMsIHRvQmlwMzJUcmlwbGUsIFV0eG9LZXljaGFpbiB9IGZyb20gJy4va2V5Y2hhaW5zJztcbmltcG9ydCB7IHZlcmlmeUtleVNpZ25hdHVyZSwgdmVyaWZ5VXNlclB1YmxpY0tleSwgdmVyaWZ5VXNlclB1YmxpY0tleUFzeW5jIH0gZnJvbSAnLi92ZXJpZnlLZXknO1xuaW1wb3J0IHsgZ2V0UG9saWN5Rm9yRW52IH0gZnJvbSAnLi9kZXNjcmlwdG9yL3ZhbGlkYXRlUG9saWN5JztcbmltcG9ydCB7IHNpZ25UcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vc2lnblRyYW5zYWN0aW9uJztcbmltcG9ydCB7IGlzVXR4b1dhbGxldERhdGEsIFV0eG9XYWxsZXQgfSBmcm9tICcuL3dhbGxldCc7XG5pbXBvcnQgeyBpc0Rlc2NyaXB0b3JXYWxsZXREYXRhIH0gZnJvbSAnLi9kZXNjcmlwdG9yL2Rlc2NyaXB0b3JXYWxsZXQnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi91bnNwZW50JztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9ICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB8ICdwMnRyJyB8ICdwMnRyTXVzaWcyJztcblxuZXhwb3J0IHR5cGUgVHhGb3JtYXQgPVxuICAvLyBUaGlzIGlzIGEgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCBiYXNlZCBhcm91bmQgdGhlIGJpdGNvaW5qcy1saWIgc2VyaWFsaXphdGlvbiBvZiB1bnNpZ25lZCB0cmFuc2FjdGlvbnNcbiAgLy8gZG9lcyBub3QgaW5jbHVkZSBwcmV2T3V0IGRhdGEgYW5kIGlzIGEgYml0IHBhaW5mdWwgdG8gd29yayB3aXRoXG4gIC8vIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcHNidFxuICAvLyBAZGVwcmVjYXRlZFxuICB8ICdsZWdhY3knXG4gIC8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBzYnQgZm9ybWF0LCBpbmNsdWRpbmcgdGhlIGZ1bGwgcHJldlR4IGRhdGEgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbnMuXG4gIC8vIFRoaXMgd2lsbCByZW1haW4gc3VwcG9ydGVkIGJ1dCBpcyBub3QgdGhlIGRlZmF1bHQsIHNpbmNlIHRoZSBkYXRhIHNpemVzIGNhbiBiZWNvbWUgcHJvaGliaXRpdmVseSBsYXJnZS5cbiAgfCAncHNidCdcbiAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHBzYnQgdmVyc2lvbiB3aGVyZSBsZWdhY3kgaW5wdXRzIGFyZSBzZXJpYWxpemVkIGFzIGlmIHRoZXkgd2VyZSBzZWd3aXQgaW5wdXRzLlxuICAvLyBXaGlsZSB0aGlzIHByZXZlbnRzIHVzIHRvIGZ1bGx5IHZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gZmVlLCB3ZSBoYXZlIG90aGVyIGNoZWNrcyBpbiBwbGFjZSB0byBlbnN1cmUgdGhlIGZlZSBpcyB3aXRoaW4gYm91bmRzLlxuICB8ICdwc2J0LWxpdGUnO1xuXG5leHBvcnQgY2xhc3MgRXJyb3JEZXByZWNhdGVkVHhGb3JtYXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHR4Rm9ybWF0OiBUeEZvcm1hdCkge1xuICAgIHN1cGVyKGBTREsgc3VwcG9ydCBmb3IgdHhGb3JtYXQ9JHt0eEZvcm1hdH0gaXMgZGVwcmVjYXRlZCBvbiB0aGlzIGVudmlyb25tZW50LiBQbGVhc2UgdXNlIHBzYnQgaW5zdGVhZC5gKTtcbiAgfVxufVxuXG50eXBlIFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB7XG4gIChwYXJhbXM6IHtcbiAgICBjb2luOiBJQmFzZUNvaW47XG4gICAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgICBwdWJzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogc2lnbmluZ1N0ZXAgZmxhZyBiZWNvbWVzIGFwcGxpY2FibGUgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICAgICAqIDEpIFdoZW4gdGhlIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZFxuICAgICAqIDIpIFdoZW4gdGhlIFBTQlQgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2lnbmluZyBwcm9jZXNzIG9mIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBpcyBhIDQtc3RlcCBzZXF1ZW5jZTpcbiAgICAgKiBpKSB1c2VyIG5vbmNlIGdlbmVyYXRpb24gLSBzaWduZXJOb25jZSAtIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaWkpIGJpdGdvIG5vbmNlIGdlbmVyYXRpb24gLSBjb3NpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBsb2NhbCBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaWkpIHVzZXIgc2lnbmF0dXJlIC0gc2lnbmVyU2lnbmF0dXJlIC0gdGhpcyBpcyB0aGUgc2Vjb25kIGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaXYpIGJpdGdvIHNpZ25hdHVyZSAtIG5vdCBpbiBzaWduVHJhbnNhY3Rpb24gbWV0aG9k4oCZcyBzY29wZVxuICAgICAqXG4gICAgICogSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnLCB0aGUgYWZvcmVtZW50aW9uZWQgZmlyc3QgdGhyZWUgc2VxdWVuY2UgaXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgc2lnblRyYW5zYWN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBOT1RFOiBXZSBtYWtlIGEgc3Ryb25nIGFzc3VtcHRpb24gdGhhdCB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgYW5kIGl0cyBjYWxsZXIgdXNlcyBzdGlja3kgc2Vzc2lvbnMsXG4gICAgICogc2luY2UgUFNCVHMgYXJlIGNhY2hlZCBpbiBzdGVwIDEgdG8gYmUgdXNlZCBpbiBzdGVwIDMgZm9yIE11U2lnMiB1c2VyIHNlY3VyZSBub25jZSBhY2Nlc3MuXG4gICAgICovXG4gICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCAnY29zaWduZXJOb25jZSc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPjtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBkZWNvZGVkIHRyYW5zYWN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgdGFwcm9vdCBrZXkgcGF0aCBzcGVuZCAoTXVTaWcyKSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaGFzS2V5UGF0aFNwZW5kSW5wdXQoXG4gIHR4OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIHB1YnM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICBjb2luTmFtZTogVXR4b0NvaW5OYW1lXG4pOiBib29sZWFuIHtcbiAgYXNzZXJ0KHB1YnMgJiYgaXNUcmlwbGUocHVicyksICdwdWIgdHJpcGxlIGlzIHJlcXVpcmVkIHRvIGNoZWNrIGZvciBrZXkgcGF0aCBzcGVuZCBpbnB1dHMgaW4gd2FzbS11dHhvIFBTQlQnKTtcbiAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBmaXhlZFNjcmlwdFdhbGxldC5Sb290V2FsbGV0S2V5cy5mcm9tWHB1YnMocHVicyk7XG4gIGNvbnN0IHJlcGxheVByb3RlY3Rpb24gPSB7IHB1YmxpY0tleXM6IGdldFJlcGxheVByb3RlY3Rpb25QdWJrZXlzKGNvaW5OYW1lKSB9O1xuICBjb25zdCBwYXJzZWQgPSB0eC5wYXJzZVRyYW5zYWN0aW9uV2l0aFdhbGxldEtleXMocm9vdFdhbGxldEtleXMsIHsgcmVwbGF5UHJvdGVjdGlvbiB9KTtcbiAgcmV0dXJuIHBhcnNlZC5pbnB1dHMuc29tZSgoaW5wdXQpID0+IGlucHV0LnNjcmlwdFR5cGUgPT09ICdwMnRyTXVzaWcyS2V5UGF0aCcpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgVmFsaWRhdGlvbkVycm9yIHRvIFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB3aXRoIHN0cnVjdHVyZWQgZGF0YVxuICpcbiAqIFRoaXMgcHJlc2VydmVzIHRoZSBzdHJ1Y3R1cmVkIGVycm9yIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIFZhbGlkYXRpb25FcnJvclxuICogYnkgZXh0cmFjdGluZyB0aGUgbWlzbWF0Y2hlZCBvdXRwdXRzIGFuZCBjb252ZXJ0aW5nIHRoZW0gdG8gdGhlIHN0YW5kYXJkaXplZCBmb3JtYXQuXG4gKiBUaGUgb3JpZ2luYWwgZXJyb3IgaXMgcHJlc2VydmVkIGFzIHRoZSBgY2F1c2VgIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRWYWxpZGF0aW9uRXJyb3JUb1R4SW50ZW50TWlzbWF0Y2goXG4gIGVycm9yOiBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIHJlcUlkOiBzdHJpbmcgfCBJUmVxdWVzdFRyYWNlciB8IHVuZGVmaW5lZCxcbiAgdHhQYXJhbXM6IEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgdHhIZXg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdHhFeHBsYW5hdGlvbj86IHVua25vd25cbik6IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvciB7XG4gIGNvbnN0IG1pc21hdGNoZWRSZWNpcGllbnRzOiBNaXNtYXRjaGVkUmVjaXBpZW50W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvci5lcnJvcnMpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JNaXNzaW5nT3V0cHV0cykge1xuICAgICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMucHVzaChcbiAgICAgICAgLi4uZXJyLm1pc3NpbmdPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvckltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzKSB7XG4gICAgICBtaXNtYXRjaGVkUmVjaXBpZW50cy5wdXNoKFxuICAgICAgICAuLi5lcnIuaW1wbGljaXRFeHRlcm5hbE91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICAgICAgYWRkcmVzczogb3V0cHV0LmFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50OiBvdXRwdXQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIH0pKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0eEludGVudEVycm9yID0gbmV3IFR4SW50ZW50TWlzbWF0Y2hSZWNpcGllbnRFcnJvcihcbiAgICBlcnJvci5tZXNzYWdlLFxuICAgIHJlcUlkLFxuICAgIFt0eFBhcmFtc10sXG4gICAgdHhIZXgsXG4gICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMsXG4gICAgdHhFeHBsYW5hdGlvblxuICApO1xuICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc3RydWN0dXJlZCBlcnJvciBhcyB0aGUgY2F1c2UgZm9yIGRlYnVnZ2luZ1xuICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yL2NhdXNlXG4gICh0eEludGVudEVycm9yIGFzIEVycm9yICYgeyBjYXVzZT86IEVycm9yIH0pLmNhdXNlID0gZXJyb3I7XG4gIHJldHVybiB0eEludGVudEVycm9yO1xufVxuXG5leHBvcnQgdHlwZSB7IERlY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBVdHhvQ29pblNwZWNpZmljID0gQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zPFRDb2luU3BlY2lmaWMgZXh0ZW5kcyBVdHhvQ29pblNwZWNpZmljPiBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luU3BlY2lmaWM/OiBUQ29pblNwZWNpZmljO1xufVxuXG5leHBvcnQgdHlwZSBCaXAzMjJNZXNzYWdlID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqIE1hcHMgdHhpZCB0byB0eGhleC4gUmVxdWlyZWQgZm9yIG9mZmxpbmUgc2lnbmluZy4gKi9cbiAgdHhIZXhlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNoYW5nZUFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICAvKiogcHNidCBkb2VzIG5vdCByZXF1aXJlIHVuc3BlbnRzLiAqL1xuICB1bnNwZW50cz86IFVuc3BlbnQ8VE51bWJlcj5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBmZWVJbmZvPzogc3RyaW5nO1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIGN1c3RvbUNoYW5nZVhwdWJzPzogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVkRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4ge1xuICBjaGFuZ2VJbmZvPzogeyBhZGRyZXNzOiBzdHJpbmc7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQU0JULWxpdGUgaGV4IHByZXNlbnQgb25seSBpbiBwZW5kaW5nIGFwcHJvdmFsIGZsb3dzLCB3aGVyZSBhbm90aGVyIHVzZXIncyBzZW5kIGZpeGVkIHRoZSBmb3JtYXQuXG4gICAqIE5vdCBzZXQgaW4gcmVndWxhciAvdHgvYnVpbGQgcmVzcG9uc2VzICh3aGVyZSB0aGUgY2FsbGVyIGNvbnRyb2xzIHRoZSBidWlsZCBwYXJhbWV0ZXJzKS5cbiAgICogUHJlZmVycmVkIG92ZXIgdHhIZXggd2hlbiBwcmVzZW50LCBhcyBpdCBjYXJyaWVzIHJpY2hlciBkYXRhIChub25XaXRuZXNzVXR4bywgcmVkZWVtU2NyaXB0LCBCSVAtMzIgcGF0aHMpLlxuICAgKi9cbiAgdHhIZXhQc2J0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUGFyYW1zIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3M/OiBib29sZWFuO1xuICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICByYmZUeElkcz86IHN0cmluZ1tdO1xuICAvKiogUGFyYW1ldGVycyBmb3IgYnJpZGdpbmcgaW50ZW50cyAoZS5nLiBCVEMgLT4gc0JUQyBwZWctaW4pLCBwcmVzZW50IHdoZW4gYHR5cGUgPT09ICdicmlkZ2luZydgLiAqL1xuICBicmlkZ2luZ1BhcmFtcz86IEJyaWRnaW5nUGFyYW1zO1xuICBxcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHdhbGxldDogVXR4b1dhbGxldDtcbiAgdmVyaWZpY2F0aW9uPzogVmVyaWZpY2F0aW9uT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZUFkZHJlc3NPcHRpb25zIHtcbiAgYWRkcmVzc1R5cGU/OiBTY3JpcHRUeXBlMk9mMztcbiAgdGhyZXNob2xkPzogbnVtYmVyO1xuICBjaGFpbj86IG51bWJlcjtcbiAgaW5kZXg/OiBudW1iZXI7XG4gIHNlZ3dpdD86IGJvb2xlYW47XG4gIGJlY2gzMj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVGaXhlZFNjcmlwdEFkZHJlc3NPcHRpb25zIGV4dGVuZHMgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGZvcm1hdD86IENyZWF0ZUFkZHJlc3NGb3JtYXQ7XG4gIGtleWNoYWluczoge1xuICAgIHB1Yjogc3RyaW5nO1xuICAgIGFzcEtleUlkPzogc3RyaW5nO1xuICB9W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RldGFpbHMge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIGNoYWluOiBudW1iZXI7XG4gIGluZGV4OiBudW1iZXI7XG4gIGNvaW46IHN0cmluZztcbiAgY29pblNwZWNpZmljOiBBZGRyZXNzQ29pblNwZWNpZmljIHwgRGVzY3JpcHRvckFkZHJlc3NDb2luU3BlY2lmaWM7XG4gIGFkZHJlc3NUeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljIGV4dGVuZHMgQWRkcmVzc0NvaW5TcGVjaWZpYyB7XG4gIGRlc2NyaXB0b3JOYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0b3JDaGVja3N1bTogc3RyaW5nO1xufVxuXG50eXBlIFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IEJhc2VTaWduVHJhbnNhY3Rpb25PcHRpb25zICYge1xuICAvKiogVHJhbnNhY3Rpb24gcHJlYnVpbGQgZnJvbSBiaXRnbyBzZXJ2ZXIgKi9cbiAgdHhQcmVidWlsZDoge1xuICAgIC8qKlxuICAgICAqIHdhbGxldElkIGlzIHJlcXVpcmVkIGluIGZvbGxvd2luZyAyIHNjZW5hcmlvcy5cbiAgICAgKiAxLiBFeHRlcm5hbCBzaWduZXIgZXhwcmVzcyBtb2RlIGlzIHVzZWQuXG4gICAgICogMi4gYml0Z28gTXVTaWcyIG5vbmNlIGlzIHJlcXVlc3RlZFxuICAgICAqL1xuICAgIHdhbGxldElkPzogc3RyaW5nO1xuICAgIHR4SGV4OiBzdHJpbmc7XG4gICAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICB9O1xuICAvKiogeHB1YnMgdHJpcGxlIGZvciB3YWxsZXQgKHVzZXIsIGJhY2t1cCwgYml0Z28pLiBSZXF1aXJlZCBvbmx5IHdoZW4gdHhQcmVidWlsZC50eEhleCBpcyBub3QgYSBQU0JUICovXG4gIHB1YnM/OiBUcmlwbGU8c3RyaW5nPjtcbiAgLyoqIHhwdWIgZm9yIGNvc2lnbmVyIChkZWZhdWx0cyB0byBiaXRnbykgKi9cbiAgY29zaWduZXJQdWI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGNyZWF0ZXMgZnVsbC1zaWduZWQgdHJhbnNhY3Rpb24gd2l0aG91dCBwbGFjZWhvbGRlciBzaWduYXR1cmVzLlxuICAgKiBXaGVuIGZhbHNlLCBjcmVhdGVzIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICovXG4gIGlzTGFzdFNpZ25hdHVyZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSBzaWduZWQgdHJhbnNhY3Rpb24gd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBQU0JUIHRvIGxlZ2FjeSBmb3JtYXQgYmVmb3JlIHJldHVybmluZy5cbiAgICogU2V0IGF1dG9tYXRpY2FsbHkgYnkgcHJlc2lnblRyYW5zYWN0aW9uKCkgd2hlbiB0aGUgY2FsbGVyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHR4Rm9ybWF0OiAnbGVnYWN5Jy5cbiAgICovXG4gIHJldHVybkxlZ2FjeUZvcm1hdD86IGJvb2xlYW47XG4gIHdhbGxldD86IFV0eG9XYWxsZXQ7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUgKGRlZmF1bHQpLCBleHRyYWN0IGZpbmFsaXplZCBQU0JUIHRvIGxlZ2FjeSB0cmFuc2FjdGlvbiBmb3JtYXQuXG4gICAqIFdoZW4gZmFsc2UsIHJldHVybiBmaW5hbGl6ZWQgUFNCVC4gVXNlZnVsIGZvciB0ZXN0aW5nIHRvIGtlZXAgdHJhbnNhY3Rpb25zIGluIFBTQlQgZm9ybWF0LlxuICAgKi9cbiAgZXh0cmFjdFRyYW5zYWN0aW9uPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgZW1iZWRzIFdBU00tVVRYTyB2ZXJzaW9uIG1ldGFkYXRhIGludG8gdGhlIHNpZ25lZCBQU0JULiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgd3JpdGVTaWduZWRXaXRoPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBVdHhvQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4gJlxuICAoXG4gICAgfCB7XG4gICAgICAgIHBydjogc3RyaW5nO1xuICAgICAgICBzaWduaW5nU3RlcD86ICdzaWduZXJOb25jZScgfCAnc2lnbmVyU2lnbmF0dXJlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgc2lnbmluZ1N0ZXA6ICdjb3NpZ25lck5vbmNlJztcbiAgICAgIH1cbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNpZ0FkZHJlc3Mge1xuICBvdXRwdXRTY3JpcHQ6IEJ1ZmZlcjtcbiAgcmVkZWVtU2NyaXB0PzogQnVmZmVyO1xuICB3aXRuZXNzU2NyaXB0PzogQnVmZmVyO1xuICBhZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlckZyb21Xcm9uZ0NoYWluT3B0aW9ucyB7XG4gIHR4aWQ6IHN0cmluZztcbiAgcmVjb3ZlcnlBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xuICB4cHJ2Pzogc3RyaW5nO1xuICBhcGlLZXk/OiBzdHJpbmc7XG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBjb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgcmVjb3ZlcnlDb2luPzogQWJzdHJhY3RVdHhvQ29pbjtcbiAgc2lnbmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlLZXlTaWduYXR1cmVzT3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbjogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5Y2hhaW5Ub1ZlcmlmeTogeyBwdWI/OiBzdHJpbmcgfTtcbiAga2V5U2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMge1xuICB1c2VyS2V5Y2hhaW4/OiBVdHhvS2V5Y2hhaW47XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICB0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+XG4gIGV4dGVuZHMgQmFzZVZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj47XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbiAgd2FsbGV0OiBVdHhvV2FsbGV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVxdWVzdCB7XG4gIHBzYnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduUHNidFJlc3BvbnNlIHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVdHhvQ29pbiBleHRlbmRzIEJhc2VDb2luIGltcGxlbWVudHMgTXVzaWcyUGFydGljaXBhbnQ8Zml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0PiB7XG4gIGFic3RyYWN0IG5hbWU6IFV0eG9Db2luTmFtZTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29pbiBpcyBhIG1haW5uZXQgY29pbi5cbiAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuYW1lIHByb3BlcnR5LlxuICAgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzTWFpbm5ldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNNYWlubmV0Q29pbih0aGlzLm5hbWUpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcgPSAnbnVtYmVyJykge1xuICAgIHN1cGVyKGJpdGdvKTtcbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKTogVXR4b0NvaW5OYW1lIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IFV0eG9Db2luTmFtZU1haW5uZXQge1xuICAgIHJldHVybiBnZXRNYWlubmV0Q29pbk5hbWUodGhpcy5uYW1lKTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGdldEZ1bGxOYW1lRnJvbUNvaW5OYW1lKHRoaXMubmFtZSk7XG4gIH1cblxuICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvaW4gc3VwcG9ydHMgYSBibG9jayB0YXJnZXQgKi9cbiAgc3VwcG9ydHNCbG9ja1RhcmdldCgpOiBib29sZWFuIHtcbiAgICAvLyBGSVhNRTogdGhlIFNESyBkb2VzIG5vdCBzZWVtIHRvIHVzZSB0aGlzIGFueXdoZXJlIHNvIGl0IGlzIHVuY2xlYXIgd2hhdCB0aGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpc1xuICAgIGNvbnN0IG1haW5uZXQgPSBnZXRNYWlubmV0Q29pbk5hbWUodGhpcy5uYW1lKTtcbiAgICByZXR1cm4gbWFpbm5ldCA9PT0gJ2J0YycgfHwgbWFpbm5ldCA9PT0gJ2RvZ2UnO1xuICB9XG5cbiAgc3dlZXBXaXRoU2VuZE1hbnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgc3RhdGljIGdldCB2YWxpZEFkZHJlc3NUeXBlcygpOiBTY3JpcHRUeXBlMk9mM1tdIHtcbiAgICByZXR1cm4gWydwMnNoJywgJ3Ayc2hQMndzaCcsICdwMndzaCcsICdwMnRyJywgJ3AydHJNdXNpZzInXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmYWN0b3IgYmV0d2VlbiB0aGUgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDFlODtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbVxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHBhcmFtPzogeyBhbnlGb3JtYXQ/OiBib29sZWFuOyBhbGxvd0xpZ2h0bmluZz86IGJvb2xlYW4gfSB8IC8qIGxlZ2FjeSBwYXJhbWV0ZXIgKi8gYm9vbGVhblxuICApOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnYm9vbGVhbicgJiYgcGFyYW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVwcmVjYXRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93TGlnaHRuaW5nID0gKHBhcmFtIGFzIHsgYWxsb3dMaWdodG5pbmc/OiBib29sZWFuIH0gfCB1bmRlZmluZWQpPy5hbGxvd0xpZ2h0bmluZyA/PyBmYWxzZTtcbiAgICBpZiAoYWxsb3dMaWdodG5pbmcpIHtcbiAgICAgIGlmICgvXigwMnwwMylbMC05YS1mQS1GXXs2NH0kLy50ZXN0KGFkZHJlc3MpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzQm9sdDExSW52b2ljZShhZGRyZXNzKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0LCBhbGxvdyBhbGwgYWRkcmVzcyBmb3JtYXRzLlxuICAgIC8vIEF0IHRoZSB0aW1lIG9mIHdyaXRpbmcsIHRoZSBvbmx5IGFkZGl0aW9uYWwgYWRkcmVzcyBmb3JtYXQgaXMgYmNoIGNhc2hhZGRyLlxuICAgIGNvbnN0IGFueUZvcm1hdCA9IChwYXJhbSBhcyB7IGFueUZvcm1hdDogYm9vbGVhbiB9IHwgdW5kZWZpbmVkKT8uYW55Rm9ybWF0ID8/IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IHdhc21BZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aENvaW4oYWRkcmVzcywgdGhpcy5uYW1lKTtcbiAgICAgIC8vIERldGVybWluZSB3aGljaCBmb3JtYXQgdGhlIGlucHV0IGFkZHJlc3Mgd2FzIGluIGJ5IHJvdW5kLXRyaXBwaW5nXG4gICAgICAvLyB0aHJvdWdoIGVhY2ggY2FuZGlkYXRlIGFuZCBjaGVja2luZyBieXRlLWVxdWFsaXR5LiAnZGVmYXVsdCcgaXMgdHJpZWRcbiAgICAgIC8vIGZpcnN0IHNvIGNhbm9uaWNhbCBkZWZhdWx0LWZvcm1hdCBhZGRyZXNzZXMgZWFybHktZXhpdC5cbiAgICAgIGZvciAoY29uc3QgZm9ybWF0IG9mIFsnZGVmYXVsdCcsICdjYXNoYWRkciddIGFzIGNvbnN0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHdhc21BZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHQsIHRoaXMubmFtZSwgZm9ybWF0KSA9PT0gYWRkcmVzcykge1xuICAgICAgICAgICAgcmV0dXJuIGFueUZvcm1hdCB8fCBmb3JtYXQgPT09ICdkZWZhdWx0JztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGNvaW4gZG9lc24ndCBzdXBwb3J0IHRoaXMgZm9ybWF0OyB0cnkgdGhlIG5leHQgb25lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gQklQMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBjcmFmdGluZyB0aGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBCaXRHbyBBUEkuXG4gICAqIEl0IGNvbnZlcnRzIHRoZSByZWNpcGllbnQgYWRkcmVzcyBgc2NyaXB0UHViS2V5Oi4uLmAgdG8geyBzY3JpcHQ6IHN0cmluZyB9IHwgeyBhZGRyZXNzOiBzdHJpbmcgfS5cbiAgICovXG4gIG92ZXJyaWRlIHByZXByb2Nlc3NCdWlsZFBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAocGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1zLnJlY2lwaWVudHMgPVxuICAgICAgICBwYXJhbXMucmVjaXBpZW50cyBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgPyBwYXJhbXM/LnJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgYWRkcmVzcywgLi4ucmVzdCB9ID0gcmVjaXBpZW50O1xuICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2lwaWVudDsgLy8gQWxyZWFkeSB7IHNjcmlwdCwgYW1vdW50IH0g4oCUIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4geyAuLi5yZXN0LCAuLi5mcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0KGFkZHJlc3MpIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogcGFyYW1zLnJlY2lwaWVudHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxhdGVzdCBibG9jayBoZWlnaHRcbiAgICogQHBhcmFtIHJlcUlkXG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RCbG9ja0hlaWdodChyZXFJZD86IFJlcXVlc3RUcmFjZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmIChyZXFJZCkge1xuICAgICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHJlcUlkKTtcbiAgICB9XG4gICAgY29uc3QgY2hhaW5oZWFkID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvYmxvY2svbGF0ZXN0JykpLnJlc3VsdCgpO1xuICAgIHJldHVybiAoY2hhaW5oZWFkIGFzIGFueSkuaGVpZ2h0O1xuICB9XG5cbiAgY2hlY2tSZWNpcGllbnQocmVjaXBpZW50OiB7IGFkZHJlc3M/OiBzdHJpbmc7IGFtb3VudDogbnVtYmVyIHwgc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50KHJlY2lwaWVudCk7XG4gICAgaWYgKHJlY2lwaWVudC5hZGRyZXNzICYmICFpc1NjcmlwdFJlY2lwaWVudChyZWNpcGllbnQuYWRkcmVzcykpIHtcbiAgICAgIHN1cGVyLmNoZWNrUmVjaXBpZW50KHsgYWRkcmVzczogcmVjaXBpZW50LmFkZHJlc3MsIGFtb3VudDogcmVjaXBpZW50LmFtb3VudCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGN1c3RvbSBjb2luIGxvZ2ljIGFmdGVyIGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSBCaXRHb1xuICAgKiBAcGFyYW0gcHJlYnVpbGRcbiAgICovXG4gIGFzeW5jIHBvc3RQcm9jZXNzUHJlYnVpbGQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgcHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj5cbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+PiB7XG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkKHByZWJ1aWxkKTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChwcmVidWlsZC5ibG9ja0hlaWdodCkpIHtcbiAgICAgIHByZWJ1aWxkLmJsb2NrSGVpZ2h0ID0gKGF3YWl0IHRoaXMuZ2V0TGF0ZXN0QmxvY2tIZWlnaHQoKSkgYXMgbnVtYmVyO1xuICAgIH1cbiAgICByZXR1cm4gXy5leHRlbmQoe30sIHByZWJ1aWxkLCB7IHR4SGV4OiBlbmNvZGVUcmFuc2FjdGlvbih0eCkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gd2lsbCBiZSByZW1vdmVkIHdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciB1dHhvbGliXG4gICAqIERldGVybWluZSBhbiBhZGRyZXNzJyB0eXBlIGJhc2VkIG9uIGl0cyB3aXRuZXNzIGFuZCByZWRlZW0gc2NyaXB0IHByZXNlbmNlXG4gICAqIEBwYXJhbSBhZGRyZXNzRGV0YWlsc1xuICAgKi9cbiAgc3RhdGljIGluZmVyQWRkcmVzc1R5cGUoYWRkcmVzc0RldGFpbHM6IHsgY2hhaW46IG51bWJlciB9KTogU2NyaXB0VHlwZTJPZjMgfCBudWxsIHtcbiAgICByZXR1cm4gZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLmlzKGFkZHJlc3NEZXRhaWxzLmNoYWluKVxuICAgICAgPyAoZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnNjcmlwdFR5cGUoYWRkcmVzc0RldGFpbHMuY2hhaW4pIGFzIFNjcmlwdFR5cGUyT2YzKVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb24oaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gICAgY29uc3QgYnVmZmVyID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHN0cmluZ1RvQnVmZmVyVHJ5Rm9ybWF0cyhpbnB1dCwgWydoZXgnLCAnYmFzZTY0J10pIDogaW5wdXQ7XG4gICAgaWYgKCFoYXNQc2J0TWFnaWMoYnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yRGVwcmVjYXRlZFR4Rm9ybWF0KCdsZWdhY3knKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZVBzYnQoYnVmZmVyLCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Bc1BzYnQoaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZyk6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlVHJhbnNhY3Rpb24oaW5wdXQpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQocHJlYnVpbGQ6IHtcbiAgICB0eEhleD86IHN0cmluZztcbiAgICB0eEJhc2U2ND86IHN0cmluZztcbiAgICAvKiogU2VlIFRyYW5zYWN0aW9uUHJlYnVpbGQudHhIZXhQc2J0IOKAlCBvbmx5IHByZXNlbnQgaW4gcGVuZGluZyBhcHByb3ZhbCBmbG93cy4gKi9cbiAgICB0eEhleFBzYnQ/OiBzdHJpbmc7XG4gIH0pOiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICAgIGNvbnN0IHN0cmluZyA9IHByZWJ1aWxkLnR4SGV4UHNidCA/PyBwcmVidWlsZC50eEhleCA/PyBwcmVidWlsZC50eEJhc2U2NDtcbiAgICBpZiAoIXN0cmluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHR4SGV4IG9yIHR4QmFzZTY0IHByb3BlcnR5Jyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBhbmQgZmlsbCB0cmFuc2FjdGlvbiBkZXRhaWxzIHN1Y2ggYXMgaW50ZXJuYWwvY2hhbmdlIHNwZW5kLCBleHRlcm5hbCBzcGVuZCAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSwgZXRjLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbih0aGlzLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGZ1bmN0aW9uIHZlcmlmeVVzZXJQdWJsaWNLZXkgaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIHZlcmlmeVVzZXJQdWJsaWNLZXkocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2ZXJpZnlVc2VyUHVibGljS2V5KHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgZnVuY3Rpb24gdmVyaWZ5VXNlclB1YmxpY0tleUFzeW5jIGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB2ZXJpZnlVc2VyUHVibGljS2V5QXN5bmMocGFyYW1zOiBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBhd2FpdCB2ZXJpZnlVc2VyUHVibGljS2V5QXN5bmModGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBmdW5jdGlvbiB2ZXJpZnlLZXlTaWduYXR1cmUgaW5zdGVhZFxuICAgKi9cbiAgcHVibGljIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXM6IFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZlcmlmeUtleVNpZ25hdHVyZShwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgY29tcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eFBhcmFtcyBwYXJhbXMgb2JqZWN0IHBhc3NlZCB0byBzZW5kXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgc2VydmVyXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZC50eEhleCBwcmVidWlsdCB0cmFuc2FjdGlvbidzIHR4SGV4IGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQgV2FsbGV0IG9iamVjdCB0byBvYnRhaW4ga2V5cyB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbiBPYmplY3Qgc3BlY2lmeWluZyBzb21lIHZlcmlmaWNhdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uLmRpc2FibGVOZXR3b3JraW5nIERpc2FsbG93IGZldGNoaW5nIGFueSBkYXRhIGZyb20gdGhlIGludGVybmV0IGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24ua2V5Y2hhaW5zIFBhc3Mga2V5Y2hhaW5zIG1hbnVhbGx5IHJhdGhlciB0aGFuIGZldGNoaW5nIHRoZW0gYnkgaWRcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uYWRkcmVzc2VzIEFkZHJlc3MgZGV0YWlscyB0byBwYXNzIGluIGZvciBvdXQtb2YtYmFuZCB2ZXJpZmljYXRpb25cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmVyaWZpY2F0aW9uIHBhc3Nlc1xuICAgKiBAdGhyb3dzIHtUeEludGVudE1pc21hdGNoRXJyb3J9IGlmIHRyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHRocm93cyB7VHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yfSBpZiB0cmFuc2FjdGlvbiByZWNpcGllbnRzIGRvbid0IG1hdGNoIHVzZXIgaW50ZW50XG4gICAqL1xuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHZlcmlmeVRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICBjb25zdCB0eEV4cGxhbmF0aW9uID0gYXdhaXQgVHhJbnRlbnRNaXNtYXRjaEVycm9yLnRyeUdldFR4RXhwbGFuYXRpb24oXG4gICAgICAgICAgdGhpcyBhcyB1bmtub3duIGFzIElCYXNlQ29pbixcbiAgICAgICAgICBwYXJhbXMudHhQcmVidWlsZFxuICAgICAgICApO1xuICAgICAgICB0aHJvdyBjb252ZXJ0VmFsaWRhdGlvbkVycm9yVG9UeEludGVudE1pc21hdGNoKFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIHBhcmFtcy5yZXFJZCxcbiAgICAgICAgICBwYXJhbXMudHhQYXJhbXMsXG4gICAgICAgICAgcGFyYW1zLnR4UHJlYnVpbGQudHhIZXgsXG4gICAgICAgICAgdHhFeHBsYW5hdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2Ugc3VyZSBhbiBhZGRyZXNzIGlzIHZhbGlkIGFuZCB0aHJvdyBhbiBlcnJvciBpZiBpdCdzIG5vdC5cbiAgICogQHBhcmFtIHBhcmFtcy5hZGRyZXNzIFRoZSBhZGRyZXNzIHN0cmluZyBvbiB0aGUgbmV0d29ya1xuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3NUeXBlXG4gICAqIEBwYXJhbSBwYXJhbXMua2V5Y2hhaW5zIEtleWNoYWluIG9iamVjdHMgd2l0aCB4cHVic1xuICAgKiBAcGFyYW0gcGFyYW1zLmNvaW5TcGVjaWZpYyBDb2luLXNwZWNpZmljIGRldGFpbHMgZm9yIHRoZSBhZGRyZXNzIHN1Y2ggYXMgYSB3aXRuZXNzIHNjcmlwdFxuICAgKiBAcGFyYW0gcGFyYW1zLmNoYWluIERlcml2YXRpb24gY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtcy5pbmRleCBEZXJpdmF0aW9uIGluZGV4XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRXJyb3J9XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3J9XG4gICAqIEB0aHJvd3Mge1VuZXhwZWN0ZWRBZGRyZXNzRXJyb3J9XG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBWZXJpZnlBZGRyZXNzT3B0aW9uczxVdHhvQ29pblNwZWNpZmljPiwgd2FsbGV0PzogSVdhbGxldCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywga2V5Y2hhaW5zLCBjaGFpbiwgaW5kZXggfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGlmICh3YWxsZXQgJiYgaXNEZXNjcmlwdG9yV2FsbGV0KHdhbGxldCkpIHtcbiAgICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMnKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNUcmlwbGUoa2V5Y2hhaW5zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleWNoYWlucyBtdXN0IGJlIGEgdHJpcGxlJyk7XG4gICAgICB9XG4gICAgICBhc3NlcnREZXNjcmlwdG9yV2FsbGV0QWRkcmVzcyhcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIGdldERlc2NyaXB0b3JNYXBGcm9tV2FsbGV0KHdhbGxldCwgdG9CaXAzMlRyaXBsZShrZXljaGFpbnMpLCBnZXRQb2xpY3lGb3JFbnYodGhpcy5iaXRnby5lbnYpKVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICgoXy5pc1VuZGVmaW5lZChjaGFpbikgJiYgXy5pc1VuZGVmaW5lZChpbmRleCkpIHx8ICEoXy5pc0Zpbml0ZShjaGFpbikgJiYgXy5pc0Zpbml0ZShpbmRleCkpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBpbnZhbGlkIGNoYWluICgke2NoYWlufSkgb3IgaW5kZXggKCR7aW5kZXh9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSBrZXljaGFpbnMnKTtcbiAgICB9XG5cbiAgICBhc3NlcnRGaXhlZFNjcmlwdFdhbGxldEFkZHJlc3ModGhpcy5uYW1lLCB7XG4gICAgICBhZGRyZXNzLFxuICAgICAga2V5Y2hhaW5zLFxuICAgICAgZm9ybWF0OiBwYXJhbXMuZm9ybWF0ID8/ICdiYXNlNTgnLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2FsbHkgZGVyaXZlIGEgZml4ZWQtc2NyaXB0ICgyLW9mLTMgbXVsdGlzaWcpIHdhbGxldCByZWNlaXZlIGFkZHJlc3MgZnJvbSB0aGUgeHB1YiB0cmlwbGVcbiAgICogYW5kIGEgY2hhaW4vaW5kZXgsIHVzaW5nIHB1YmxpYyBrZXlzIG9ubHkgKG5vIHByaXZhdGUga2V5cywgbm8gbmV0d29yayBhY2Nlc3MpLiBUaGlzIGlzIHRoZVxuICAgKiBpbnZlcnNlIG9mIHtAbGluayBpc1dhbGxldEFkZHJlc3N9LCBkZWxlZ2F0aW5nIHRvIHRoZSBzYW1lIGBnZW5lcmF0ZUFkZHJlc3NgIHVzZWQgYnkgdGhlXG4gICAqIHZlcmlmaWNhdGlvbiBwYXRoLCBzbyBkZXJpdmUgYW5kIHZlcmlmeSBjYW4gbmV2ZXIgZGl2ZXJnZS5cbiAgICpcbiAgICogVGhlIGBjaGFpbmAgY29kZSBzZWxlY3RzIHRoZSBzY3JpcHQgdHlwZSAoZS5nLiAwLzEgPSBQMlNILCAyMC8yMSA9IFAyV1NIL2JlY2gzMiwgMzAvMzEgPSBQMlRSKTtcbiAgICogYW4gb3B0aW9uYWwgYGZvcm1hdGAgb3ZlcnJpZGVzIHRoZSBhZGRyZXNzIGVuY29kaW5nLlxuICAgKiBAcGFyYW0gcGFyYW1zIGtleWNoYWlucyAoeHB1YiB0cmlwbGUgdmlhIGBwdWJgKSwgY2hhaW4sIGluZGV4LCBhbmQgb3B0aW9uYWwgZm9ybWF0XG4gICAqIEByZXR1cm5zIHRoZSBkZXJpdmVkIGFkZHJlc3MgYW5kIHRoZSBjaGFpbi9pbmRleCB1c2VkXG4gICAqL1xuICBhc3luYyBkZXJpdmVBZGRyZXNzKHBhcmFtczogRGVyaXZlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPERlcml2ZUFkZHJlc3NSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGtleWNoYWlucywgY2hhaW4sIGluZGV4LCBmb3JtYXQgfSA9IHBhcmFtcztcblxuICAgIGlmICgha2V5Y2hhaW5zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0ga2V5Y2hhaW5zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzcyA9IGdlbmVyYXRlQWRkcmVzcyh0aGlzLm5hbWUsIHtcbiAgICAgIC8vIGZpeGVkLXNjcmlwdCAobXVsdGlzaWcpIGNvaW5zIGRlcml2ZSBmcm9tIHRoZSB4cHViIHRyaXBsZSB2aWEgYHB1YmBcbiAgICAgIGtleWNoYWluczoga2V5Y2hhaW5zIGFzIHsgcHViOiBzdHJpbmcgfVtdLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICAgIGZvcm1hdCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGFkZHJlc3MsIGNoYWluLCBpbmRleCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gdW5zcGVudFR5cGVcbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc1R5cGUoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LnN1cHBvcnRzU2NyaXB0VHlwZSh0aGlzLm5hbWUsIGFkZHJlc3NUeXBlKTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcmV0dXJuIHRydWUgaWZmIGNvaW4gc3VwcG9ydHMgc3BlbmRpbmcgZnJvbSBjaGFpblxuICAgKi9cbiAgc3VwcG9ydHNBZGRyZXNzQ2hhaW4oY2hhaW46IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBmaXhlZFNjcmlwdFdhbGxldC5DaGFpbkNvZGUuaXMoY2hhaW4pICYmXG4gICAgICB0aGlzLnN1cHBvcnRzQWRkcmVzc1R5cGUoZml4ZWRTY3JpcHRXYWxsZXQuQ2hhaW5Db2RlLnNjcmlwdFR5cGUoY2hhaW4pIGFzIFNjcmlwdFR5cGUyT2YzKVxuICAgICk7XG4gIH1cblxuICBrZXlJZHNGb3JTaWduaW5nKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gW0tleUluZGljZXMuVVNFUiwgS2V5SW5kaWNlcy5CQUNLVVAsIEtleUluZGljZXMuQklUR09dO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGlucHV0IHBzYnQgYWRkZWQgd2l0aCBkZXRlcm1pbmlzdGljIE11U2lnMiBub25jZSBmb3IgYml0Z28ga2V5IGZvciBlYWNoIE11U2lnMiBpbnB1dHMuXG4gICAqIEBwYXJhbSBwc2J0IGFsbCBNdVNpZzIgaW5wdXRzIHNob3VsZCBjb250YWluIHVzZXIgTXVTaWcyIG5vbmNlXG4gICAqIEBwYXJhbSB3YWxsZXRJZFxuICAgKi9cbiAgYXN5bmMgZ2V0TXVzaWcyTm9uY2VzKHBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCwgd2FsbGV0SWQ6IHN0cmluZyk6IFByb21pc2U8Zml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0PiB7XG4gICAgY29uc3QgYnVmZmVyID0gZW5jb2RlVHJhbnNhY3Rpb24ocHNidCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybCgnL3dhbGxldC8nICsgd2FsbGV0SWQgKyAnL3R4L3NpZ25wc2J0JykpXG4gICAgICAuc2VuZCh7IHBzYnQ6IGJ1ZmZlci50b1N0cmluZygnaGV4JykgfSlcbiAgICAgIC5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlUHNidChyZXNwb25zZS5wc2J0LCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRNdXNpZzJOb25jZXMgaW5zdGVhZFxuICAgKiBAcmV0dXJucyBpbnB1dCBwc2J0IGFkZGVkIHdpdGggZGV0ZXJtaW5pc3RpYyBNdVNpZzIgbm9uY2UgZm9yIGJpdGdvIGtleSBmb3IgZWFjaCBNdVNpZzIgaW5wdXRzLlxuICAgKiBAcGFyYW0gcHNidEhleCBhbGwgTXVTaWcyIGlucHV0cyBzaG91bGQgY29udGFpbiB1c2VyIE11U2lnMiBub25jZVxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICovXG4gIGFzeW5jIHNpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZywgd2FsbGV0SWQ6IHN0cmluZyk6IFByb21pc2U8U2lnblBzYnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHBzYnQgPSBhd2FpdCB0aGlzLmdldE11c2lnMk5vbmNlcyh0aGlzLmRlY29kZVRyYW5zYWN0aW9uQXNQc2J0KHBzYnRIZXgpLCB3YWxsZXRJZCk7XG4gICAgcmV0dXJuIHsgcHNidDogZW5jb2RlVHJhbnNhY3Rpb24ocHNidCkudG9TdHJpbmcoJ2hleCcpIH07XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgaW5wdXQgcHNidCBhZGRlZCB3aXRoIGRldGVybWluaXN0aWMgTXVTaWcyIG5vbmNlIGZvciBiaXRnbyBrZXkgZm9yIGVhY2ggTXVTaWcyIGlucHV0cyBmcm9tIE9WQy5cbiAgICogQHBhcmFtIG92Y0pzb24gSlNPTiBvYmplY3QgcHJvdmlkZWQgYnkgT1ZDIHdpdGggZmllbGRzIHBzYnRIZXggYW5kIHdhbGxldElkXG4gICAqL1xuICBhc3luYyBzaWduUHNidEZyb21PVkMob3ZjSnNvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gICAgYXNzZXJ0KG92Y0pzb25bJ3BzYnRIZXgnXSwgJ292Y0pzb24gbXVzdCBjb250YWluIHBzYnRIZXgnKTtcbiAgICBhc3NlcnQob3ZjSnNvblsnd2FsbGV0SWQnXSwgJ292Y0pzb24gbXVzdCBjb250YWluIHdhbGxldElkJyk7XG4gICAgY29uc3QgaGV4ID0gb3ZjSnNvblsncHNidEhleCddIGFzIHN0cmluZztcbiAgICBjb25zdCB3YWxsZXRJZCA9IG92Y0pzb25bJ3dhbGxldElkJ10gYXMgc3RyaW5nO1xuICAgIGNvbnN0IHBzYnQgPSBhd2FpdCB0aGlzLmdldE11c2lnMk5vbmNlcyh0aGlzLmRlY29kZVRyYW5zYWN0aW9uQXNQc2J0KGhleCksIHdhbGxldElkKTtcbiAgICByZXR1cm4gXy5leHRlbmQob3ZjSnNvbiwgeyB0eEhleDogZW5jb2RlVHJhbnNhY3Rpb24ocHNidCkudG9TdHJpbmcoJ2hleCcpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcyAtIHtAc2VlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnN9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj59XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBTaWduVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24gfCBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyPih0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIGEgY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24uIEV4YW1wbGUgdXNlIGNhc2UgaXMgZXhwcmVzcyBleHRlcm5hbCBzaWduZXJcbiAgICogQHBhcmFtIGN1c3RvbVNpZ25pbmdGdW5jdGlvbiBjdXN0b20gc2lnbmluZyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzaW5nbGUgc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBzaWduVHJhbnNhY3Rpb25QYXJhbXMgcGFyYW1ldGVycyBmb3IgY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24uIEluY2x1ZGVzIHR4UHJlYnVpbGQgYW5kIHB1YnNcbiAgICpcbiAgICogQHJldHVybnMgc2lnbmVkIHRyYW5zYWN0aW9uIGFzIGhleCBzdHJpbmdcbiAgICovXG4gIGFzeW5jIHNpZ25XaXRoQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICAgIGN1c3RvbVNpZ25pbmdGdW5jdGlvbjogVXR4b0N1c3RvbVNpZ25pbmdGdW5jdGlvbjxUTnVtYmVyPixcbiAgICBzaWduVHJhbnNhY3Rpb25QYXJhbXM6IHsgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjsgcHViczogc3RyaW5nW10gfVxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSBzaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZC50eEhleDtcbiAgICBhc3NlcnQodHhIZXgsICdtaXNzaW5nIHR4SGV4IHBhcmFtZXRlcicpO1xuXG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKHR4SGV4KTtcblxuICAgIGNvbnN0IGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQgPSBoYXNLZXlQYXRoU3BlbmRJbnB1dCh0eCwgc2lnblRyYW5zYWN0aW9uUGFyYW1zLnB1YnMsIHRoaXMubmFtZSk7XG5cbiAgICBpZiAoIWlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQpIHtcbiAgICAgIHJldHVybiBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsIGNvaW46IHRoaXMgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ2V0VHhIZXggPSAodjogU2lnbmVkVHJhbnNhY3Rpb24pOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKCd0eEhleCcgaW4gdikge1xuICAgICAgICByZXR1cm4gdi50eEhleDtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbm90IGZvdW5kIGluIHNpZ25UcmFuc2FjdGlvbiByZXN1bHQnKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc2lnbmVyTm9uY2VUeCA9IGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyxcbiAgICAgIGNvaW46IHRoaXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YnMgfSA9IHNpZ25UcmFuc2FjdGlvblBhcmFtcztcbiAgICBhc3NlcnQocHVicyA9PT0gdW5kZWZpbmVkIHx8IGlzVHJpcGxlKHB1YnMpKTtcblxuICAgIGNvbnN0IGNvc2lnbmVyTm9uY2VUeCA9IGF3YWl0IHRoaXMuc2lnblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHB1YnMsXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLCB0eEhleDogZ2V0VHhIZXgoc2lnbmVyTm9uY2VUeCkgfSxcbiAgICAgIHNpZ25pbmdTdGVwOiAnY29zaWduZXJOb25jZScsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHtcbiAgICAgIC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcyxcbiAgICAgIHR4UHJlYnVpbGQ6IHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLnR4UHJlYnVpbGQsIHR4SGV4OiBnZXRUeEhleChjb3NpZ25lck5vbmNlVHgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ3NpZ25lclNpZ25hdHVyZScsXG4gICAgICBjb2luOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB1bnNwZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaXNCaXRHb1RhaW50ZWRVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHVuc3BlbnQ6IFVuc3BlbnQ8VE51bWJlcj4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNSZXBsYXlQcm90ZWN0aW9uVW5zcGVudCh1bnNwZW50LCB0aGlzLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29tcG9zZSBhIHJhdyBwc2J0L3RyYW5zYWN0aW9uIGludG8gdXNlZnVsIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSB0b3RhbCBhbW91bnRzLFxuICAgKiBjaGFuZ2UgYW1vdW50cywgYW5kIHRyYW5zYWN0aW9uIG91dHB1dHMuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4sXG4gICAgd2FsbGV0PzogSVdhbGxldFxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBpZiAoIXBhcmFtcy5wdWJzKSB7XG4gICAgICAvLyBpZiBubyBwdWJzIGFyZSBwcm92aWRlZCwgb3Bwb3J0dW5pc3RpY2FsbHkgZmV0Y2ggdGhlIGtleWNoYWlucyBmcm9tIHRoZSB3YWxsZXRcbiAgICAgIGlmICh3YWxsZXQpIHtcbiAgICAgICAgY29uc3Qga2V5Y2hhaW5zID0gYXdhaXQgZmV0Y2hLZXljaGFpbnModGhpcywgd2FsbGV0KTtcbiAgICAgICAgcGFyYW1zLnB1YnMgPSB0b0JpcDMyVHJpcGxlKGtleWNoYWlucykubWFwKChrKSA9PiBrLm5ldXRlcmVkKCkudG9CYXNlNTgoKSkgYXMgVHJpcGxlPHN0cmluZz47XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3YWxsZXQgJiYgaXNEZXNjcmlwdG9yV2FsbGV0KHdhbGxldCkpIHtcbiAgICAgIC8vIERlc2NyaXB0b3Igd2FsbGV0cyBkZWNvZGUgcHJlYnVpbGQgYnl0ZXMgc3RyYWlnaHQgaW50byB0aGUgd2FzbS11dHhvXG4gICAgICAvLyBkZXNjcmlwdG9yIFBzYnQsIHNraXBwaW5nIHRoZSBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQgaW50ZXJtZWRpYXRlLlxuICAgICAgcmV0dXJuIGV4cGxhaW5UeChkZWNvZGVEZXNjcmlwdG9yUHNidChwYXJhbXMpLCB7IC4uLnBhcmFtcywgd2FsbGV0IH0sIHRoaXMubmFtZSk7XG4gICAgfVxuICAgIHJldHVybiBleHBsYWluVHgodGhpcy5kZWNvZGVUcmFuc2FjdGlvbkZyb21QcmVidWlsZChwYXJhbXMpLCB7IC4uLnBhcmFtcywgd2FsbGV0IH0sIHRoaXMubmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2Uge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtcyAtIHtAc2VlIGJhY2t1cEtleVJlY292ZXJ5fVxuICAgKi9cbiAgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiBiYWNrdXBLZXlSZWNvdmVyeT4ge1xuICAgIHJldHVybiBiYWNrdXBLZXlSZWNvdmVyeSh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgYXN5bmMgcmVjb3ZlclYxKHBhcmFtczogVjFSZWNvdmVyUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgdjFCYWNrdXBLZXlSZWNvdmVyeT4ge1xuICAgIHJldHVybiB2MUJhY2t1cEtleVJlY292ZXJ5KHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICBhc3luYyBzd2VlcFYxKHBhcmFtczogVjFTd2VlcFBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIHYxU3dlZXA+IHtcbiAgICByZXR1cm4gdjFTd2VlcCh0aGlzLCB0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgY29pbiB0aGF0IHdhcyBzZW50IHRvIHdyb25nIGNoYWluXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHBhcmFtIHBhcmFtcy50eGlkIFRoZSB0eGlkIG9mIHRoZSBmYXVsdHkgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUFkZHJlc3MgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMucmVjb3ZlcnlDb2luIHRoZSBjb2luIHR5cGUgb2YgdGhlIHdhbGxldCB0aGF0IHJlY2VpdmVkIHRoZSBmdW5kc1xuICAgKiBAcGFyYW0gcGFyYW1zLnNpZ25lZCByZXR1cm4gYSBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiAoZGVmYXVsdD10cnVlKVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgdGhlIHdhbGxldCBwYXNzcGhyYXNlXG4gICAqIEBwYXJhbSBwYXJhbXMueHBydiB0aGUgdW5lbmNyeXB0ZWQgeHBydiAodXNlZCBpbnN0ZWFkIG9mIHdhbGxldCBwYXNzcGhyYXNlKVxuICAgKiBAcGFyYW0gcGFyYW1zLmFwaUtleSBmb3IgdXR4byBjb2lucyBvdGhlciB0aGFuIFtCVEMsVEJUQ10gdGhpcyBpcyBhIEJsb2NrIENoYWlyIGFwaSBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBhc3luYyByZWNvdmVyRnJvbVdyb25nQ2hhaW48VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zXG4gICk6IFByb21pc2U8Q3Jvc3NDaGFpblJlY292ZXJ5U2lnbmVkPFROdW1iZXI+IHwgQ3Jvc3NDaGFpblJlY292ZXJ5VW5zaWduZWQ8VE51bWJlcj4+IHtcbiAgICBjb25zdCB7IHR4aWQsIHJlY292ZXJ5QWRkcmVzcywgd2FsbGV0LCB3YWxsZXRQYXNzcGhyYXNlLCB4cHJ2LCBhcGlLZXkgfSA9IHBhcmFtcztcblxuICAgIC8vIHBhcmFtcy5yZWNvdmVyeUNvaW4gdXNlZCB0byBiZSBwYXJhbXMuY29pbiwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCByZWNvdmVyeUNvaW4gPSBwYXJhbXMuY29pbiB8fCBwYXJhbXMucmVjb3ZlcnlDb2luO1xuICAgIGlmICghcmVjb3ZlcnlDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgb2JqZWN0IHJlY292ZXJ5Q29pbicpO1xuICAgIH1cbiAgICAvLyBzaWduZWQgc2hvdWxkIGRlZmF1bHQgdG8gdHJ1ZSwgYW5kIG9ubHkgYmUgZGlzYWJsZWQgaWYgZXhwbGljaXRseSBzZXQgdG8gZmFsc2UgKG5vdCB1bmRlZmluZWQpXG4gICAgY29uc3Qgc2lnbmVkID0gcGFyYW1zLnNpZ25lZCAhPT0gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VDb2luRmFtaWx5ID0gdGhpcy5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCByZWNvdmVyeUNvaW5GYW1pbHkgPSByZWNvdmVyeUNvaW4uZ2V0RmFtaWx5KCk7XG4gICAgY29uc3Qgc3VwcG9ydGVkUmVjb3ZlcnlDb2lucyA9IHN1cHBvcnRlZENyb3NzQ2hhaW5SZWNvdmVyaWVzW3NvdXJjZUNvaW5GYW1pbHldO1xuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQoc3VwcG9ydGVkUmVjb3ZlcnlDb2lucykgfHwgIXN1cHBvcnRlZFJlY292ZXJ5Q29pbnMuaW5jbHVkZXMocmVjb3ZlcnlDb2luRmFtaWx5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBvZiAke3NvdXJjZUNvaW5GYW1pbHl9IGJhbGFuY2VzIGZyb20gJHtyZWNvdmVyeUNvaW5GYW1pbHl9IHdhbGxldHMgaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgcmVjb3ZlckNyb3NzQ2hhaW48VE51bWJlcj4odGhpcy5iaXRnbywge1xuICAgICAgc291cmNlQ29pbjogdGhpcyxcbiAgICAgIHJlY292ZXJ5Q29pbixcbiAgICAgIHdhbGxldElkOiB3YWxsZXQsXG4gICAgICB0eGlkLFxuICAgICAgcmVjb3ZlcnlBZGRyZXNzLFxuICAgICAgd2FsbGV0UGFzc3BocmFzZTogc2lnbmVkID8gd2FsbGV0UGFzc3BocmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHhwcnY6IHNpZ25lZCA/IHhwcnYgOiB1bmRlZmluZWQsXG4gICAgICBhcGlLZXksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmlwMzIga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHB1YiBhbmQgcHJ2XG4gICAqL1xuICBnZW5lcmF0ZUtleVBhaXIoc2VlZDogQnVmZmVyKTogeyBwdWI6IHN0cmluZzsgcHJ2OiBzdHJpbmcgfSB7XG4gICAgaWYgKCFzZWVkKSB7XG4gICAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAgIC8vIG1heGltdW0gZW50cm9weSBhbmQgZ2l2ZXMgdXMgbWF4aW11bSBzZWN1cml0eSBhZ2FpbnN0IGNyYWNraW5nLlxuICAgICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICAgIH1cbiAgICBjb25zdCBleHRlbmRlZEtleSA9IEJJUDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKSxcbiAgICAgIHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIGRlZmF1bHQgdHJhbnNhY3Rpb24gZm9ybWF0IGJhc2VkIG9uIHdhbGxldCBwcm9wZXJ0aWVzIGFuZCBuZXR3b3JrXG4gICAqIEBwYXJhbSB3YWxsZXQgLSBUaGUgd2FsbGV0IHRvIGNoZWNrXG4gICAqIEBwYXJhbSByZXF1ZXN0ZWRGb3JtYXQgLSBPcHRpb25hbCBleHBsaWNpdGx5IHJlcXVlc3RlZCBmb3JtYXRcbiAgICogQHJldHVybnMgVGhlIHRyYW5zYWN0aW9uIGZvcm1hdCB0byB1c2UsIG9yIHVuZGVmaW5lZCBpZiBubyBkZWZhdWx0IGFwcGxpZXNcbiAgICovXG4gIGdldERlZmF1bHRUeEZvcm1hdCh3YWxsZXQ6IFdhbGxldCwgcmVxdWVzdGVkRm9ybWF0PzogVHhGb3JtYXQpOiBUeEZvcm1hdCB7XG4gICAgaWYgKHJlcXVlc3RlZEZvcm1hdCA9PT0gJ2xlZ2FjeScpIHtcbiAgICAgIHJldHVybiAncHNidC1saXRlJztcbiAgICB9XG4gICAgcmV0dXJuIHJlcXVlc3RlZEZvcm1hdCA/PyAncHNidC1saXRlJztcbiAgfVxuXG4gIGFzeW5jIGdldEV4dHJhUHJlYnVpbGRQYXJhbXMoYnVpbGRQYXJhbXM6IEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zICYgeyB3YWxsZXQ6IFdhbGxldCB9KTogUHJvbWlzZTx7XG4gICAgdHhGb3JtYXQ/OiBUeEZvcm1hdDtcbiAgICBjaGFuZ2VBZGRyZXNzVHlwZT86IFNjcmlwdFR5cGUyT2YzW10gfCBTY3JpcHRUeXBlMk9mMztcbiAgICBhbGxvd2VkSW5wdXRTY3JpcHRUeXBlcz86IFNjcmlwdFR5cGUyT2YzW107XG4gIH0+IHtcbiAgICBjb25zdCByZXF1ZXN0ZWRGb3JtYXQgPSBidWlsZFBhcmFtcy50eEZvcm1hdCBhcyBUeEZvcm1hdCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0eEZvcm1hdCA9IHRoaXMuZ2V0RGVmYXVsdFR4Rm9ybWF0KGJ1aWxkUGFyYW1zLndhbGxldCwgcmVxdWVzdGVkRm9ybWF0KTtcbiAgICBsZXQgY2hhbmdlQWRkcmVzc1R5cGUgPSBidWlsZFBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSBhcyBTY3JpcHRUeXBlMk9mM1tdIHwgU2NyaXB0VHlwZTJPZjMgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBpZiB0aGUgYWRkcmVzc1R5cGUgaXMgbm90IHNwZWNpZmllZCwgd2UgbmVlZCB0byBkZWZhdWx0IHRvIHAydHJNdXNpZzIgZm9yIHRlc3RuZXQgaG90IHdhbGxldHMgZm9yIHN0YWdlZCByb2xsb3V0IG9mIHAydHJNdXNpZzJcbiAgICBpZiAoXG4gICAgICBidWlsZFBhcmFtcy5hZGRyZXNzVHlwZSA9PT0gdW5kZWZpbmVkICYmIC8vIGFkZHJlc3NUeXBlIGlzIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGBjaGFuZ2VBZGRyZXNzYFxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzcyA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBidWlsZFBhcmFtcy53YWxsZXQudHlwZSgpID09PSAnaG90J1xuICAgICkge1xuICAgICAgY2hhbmdlQWRkcmVzc1R5cGUgPSBbJ3AydHJNdXNpZzInLCAncDJ3c2gnLCAncDJzaFAyd3NoJywgJ3Ayc2gnLCAncDJ0ciddO1xuICAgIH1cblxuICAgIC8vIGdldEhhbGZTaWduZWRMZWdhY3lGb3JtYXQoKSBvbmx5IHN1cHBvcnRzIHAybXMtYmFzZWQgdHlwZXMgKHAyc2gsIHAyc2hQMndzaCwgcDJ3c2gpLlxuICAgIC8vIEZpbHRlciBjaGFuZ2Ugb3V0cHV0cyBhbmQgcmVzdHJpY3QgaW5wdXQgc2VsZWN0aW9uIHRvIHRoZXNlIHR5cGVzLlxuICAgIGNvbnN0IGxlZ2FjeUNvbXBhdGlibGVUeXBlczogU2NyaXB0VHlwZTJPZjNbXSA9IFsncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJ3c2gnXTtcbiAgICBsZXQgYWxsb3dlZElucHV0U2NyaXB0VHlwZXM6IFNjcmlwdFR5cGUyT2YzW10gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocmVxdWVzdGVkRm9ybWF0ID09PSAnbGVnYWN5Jykge1xuICAgICAgYWxsb3dlZElucHV0U2NyaXB0VHlwZXMgPSBsZWdhY3lDb21wYXRpYmxlVHlwZXM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGFuZ2VBZGRyZXNzVHlwZSkpIHtcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGUgPSBjaGFuZ2VBZGRyZXNzVHlwZS5maWx0ZXIoKHQpOiB0IGlzIFNjcmlwdFR5cGUyT2YzID0+XG4gICAgICAgICAgbGVnYWN5Q29tcGF0aWJsZVR5cGVzLmluY2x1ZGVzKHQgYXMgU2NyaXB0VHlwZTJPZjMpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZUFkZHJlc3NUeXBlICE9PSB1bmRlZmluZWQgJiYgIWxlZ2FjeUNvbXBhdGlibGVUeXBlcy5pbmNsdWRlcyhjaGFuZ2VBZGRyZXNzVHlwZSkpIHtcbiAgICAgICAgY2hhbmdlQWRkcmVzc1R5cGUgPSBsZWdhY3lDb21wYXRpYmxlVHlwZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4Rm9ybWF0LFxuICAgICAgY2hhbmdlQWRkcmVzc1R5cGUsXG4gICAgICBhbGxvd2VkSW5wdXRTY3JpcHRUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgcHJlQ3JlYXRlQml0R28ocGFyYW1zOiBQcmVjcmVhdGVCaXRHb09wdGlvbnMpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhc3luYyBwcmVzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBQcmVzaWduVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAocGFyYW1zLndhbGxldERhdGEgJiYgaXNVdHhvV2FsbGV0RGF0YShwYXJhbXMud2FsbGV0RGF0YSkgJiYgaXNEZXNjcmlwdG9yV2FsbGV0RGF0YShwYXJhbXMud2FsbGV0RGF0YSkpIHtcbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0dXJuTGVnYWN5Rm9ybWF0ID0gKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikudHhGb3JtYXQgPT09ICdsZWdhY3knO1xuICAgIHJldHVybiB7IC4uLnBhcmFtcywgcmV0dXJuTGVnYWN5Rm9ybWF0IH07XG4gIH1cblxuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICAgIGtleWNoYWluczogS2V5Y2hhaW5zVHJpcGxldFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRSZWNvdmVyeVByb3ZpZGVyKGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlciB7XG4gICAgcmV0dXJuIGZvckNvaW4odGhpcy5nZXRDaGFpbigpLCBhcGlUb2tlbik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoe1xuICAgIG11bHRpU2lnVHlwZSxcbiAgICBwdWJsaWNLZXksXG4gICAgcHJ2LFxuICB9OiB7XG4gICAgbXVsdGlTaWdUeXBlOiBNdWx0aXNpZ1R5cGU7XG4gICAgcHVibGljS2V5OiBzdHJpbmc7XG4gICAgcHJ2OiBzdHJpbmc7XG4gIH0pOiB2b2lkIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlID09PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0c3MgYXVkaXRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb2luJyk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZFBydihwcnYpICYmICFpc1ZhbGlkWHBydihwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKHB1YmxpY0tleSkge1xuICAgICAgY29uc3QgZ2VuUHViS2V5ID0gQklQMzIuZnJvbUJhc2U1OChwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICAgIGlmIChnZW5QdWJLZXkgIT09IHB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmxpYyBrZXkgZG9lcyBub3QgbWF0Y2ggcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==