@bitgo/abstract-utxo 10.6.0 → 10.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. package/dist/{src → cjs/src}/abstractUtxoCoin.d.ts +18 -68
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  3. package/dist/cjs/src/abstractUtxoCoin.js +645 -0
  4. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  5. package/dist/cjs/src/address/fixedScript.js +150 -0
  6. package/dist/cjs/src/address/index.d.ts.map +1 -0
  7. package/dist/{src → cjs/src}/address/index.js +1 -1
  8. package/dist/cjs/src/config.d.ts.map +1 -0
  9. package/dist/cjs/src/config.js +14 -0
  10. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  11. package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
  12. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  13. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
  14. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  15. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  16. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  17. package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
  18. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  20. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  21. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  22. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  23. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  24. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  25. package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
  26. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  27. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  28. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  29. package/dist/{src → cjs/src}/descriptor/index.js +1 -1
  30. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  32. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  33. package/dist/cjs/src/impl/bch/bch.js +74 -0
  34. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  35. package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
  36. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  37. package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
  38. package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -1
  39. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  40. package/dist/cjs/src/impl/bcha/bcha.js +48 -0
  41. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  42. package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
  43. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  44. package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
  45. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  46. package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
  47. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  48. package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
  49. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  50. package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
  51. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  52. package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
  53. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  54. package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
  55. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  56. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
  57. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  58. package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
  59. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  60. package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
  61. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  62. package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
  63. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  64. package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
  65. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  66. package/dist/{src → cjs/src}/impl/btg/btg.js +1 -1
  67. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  68. package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
  69. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  70. package/dist/{src → cjs/src}/impl/dash/dash.js +1 -1
  71. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  72. package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
  73. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  74. package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
  75. package/dist/{src → cjs/src}/impl/doge/doge.d.ts +4 -2
  76. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  77. package/dist/cjs/src/impl/doge/doge.js +79 -0
  78. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  79. package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
  80. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  81. package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
  82. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  83. package/dist/{src → cjs/src}/impl/index.js +1 -1
  84. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  85. package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
  86. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  87. package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
  88. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  89. package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
  90. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  91. package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
  92. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  93. package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
  94. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  95. package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
  96. package/dist/cjs/src/index.d.ts.map +1 -0
  97. package/dist/{src → cjs/src}/index.js +1 -1
  98. package/dist/cjs/src/keychains.d.ts.map +1 -0
  99. package/dist/cjs/src/keychains.js +104 -0
  100. package/dist/cjs/src/names.d.ts.map +1 -0
  101. package/dist/cjs/src/names.js +214 -0
  102. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  103. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
  104. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  105. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  106. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  107. package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
  108. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  109. package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
  110. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  111. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  112. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  113. package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
  114. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  115. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  116. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  117. package/dist/cjs/src/recovery/backupKeyRecovery.js +370 -0
  118. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  119. package/dist/cjs/src/recovery/baseApi.js +73 -0
  120. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  121. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  122. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  123. package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
  124. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  125. package/dist/{src → cjs/src}/recovery/index.js +1 -1
  126. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  127. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  128. package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
  129. package/dist/cjs/src/replayProtection.d.ts.map +1 -0
  130. package/dist/cjs/src/replayProtection.js +58 -0
  131. package/dist/cjs/src/sign.d.ts.map +1 -0
  132. package/dist/cjs/src/sign.js +205 -0
  133. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  134. package/dist/cjs/src/transaction/bip322.js +125 -0
  135. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  136. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  137. package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
  138. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  139. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
  140. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  141. package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
  142. package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +2 -1
  143. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  144. package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
  145. package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +2 -1
  146. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  147. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  148. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  149. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  150. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  151. package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
  152. package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +2 -1
  153. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  154. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
  155. package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
  156. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  157. package/dist/cjs/src/transaction/explainTransaction.js +88 -0
  158. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  159. package/dist/cjs/src/transaction/fetchInputs.js +109 -0
  160. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  161. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  162. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +43 -0
  163. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +64 -0
  164. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  165. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +321 -0
  166. package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
  167. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  168. package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
  169. package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +3 -1
  170. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  171. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +217 -0
  172. package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +2 -1
  173. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  174. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +215 -0
  175. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  176. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
  177. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  178. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
  179. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  180. package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
  181. package/dist/{src → cjs/src}/transaction/index.d.ts +1 -0
  182. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  183. package/dist/{src → cjs/src}/transaction/index.js +2 -1
  184. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  185. package/dist/cjs/src/transaction/outputDifference.js +47 -0
  186. package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +2 -1
  187. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  188. package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
  189. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  190. package/dist/cjs/src/transaction/recipient.js +88 -0
  191. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  192. package/dist/cjs/src/transaction/signTransaction.js +102 -0
  193. package/dist/cjs/src/transaction/types.d.ts +44 -0
  194. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  195. package/dist/cjs/src/transaction/types.js +3 -0
  196. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  197. package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
  198. package/dist/{src → cjs/src}/verifyKey.d.ts +2 -1
  199. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  200. package/dist/cjs/src/verifyKey.js +164 -0
  201. package/dist/cjs/src/wallet.d.ts.map +1 -0
  202. package/dist/cjs/src/wallet.js +8 -0
  203. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  204. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  205. package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
  206. package/dist/cjs/test/unit/address.d.ts +2 -0
  207. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  208. package/dist/cjs/test/unit/address.js +182 -0
  209. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  210. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  211. package/dist/cjs/test/unit/bip322.js +45 -0
  212. package/dist/cjs/test/unit/coins.d.ts +2 -0
  213. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  214. package/dist/cjs/test/unit/coins.js +97 -0
  215. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  216. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/customChangeWallet.js +154 -0
  218. package/dist/cjs/test/unit/customSigner.d.ts +3 -0
  219. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  220. package/dist/cjs/test/unit/customSigner.js +108 -0
  221. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  222. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
  224. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  225. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  226. package/dist/cjs/test/unit/descriptor/builder.js +72 -0
  227. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  228. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
  230. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  231. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  232. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
  233. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  234. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  235. package/dist/cjs/test/unit/descriptorAddress.js +102 -0
  236. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  237. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/explainTransaction.js +74 -0
  239. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
  240. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
  242. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  243. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  244. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  245. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  246. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  247. package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
  248. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  249. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  250. package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
  251. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  252. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  253. package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
  254. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
  255. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
  256. package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
  257. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
  258. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
  259. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
  260. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
  261. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
  262. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
  263. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  264. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  265. package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
  266. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  267. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  268. package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
  269. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  270. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  271. package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
  272. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
  273. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
  274. package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
  275. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  276. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  277. package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
  278. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  279. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  280. package/dist/cjs/test/unit/keySignatures.js +54 -0
  281. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  282. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  283. package/dist/cjs/test/unit/keychains.js +49 -0
  284. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  285. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  286. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  287. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  288. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  289. package/dist/cjs/test/unit/parseTransaction.js +125 -0
  290. package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
  291. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  292. package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
  293. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  294. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  295. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +285 -0
  296. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  297. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  298. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
  299. package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
  300. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  301. package/dist/cjs/test/unit/recovery/mock.js +138 -0
  302. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  303. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  304. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
  305. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  306. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  307. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
  308. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
  309. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
  310. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
  311. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  312. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  313. package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
  314. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  315. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  316. package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
  317. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  318. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  319. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
  320. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  321. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  322. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +101 -0
  323. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  324. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  325. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +288 -0
  326. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts +3 -0
  327. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts.map +1 -0
  328. package/dist/cjs/test/unit/transaction/fixedScript/util.js +46 -0
  329. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  330. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  331. package/dist/cjs/test/unit/transaction.js +501 -0
  332. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  333. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  334. package/dist/cjs/test/unit/txFormat.js +174 -0
  335. package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
  336. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  337. package/dist/cjs/test/unit/util/fixtures.js +102 -0
  338. package/dist/cjs/test/unit/util/index.d.ts +7 -0
  339. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  340. package/dist/cjs/test/unit/util/index.js +23 -0
  341. package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
  342. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  343. package/dist/cjs/test/unit/util/keychains.js +72 -0
  344. package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
  345. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  346. package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
  347. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  348. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  349. package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
  350. package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
  351. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  352. package/dist/cjs/test/unit/util/transaction.js +107 -0
  353. package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
  354. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  355. package/dist/cjs/test/unit/util/unspents.js +106 -0
  356. package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
  357. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  358. package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
  359. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  360. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  361. package/dist/cjs/test/unit/util/wallet.js +9 -0
  362. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  363. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  364. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  365. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  366. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  367. package/dist/cjs/test/unit/wallet.js +248 -0
  368. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  369. package/dist/esm/abstractUtxoCoin.d.ts +425 -0
  370. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  371. package/dist/esm/abstractUtxoCoin.js +604 -0
  372. package/dist/esm/address/fixedScript.d.ts +51 -0
  373. package/dist/esm/address/fixedScript.js +109 -0
  374. package/dist/esm/address/index.d.ts +2 -0
  375. package/dist/esm/address/index.js +2 -0
  376. package/dist/esm/config.d.ts +9 -0
  377. package/dist/esm/config.js +11 -0
  378. package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
  379. package/dist/esm/descriptor/NamedDescriptor.js +39 -0
  380. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  381. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  382. package/dist/esm/descriptor/builder/builder.d.ts +13 -0
  383. package/dist/esm/descriptor/builder/builder.js +34 -0
  384. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  385. package/dist/esm/descriptor/builder/index.js +3 -0
  386. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  387. package/dist/esm/descriptor/builder/parse.js +112 -0
  388. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  389. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  390. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  391. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  392. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  393. package/dist/esm/descriptor/createWallet/index.js +3 -0
  394. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  395. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  396. package/dist/esm/descriptor/index.d.ts +8 -0
  397. package/dist/esm/descriptor/index.js +7 -0
  398. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  399. package/dist/esm/descriptor/validatePolicy.js +80 -0
  400. package/dist/esm/impl/bch/bch.d.ts +20 -0
  401. package/dist/{src → esm}/impl/bch/bch.d.ts.map +1 -1
  402. package/dist/esm/impl/bch/bch.js +37 -0
  403. package/dist/esm/impl/bch/index.d.ts +3 -0
  404. package/dist/esm/impl/bch/index.js +3 -0
  405. package/dist/esm/impl/bch/tbch.d.ts +10 -0
  406. package/dist/esm/impl/bch/tbch.js +11 -0
  407. package/dist/esm/impl/bcha/bcha.d.ts +8 -0
  408. package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +1 -1
  409. package/dist/esm/impl/bcha/bcha.js +11 -0
  410. package/dist/esm/impl/bcha/index.d.ts +3 -0
  411. package/dist/esm/impl/bcha/index.js +3 -0
  412. package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
  413. package/dist/esm/impl/bcha/tbcha.js +11 -0
  414. package/dist/esm/impl/bsv/bsv.d.ts +8 -0
  415. package/dist/esm/impl/bsv/bsv.js +11 -0
  416. package/dist/esm/impl/bsv/index.d.ts +3 -0
  417. package/dist/esm/impl/bsv/index.js +3 -0
  418. package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
  419. package/dist/esm/impl/bsv/tbsv.js +11 -0
  420. package/dist/esm/impl/btc/btc.d.ts +13 -0
  421. package/dist/esm/impl/btc/btc.js +18 -0
  422. package/dist/esm/impl/btc/index.d.ts +7 -0
  423. package/dist/esm/impl/btc/index.js +7 -0
  424. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
  425. package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
  426. package/dist/esm/impl/btc/tbtc.d.ts +10 -0
  427. package/dist/esm/impl/btc/tbtc.js +11 -0
  428. package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
  429. package/dist/esm/impl/btc/tbtc4.js +11 -0
  430. package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
  431. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  432. package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
  433. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  434. package/dist/esm/impl/btg/btg.d.ts +7 -0
  435. package/dist/esm/impl/btg/btg.js +11 -0
  436. package/dist/esm/impl/btg/index.d.ts +2 -0
  437. package/dist/esm/impl/btg/index.js +2 -0
  438. package/dist/esm/impl/dash/dash.d.ts +7 -0
  439. package/dist/esm/impl/dash/dash.js +11 -0
  440. package/dist/esm/impl/dash/index.d.ts +3 -0
  441. package/dist/esm/impl/dash/index.js +3 -0
  442. package/dist/esm/impl/dash/tdash.d.ts +10 -0
  443. package/dist/esm/impl/dash/tdash.js +11 -0
  444. package/dist/esm/impl/doge/doge.d.ts +32 -0
  445. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  446. package/dist/esm/impl/doge/doge.js +75 -0
  447. package/dist/esm/impl/doge/index.d.ts +3 -0
  448. package/dist/esm/impl/doge/index.js +3 -0
  449. package/dist/esm/impl/doge/tdoge.d.ts +10 -0
  450. package/dist/esm/impl/doge/tdoge.js +11 -0
  451. package/dist/esm/impl/index.d.ts +10 -0
  452. package/dist/esm/impl/index.js +10 -0
  453. package/dist/esm/impl/ltc/index.d.ts +3 -0
  454. package/dist/esm/impl/ltc/index.js +3 -0
  455. package/dist/esm/impl/ltc/ltc.d.ts +7 -0
  456. package/dist/esm/impl/ltc/ltc.js +15 -0
  457. package/dist/esm/impl/ltc/tltc.d.ts +7 -0
  458. package/dist/esm/impl/ltc/tltc.js +14 -0
  459. package/dist/esm/impl/zec/index.d.ts +3 -0
  460. package/dist/esm/impl/zec/index.js +3 -0
  461. package/dist/esm/impl/zec/tzec.d.ts +7 -0
  462. package/dist/esm/impl/zec/tzec.js +11 -0
  463. package/dist/esm/impl/zec/zec.d.ts +10 -0
  464. package/dist/esm/impl/zec/zec.js +11 -0
  465. package/dist/esm/index.d.ts +21 -0
  466. package/dist/esm/index.js +21 -0
  467. package/dist/esm/keychains.d.ts +48 -0
  468. package/dist/esm/keychains.js +61 -0
  469. package/dist/esm/names.d.ts +26 -0
  470. package/dist/esm/names.js +171 -0
  471. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
  472. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
  473. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  474. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  475. package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
  476. package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
  477. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  478. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  479. package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
  480. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  481. package/dist/esm/offlineVault/index.d.ts +6 -0
  482. package/dist/esm/offlineVault/index.js +4 -0
  483. package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
  484. package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
  485. package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
  486. package/dist/esm/recovery/backupKeyRecovery.js +329 -0
  487. package/dist/esm/recovery/baseApi.d.ts +24 -0
  488. package/dist/esm/recovery/baseApi.js +64 -0
  489. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  490. package/dist/esm/recovery/coingeckoApi.js +40 -0
  491. package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
  492. package/dist/esm/recovery/crossChainRecovery.js +325 -0
  493. package/dist/esm/recovery/index.d.ts +7 -0
  494. package/dist/esm/recovery/index.js +7 -0
  495. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  496. package/dist/esm/recovery/mempoolApi.js +29 -0
  497. package/dist/esm/replayProtection.d.ts +5 -0
  498. package/dist/esm/replayProtection.d.ts.map +1 -0
  499. package/dist/esm/replayProtection.js +20 -0
  500. package/dist/esm/sign.d.ts +54 -0
  501. package/dist/esm/sign.js +162 -0
  502. package/dist/esm/transaction/bip322.d.ts +27 -0
  503. package/dist/esm/transaction/bip322.js +86 -0
  504. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  505. package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
  506. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  507. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  508. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  509. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  510. package/dist/esm/transaction/descriptor/index.js +6 -0
  511. package/dist/esm/transaction/descriptor/parse.d.ts +16 -0
  512. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  513. package/dist/esm/transaction/descriptor/parse.js +79 -0
  514. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  515. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  516. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  517. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  518. package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
  519. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  520. package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
  521. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  522. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  523. package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
  524. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  525. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  526. package/dist/esm/transaction/explainTransaction.js +52 -0
  527. package/dist/esm/transaction/fetchInputs.d.ts +26 -0
  528. package/dist/esm/transaction/fetchInputs.js +72 -0
  529. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  530. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  531. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +40 -0
  532. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +64 -0
  533. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  534. package/dist/esm/transaction/fixedScript/explainTransaction.js +284 -0
  535. package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
  536. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  537. package/dist/esm/transaction/fixedScript/index.js +6 -0
  538. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  539. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  540. package/dist/esm/transaction/fixedScript/parseOutput.js +210 -0
  541. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  542. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  543. package/dist/esm/transaction/fixedScript/parseTransaction.js +176 -0
  544. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
  545. package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
  546. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  547. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  548. package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
  549. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  550. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  551. package/dist/esm/transaction/index.d.ts +8 -0
  552. package/dist/esm/transaction/index.d.ts.map +1 -0
  553. package/dist/esm/transaction/index.js +8 -0
  554. package/dist/esm/transaction/outputDifference.d.ts +40 -0
  555. package/dist/esm/transaction/outputDifference.js +42 -0
  556. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  557. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  558. package/dist/esm/transaction/parseTransaction.js +12 -0
  559. package/dist/esm/transaction/recipient.d.ts +29 -0
  560. package/dist/{src → esm}/transaction/recipient.d.ts.map +1 -1
  561. package/dist/esm/transaction/recipient.js +48 -0
  562. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  563. package/dist/esm/transaction/signTransaction.js +63 -0
  564. package/dist/esm/transaction/types.d.ts +44 -0
  565. package/dist/esm/transaction/types.d.ts.map +1 -0
  566. package/dist/esm/transaction/types.js +2 -0
  567. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  568. package/dist/esm/transaction/verifyTransaction.js +14 -0
  569. package/dist/esm/verifyKey.d.ts +29 -0
  570. package/dist/esm/verifyKey.d.ts.map +1 -0
  571. package/dist/esm/verifyKey.js +123 -0
  572. package/dist/esm/wallet.d.ts +15 -0
  573. package/dist/esm/wallet.js +5 -0
  574. package/package.json +32 -15
  575. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  576. package/dist/src/abstractUtxoCoin.js +0 -634
  577. package/dist/src/address/fixedScript.js +0 -150
  578. package/dist/src/config.js +0 -14
  579. package/dist/src/descriptor/NamedDescriptor.js +0 -79
  580. package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
  581. package/dist/src/descriptor/builder/builder.js +0 -37
  582. package/dist/src/descriptor/builder/parse.js +0 -116
  583. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
  584. package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
  585. package/dist/src/descriptor/descriptorWallet.js +0 -54
  586. package/dist/src/descriptor/validatePolicy.js +0 -92
  587. package/dist/src/impl/bch/bch.js +0 -70
  588. package/dist/src/impl/bcha/bcha.js +0 -58
  589. package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
  590. package/dist/src/impl/doge/doge.d.ts.map +0 -1
  591. package/dist/src/impl/doge/doge.js +0 -79
  592. package/dist/src/keychains.js +0 -104
  593. package/dist/src/names.js +0 -214
  594. package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
  595. package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
  596. package/dist/src/offlineVault/TransactionExplanation.js +0 -16
  597. package/dist/src/offlineVault/descriptor/transaction.js +0 -80
  598. package/dist/src/recovery/backupKeyRecovery.js +0 -370
  599. package/dist/src/recovery/baseApi.js +0 -73
  600. package/dist/src/recovery/coingeckoApi.js +0 -44
  601. package/dist/src/recovery/crossChainRecovery.js +0 -364
  602. package/dist/src/recovery/mempoolApi.js +0 -36
  603. package/dist/src/replayProtection.d.ts.map +0 -1
  604. package/dist/src/replayProtection.js +0 -53
  605. package/dist/src/sign.js +0 -205
  606. package/dist/src/transaction/bip322.js +0 -125
  607. package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
  608. package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
  609. package/dist/src/transaction/descriptor/parse.d.ts.map +0 -1
  610. package/dist/src/transaction/descriptor/parse.js +0 -116
  611. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +0 -1
  612. package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
  613. package/dist/src/transaction/descriptor/signPsbt.js +0 -43
  614. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +0 -1
  615. package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
  616. package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
  617. package/dist/src/transaction/explainTransaction.js +0 -67
  618. package/dist/src/transaction/fetchInputs.js +0 -109
  619. package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
  620. package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
  621. package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
  622. package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
  623. package/dist/src/transaction/fixedScript/parseOutput.d.ts.map +0 -1
  624. package/dist/src/transaction/fixedScript/parseOutput.js +0 -213
  625. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
  626. package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
  627. package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
  628. package/dist/src/transaction/fixedScript/verifyTransaction.d.ts.map +0 -1
  629. package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
  630. package/dist/src/transaction/index.d.ts.map +0 -1
  631. package/dist/src/transaction/outputDifference.js +0 -47
  632. package/dist/src/transaction/parseTransaction.d.ts.map +0 -1
  633. package/dist/src/transaction/recipient.js +0 -88
  634. package/dist/src/transaction/signTransaction.js +0 -102
  635. package/dist/src/verifyKey.d.ts.map +0 -1
  636. package/dist/src/verifyKey.js +0 -164
  637. package/dist/src/wallet.js +0 -8
  638. /package/dist/{src → cjs/src}/address/fixedScript.d.ts +0 -0
  639. /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
  640. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  641. /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
  642. /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
  643. /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
  644. /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
  645. /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
  646. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
  647. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
  648. /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
  649. /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
  650. /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
  651. /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
  652. /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
  653. /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
  654. /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
  655. /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
  656. /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
  657. /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
  658. /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
  659. /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
  660. /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
  661. /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
  662. /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
  663. /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
  664. /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
  665. /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
  666. /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
  667. /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
  668. /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
  669. /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
  670. /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
  671. /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
  672. /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
  673. /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
  674. /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
  675. /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
  676. /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
  677. /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
  678. /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
  679. /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
  680. /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
  681. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  682. /package/dist/{src → cjs/src}/keychains.d.ts +0 -0
  683. /package/dist/{src → cjs/src}/names.d.ts +0 -0
  684. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
  685. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
  686. /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
  687. /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
  688. /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
  689. /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
  690. /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
  691. /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
  692. /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
  693. /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
  694. /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
  695. /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
  696. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  697. /package/dist/{src → cjs/src}/sign.d.ts +0 -0
  698. /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
  699. /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
  700. /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
  701. /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
  702. /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
  703. /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
  704. /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
  705. /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
  706. /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
  707. /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
  708. /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
  709. /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
  710. /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
  711. /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
  712. /package/dist/{src → esm}/address/fixedScript.d.ts.map +0 -0
  713. /package/dist/{src → esm}/address/index.d.ts.map +0 -0
  714. /package/dist/{src → esm}/config.d.ts.map +0 -0
  715. /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
  716. /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
  717. /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
  718. /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
  719. /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
  720. /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
  721. /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
  722. /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
  723. /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
  724. /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
  725. /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
  726. /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
  727. /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
  728. /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
  729. /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
  730. /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
  731. /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
  732. /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
  733. /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
  734. /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
  735. /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
  736. /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
  737. /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
  738. /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
  739. /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
  740. /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
  741. /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
  742. /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
  743. /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
  744. /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
  745. /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
  746. /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
  747. /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
  748. /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
  749. /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
  750. /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
  751. /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
  752. /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
  753. /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
  754. /package/dist/{src → esm}/index.d.ts.map +0 -0
  755. /package/dist/{src → esm}/keychains.d.ts.map +0 -0
  756. /package/dist/{src → esm}/names.d.ts.map +0 -0
  757. /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
  758. /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
  759. /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
  760. /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
  761. /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
  762. /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
  763. /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
  764. /package/dist/{src → esm}/recovery/backupKeyRecovery.d.ts.map +0 -0
  765. /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
  766. /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
  767. /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
  768. /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
  769. /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
  770. /package/dist/{src → esm}/sign.d.ts.map +0 -0
  771. /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
  772. /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
  773. /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
  774. /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
  775. /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
  776. /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
  777. /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
  778. /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
  779. /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
  780. /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
  781. /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
  782. /package/dist/{src → esm}/wallet.d.ts.map +0 -0
@@ -0,0 +1,604 @@
1
+ import assert from 'assert';
2
+ import { randomBytes } from 'crypto';
3
+ import _ from 'lodash';
4
+ import * as utxolib from '@bitgo/utxo-lib';
5
+ import { bip32 } from '@bitgo/secp256k1';
6
+ import { bitgo, getMainnet, isMainnet, isTestnet } from '@bitgo/utxo-lib';
7
+ import { BaseCoin, InvalidAddressDerivationPropertyError, InvalidAddressError, isTriple, KeyIndices, multisigTypes, TxIntentMismatchRecipientError, isValidPrv, isValidXprv, } from '@bitgo/sdk-core';
8
+ import { backupKeyRecovery, forCoin, recoverCrossChain, v1BackupKeyRecovery, v1Sweep, } from './recovery';
9
+ import { isReplayProtectionUnspent } from './replayProtection';
10
+ import { supportedCrossChainRecoveries } from './config';
11
+ import { assertValidTransactionRecipient, explainTx, fromExtendedAddressFormat, isScriptRecipient, parseTransaction, verifyTransaction, } from './transaction';
12
+ import { AggregateValidationError, ErrorMissingOutputs, ErrorImplicitExternalOutputs, } from './transaction/descriptor/verifyTransaction';
13
+ import { assertDescriptorWalletAddress, getDescriptorMapFromWallet, isDescriptorWallet } from './descriptor';
14
+ import { getChainFromNetwork, getFamilyFromNetwork, getFullNameFromNetwork } from './names';
15
+ import { assertFixedScriptWalletAddress } from './address/fixedScript';
16
+ import { toBip32Triple } from './keychains';
17
+ import { verifyKeySignature, verifyUserPublicKey } from './verifyKey';
18
+ import { getPolicyForEnv } from './descriptor/validatePolicy';
19
+ import { signTransaction } from './transaction/signTransaction';
20
+ import { isUtxoWalletData } from './wallet';
21
+ import { isDescriptorWalletData } from './descriptor/descriptorWallet';
22
+ export class ErrorDeprecatedTxFormat extends Error {
23
+ constructor(txFormat) {
24
+ super(`SDK support for txFormat=${txFormat} is deprecated on this environment. Please use psbt instead.`);
25
+ }
26
+ }
27
+ const { isChainCode, scriptTypeForChain, outputScripts } = bitgo;
28
+ /**
29
+ * Convert ValidationError to TxIntentMismatchRecipientError with structured data
30
+ *
31
+ * This preserves the structured error information from the original ValidationError
32
+ * by extracting the mismatched outputs and converting them to the standardized format.
33
+ * The original error is preserved as the `cause` for debugging purposes.
34
+ */
35
+ function convertValidationErrorToTxIntentMismatch(error, reqId, txParams, txHex) {
36
+ const mismatchedRecipients = [];
37
+ for (const err of error.errors) {
38
+ if (err instanceof ErrorMissingOutputs) {
39
+ mismatchedRecipients.push(...err.missingOutputs.map((output) => ({
40
+ address: output.address,
41
+ amount: output.amount.toString(),
42
+ })));
43
+ }
44
+ else if (err instanceof ErrorImplicitExternalOutputs) {
45
+ mismatchedRecipients.push(...err.implicitExternalOutputs.map((output) => ({
46
+ address: output.address,
47
+ amount: output.amount.toString(),
48
+ })));
49
+ }
50
+ }
51
+ const txIntentError = new TxIntentMismatchRecipientError(error.message, reqId, [txParams], txHex, mismatchedRecipients);
52
+ // Preserve the original structured error as the cause for debugging
53
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause
54
+ txIntentError.cause = error;
55
+ return txIntentError;
56
+ }
57
+ export class AbstractUtxoCoin extends BaseCoin {
58
+ constructor(bitgo, network, amountType = 'number') {
59
+ super(bitgo);
60
+ if (!utxolib.isValidNetwork(network)) {
61
+ throw new Error('invalid network: please make sure to use the same version of ' +
62
+ '@bitgo/utxo-lib as this library when initializing an instance of this class');
63
+ }
64
+ this.amountType = amountType;
65
+ this._network = network;
66
+ }
67
+ get network() {
68
+ return this._network;
69
+ }
70
+ getChain() {
71
+ return getChainFromNetwork(this.network);
72
+ }
73
+ getFamily() {
74
+ return getFamilyFromNetwork(this.network);
75
+ }
76
+ getFullName() {
77
+ return getFullNameFromNetwork(this.network);
78
+ }
79
+ /** Indicates whether the coin supports a block target */
80
+ supportsBlockTarget() {
81
+ // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is
82
+ switch (getMainnet(this.network)) {
83
+ case utxolib.networks.bitcoin:
84
+ case utxolib.networks.dogecoin:
85
+ return true;
86
+ default:
87
+ return false;
88
+ }
89
+ }
90
+ sweepWithSendMany() {
91
+ return true;
92
+ }
93
+ /** @deprecated */
94
+ static get validAddressTypes() {
95
+ return [...outputScripts.scriptTypes2Of3];
96
+ }
97
+ /**
98
+ * Returns the factor between the base unit and its smallest subdivison
99
+ * @return {number}
100
+ */
101
+ getBaseFactor() {
102
+ return 1e8;
103
+ }
104
+ /**
105
+ * Check if an address is valid
106
+ * @param address
107
+ * @param param
108
+ */
109
+ isValidAddress(address, param) {
110
+ if (typeof param === 'boolean' && param) {
111
+ throw new Error('deprecated');
112
+ }
113
+ // By default, allow all address formats.
114
+ // At the time of writing, the only additional address format is bch cashaddr.
115
+ const anyFormat = param?.anyFormat ?? true;
116
+ try {
117
+ // Find out if the address is valid for any format. Tries all supported formats by default.
118
+ // Throws if address cannot be decoded with any format.
119
+ const [format, script] = utxolib.addressFormat.toOutputScriptAndFormat(address, this.network);
120
+ // unless anyFormat is set, only 'default' is allowed.
121
+ if (!anyFormat && format !== 'default') {
122
+ return false;
123
+ }
124
+ // make sure that address is in normal representation for given format.
125
+ return address === utxolib.addressFormat.fromOutputScriptWithFormat(script, format, this.network);
126
+ }
127
+ catch (e) {
128
+ return false;
129
+ }
130
+ }
131
+ /**
132
+ * Return boolean indicating whether input is valid public key for the coin.
133
+ *
134
+ * @param {String} pub the pub to be checked
135
+ * @returns {Boolean} is it valid?
136
+ */
137
+ isValidPub(pub) {
138
+ try {
139
+ return bip32.fromBase58(pub).isNeutered();
140
+ }
141
+ catch (e) {
142
+ return false;
143
+ }
144
+ }
145
+ preprocessBuildParams(params) {
146
+ if (params.recipients !== undefined) {
147
+ params.recipients =
148
+ params.recipients instanceof Array
149
+ ? params?.recipients?.map((recipient) => {
150
+ const { address, ...rest } = recipient;
151
+ return { ...rest, ...fromExtendedAddressFormat(address) };
152
+ })
153
+ : params.recipients;
154
+ }
155
+ return params;
156
+ }
157
+ /**
158
+ * Get the latest block height
159
+ * @param reqId
160
+ */
161
+ async getLatestBlockHeight(reqId) {
162
+ if (reqId) {
163
+ this.bitgo.setRequestTracer(reqId);
164
+ }
165
+ const chainhead = await this.bitgo.get(this.url('/public/block/latest')).result();
166
+ return chainhead.height;
167
+ }
168
+ checkRecipient(recipient) {
169
+ assertValidTransactionRecipient(recipient);
170
+ if (!isScriptRecipient(recipient.address)) {
171
+ super.checkRecipient(recipient);
172
+ }
173
+ }
174
+ /**
175
+ * Run custom coin logic after a transaction prebuild has been received from BitGo
176
+ * @param prebuild
177
+ */
178
+ async postProcessPrebuild(prebuild) {
179
+ const tx = this.decodeTransactionFromPrebuild(prebuild);
180
+ if (_.isUndefined(prebuild.blockHeight)) {
181
+ prebuild.blockHeight = (await this.getLatestBlockHeight());
182
+ }
183
+ return _.extend({}, prebuild, { txHex: tx.toHex() });
184
+ }
185
+ /**
186
+ * Determine an address' type based on its witness and redeem script presence
187
+ * @param addressDetails
188
+ */
189
+ static inferAddressType(addressDetails) {
190
+ return isChainCode(addressDetails.chain) ? scriptTypeForChain(addressDetails.chain) : null;
191
+ }
192
+ createTransactionFromHex(hex) {
193
+ return utxolib.bitgo.createTransactionFromHex(hex, this.network, this.amountType);
194
+ }
195
+ decodeTransaction(input) {
196
+ if (typeof input === 'string') {
197
+ for (const format of ['hex', 'base64']) {
198
+ const buffer = Buffer.from(input, format);
199
+ const bufferToString = buffer.toString(format);
200
+ if ((format === 'base64' && bufferToString === input) ||
201
+ (format === 'hex' && bufferToString === input.toLowerCase())) {
202
+ return this.decodeTransaction(buffer);
203
+ }
204
+ }
205
+ throw new Error('input must be a valid hex or base64 string');
206
+ }
207
+ if (utxolib.bitgo.isPsbt(input)) {
208
+ return utxolib.bitgo.createPsbtFromBuffer(input, this.network);
209
+ }
210
+ else {
211
+ return utxolib.bitgo.createTransactionFromBuffer(input, this.network, {
212
+ amountType: this.amountType,
213
+ });
214
+ }
215
+ }
216
+ decodeTransactionFromPrebuild(prebuild) {
217
+ const string = prebuild.txHex ?? prebuild.txBase64;
218
+ if (!string) {
219
+ throw new Error('missing required txHex or txBase64 property');
220
+ }
221
+ return this.decodeTransaction(string);
222
+ }
223
+ toCanonicalTransactionRecipient(output) {
224
+ const amount = BigInt(output.valueString);
225
+ assertValidTransactionRecipient({ amount, address: output.address });
226
+ assert(output.address, 'address is required');
227
+ if (isScriptRecipient(output.address)) {
228
+ return { amount, address: output.address };
229
+ }
230
+ return { amount, address: this.canonicalAddress(output.address) };
231
+ }
232
+ /**
233
+ * Extract and fill transaction details such as internal/change spend, external spend (explicit vs. implicit), etc.
234
+ * @param params
235
+ * @returns {*}
236
+ */
237
+ async parseTransaction(params) {
238
+ return parseTransaction(this, params);
239
+ }
240
+ /**
241
+ * @deprecated - use function verifyUserPublicKey instead
242
+ */
243
+ verifyUserPublicKey(params) {
244
+ return verifyUserPublicKey(this.bitgo, params);
245
+ }
246
+ /**
247
+ * @deprecated - use function verifyKeySignature instead
248
+ */
249
+ verifyKeySignature(params) {
250
+ return verifyKeySignature(params);
251
+ }
252
+ /**
253
+ * Verify that a transaction prebuild complies with the original intention
254
+ *
255
+ * @param params
256
+ * @param params.txParams params object passed to send
257
+ * @param params.txPrebuild prebuild object returned by server
258
+ * @param params.txPrebuild.txHex prebuilt transaction's txHex form
259
+ * @param params.wallet Wallet object to obtain keys to verify against
260
+ * @param params.verification Object specifying some verification parameters
261
+ * @param params.verification.disableNetworking Disallow fetching any data from the internet for verification purposes
262
+ * @param params.verification.keychains Pass keychains manually rather than fetching them by id
263
+ * @param params.verification.addresses Address details to pass in for out-of-band verification
264
+ * @returns {boolean} True if verification passes
265
+ * @throws {TxIntentMismatchError} if transaction validation fails
266
+ * @throws {TxIntentMismatchRecipientError} if transaction recipients don't match user intent
267
+ */
268
+ async verifyTransaction(params) {
269
+ try {
270
+ return await verifyTransaction(this, this.bitgo, params);
271
+ }
272
+ catch (error) {
273
+ if (error instanceof AggregateValidationError) {
274
+ throw convertValidationErrorToTxIntentMismatch(error, params.reqId, params.txParams, params.txPrebuild.txHex);
275
+ }
276
+ throw error;
277
+ }
278
+ }
279
+ /**
280
+ * Make sure an address is valid and throw an error if it's not.
281
+ * @param params.address The address string on the network
282
+ * @param params.addressType
283
+ * @param params.keychains Keychain objects with xpubs
284
+ * @param params.coinSpecific Coin-specific details for the address such as a witness script
285
+ * @param params.chain Derivation chain
286
+ * @param params.index Derivation index
287
+ * @throws {InvalidAddressError}
288
+ * @throws {InvalidAddressDerivationPropertyError}
289
+ * @throws {UnexpectedAddressError}
290
+ */
291
+ async isWalletAddress(params, wallet) {
292
+ const { address, keychains, chain, index } = params;
293
+ if (!this.isValidAddress(address)) {
294
+ throw new InvalidAddressError(`invalid address: ${address}`);
295
+ }
296
+ if (wallet && isDescriptorWallet(wallet)) {
297
+ if (!keychains) {
298
+ throw new Error('missing required param keychains');
299
+ }
300
+ if (!isTriple(keychains)) {
301
+ throw new Error('keychains must be a triple');
302
+ }
303
+ assertDescriptorWalletAddress(this.network, params, getDescriptorMapFromWallet(wallet, toBip32Triple(keychains), getPolicyForEnv(this.bitgo.env)));
304
+ return true;
305
+ }
306
+ if ((_.isUndefined(chain) && _.isUndefined(index)) || !(_.isFinite(chain) && _.isFinite(index))) {
307
+ throw new InvalidAddressDerivationPropertyError(`address validation failure: invalid chain (${chain}) or index (${index})`);
308
+ }
309
+ if (!keychains) {
310
+ throw new Error('missing required param keychains');
311
+ }
312
+ assertFixedScriptWalletAddress(this.network, {
313
+ address,
314
+ keychains,
315
+ format: params.format ?? 'base58',
316
+ addressType: params.addressType,
317
+ chain,
318
+ index,
319
+ });
320
+ return true;
321
+ }
322
+ /**
323
+ * @param addressType
324
+ * @returns true iff coin supports spending from unspentType
325
+ */
326
+ supportsAddressType(addressType) {
327
+ return utxolib.bitgo.outputScripts.isSupportedScriptType(this.network, addressType);
328
+ }
329
+ /** inherited doc */
330
+ getDefaultMultisigType() {
331
+ return multisigTypes.onchain;
332
+ }
333
+ /**
334
+ * @param chain
335
+ * @return true iff coin supports spending from chain
336
+ */
337
+ supportsAddressChain(chain) {
338
+ return isChainCode(chain) && this.supportsAddressType(utxolib.bitgo.scriptTypeForChain(chain));
339
+ }
340
+ keyIdsForSigning() {
341
+ return [KeyIndices.USER, KeyIndices.BACKUP, KeyIndices.BITGO];
342
+ }
343
+ /**
344
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs.
345
+ * @param psbtHex all MuSig2 inputs should contain user MuSig2 nonce
346
+ * @param walletId
347
+ */
348
+ async signPsbt(psbtHex, walletId) {
349
+ const params = { psbt: psbtHex };
350
+ return await this.bitgo
351
+ .post(this.url('/wallet/' + walletId + '/tx/signpsbt'))
352
+ .send(params)
353
+ .result();
354
+ }
355
+ /**
356
+ * @returns input psbt added with deterministic MuSig2 nonce for bitgo key for each MuSig2 inputs from OVC.
357
+ * @param ovcJson JSON object provided by OVC with fields psbtHex and walletId
358
+ */
359
+ async signPsbtFromOVC(ovcJson) {
360
+ assert(ovcJson['psbtHex'], 'ovcJson must contain psbtHex');
361
+ assert(ovcJson['walletId'], 'ovcJson must contain walletId');
362
+ const psbt = (await this.signPsbt(ovcJson['psbtHex'], ovcJson['walletId'])).psbt;
363
+ assert(psbt, 'psbt not found');
364
+ return _.extend(ovcJson, { txHex: psbt });
365
+ }
366
+ /**
367
+ * Assemble keychain and half-sign prebuilt transaction
368
+ * @param params - {@see SignTransactionOptions}
369
+ * @returns {Promise<SignedTransaction | HalfSignedUtxoTransaction>}
370
+ */
371
+ async signTransaction(params) {
372
+ return signTransaction(this, this.bitgo, params);
373
+ }
374
+ /**
375
+ * Sign a transaction with a custom signing function. Example use case is express external signer
376
+ * @param customSigningFunction custom signing function that returns a single signed transaction
377
+ * @param signTransactionParams parameters for custom signing function. Includes txPrebuild and pubs (for legacy tx only).
378
+ *
379
+ * @returns signed transaction as hex string
380
+ */
381
+ async signWithCustomSigningFunction(customSigningFunction, signTransactionParams) {
382
+ const txHex = signTransactionParams.txPrebuild.txHex;
383
+ assert(txHex, 'missing txHex parameter');
384
+ const tx = this.decodeTransaction(txHex);
385
+ const isTxWithKeyPathSpendInput = tx instanceof bitgo.UtxoPsbt && bitgo.isTransactionWithKeyPathSpendInput(tx);
386
+ if (!isTxWithKeyPathSpendInput) {
387
+ return await customSigningFunction({ ...signTransactionParams, coin: this });
388
+ }
389
+ const getTxHex = (v) => {
390
+ if ('txHex' in v) {
391
+ return v.txHex;
392
+ }
393
+ throw new Error('txHex not found in signTransaction result');
394
+ };
395
+ const signerNonceTx = await customSigningFunction({
396
+ ...signTransactionParams,
397
+ signingStep: 'signerNonce',
398
+ coin: this,
399
+ });
400
+ const { pubs } = signTransactionParams;
401
+ assert(pubs === undefined || isTriple(pubs));
402
+ const cosignerNonceTx = await this.signTransaction({
403
+ ...signTransactionParams,
404
+ pubs,
405
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(signerNonceTx) },
406
+ signingStep: 'cosignerNonce',
407
+ });
408
+ return await customSigningFunction({
409
+ ...signTransactionParams,
410
+ txPrebuild: { ...signTransactionParams.txPrebuild, txHex: getTxHex(cosignerNonceTx) },
411
+ signingStep: 'signerSignature',
412
+ coin: this,
413
+ });
414
+ }
415
+ /**
416
+ * @param unspent
417
+ * @returns {boolean}
418
+ */
419
+ isBitGoTaintedUnspent(unspent) {
420
+ return isReplayProtectionUnspent(unspent, this.network);
421
+ }
422
+ /**
423
+ * Decompose a raw psbt/transaction into useful information, such as the total amounts,
424
+ * change amounts, and transaction outputs.
425
+ * @param params
426
+ */
427
+ async explainTransaction(params) {
428
+ return explainTx(this.decodeTransactionFromPrebuild(params), params, this.network);
429
+ }
430
+ /**
431
+ * Create a multisig address of a given type from a list of keychains and a signing threshold
432
+ * @param addressType
433
+ * @param signatureThreshold
434
+ * @param keys
435
+ */
436
+ createMultiSigAddress(addressType, signatureThreshold, keys) {
437
+ const { scriptPubKey: outputScript, redeemScript, witnessScript, } = utxolib.bitgo.outputScripts.createOutputScript2of3(keys, addressType);
438
+ return {
439
+ outputScript,
440
+ redeemScript,
441
+ witnessScript,
442
+ address: utxolib.address.fromOutputScript(outputScript, this.network),
443
+ };
444
+ }
445
+ /**
446
+ * @deprecated - use {@see backupKeyRecovery}
447
+ * Builds a funds recovery transaction without BitGo
448
+ * @param params - {@see backupKeyRecovery}
449
+ */
450
+ async recover(params) {
451
+ return backupKeyRecovery(this, this.bitgo, params);
452
+ }
453
+ async recoverV1(params) {
454
+ return v1BackupKeyRecovery(this, this.bitgo, params);
455
+ }
456
+ async sweepV1(params) {
457
+ return v1Sweep(this, this.bitgo, params);
458
+ }
459
+ /**
460
+ * Recover coin that was sent to wrong chain
461
+ * @param params
462
+ * @param params.txid The txid of the faulty transaction
463
+ * @param params.recoveryAddress address to send recovered funds to
464
+ * @param params.wallet the wallet that received the funds
465
+ * @param params.recoveryCoin the coin type of the wallet that received the funds
466
+ * @param params.signed return a half-signed transaction (default=true)
467
+ * @param params.walletPassphrase the wallet passphrase
468
+ * @param params.xprv the unencrypted xprv (used instead of wallet passphrase)
469
+ * @param params.apiKey for utxo coins other than [BTC,TBTC] this is a Block Chair api key
470
+ * @returns {*}
471
+ */
472
+ async recoverFromWrongChain(params) {
473
+ const { txid, recoveryAddress, wallet, walletPassphrase, xprv, apiKey } = params;
474
+ // params.recoveryCoin used to be params.coin, backwards compatibility
475
+ const recoveryCoin = params.coin || params.recoveryCoin;
476
+ if (!recoveryCoin) {
477
+ throw new Error('missing required object recoveryCoin');
478
+ }
479
+ // signed should default to true, and only be disabled if explicitly set to false (not undefined)
480
+ const signed = params.signed !== false;
481
+ const sourceCoinFamily = this.getFamily();
482
+ const recoveryCoinFamily = recoveryCoin.getFamily();
483
+ const supportedRecoveryCoins = supportedCrossChainRecoveries[sourceCoinFamily];
484
+ if (_.isUndefined(supportedRecoveryCoins) || !supportedRecoveryCoins.includes(recoveryCoinFamily)) {
485
+ throw new Error(`Recovery of ${sourceCoinFamily} balances from ${recoveryCoinFamily} wallets is not supported.`);
486
+ }
487
+ return await recoverCrossChain(this.bitgo, {
488
+ sourceCoin: this,
489
+ recoveryCoin,
490
+ walletId: wallet,
491
+ txid,
492
+ recoveryAddress,
493
+ walletPassphrase: signed ? walletPassphrase : undefined,
494
+ xprv: signed ? xprv : undefined,
495
+ apiKey,
496
+ });
497
+ }
498
+ /**
499
+ * Generate bip32 key pair
500
+ *
501
+ * @param seed
502
+ * @returns {Object} object with generated pub and prv
503
+ */
504
+ generateKeyPair(seed) {
505
+ if (!seed) {
506
+ // An extended private key has both a normal 256 bit private key and a 256
507
+ // bit chain code, both of which must be random. 512 bits is therefore the
508
+ // maximum entropy and gives us maximum security against cracking.
509
+ seed = randomBytes(512 / 8);
510
+ }
511
+ const extendedKey = bip32.fromSeed(seed);
512
+ return {
513
+ pub: extendedKey.neutered().toBase58(),
514
+ prv: extendedKey.toBase58(),
515
+ };
516
+ }
517
+ /**
518
+ * Determines the default transaction format based on wallet properties and network
519
+ * @param wallet - The wallet to check
520
+ * @param requestedFormat - Optional explicitly requested format
521
+ * @returns The transaction format to use, or undefined if no default applies
522
+ */
523
+ getDefaultTxFormat(wallet, requestedFormat) {
524
+ // If format is explicitly requested, use it
525
+ if (requestedFormat !== undefined) {
526
+ if (isTestnet(this.network) && requestedFormat === 'legacy') {
527
+ throw new ErrorDeprecatedTxFormat(requestedFormat);
528
+ }
529
+ return requestedFormat;
530
+ }
531
+ if (isTestnet(this.network)) {
532
+ return 'psbt-lite';
533
+ }
534
+ const walletFlagMusigKp = wallet.flag('musigKp') === 'true';
535
+ const isHotWallet = wallet.type() === 'hot';
536
+ // Determine if we should default to psbt format
537
+ const shouldDefaultToPsbt = wallet.subType() === 'distributedCustody' ||
538
+ // if mainnet, only default to psbt for btc hot wallets
539
+ (isMainnet(this.network) && getMainnet(this.network) === utxolib.networks.bitcoin && isHotWallet) ||
540
+ // default to psbt if it has the wallet flag
541
+ walletFlagMusigKp;
542
+ return shouldDefaultToPsbt ? 'psbt' : undefined;
543
+ }
544
+ async getExtraPrebuildParams(buildParams) {
545
+ const txFormat = this.getDefaultTxFormat(buildParams.wallet, buildParams.txFormat);
546
+ let changeAddressType = buildParams.changeAddressType;
547
+ // if the addressType is not specified, we need to default to p2trMusig2 for testnet hot wallets for staged rollout of p2trMusig2
548
+ if (buildParams.addressType === undefined && // addressType is deprecated and replaced by `changeAddress`
549
+ buildParams.changeAddressType === undefined &&
550
+ buildParams.changeAddress === undefined &&
551
+ buildParams.wallet.type() === 'hot') {
552
+ changeAddressType = ['p2trMusig2', 'p2wsh', 'p2shP2wsh', 'p2sh', 'p2tr'];
553
+ }
554
+ return {
555
+ txFormat,
556
+ changeAddressType,
557
+ };
558
+ }
559
+ preCreateBitGo(params) {
560
+ return;
561
+ }
562
+ async presignTransaction(params) {
563
+ if (params.walletData && isUtxoWalletData(params.walletData) && isDescriptorWalletData(params.walletData)) {
564
+ return params;
565
+ }
566
+ // In the case that we have a 'psbt-lite' transaction format, we want to indicate in signing to not fail
567
+ const txHex = (params.txHex ?? params.txPrebuild?.txHex);
568
+ if (txHex &&
569
+ utxolib.bitgo.isPsbt(txHex) &&
570
+ utxolib.bitgo.isPsbtLite(utxolib.bitgo.createPsbtFromHex(txHex, this.network)) &&
571
+ params.allowNonSegwitSigningWithoutPrevTx === undefined) {
572
+ return { ...params, allowNonSegwitSigningWithoutPrevTx: true };
573
+ }
574
+ return params;
575
+ }
576
+ async supplementGenerateWallet(walletParams, keychains) {
577
+ return walletParams;
578
+ }
579
+ transactionDataAllowed() {
580
+ return false;
581
+ }
582
+ valuelessTransferAllowed() {
583
+ return false;
584
+ }
585
+ getRecoveryProvider(apiToken) {
586
+ return forCoin(this.getChain(), apiToken);
587
+ }
588
+ /** @inheritDoc */
589
+ auditDecryptedKey({ multiSigType, publicKey, prv }) {
590
+ if (multiSigType === 'tss') {
591
+ throw new Error('tss auditing is not supported for this coin');
592
+ }
593
+ if (!isValidPrv(prv) && !isValidXprv(prv)) {
594
+ throw new Error('invalid private key');
595
+ }
596
+ if (publicKey) {
597
+ const genPubKey = bip32.fromBase58(prv).neutered().toBase58();
598
+ if (genPubKey !== publicKey) {
599
+ throw new Error('public key does not match private key');
600
+ }
601
+ }
602
+ }
603
+ }
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RVdHhvQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hYnN0cmFjdFV0eG9Db2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRXJDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUUsT0FBTyxFQUVMLFFBQVEsRUFNUixxQ0FBcUMsRUFDckMsbUJBQW1CLEVBRW5CLFFBQVEsRUFHUixVQUFVLEVBR1YsYUFBYSxFQVdiLDhCQUE4QixFQUs5QixVQUFVLEVBQ1YsV0FBVyxHQUNaLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLGlCQUFpQixFQUdqQixPQUFPLEVBQ1AsaUJBQWlCLEVBR2pCLG1CQUFtQixFQUVuQixPQUFPLEdBRVIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pELE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsU0FBUyxFQUNULHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG1CQUFtQixFQUNuQiw0QkFBNEIsR0FDN0IsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsMEJB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ekMsQ0FBQztRQUNELElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzlELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0IHsgYml0Z28sIGdldE1haW5uZXQsIGlzTWFpbm5ldCwgaXNUZXN0bmV0IH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7XG4gIEFkZHJlc3NDb2luU3BlY2lmaWMsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIENyZWF0ZUFkZHJlc3NGb3JtYXQsXG4gIEV4dHJhUHJlYnVpbGRQYXJhbXNPcHRpb25zLFxuICBIYWxmU2lnbmVkVXR4b1RyYW5zYWN0aW9uLFxuICBJQmFzZUNvaW4sXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIElSZXF1ZXN0VHJhY2VyLFxuICBpc1RyaXBsZSxcbiAgSVdhbGxldCxcbiAgS2V5Y2hhaW5zVHJpcGxldCxcbiAgS2V5SW5kaWNlcyxcbiAgTWlzbWF0Y2hlZFJlY2lwaWVudCxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyBhcyBCYXNlUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFByZWNyZWF0ZUJpdEdvT3B0aW9ucyxcbiAgUHJlc2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgUmVxdWVzdFRyYWNlcixcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uUGFyYW1zIGFzIEJhc2VUcmFuc2FjdGlvblBhcmFtcyxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCBhcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHJpcGxlLFxuICBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IsXG4gIFZlcmlmaWNhdGlvbk9wdGlvbnMsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zIGFzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIGFzIEJhc2VWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFdhbGxldCxcbiAgaXNWYWxpZFBydixcbiAgaXNWYWxpZFhwcnYsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5cbmltcG9ydCB7XG4gIGJhY2t1cEtleVJlY292ZXJ5LFxuICBDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQsXG4gIENyb3NzQ2hhaW5SZWNvdmVyeVVuc2lnbmVkLFxuICBmb3JDb2luLFxuICByZWNvdmVyQ3Jvc3NDaGFpbixcbiAgUmVjb3ZlclBhcmFtcyxcbiAgUmVjb3ZlcnlQcm92aWRlcixcbiAgdjFCYWNrdXBLZXlSZWNvdmVyeSxcbiAgVjFSZWNvdmVyUGFyYW1zLFxuICB2MVN3ZWVwLFxuICBWMVN3ZWVwUGFyYW1zLFxufSBmcm9tICcuL3JlY292ZXJ5JztcbmltcG9ydCB7IGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQgfSBmcm9tICcuL3JlcGxheVByb3RlY3Rpb24nO1xuaW1wb3J0IHsgc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXMgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBhc3NlcnRWYWxpZFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBleHBsYWluVHgsXG4gIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXQsXG4gIGlzU2NyaXB0UmVjaXBpZW50LFxuICBwYXJzZVRyYW5zYWN0aW9uLFxuICB2ZXJpZnlUcmFuc2FjdGlvbixcbn0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdHlwZSB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L2V4cGxhaW5UcmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBBZ2dyZWdhdGVWYWxpZGF0aW9uRXJyb3IsXG4gIEVycm9yTWlzc2luZ091dHB1dHMsXG4gIEVycm9ySW1wbGljaXRFeHRlcm5hbE91dHB1dHMsXG59IGZyb20gJy4vdHJhbnNhY3Rpb24vZGVzY3JpcHRvci92ZXJpZnlUcmFuc2FjdGlvbic7XG5pbXBvcnQgeyBhc3NlcnREZXNjcmlwdG9yV2FsbGV0QWRkcmVzcywgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQsIGlzRGVzY3JpcHRvcldhbGxldCB9IGZyb20gJy4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBnZXRDaGFpbkZyb21OZXR3b3JrLCBnZXRGYW1pbHlGcm9tTmV0d29yaywgZ2V0RnVsbE5hbWVGcm9tTmV0d29yayB9IGZyb20gJy4vbmFtZXMnO1xuaW1wb3J0IHsgYXNzZXJ0Rml4ZWRTY3JpcHRXYWxsZXRBZGRyZXNzIH0gZnJvbSAnLi9hZGRyZXNzL2ZpeGVkU2NyaXB0JztcbmltcG9ydCB7IFBhcnNlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbi90eXBlcyc7XG5pbXBvcnQgeyB0b0JpcDMyVHJpcGxlLCBVdHhvS2V5Y2hhaW4gfSBmcm9tICcuL2tleWNoYWlucyc7XG5pbXBvcnQgeyB2ZXJpZnlLZXlTaWduYXR1cmUsIHZlcmlmeVVzZXJQdWJsaWNLZXkgfSBmcm9tICcuL3ZlcmlmeUtleSc7XG5pbXBvcnQgeyBnZXRQb2xpY3lGb3JFbnYgfSBmcm9tICcuL2Rlc2NyaXB0b3IvdmFsaWRhdGVQb2xpY3knO1xuaW1wb3J0IHsgc2lnblRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9zaWduVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNVdHhvV2FsbGV0RGF0YSwgVXR4b1dhbGxldCB9IGZyb20gJy4vd2FsbGV0JztcbmltcG9ydCB7IGlzRGVzY3JpcHRvcldhbGxldERhdGEgfSBmcm9tICcuL2Rlc2NyaXB0b3IvZGVzY3JpcHRvcldhbGxldCc7XG5cbmltcG9ydCBTY3JpcHRUeXBlMk9mMyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5TY3JpcHRUeXBlMk9mMztcblxuZXhwb3J0IHR5cGUgVHhGb3JtYXQgPVxuICAvLyBUaGlzIGlzIGEgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCBiYXNlZCBhcm91bmQgdGhlIGJpdGNvaW5qcy1saWIgc2VyaWFsaXphdGlvbiBvZiB1bnNpZ25lZCB0cmFuc2FjdGlvbnNcbiAgLy8gZG9lcyBub3QgaW5jbHVkZSBwcmV2T3V0IGRhdGEgYW5kIGlzIGEgYml0IHBhaW5mdWwgdG8gd29yayB3aXRoXG4gIC8vIGdvaW5nIHRvIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcHNidFxuICAvLyBAZGVwcmVjYXRlZFxuICB8ICdsZWdhY3knXG4gIC8vIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHBzYnQgZm9ybWF0LCBpbmNsdWRpbmcgdGhlIGZ1bGwgcHJldlR4IGRhdGEgZm9yIGxlZ2FjeSB0cmFuc2FjdGlvbnMuXG4gIC8vIFRoaXMgd2lsbCByZW1haW4gc3VwcG9ydGVkIGJ1dCBpcyBub3QgdGhlIGRlZmF1bHQsIHNpbmNlIHRoZSBkYXRhIHNpemVzIGNhbiBiZWNvbWUgcHJvaGliaXRpdmVseSBsYXJnZS5cbiAgfCAncHNidCdcbiAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIHBzYnQgdmVyc2lvbiB3aGVyZSBsZWdhY3kgaW5wdXRzIGFyZSBzZXJpYWxpemVkIGFzIGlmIHRoZXkgd2VyZSBzZWd3aXQgaW5wdXRzLlxuICAvLyBXaGlsZSB0aGlzIHByZXZlbnRzIHVzIHRvIGZ1bGx5IHZlcmlmeSB0aGUgdHJhbnNhY3Rpb24gZmVlLCB3ZSBoYXZlIG90aGVyIGNoZWNrcyBpbiBwbGFjZSB0byBlbnN1cmUgdGhlIGZlZSBpcyB3aXRoaW4gYm91bmRzLlxuICB8ICdwc2J0LWxpdGUnO1xuXG5leHBvcnQgY2xhc3MgRXJyb3JEZXByZWNhdGVkVHhGb3JtYXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHR4Rm9ybWF0OiBUeEZvcm1hdCkge1xuICAgIHN1cGVyKGBTREsgc3VwcG9ydCBmb3IgdHhGb3JtYXQ9JHt0eEZvcm1hdH0gaXMgZGVwcmVjYXRlZCBvbiB0aGlzIGVudmlyb25tZW50LiBQbGVhc2UgdXNlIHBzYnQgaW5zdGVhZC5gKTtcbiAgfVxufVxuXG50eXBlIFV0eG9DdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB7XG4gIChwYXJhbXM6IHtcbiAgICBjb2luOiBJQmFzZUNvaW47XG4gICAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgICBwdWJzPzogc3RyaW5nW107XG4gICAgLyoqXG4gICAgICogc2lnbmluZ1N0ZXAgZmxhZyBiZWNvbWVzIGFwcGxpY2FibGUgd2hlbiBib3RoIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OlxuICAgICAqIDEpIFdoZW4gdGhlIGV4dGVybmFsIGV4cHJlc3Mgc2lnbmVyIGlzIGFjdGl2YXRlZFxuICAgICAqIDIpIFdoZW4gdGhlIFBTQlQgaW5jbHVkZXMgYXQgbGVhc3Qgb25lIHRhcHJvb3RLZXlQYXRoU3BlbmQgaW5wdXQuXG4gICAgICpcbiAgICAgKiBUaGUgc2lnbmluZyBwcm9jZXNzIG9mIGEgdGFwcm9vdEtleVBhdGhTcGVuZCBpbnB1dCBpcyBhIDQtc3RlcCBzZXF1ZW5jZTpcbiAgICAgKiBpKSB1c2VyIG5vbmNlIGdlbmVyYXRpb24gLSBzaWduZXJOb25jZSAtIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaWkpIGJpdGdvIG5vbmNlIGdlbmVyYXRpb24gLSBjb3NpZ25lck5vbmNlIC0gdGhpcyBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgY2FsbCB0byBsb2NhbCBzaWduVHJhbnNhY3Rpb25cbiAgICAgKiBpaWkpIHVzZXIgc2lnbmF0dXJlIC0gc2lnbmVyU2lnbmF0dXJlIC0gdGhpcyBpcyB0aGUgc2Vjb25kIGNhbGwgdG8gZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgc2lnblRyYW5zYWN0aW9uXG4gICAgICogaXYpIGJpdGdvIHNpZ25hdHVyZSAtIG5vdCBpbiBzaWduVHJhbnNhY3Rpb24gbWV0aG9k4oCZcyBzY29wZVxuICAgICAqXG4gICAgICogSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyBmbGFnLCB0aGUgYWZvcmVtZW50aW9uZWQgZmlyc3QgdGhyZWUgc2VxdWVuY2UgaXMgZXhlY3V0ZWQgaW4gYSBzaW5nbGUgc2lnblRyYW5zYWN0aW9uIGNhbGwuXG4gICAgICpcbiAgICAgKiBOT1RFOiBXZSBtYWtlIGEgc3Ryb25nIGFzc3VtcHRpb24gdGhhdCB0aGUgZXh0ZXJuYWwgZXhwcmVzcyBzaWduZXIgYW5kIGl0cyBjYWxsZXIgdXNlcyBzdGlja3kgc2Vzc2lvbnMsXG4gICAgICogc2luY2UgUFNCVHMgYXJlIGNhY2hlZCBpbiBzdGVwIDEgdG8gYmUgdXNlZCBpbiBzdGVwIDMgZm9yIE11U2lnMiB1c2VyIHNlY3VyZSBub25jZSBhY2Nlc3MuXG4gICAgICovXG4gICAgc2lnbmluZ1N0ZXA/OiAnc2lnbmVyTm9uY2UnIHwgJ3NpZ25lclNpZ25hdHVyZScgfCAnY29zaWduZXJOb25jZSc7XG4gIH0pOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPjtcbn07XG5cbmNvbnN0IHsgaXNDaGFpbkNvZGUsIHNjcmlwdFR5cGVGb3JDaGFpbiwgb3V0cHV0U2NyaXB0cyB9ID0gYml0Z287XG5cbnR5cGUgVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IGJpdGdvLlVuc3BlbnQ8VE51bWJlcj47XG5cbi8qKlxuICogQ29udmVydCBWYWxpZGF0aW9uRXJyb3IgdG8gVHhJbnRlbnRNaXNtYXRjaFJlY2lwaWVudEVycm9yIHdpdGggc3RydWN0dXJlZCBkYXRhXG4gKlxuICogVGhpcyBwcmVzZXJ2ZXMgdGhlIHN0cnVjdHVyZWQgZXJyb3IgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3JpZ2luYWwgVmFsaWRhdGlvbkVycm9yXG4gKiBieSBleHRyYWN0aW5nIHRoZSBtaXNtYXRjaGVkIG91dHB1dHMgYW5kIGNvbnZlcnRpbmcgdGhlbSB0byB0aGUgc3RhbmRhcmRpemVkIGZvcm1hdC5cbiAqIFRoZSBvcmlnaW5hbCBlcnJvciBpcyBwcmVzZXJ2ZWQgYXMgdGhlIGBjYXVzZWAgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuZnVuY3Rpb24gY29udmVydFZhbGlkYXRpb25FcnJvclRvVHhJbnRlbnRNaXNtYXRjaChcbiAgZXJyb3I6IEFnZ3JlZ2F0ZVZhbGlkYXRpb25FcnJvcixcbiAgcmVxSWQ6IHN0cmluZyB8IElSZXF1ZXN0VHJhY2VyIHwgdW5kZWZpbmVkLFxuICB0eFBhcmFtczogQmFzZVRyYW5zYWN0aW9uUGFyYW1zLFxuICB0eEhleDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3Ige1xuICBjb25zdCBtaXNtYXRjaGVkUmVjaXBpZW50czogTWlzbWF0Y2hlZFJlY2lwaWVudFtdID0gW107XG5cbiAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3IuZXJyb3JzKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yTWlzc2luZ091dHB1dHMpIHtcbiAgICAgIG1pc21hdGNoZWRSZWNpcGllbnRzLnB1c2goXG4gICAgICAgIC4uLmVyci5taXNzaW5nT3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gKHtcbiAgICAgICAgICBhZGRyZXNzOiBvdXRwdXQuYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IG91dHB1dC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgfSkpXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3JJbXBsaWNpdEV4dGVybmFsT3V0cHV0cykge1xuICAgICAgbWlzbWF0Y2hlZFJlY2lwaWVudHMucHVzaChcbiAgICAgICAgLi4uZXJyLmltcGxpY2l0RXh0ZXJuYWxPdXRwdXRzLm1hcCgob3V0cHV0KSA9PiAoe1xuICAgICAgICAgIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogb3V0cHV0LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICB9KSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdHhJbnRlbnRFcnJvciA9IG5ldyBUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3IoXG4gICAgZXJyb3IubWVzc2FnZSxcbiAgICByZXFJZCxcbiAgICBbdHhQYXJhbXNdLFxuICAgIHR4SGV4LFxuICAgIG1pc21hdGNoZWRSZWNpcGllbnRzXG4gICk7XG4gIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCBzdHJ1Y3R1cmVkIGVycm9yIGFzIHRoZSBjYXVzZSBmb3IgZGVidWdnaW5nXG4gIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IvY2F1c2VcbiAgKHR4SW50ZW50RXJyb3IgYXMgRXJyb3IgJiB7IGNhdXNlPzogRXJyb3IgfSkuY2F1c2UgPSBlcnJvcjtcbiAgcmV0dXJuIHR4SW50ZW50RXJyb3I7XG59XG5cbmV4cG9ydCB0eXBlIERlY29kZWRUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9XG4gIHwgdXR4b2xpYi5iaXRnby5VdHhvVHJhbnNhY3Rpb248VE51bWJlcj5cbiAgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuXG5leHBvcnQgdHlwZSBSb290V2FsbGV0S2V5cyA9IGJpdGdvLlJvb3RXYWxsZXRLZXlzO1xuXG5leHBvcnQgdHlwZSBVdHhvQ29pblNwZWNpZmljID0gQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUFkZHJlc3NPcHRpb25zPFRDb2luU3BlY2lmaWMgZXh0ZW5kcyBVdHhvQ29pblNwZWNpZmljPiBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGNoYWluPzogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luU3BlY2lmaWM/OiBUQ29pblNwZWNpZmljO1xufVxuXG5leHBvcnQgdHlwZSBCaXAzMjJNZXNzYWdlID0ge1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25JbmZvPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqIE1hcHMgdHhpZCB0byB0eGhleC4gUmVxdWlyZWQgZm9yIG9mZmxpbmUgc2lnbmluZy4gKi9cbiAgdHhIZXhlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGNoYW5nZUFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICAvKiogcHNidCBkb2VzIG5vdCByZXF1aXJlIHVuc3BlbnRzLiAqL1xuICB1bnNwZW50cz86IFVuc3BlbnQ8VE51bWJlcj5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdHhJbmZvPzogVHJhbnNhY3Rpb25JbmZvPFROdW1iZXI+O1xuICBmZWVJbmZvPzogc3RyaW5nO1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVjb3JhdGVkRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPlxuICBleHRlbmRzIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj4ge1xuICBjaGFuZ2VJbmZvPzogeyBhZGRyZXNzOiBzdHJpbmc7IGNoYWluOiBudW1iZXI7IGluZGV4OiBudW1iZXIgfVtdO1xufVxuXG5leHBvcnQgdHlwZSBVdHhvTmV0d29yayA9IHV0eG9saWIuTmV0d29yaztcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEluZm8/OiBUcmFuc2FjdGlvbkluZm88VE51bWJlcj47XG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUGFyYW1zIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUGFyYW1zIHtcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZztcbiAgYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3M/OiBib29sZWFuO1xuICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICByYmZUeElkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgQmFzZVBhcnNlVHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+O1xuICB3YWxsZXQ6IFV0eG9XYWxsZXQ7XG4gIHZlcmlmaWNhdGlvbj86IFZlcmlmaWNhdGlvbk9wdGlvbnM7XG4gIHJlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVBZGRyZXNzT3B0aW9ucyB7XG4gIGFkZHJlc3NUeXBlPzogU2NyaXB0VHlwZTJPZjM7XG4gIHRocmVzaG9sZD86IG51bWJlcjtcbiAgY2hhaW4/OiBudW1iZXI7XG4gIGluZGV4PzogbnVtYmVyO1xuICBzZWd3aXQ/OiBib29sZWFuO1xuICBiZWNoMzI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlRml4ZWRTY3JpcHRBZGRyZXNzT3B0aW9ucyBleHRlbmRzIEdlbmVyYXRlQWRkcmVzc09wdGlvbnMge1xuICBmb3JtYXQ/OiBDcmVhdGVBZGRyZXNzRm9ybWF0O1xuICBrZXljaGFpbnM6IHtcbiAgICBwdWI6IHN0cmluZztcbiAgICBhc3BLZXlJZD86IHN0cmluZztcbiAgfVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEZXRhaWxzIHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBjaGFpbjogbnVtYmVyO1xuICBpbmRleDogbnVtYmVyO1xuICBjb2luOiBzdHJpbmc7XG4gIGNvaW5TcGVjaWZpYzogQWRkcmVzc0NvaW5TcGVjaWZpYyB8IERlc2NyaXB0b3JBZGRyZXNzQ29pblNwZWNpZmljO1xuICBhZGRyZXNzVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZXNjcmlwdG9yQWRkcmVzc0NvaW5TcGVjaWZpYyBleHRlbmRzIEFkZHJlc3NDb2luU3BlY2lmaWMge1xuICBkZXNjcmlwdG9yTmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdG9yQ2hlY2tzdW06IHN0cmluZztcbn1cblxudHlwZSBVdHhvQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gPSBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyAmIHtcbiAgLyoqIFRyYW5zYWN0aW9uIHByZWJ1aWxkIGZyb20gYml0Z28gc2VydmVyICovXG4gIHR4UHJlYnVpbGQ6IHtcbiAgICAvKipcbiAgICAgKiB3YWxsZXRJZCBpcyByZXF1aXJlZCBpbiBmb2xsb3dpbmcgMiBzY2VuYXJpb3MuXG4gICAgICogMS4gRXh0ZXJuYWwgc2lnbmVyIGV4cHJlc3MgbW9kZSBpcyB1c2VkLlxuICAgICAqIDIuIGJpdGdvIE11U2lnMiBub25jZSBpcyByZXF1ZXN0ZWRcbiAgICAgKi9cbiAgICB3YWxsZXRJZD86IHN0cmluZztcbiAgICB0eEhleDogc3RyaW5nO1xuICAgIHR4SW5mbz86IFRyYW5zYWN0aW9uSW5mbzxUTnVtYmVyPjtcbiAgfTtcbiAgLyoqIHhwdWJzIHRyaXBsZSBmb3Igd2FsbGV0ICh1c2VyLCBiYWNrdXAsIGJpdGdvKS4gUmVxdWlyZWQgb25seSB3aGVuIHR4UHJlYnVpbGQudHhIZXggaXMgbm90IGEgUFNCVCAqL1xuICBwdWJzPzogVHJpcGxlPHN0cmluZz47XG4gIC8qKiB4cHViIGZvciBjb3NpZ25lciAoZGVmYXVsdHMgdG8gYml0Z28pICovXG4gIGNvc2lnbmVyUHViPzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0cnVlLCBjcmVhdGVzIGZ1bGwtc2lnbmVkIHRyYW5zYWN0aW9uIHdpdGhvdXQgcGxhY2Vob2xkZXIgc2lnbmF0dXJlcy5cbiAgICogV2hlbiBmYWxzZSwgY3JlYXRlcyBoYWxmLXNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIHBsYWNlaG9sZGVyIHNpZ25hdHVyZXMuXG4gICAqL1xuICBpc0xhc3RTaWduYXR1cmU/OiBib29sZWFuO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgYWxsb3dzIHNpZ25pbmcgYSBub24tc2Vnd2l0IGlucHV0IHdpdGggYSB3aXRuZXNzVXR4byBpbnN0ZWFkIHJlcXVpcmluZyBhIHByZXZpb3VzXG4gICAqIHRyYW5zYWN0aW9uIChub25XaXRuZXNzVXR4bylcbiAgICovXG4gIGFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHg/OiBib29sZWFuO1xuICB3YWxsZXQ/OiBVdHhvV2FsbGV0O1xufTtcblxuZXhwb3J0IHR5cGUgU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IFV0eG9CYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPiAmXG4gIChcbiAgICB8IHtcbiAgICAgICAgcHJ2OiBzdHJpbmc7XG4gICAgICAgIHNpZ25pbmdTdGVwPzogJ3NpZ25lck5vbmNlJyB8ICdzaWduZXJTaWduYXR1cmUnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnO1xuICAgICAgfVxuICApO1xuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2lnQWRkcmVzcyB7XG4gIG91dHB1dFNjcmlwdDogQnVmZmVyO1xuICByZWRlZW1TY3JpcHQ/OiBCdWZmZXI7XG4gIHdpdG5lc3NTY3JpcHQ/OiBCdWZmZXI7XG4gIGFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyRnJvbVdyb25nQ2hhaW5PcHRpb25zIHtcbiAgdHhpZDogc3RyaW5nO1xuICByZWNvdmVyeUFkZHJlc3M6IHN0cmluZztcbiAgd2FsbGV0OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIHhwcnY/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGNvaW4/OiBBYnN0cmFjdFV0eG9Db2luO1xuICByZWNvdmVyeUNvaW4/OiBBYnN0cmFjdFV0eG9Db2luO1xuICBzaWduZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUtleVNpZ25hdHVyZXNPcHRpb25zIHtcbiAgdXNlcktleWNoYWluOiB7IHB1Yj86IHN0cmluZyB9O1xuICBrZXljaGFpblRvVmVyaWZ5OiB7IHB1Yj86IHN0cmluZyB9O1xuICBrZXlTaWduYXR1cmU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlVc2VyUHVibGljS2V5T3B0aW9ucyB7XG4gIHVzZXJLZXljaGFpbj86IFV0eG9LZXljaGFpbjtcbiAgZGlzYWJsZU5ldHdvcmtpbmc6IGJvb2xlYW47XG4gIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj5cbiAgZXh0ZW5kcyBCYXNlVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPjtcbiAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zO1xuICB3YWxsZXQ6IFV0eG9XYWxsZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnblBzYnRSZXF1ZXN0IHtcbiAgcHNidDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25Qc2J0UmVzcG9uc2Uge1xuICBwc2J0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFV0eG9Db2luIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwdWJsaWMgYWx0U2NyaXB0SGFzaD86IG51bWJlcjtcbiAgcHVibGljIHN1cHBvcnRBbHRTY3JpcHREZXN0aW5hdGlvbj86IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnO1xuICBwcml2YXRlIHJlYWRvbmx5IF9uZXR3b3JrOiB1dHhvbGliLk5ldHdvcms7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIG5ldHdvcms6IHV0eG9saWIuTmV0d29yaywgYW1vdW50VHlwZTogJ251bWJlcicgfCAnYmlnaW50JyA9ICdudW1iZXInKSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICAgIGlmICghdXR4b2xpYi5pc1ZhbGlkTmV0d29yayhuZXR3b3JrKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnaW52YWxpZCBuZXR3b3JrOiBwbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSB0aGUgc2FtZSB2ZXJzaW9uIG9mICcgK1xuICAgICAgICAgICdAYml0Z28vdXR4by1saWIgYXMgdGhpcyBsaWJyYXJ5IHdoZW4gaW5pdGlhbGl6aW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MnXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFtb3VudFR5cGUgPSBhbW91bnRUeXBlO1xuICAgIHRoaXMuX25ldHdvcmsgPSBuZXR3b3JrO1xuICB9XG5cbiAgZ2V0IG5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25ldHdvcms7XG4gIH1cblxuICBnZXRDaGFpbigpIHtcbiAgICByZXR1cm4gZ2V0Q2hhaW5Gcm9tTmV0d29yayh0aGlzLm5ldHdvcmspO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCkge1xuICAgIHJldHVybiBnZXRGYW1pbHlGcm9tTmV0d29yayh0aGlzLm5ldHdvcmspO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKSB7XG4gICAgcmV0dXJuIGdldEZ1bGxOYW1lRnJvbU5ldHdvcmsodGhpcy5uZXR3b3JrKTtcbiAgfVxuXG4gIC8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29pbiBzdXBwb3J0cyBhIGJsb2NrIHRhcmdldCAqL1xuICBzdXBwb3J0c0Jsb2NrVGFyZ2V0KCkge1xuICAgIC8vIEZJWE1FOiB0aGUgU0RLIGRvZXMgbm90IHNlZW0gdG8gdXNlIHRoaXMgYW55d2hlcmUgc28gaXQgaXMgdW5jbGVhciB3aGF0IHRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzXG4gICAgc3dpdGNoIChnZXRNYWlubmV0KHRoaXMubmV0d29yaykpIHtcbiAgICAgIGNhc2UgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luOlxuICAgICAgY2FzZSB1dHhvbGliLm5ldHdvcmtzLmRvZ2Vjb2luOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzd2VlcFdpdGhTZW5kTWFueSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBzdGF0aWMgZ2V0IHZhbGlkQWRkcmVzc1R5cGVzKCk6IFNjcmlwdFR5cGUyT2YzW10ge1xuICAgIHJldHVybiBbLi4ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZhY3RvciBiZXR3ZWVuIHRoZSBiYXNlIHVuaXQgYW5kIGl0cyBzbWFsbGVzdCBzdWJkaXZpc29uXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIDFlODtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhZGRyZXNzIGlzIHZhbGlkXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqIEBwYXJhbSBwYXJhbVxuICAgKi9cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBwYXJhbT86IHsgYW55Rm9ybWF0OiBib29sZWFuIH0gfCAvKiBsZWdhY3kgcGFyYW1ldGVyICovIGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnYm9vbGVhbicgJiYgcGFyYW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGVwcmVjYXRlZCcpO1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIGFsbG93IGFsbCBhZGRyZXNzIGZvcm1hdHMuXG4gICAgLy8gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZywgdGhlIG9ubHkgYWRkaXRpb25hbCBhZGRyZXNzIGZvcm1hdCBpcyBiY2ggY2FzaGFkZHIuXG4gICAgY29uc3QgYW55Rm9ybWF0ID0gKHBhcmFtIGFzIHsgYW55Rm9ybWF0OiBib29sZWFuIH0gfCB1bmRlZmluZWQpPy5hbnlGb3JtYXQgPz8gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgLy8gRmluZCBvdXQgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWQgZm9yIGFueSBmb3JtYXQuIFRyaWVzIGFsbCBzdXBwb3J0ZWQgZm9ybWF0cyBieSBkZWZhdWx0LlxuICAgICAgLy8gVGhyb3dzIGlmIGFkZHJlc3MgY2Fubm90IGJlIGRlY29kZWQgd2l0aCBhbnkgZm9ybWF0LlxuICAgICAgY29uc3QgW2Zvcm1hdCwgc2NyaXB0XSA9IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC50b091dHB1dFNjcmlwdEFuZEZvcm1hdChhZGRyZXNzLCB0aGlzLm5ldHdvcmspO1xuICAgICAgLy8gdW5sZXNzIGFueUZvcm1hdCBpcyBzZXQsIG9ubHkgJ2RlZmF1bHQnIGlzIGFsbG93ZWQuXG4gICAgICBpZiAoIWFueUZvcm1hdCAmJiBmb3JtYXQgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhZGRyZXNzIGlzIGluIG5vcm1hbCByZXByZXNlbnRhdGlvbiBmb3IgZ2l2ZW4gZm9ybWF0LlxuICAgICAgcmV0dXJuIGFkZHJlc3MgPT09IHV0eG9saWIuYWRkcmVzc0Zvcm1hdC5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChzY3JpcHQsIGZvcm1hdCwgdGhpcy5uZXR3b3JrKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmlwMzIuZnJvbUJhc2U1OChwdWIpLmlzTmV1dGVyZWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJlcHJvY2Vzc0J1aWxkUGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGlmIChwYXJhbXMucmVjaXBpZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXMucmVjaXBpZW50cyA9XG4gICAgICAgIHBhcmFtcy5yZWNpcGllbnRzIGluc3RhbmNlb2YgQXJyYXlcbiAgICAgICAgICA/IHBhcmFtcz8ucmVjaXBpZW50cz8ubWFwKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgeyBhZGRyZXNzLCAuLi5yZXN0IH0gPSByZWNpcGllbnQ7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLnJlc3QsIC4uLmZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXQoYWRkcmVzcykgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiBwYXJhbXMucmVjaXBpZW50cztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGF0ZXN0IGJsb2NrIGhlaWdodFxuICAgKiBAcGFyYW0gcmVxSWRcbiAgICovXG4gIGFzeW5jIGdldExhdGVzdEJsb2NrSGVpZ2h0KHJlcUlkPzogUmVxdWVzdFRyYWNlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHJlcUlkKSB7XG4gICAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocmVxSWQpO1xuICAgIH1cbiAgICBjb25zdCBjaGFpbmhlYWQgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL3B1YmxpYy9ibG9jay9sYXRlc3QnKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIChjaGFpbmhlYWQgYXMgYW55KS5oZWlnaHQ7XG4gIH1cblxuICBjaGVja1JlY2lwaWVudChyZWNpcGllbnQ6IHsgYWRkcmVzczogc3RyaW5nOyBhbW91bnQ6IG51bWJlciB8IHN0cmluZyB9KTogdm9pZCB7XG4gICAgYXNzZXJ0VmFsaWRUcmFuc2FjdGlvblJlY2lwaWVudChyZWNpcGllbnQpO1xuICAgIGlmICghaXNTY3JpcHRSZWNpcGllbnQocmVjaXBpZW50LmFkZHJlc3MpKSB7XG4gICAgICBzdXBlci5jaGVja1JlY2lwaWVudChyZWNpcGllbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gY3VzdG9tIGNvaW4gbG9naWMgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIEJpdEdvXG4gICAqIEBwYXJhbSBwcmVidWlsZFxuICAgKi9cbiAgYXN5bmMgcG9zdFByb2Nlc3NQcmVidWlsZDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgICBwcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDxUTnVtYmVyPlxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uUHJlYnVpbGQ8VE51bWJlcj4+IHtcbiAgICBjb25zdCB0eCA9IHRoaXMuZGVjb2RlVHJhbnNhY3Rpb25Gcm9tUHJlYnVpbGQocHJlYnVpbGQpO1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHByZWJ1aWxkLmJsb2NrSGVpZ2h0KSkge1xuICAgICAgcHJlYnVpbGQuYmxvY2tIZWlnaHQgPSAoYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja0hlaWdodCgpKSBhcyBudW1iZXI7XG4gICAgfVxuICAgIHJldHVybiBfLmV4dGVuZCh7fSwgcHJlYnVpbGQsIHsgdHhIZXg6IHR4LnRvSGV4KCkgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGFuIGFkZHJlc3MnIHR5cGUgYmFzZWQgb24gaXRzIHdpdG5lc3MgYW5kIHJlZGVlbSBzY3JpcHQgcHJlc2VuY2VcbiAgICogQHBhcmFtIGFkZHJlc3NEZXRhaWxzXG4gICAqL1xuICBzdGF0aWMgaW5mZXJBZGRyZXNzVHlwZShhZGRyZXNzRGV0YWlsczogeyBjaGFpbjogbnVtYmVyIH0pOiBTY3JpcHRUeXBlMk9mMyB8IG51bGwge1xuICAgIHJldHVybiBpc0NoYWluQ29kZShhZGRyZXNzRGV0YWlscy5jaGFpbikgPyBzY3JpcHRUeXBlRm9yQ2hhaW4oYWRkcmVzc0RldGFpbHMuY2hhaW4pIDogbnVsbDtcbiAgfVxuXG4gIGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUhleDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBoZXg6IHN0cmluZ1xuICApOiB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tSGV4PFROdW1iZXI+KGhleCwgdGhpcy5uZXR3b3JrLCB0aGlzLmFtb3VudFR5cGUpO1xuICB9XG5cbiAgZGVjb2RlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oaW5wdXQ6IEJ1ZmZlciB8IHN0cmluZyk6IERlY29kZWRUcmFuc2FjdGlvbjxUTnVtYmVyPiB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZvciAoY29uc3QgZm9ybWF0IG9mIFsnaGV4JywgJ2Jhc2U2NCddIGFzIGNvbnN0KSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGlucHV0LCBmb3JtYXQpO1xuICAgICAgICBjb25zdCBidWZmZXJUb1N0cmluZyA9IGJ1ZmZlci50b1N0cmluZyhmb3JtYXQpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKGZvcm1hdCA9PT0gJ2Jhc2U2NCcgJiYgYnVmZmVyVG9TdHJpbmcgPT09IGlucHV0KSB8fFxuICAgICAgICAgIChmb3JtYXQgPT09ICdoZXgnICYmIGJ1ZmZlclRvU3RyaW5nID09PSBpbnB1dC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWNvZGVUcmFuc2FjdGlvbihidWZmZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5wdXQgbXVzdCBiZSBhIHZhbGlkIGhleCBvciBiYXNlNjQgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0eG9saWIuYml0Z28uaXNQc2J0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoaW5wdXQsIHRoaXMubmV0d29yayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1dHhvbGliLmJpdGdvLmNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihpbnB1dCwgdGhpcy5uZXR3b3JrLCB7XG4gICAgICAgIGFtb3VudFR5cGU6IHRoaXMuYW1vdW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGRlY29kZVRyYW5zYWN0aW9uRnJvbVByZWJ1aWxkPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHByZWJ1aWxkOiB7XG4gICAgdHhIZXg/OiBzdHJpbmc7XG4gICAgdHhCYXNlNjQ/OiBzdHJpbmc7XG4gIH0pOiBEZWNvZGVkVHJhbnNhY3Rpb248VE51bWJlcj4ge1xuICAgIGNvbnN0IHN0cmluZyA9IHByZWJ1aWxkLnR4SGV4ID8/IHByZWJ1aWxkLnR4QmFzZTY0O1xuICAgIGlmICghc3RyaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHhIZXggb3IgdHhCYXNlNjQgcHJvcGVydHknKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVjb2RlVHJhbnNhY3Rpb24oc3RyaW5nKTtcbiAgfVxuXG4gIHRvQ2Fub25pY2FsVHJhbnNhY3Rpb25SZWNpcGllbnQob3V0cHV0OiB7IHZhbHVlU3RyaW5nOiBzdHJpbmc7IGFkZHJlc3M/OiBzdHJpbmcgfSk6IHtcbiAgICBhbW91bnQ6IGJpZ2ludDtcbiAgICBhZGRyZXNzOiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludChvdXRwdXQudmFsdWVTdHJpbmcpO1xuICAgIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQoeyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH0pO1xuICAgIGFzc2VydChvdXRwdXQuYWRkcmVzcywgJ2FkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICBpZiAoaXNTY3JpcHRSZWNpcGllbnQob3V0cHV0LmFkZHJlc3MpKSB7XG4gICAgICByZXR1cm4geyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH07XG4gICAgfVxuICAgIHJldHVybiB7IGFtb3VudCwgYWRkcmVzczogdGhpcy5jYW5vbmljYWxBZGRyZXNzKG91dHB1dC5hZGRyZXNzKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYW5kIGZpbGwgdHJhbnNhY3Rpb24gZGV0YWlscyBzdWNoIGFzIGludGVybmFsL2NoYW5nZSBzcGVuZCwgZXh0ZXJuYWwgc3BlbmQgKGV4cGxpY2l0IHZzLiBpbXBsaWNpdCksIGV0Yy5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPFROdW1iZXI+PiB7XG4gICAgcmV0dXJuIHBhcnNlVHJhbnNhY3Rpb24odGhpcywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBmdW5jdGlvbiB2ZXJpZnlVc2VyUHVibGljS2V5IGluc3RlYWRcbiAgICovXG4gIHByb3RlY3RlZCB2ZXJpZnlVc2VyUHVibGljS2V5KHBhcmFtczogVmVyaWZ5VXNlclB1YmxpY0tleU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmVyaWZ5VXNlclB1YmxpY0tleSh0aGlzLmJpdGdvLCBwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGZ1bmN0aW9uIHZlcmlmeUtleVNpZ25hdHVyZSBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgdmVyaWZ5S2V5U2lnbmF0dXJlKHBhcmFtczogVmVyaWZ5S2V5U2lnbmF0dXJlc09wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdmVyaWZ5S2V5U2lnbmF0dXJlKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBzZXJ2ZXJcbiAgICogQHBhcmFtIHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4IHByZWJ1aWx0IHRyYW5zYWN0aW9uJ3MgdHhIZXggZm9ybVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldCBXYWxsZXQgb2JqZWN0IHRvIG9idGFpbiBrZXlzIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBwYXJhbXMudmVyaWZpY2F0aW9uIE9iamVjdCBzcGVjaWZ5aW5nIHNvbWUgdmVyaWZpY2F0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy52ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgRGlzYWxsb3cgZmV0Y2hpbmcgYW55IGRhdGEgZnJvbSB0aGUgaW50ZXJuZXQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlc1xuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5rZXljaGFpbnMgUGFzcyBrZXljaGFpbnMgbWFudWFsbHkgcmF0aGVyIHRoYW4gZmV0Y2hpbmcgdGhlbSBieSBpZFxuICAgKiBAcGFyYW0gcGFyYW1zLnZlcmlmaWNhdGlvbi5hZGRyZXNzZXMgQWRkcmVzcyBkZXRhaWxzIHRvIHBhc3MgaW4gZm9yIG91dC1vZi1iYW5kIHZlcmlmaWNhdGlvblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2ZXJpZmljYXRpb24gcGFzc2VzXG4gICAqIEB0aHJvd3Mge1R4SW50ZW50TWlzbWF0Y2hFcnJvcn0gaWYgdHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsc1xuICAgKiBAdGhyb3dzIHtUeEludGVudE1pc21hdGNoUmVjaXBpZW50RXJyb3J9IGlmIHRyYW5zYWN0aW9uIHJlY2lwaWVudHMgZG9uJ3QgbWF0Y2ggdXNlciBpbnRlbnRcbiAgICovXG4gIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdmVyaWZ5VHJhbnNhY3Rpb24odGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IGNvbnZlcnRWYWxpZGF0aW9uRXJyb3JUb1R4SW50ZW50TWlzbWF0Y2goZXJyb3IsIHBhcmFtcy5yZXFJZCwgcGFyYW1zLnR4UGFyYW1zLCBwYXJhbXMudHhQcmVidWlsZC50eEhleCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBzdXJlIGFuIGFkZHJlc3MgaXMgdmFsaWQgYW5kIHRocm93IGFuIGVycm9yIGlmIGl0J3Mgbm90LlxuICAgKiBAcGFyYW0gcGFyYW1zLmFkZHJlc3MgVGhlIGFkZHJlc3Mgc3RyaW5nIG9uIHRoZSBuZXR3b3JrXG4gICAqIEBwYXJhbSBwYXJhbXMuYWRkcmVzc1R5cGVcbiAgICogQHBhcmFtIHBhcmFtcy5rZXljaGFpbnMgS2V5Y2hhaW4gb2JqZWN0cyB3aXRoIHhwdWJzXG4gICAqIEBwYXJhbSBwYXJhbXMuY29pblNwZWNpZmljIENvaW4tc3BlY2lmaWMgZGV0YWlscyBmb3IgdGhlIGFkZHJlc3Mgc3VjaCBhcyBhIHdpdG5lc3Mgc2NyaXB0XG4gICAqIEBwYXJhbSBwYXJhbXMuY2hhaW4gRGVyaXZhdGlvbiBjaGFpblxuICAgKiBAcGFyYW0gcGFyYW1zLmluZGV4IERlcml2YXRpb24gaW5kZXhcbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NFcnJvcn1cbiAgICogQHRocm93cyB7SW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvcn1cbiAgICogQHRocm93cyB7VW5leHBlY3RlZEFkZHJlc3NFcnJvcn1cbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zPFV0eG9Db2luU3BlY2lmaWM+LCB3YWxsZXQ/OiBJV2FsbGV0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBrZXljaGFpbnMsIGNoYWluLCBpbmRleCB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuXG4gICAgaWYgKHdhbGxldCAmJiBpc0Rlc2NyaXB0b3JXYWxsZXQod2FsbGV0KSkge1xuICAgICAgaWYgKCFrZXljaGFpbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGtleWNoYWlucycpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1RyaXBsZShrZXljaGFpbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5Y2hhaW5zIG11c3QgYmUgYSB0cmlwbGUnKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydERlc2NyaXB0b3JXYWxsZXRBZGRyZXNzKFxuICAgICAgICB0aGlzLm5ldHdvcmssXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgZ2V0RGVzY3JpcHRvck1hcEZyb21XYWxsZXQod2FsbGV0LCB0b0JpcDMyVHJpcGxlKGtleWNoYWlucyksIGdldFBvbGljeUZvckVudih0aGlzLmJpdGdvLmVudikpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKChfLmlzVW5kZWZpbmVkKGNoYWluKSAmJiBfLmlzVW5kZWZpbmVkKGluZGV4KSkgfHwgIShfLmlzRmluaXRlKGNoYWluKSAmJiBfLmlzRmluaXRlKGluZGV4KSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Rlcml2YXRpb25Qcm9wZXJ0eUVycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6IGludmFsaWQgY2hhaW4gKCR7Y2hhaW59KSBvciBpbmRleCAoJHtpbmRleH0pYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWtleWNoYWlucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBhcmFtIGtleWNoYWlucycpO1xuICAgIH1cblxuICAgIGFzc2VydEZpeGVkU2NyaXB0V2FsbGV0QWRkcmVzcyh0aGlzLm5ldHdvcmssIHtcbiAgICAgIGFkZHJlc3MsXG4gICAgICBrZXljaGFpbnMsXG4gICAgICBmb3JtYXQ6IHBhcmFtcy5mb3JtYXQgPz8gJ2Jhc2U1OCcsXG4gICAgICBhZGRyZXNzVHlwZTogcGFyYW1zLmFkZHJlc3NUeXBlLFxuICAgICAgY2hhaW4sXG4gICAgICBpbmRleCxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gdW5zcGVudFR5cGVcbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc1R5cGUoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5pc1N1cHBvcnRlZFNjcmlwdFR5cGUodGhpcy5uZXR3b3JrLCBhZGRyZXNzVHlwZSk7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHJldHVybiB0cnVlIGlmZiBjb2luIHN1cHBvcnRzIHNwZW5kaW5nIGZyb20gY2hhaW5cbiAgICovXG4gIHN1cHBvcnRzQWRkcmVzc0NoYWluKGNoYWluOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNDaGFpbkNvZGUoY2hhaW4pICYmIHRoaXMuc3VwcG9ydHNBZGRyZXNzVHlwZSh1dHhvbGliLmJpdGdvLnNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbikpO1xuICB9XG5cbiAga2V5SWRzRm9yU2lnbmluZygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFtLZXlJbmRpY2VzLlVTRVIsIEtleUluZGljZXMuQkFDS1VQLCBLZXlJbmRpY2VzLkJJVEdPXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbnB1dCBwc2J0IGFkZGVkIHdpdGggZGV0ZXJtaW5pc3RpYyBNdVNpZzIgbm9uY2UgZm9yIGJpdGdvIGtleSBmb3IgZWFjaCBNdVNpZzIgaW5wdXRzLlxuICAgKiBAcGFyYW0gcHNidEhleCBhbGwgTXVTaWcyIGlucHV0cyBzaG91bGQgY29udGFpbiB1c2VyIE11U2lnMiBub25jZVxuICAgKiBAcGFyYW0gd2FsbGV0SWRcbiAgICovXG4gIGFzeW5jIHNpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZywgd2FsbGV0SWQ6IHN0cmluZyk6IFByb21pc2U8U2lnblBzYnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IHBhcmFtczogU2lnblBzYnRSZXF1ZXN0ID0geyBwc2J0OiBwc2J0SGV4IH07XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMudXJsKCcvd2FsbGV0LycgKyB3YWxsZXRJZCArICcvdHgvc2lnbnBzYnQnKSlcbiAgICAgIC5zZW5kKHBhcmFtcylcbiAgICAgIC5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbnB1dCBwc2J0IGFkZGVkIHdpdGggZGV0ZXJtaW5pc3RpYyBNdVNpZzIgbm9uY2UgZm9yIGJpdGdvIGtleSBmb3IgZWFjaCBNdVNpZzIgaW5wdXRzIGZyb20gT1ZDLlxuICAgKiBAcGFyYW0gb3ZjSnNvbiBKU09OIG9iamVjdCBwcm92aWRlZCBieSBPVkMgd2l0aCBmaWVsZHMgcHNidEhleCBhbmQgd2FsbGV0SWRcbiAgICovXG4gIGFzeW5jIHNpZ25Qc2J0RnJvbU9WQyhvdmNKc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgICBhc3NlcnQob3ZjSnNvblsncHNidEhleCddLCAnb3ZjSnNvbiBtdXN0IGNvbnRhaW4gcHNidEhleCcpO1xuICAgIGFzc2VydChvdmNKc29uWyd3YWxsZXRJZCddLCAnb3ZjSnNvbiBtdXN0IGNvbnRhaW4gd2FsbGV0SWQnKTtcbiAgICBjb25zdCBwc2J0ID0gKGF3YWl0IHRoaXMuc2lnblBzYnQob3ZjSnNvblsncHNidEhleCddIGFzIHN0cmluZywgb3ZjSnNvblsnd2FsbGV0SWQnXSBhcyBzdHJpbmcpKS5wc2J0O1xuICAgIGFzc2VydChwc2J0LCAncHNidCBub3QgZm91bmQnKTtcbiAgICByZXR1cm4gXy5leHRlbmQob3ZjSnNvbiwgeyB0eEhleDogcHNidCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSB7QHNlZSBTaWduVHJhbnNhY3Rpb25PcHRpb25zfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbiB8IEhhbGZTaWduZWRVdHhvVHJhbnNhY3Rpb24+fVxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+KFxuICAgIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uIHwgSGFsZlNpZ25lZFV0eG9UcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiBzaWduVHJhbnNhY3Rpb248VE51bWJlcj4odGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgdHJhbnNhY3Rpb24gd2l0aCBhIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBFeGFtcGxlIHVzZSBjYXNlIGlzIGV4cHJlc3MgZXh0ZXJuYWwgc2lnbmVyXG4gICAqIEBwYXJhbSBjdXN0b21TaWduaW5nRnVuY3Rpb24gY3VzdG9tIHNpZ25pbmcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgc2luZ2xlIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gc2lnblRyYW5zYWN0aW9uUGFyYW1zIHBhcmFtZXRlcnMgZm9yIGN1c3RvbSBzaWduaW5nIGZ1bmN0aW9uLiBJbmNsdWRlcyB0eFByZWJ1aWxkIGFuZCBwdWJzIChmb3IgbGVnYWN5IHR4IG9ubHkpLlxuICAgKlxuICAgKiBAcmV0dXJucyBzaWduZWQgdHJhbnNhY3Rpb24gYXMgaGV4IHN0cmluZ1xuICAgKi9cbiAgYXN5bmMgc2lnbldpdGhDdXN0b21TaWduaW5nRnVuY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uOiBVdHhvQ3VzdG9tU2lnbmluZ0Z1bmN0aW9uPFROdW1iZXI+LFxuICAgIHNpZ25UcmFuc2FjdGlvblBhcmFtczogeyB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkPFROdW1iZXI+OyBwdWJzPzogc3RyaW5nW10gfVxuICApOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSBzaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZC50eEhleDtcbiAgICBhc3NlcnQodHhIZXgsICdtaXNzaW5nIHR4SGV4IHBhcmFtZXRlcicpO1xuXG4gICAgY29uc3QgdHggPSB0aGlzLmRlY29kZVRyYW5zYWN0aW9uKHR4SGV4KTtcblxuICAgIGNvbnN0IGlzVHhXaXRoS2V5UGF0aFNwZW5kSW5wdXQgPSB0eCBpbnN0YW5jZW9mIGJpdGdvLlV0eG9Qc2J0ICYmIGJpdGdvLmlzVHJhbnNhY3Rpb25XaXRoS2V5UGF0aFNwZW5kSW5wdXQodHgpO1xuXG4gICAgaWYgKCFpc1R4V2l0aEtleVBhdGhTcGVuZElucHV0KSB7XG4gICAgICByZXR1cm4gYXdhaXQgY3VzdG9tU2lnbmluZ0Z1bmN0aW9uKHsgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLCBjb2luOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFR4SGV4ID0gKHY6IFNpZ25lZFRyYW5zYWN0aW9uKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICgndHhIZXgnIGluIHYpIHtcbiAgICAgICAgcmV0dXJuIHYudHhIZXg7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5vdCBmb3VuZCBpbiBzaWduVHJhbnNhY3Rpb24gcmVzdWx0Jyk7XG4gICAgfTtcblxuICAgIGNvbnN0IHNpZ25lck5vbmNlVHggPSBhd2FpdCBjdXN0b21TaWduaW5nRnVuY3Rpb24oe1xuICAgICAgLi4uc2lnblRyYW5zYWN0aW9uUGFyYW1zLFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJOb25jZScsXG4gICAgICBjb2luOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJzIH0gPSBzaWduVHJhbnNhY3Rpb25QYXJhbXM7XG4gICAgYXNzZXJ0KHB1YnMgPT09IHVuZGVmaW5lZCB8fCBpc1RyaXBsZShwdWJzKSk7XG5cbiAgICBjb25zdCBjb3NpZ25lck5vbmNlVHggPSBhd2FpdCB0aGlzLnNpZ25UcmFuc2FjdGlvbjxUTnVtYmVyPih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICBwdWJzLFxuICAgICAgdHhQcmVidWlsZDogeyAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMudHhQcmVidWlsZCwgdHhIZXg6IGdldFR4SGV4KHNpZ25lck5vbmNlVHgpIH0sXG4gICAgICBzaWduaW5nU3RlcDogJ2Nvc2lnbmVyTm9uY2UnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGF3YWl0IGN1c3RvbVNpZ25pbmdGdW5jdGlvbih7XG4gICAgICAuLi5zaWduVHJhbnNhY3Rpb25QYXJhbXMsXG4gICAgICB0eFByZWJ1aWxkOiB7IC4uLnNpZ25UcmFuc2FjdGlvblBhcmFtcy50eFByZWJ1aWxkLCB0eEhleDogZ2V0VHhIZXgoY29zaWduZXJOb25jZVR4KSB9LFxuICAgICAgc2lnbmluZ1N0ZXA6ICdzaWduZXJTaWduYXR1cmUnLFxuICAgICAgY29pbjogdGhpcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gdW5zcGVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQml0R29UYWludGVkVW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50Pih1bnNwZW50OiBVbnNwZW50PFROdW1iZXI+KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQ8VE51bWJlcj4odW5zcGVudCwgdGhpcy5uZXR3b3JrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvbXBvc2UgYSByYXcgcHNidC90cmFuc2FjdGlvbiBpbnRvIHVzZWZ1bCBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdG90YWwgYW1vdW50cyxcbiAgICogY2hhbmdlIGFtb3VudHMsIGFuZCB0cmFuc2FjdGlvbiBvdXRwdXRzLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBsYWluVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4oXG4gICAgcGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zPFROdW1iZXI+XG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIHJldHVybiBleHBsYWluVHgodGhpcy5kZWNvZGVUcmFuc2FjdGlvbkZyb21QcmVidWlsZChwYXJhbXMpLCBwYXJhbXMsIHRoaXMubmV0d29yayk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbXVsdGlzaWcgYWRkcmVzcyBvZiBhIGdpdmVuIHR5cGUgZnJvbSBhIGxpc3Qgb2Yga2V5Y2hhaW5zIGFuZCBhIHNpZ25pbmcgdGhyZXNob2xkXG4gICAqIEBwYXJhbSBhZGRyZXNzVHlwZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlVGhyZXNob2xkXG4gICAqIEBwYXJhbSBrZXlzXG4gICAqL1xuICBjcmVhdGVNdWx0aVNpZ0FkZHJlc3MoYWRkcmVzc1R5cGU6IFNjcmlwdFR5cGUyT2YzLCBzaWduYXR1cmVUaHJlc2hvbGQ6IG51bWJlciwga2V5czogQnVmZmVyW10pOiBNdWx0aVNpZ0FkZHJlc3Mge1xuICAgIGNvbnN0IHtcbiAgICAgIHNjcmlwdFB1YktleTogb3V0cHV0U2NyaXB0LFxuICAgICAgcmVkZWVtU2NyaXB0LFxuICAgICAgd2l0bmVzc1NjcmlwdCxcbiAgICB9ID0gdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmNyZWF0ZU91dHB1dFNjcmlwdDJvZjMoa2V5cywgYWRkcmVzc1R5cGUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dHB1dFNjcmlwdCxcbiAgICAgIHJlZGVlbVNjcmlwdCxcbiAgICAgIHdpdG5lc3NTY3JpcHQsXG4gICAgICBhZGRyZXNzOiB1dHhvbGliLmFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIHRoaXMubmV0d29yayksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSB7QHNlZSBiYWNrdXBLZXlSZWNvdmVyeX1cbiAgICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHb1xuICAgKiBAcGFyYW0gcGFyYW1zIC0ge0BzZWUgYmFja3VwS2V5UmVjb3Zlcnl9XG4gICAqL1xuICBhc3luYyByZWNvdmVyKHBhcmFtczogUmVjb3ZlclBhcmFtcyk6IFJldHVyblR5cGU8dHlwZW9mIGJhY2t1cEtleVJlY292ZXJ5PiB7XG4gICAgcmV0dXJuIGJhY2t1cEtleVJlY292ZXJ5KHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICBhc3luYyByZWNvdmVyVjEocGFyYW1zOiBWMVJlY292ZXJQYXJhbXMpOiBSZXR1cm5UeXBlPHR5cGVvZiB2MUJhY2t1cEtleVJlY292ZXJ5PiB7XG4gICAgcmV0dXJuIHYxQmFja3VwS2V5UmVjb3ZlcnkodGhpcywgdGhpcy5iaXRnbywgcGFyYW1zKTtcbiAgfVxuXG4gIGFzeW5jIHN3ZWVwVjEocGFyYW1zOiBWMVN3ZWVwUGFyYW1zKTogUmV0dXJuVHlwZTx0eXBlb2YgdjFTd2VlcD4ge1xuICAgIHJldHVybiB2MVN3ZWVwKHRoaXMsIHRoaXMuYml0Z28sIHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBjb2luIHRoYXQgd2FzIHNlbnQgdG8gd3JvbmcgY2hhaW5cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4aWQgVGhlIHR4aWQgb2YgdGhlIGZhdWx0eSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zLnJlY292ZXJ5QWRkcmVzcyBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0IHRoZSB3YWxsZXQgdGhhdCByZWNlaXZlZCB0aGUgZnVuZHNcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeUNvaW4gdGhlIGNvaW4gdHlwZSBvZiB0aGUgd2FsbGV0IHRoYXQgcmVjZWl2ZWQgdGhlIGZ1bmRzXG4gICAqIEBwYXJhbSBwYXJhbXMuc2lnbmVkIHJldHVybiBhIGhhbGYtc2lnbmVkIHRyYW5zYWN0aW9uIChkZWZhdWx0PXRydWUpXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB0aGUgd2FsbGV0IHBhc3NwaHJhc2VcbiAgICogQHBhcmFtIHBhcmFtcy54cHJ2IHRoZSB1bmVuY3J5cHRlZCB4cHJ2ICh1c2VkIGluc3RlYWQgb2Ygd2FsbGV0IHBhc3NwaHJhc2UpXG4gICAqIEBwYXJhbSBwYXJhbXMuYXBpS2V5IGZvciB1dHhvIGNvaW5zIG90aGVyIHRoYW4gW0JUQyxUQlRDXSB0aGlzIGlzIGEgQmxvY2sgQ2hhaXIgYXBpIGtleVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGFzeW5jIHJlY292ZXJGcm9tV3JvbmdDaGFpbjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPihcbiAgICBwYXJhbXM6IFJlY292ZXJGcm9tV3JvbmdDaGFpbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxDcm9zc0NoYWluUmVjb3ZlcnlTaWduZWQ8VE51bWJlcj4gfCBDcm9zc0NoYWluUmVjb3ZlcnlVbnNpZ25lZDxUTnVtYmVyPj4ge1xuICAgIGNvbnN0IHsgdHhpZCwgcmVjb3ZlcnlBZGRyZXNzLCB3YWxsZXQsIHdhbGxldFBhc3NwaHJhc2UsIHhwcnYsIGFwaUtleSB9ID0gcGFyYW1zO1xuXG4gICAgLy8gcGFyYW1zLnJlY292ZXJ5Q29pbiB1c2VkIHRvIGJlIHBhcmFtcy5jb2luLCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHJlY292ZXJ5Q29pbiA9IHBhcmFtcy5jb2luIHx8IHBhcmFtcy5yZWNvdmVyeUNvaW47XG4gICAgaWYgKCFyZWNvdmVyeUNvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBvYmplY3QgcmVjb3ZlcnlDb2luJyk7XG4gICAgfVxuICAgIC8vIHNpZ25lZCBzaG91bGQgZGVmYXVsdCB0byB0cnVlLCBhbmQgb25seSBiZSBkaXNhYmxlZCBpZiBleHBsaWNpdGx5IHNldCB0byBmYWxzZSAobm90IHVuZGVmaW5lZClcbiAgICBjb25zdCBzaWduZWQgPSBwYXJhbXMuc2lnbmVkICE9PSBmYWxzZTtcblxuICAgIGNvbnN0IHNvdXJjZUNvaW5GYW1pbHkgPSB0aGlzLmdldEZhbWlseSgpO1xuICAgIGNvbnN0IHJlY292ZXJ5Q29pbkZhbWlseSA9IHJlY292ZXJ5Q29pbi5nZXRGYW1pbHkoKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zID0gc3VwcG9ydGVkQ3Jvc3NDaGFpblJlY292ZXJpZXNbc291cmNlQ29pbkZhbWlseV07XG5cbiAgICBpZiAoXy5pc1VuZGVmaW5lZChzdXBwb3J0ZWRSZWNvdmVyeUNvaW5zKSB8fCAhc3VwcG9ydGVkUmVjb3ZlcnlDb2lucy5pbmNsdWRlcyhyZWNvdmVyeUNvaW5GYW1pbHkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY292ZXJ5IG9mICR7c291cmNlQ29pbkZhbWlseX0gYmFsYW5jZXMgZnJvbSAke3JlY292ZXJ5Q29pbkZhbWlseX0gd2FsbGV0cyBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCByZWNvdmVyQ3Jvc3NDaGFpbjxUTnVtYmVyPih0aGlzLmJpdGdvLCB7XG4gICAgICBzb3VyY2VDb2luOiB0aGlzLFxuICAgICAgcmVjb3ZlcnlDb2luLFxuICAgICAgd2FsbGV0SWQ6IHdhbGxldCxcbiAgICAgIHR4aWQsXG4gICAgICByZWNvdmVyeUFkZHJlc3MsXG4gICAgICB3YWxsZXRQYXNzcGhyYXNlOiBzaWduZWQgPyB3YWxsZXRQYXNzcGhyYXNlIDogdW5kZWZpbmVkLFxuICAgICAgeHBydjogc2lnbmVkID8geHBydiA6IHVuZGVmaW5lZCxcbiAgICAgIGFwaUtleSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiaXAzMiBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViIGFuZCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkOiBCdWZmZXIpOiB7IHB1Yjogc3RyaW5nOyBwcnY6IHN0cmluZyB9IHtcbiAgICBpZiAoIXNlZWQpIHtcbiAgICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgICAvLyBiaXQgY2hhaW4gY29kZSwgYm90aCBvZiB3aGljaCBtdXN0IGJlIHJhbmRvbS4gNTEyIGJpdHMgaXMgdGhlcmVmb3JlIHRoZVxuICAgICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gICAgfVxuICAgIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogZXh0ZW5kZWRLZXkubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgICAgcHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgZGVmYXVsdCB0cmFuc2FjdGlvbiBmb3JtYXQgYmFzZWQgb24gd2FsbGV0IHByb3BlcnRpZXMgYW5kIG5ldHdvcmtcbiAgICogQHBhcmFtIHdhbGxldCAtIFRoZSB3YWxsZXQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHJlcXVlc3RlZEZvcm1hdCAtIE9wdGlvbmFsIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGZvcm1hdFxuICAgKiBAcmV0dXJucyBUaGUgdHJhbnNhY3Rpb24gZm9ybWF0IHRvIHVzZSwgb3IgdW5kZWZpbmVkIGlmIG5vIGRlZmF1bHQgYXBwbGllc1xuICAgKi9cbiAgZ2V0RGVmYXVsdFR4Rm9ybWF0KHdhbGxldDogV2FsbGV0LCByZXF1ZXN0ZWRGb3JtYXQ/OiBUeEZvcm1hdCk6IFR4Rm9ybWF0IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBJZiBmb3JtYXQgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHVzZSBpdFxuICAgIGlmIChyZXF1ZXN0ZWRGb3JtYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzVGVzdG5ldCh0aGlzLm5ldHdvcmspICYmIHJlcXVlc3RlZEZvcm1hdCA9PT0gJ2xlZ2FjeScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yRGVwcmVjYXRlZFR4Rm9ybWF0KHJlcXVlc3RlZEZvcm1hdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXF1ZXN0ZWRGb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKGlzVGVzdG5ldCh0aGlzLm5ldHdvcmspKSB7XG4gICAgICByZXR1cm4gJ3BzYnQtbGl0ZSc7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FsbGV0RmxhZ011c2lnS3AgPSB3YWxsZXQuZmxhZygnbXVzaWdLcCcpID09PSAndHJ1ZSc7XG4gICAgY29uc3QgaXNIb3RXYWxsZXQgPSB3YWxsZXQudHlwZSgpID09PSAnaG90JztcblxuICAgIC8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgZGVmYXVsdCB0byBwc2J0IGZvcm1hdFxuICAgIGNvbnN0IHNob3VsZERlZmF1bHRUb1BzYnQgPVxuICAgICAgd2FsbGV0LnN1YlR5cGUoKSA9PT0gJ2Rpc3RyaWJ1dGVkQ3VzdG9keScgfHxcbiAgICAgIC8vIGlmIG1haW5uZXQsIG9ubHkgZGVmYXVsdCB0byBwc2J0IGZvciBidGMgaG90IHdhbGxldHNcbiAgICAgIChpc01haW5uZXQodGhpcy5uZXR3b3JrKSAmJiBnZXRNYWlubmV0KHRoaXMubmV0d29yaykgPT09IHV0eG9saWIubmV0d29ya3MuYml0Y29pbiAmJiBpc0hvdFdhbGxldCkgfHxcbiAgICAgIC8vIGRlZmF1bHQgdG8gcHNidCBpZiBpdCBoYXMgdGhlIHdhbGxldCBmbGFnXG4gICAgICB3YWxsZXRGbGFnTXVzaWdLcDtcblxuICAgIHJldHVybiBzaG91bGREZWZhdWx0VG9Qc2J0ID8gJ3BzYnQnIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgZ2V0RXh0cmFQcmVidWlsZFBhcmFtcyhidWlsZFBhcmFtczogRXh0cmFQcmVidWlsZFBhcmFtc09wdGlvbnMgJiB7IHdhbGxldDogV2FsbGV0IH0pOiBQcm9taXNlPHtcbiAgICB0eEZvcm1hdD86IFR4Rm9ybWF0O1xuICAgIGNoYW5nZUFkZHJlc3NUeXBlPzogU2NyaXB0VHlwZTJPZjNbXSB8IFNjcmlwdFR5cGUyT2YzO1xuICB9PiB7XG4gICAgY29uc3QgdHhGb3JtYXQgPSB0aGlzLmdldERlZmF1bHRUeEZvcm1hdChidWlsZFBhcmFtcy53YWxsZXQsIGJ1aWxkUGFyYW1zLnR4Rm9ybWF0IGFzIFR4Rm9ybWF0IHwgdW5kZWZpbmVkKTtcbiAgICBsZXQgY2hhbmdlQWRkcmVzc1R5cGUgPSBidWlsZFBhcmFtcy5jaGFuZ2VBZGRyZXNzVHlwZSBhcyBTY3JpcHRUeXBlMk9mM1tdIHwgU2NyaXB0VHlwZTJPZjMgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBpZiB0aGUgYWRkcmVzc1R5cGUgaXMgbm90IHNwZWNpZmllZCwgd2UgbmVlZCB0byBkZWZhdWx0IHRvIHAydHJNdXNpZzIgZm9yIHRlc3RuZXQgaG90IHdhbGxldHMgZm9yIHN0YWdlZCByb2xsb3V0IG9mIHAydHJNdXNpZzJcbiAgICBpZiAoXG4gICAgICBidWlsZFBhcmFtcy5hZGRyZXNzVHlwZSA9PT0gdW5kZWZpbmVkICYmIC8vIGFkZHJlc3NUeXBlIGlzIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5IGBjaGFuZ2VBZGRyZXNzYFxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzc1R5cGUgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgYnVpbGRQYXJhbXMuY2hhbmdlQWRkcmVzcyA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBidWlsZFBhcmFtcy53YWxsZXQudHlwZSgpID09PSAnaG90J1xuICAgICkge1xuICAgICAgY2hhbmdlQWRkcmVzc1R5cGUgPSBbJ3AydHJNdXNpZzInLCAncDJ3c2gnLCAncDJzaFAyd3NoJywgJ3Ayc2gnLCAncDJ0ciddO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0eEZvcm1hdCxcbiAgICAgIGNoYW5nZUFkZHJlc3NUeXBlLFxuICAgIH07XG4gIH1cblxuICBwcmVDcmVhdGVCaXRHbyhwYXJhbXM6IFByZWNyZWF0ZUJpdEdvT3B0aW9ucyk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGFzeW5jIHByZXNpZ25UcmFuc2FjdGlvbihwYXJhbXM6IFByZXNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwYXJhbXMud2FsbGV0RGF0YSAmJiBpc1V0eG9XYWxsZXREYXRhKHBhcmFtcy53YWxsZXREYXRhKSAmJiBpc0Rlc2NyaXB0b3JXYWxsZXREYXRhKHBhcmFtcy53YWxsZXREYXRhKSkge1xuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBoYXZlIGEgJ3BzYnQtbGl0ZScgdHJhbnNhY3Rpb24gZm9ybWF0LCB3ZSB3YW50IHRvIGluZGljYXRlIGluIHNpZ25pbmcgdG8gbm90IGZhaWxcbiAgICBjb25zdCB0eEhleCA9IChwYXJhbXMudHhIZXggPz8gcGFyYW1zLnR4UHJlYnVpbGQ/LnR4SGV4KSBhcyBzdHJpbmc7XG4gICAgaWYgKFxuICAgICAgdHhIZXggJiZcbiAgICAgIHV0eG9saWIuYml0Z28uaXNQc2J0KHR4SGV4IGFzIHN0cmluZykgJiZcbiAgICAgIHV0eG9saWIuYml0Z28uaXNQc2J0TGl0ZSh1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tSGV4KHR4SGV4LCB0aGlzLm5ldHdvcmspKSAmJlxuICAgICAgcGFyYW1zLmFsbG93Tm9uU2Vnd2l0U2lnbmluZ1dpdGhvdXRQcmV2VHggPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBhbGxvd05vblNlZ3dpdFNpZ25pbmdXaXRob3V0UHJldlR4OiB0cnVlIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zLFxuICAgIGtleWNoYWluczogS2V5Y2hhaW5zVHJpcGxldFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRSZWNvdmVyeVByb3ZpZGVyKGFwaVRva2VuPzogc3RyaW5nKTogUmVjb3ZlcnlQcm92aWRlciB7XG4gICAgcmV0dXJuIGZvckNvaW4odGhpcy5nZXRDaGFpbigpLCBhcGlUb2tlbik7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkoeyBtdWx0aVNpZ1R5cGUsIHB1YmxpY0tleSwgcHJ2IH0pIHtcbiAgICBpZiAobXVsdGlTaWdUeXBlID09PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0c3MgYXVkaXRpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBjb2luJyk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZFBydihwcnYpICYmICFpc1ZhbGlkWHBydihwcnYpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKHB1YmxpY0tleSkge1xuICAgICAgY29uc3QgZ2VuUHViS2V5ID0gYmlwMzIuZnJvbUJhc2U1OChwcnYpLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcbiAgICAgIGlmIChnZW5QdWJLZXkgIT09IHB1YmxpY0tleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3B1YmxpYyBrZXkgZG9lcyBub3QgbWF0Y2ggcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==