@bitgo-beta/sdk-core 8.2.1-beta.203 → 8.2.1-beta.2030

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 (744) hide show
  1. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  3. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  6. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
  9. package/dist/src/account-lib/baseCoin/enum.d.ts +58 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +109 -10
  12. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  13. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  14. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  15. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  16. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  17. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  18. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  19. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  20. package/dist/src/account-lib/baseCoin/index.js +8 -5
  21. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  30. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  33. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  36. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  45. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  48. package/dist/src/account-lib/index.js +23 -9
  49. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  50. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  51. package/dist/src/account-lib/mpc/index.js +6 -2
  52. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -3
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +376 -354
  55. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  56. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  59. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +46 -53
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  62. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  65. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  66. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  69. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  70. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  71. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  72. package/dist/src/account-lib/mpc/util.js +24 -1
  73. package/dist/src/account-lib/staking/index.js +6 -2
  74. package/dist/src/account-lib/staking/utils.js +3 -3
  75. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  76. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  77. package/dist/src/account-lib/util/crypto.js +69 -38
  78. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  81. package/dist/src/api/bip32path.js +2 -3
  82. package/dist/src/api/index.js +6 -2
  83. package/dist/src/api/types.d.ts +31 -0
  84. package/dist/src/api/types.d.ts.map +1 -1
  85. package/dist/src/api/types.js +1 -1
  86. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -1
  87. package/dist/src/bitgo/address-book/address-book.js +20 -12
  88. package/dist/src/bitgo/address-book/index.js +6 -2
  89. package/dist/src/bitgo/address-book/types.d.ts +36 -36
  90. package/dist/src/bitgo/address-book/types.d.ts.map +1 -1
  91. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +123 -12
  92. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  93. package/dist/src/bitgo/baseCoin/baseCoin.js +203 -16
  94. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +294 -27
  95. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  96. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  97. package/dist/src/bitgo/baseCoin/index.js +6 -2
  98. package/dist/src/bitgo/bip32util.d.ts +3 -16
  99. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  100. package/dist/src/bitgo/bip32util.js +4 -56
  101. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  102. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  103. package/dist/src/bitgo/bitcoin.js +26 -13
  104. package/dist/src/bitgo/bitgoBase.d.ts +17 -4
  105. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  106. package/dist/src/bitgo/bitgoBase.js +1 -1
  107. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  108. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  109. package/dist/src/bitgo/coinFactory.js +26 -3
  110. package/dist/src/bitgo/config.d.ts +3 -101
  111. package/dist/src/bitgo/config.d.ts.map +1 -1
  112. package/dist/src/bitgo/config.js +26 -15
  113. package/dist/src/bitgo/defi/defiVault.d.ts +171 -0
  114. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  115. package/dist/src/bitgo/defi/defiVault.js +445 -0
  116. package/dist/src/bitgo/defi/iDefiVault.d.ts +96 -0
  117. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  118. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  119. package/dist/src/bitgo/defi/index.d.ts +3 -0
  120. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  121. package/dist/src/bitgo/defi/index.js +22 -0
  122. package/dist/src/bitgo/ecdh.d.ts +0 -1
  123. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  124. package/dist/src/bitgo/ecdh.js +26 -13
  125. package/dist/src/bitgo/enterprise/enterprise.d.ts +9 -4
  126. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  127. package/dist/src/bitgo/enterprise/enterprise.js +47 -21
  128. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  129. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +5 -3
  130. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  132. package/dist/src/bitgo/enterprise/index.js +6 -2
  133. package/dist/src/bitgo/environments.d.ts +68 -3
  134. package/dist/src/bitgo/environments.d.ts.map +1 -1
  135. package/dist/src/bitgo/environments.js +414 -34
  136. package/dist/src/bitgo/errors.d.ts +182 -1
  137. package/dist/src/bitgo/errors.d.ts.map +1 -1
  138. package/dist/src/bitgo/errors.js +177 -3
  139. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  140. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  141. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  142. package/dist/src/bitgo/index.d.ts +5 -1
  143. package/dist/src/bitgo/index.d.ts.map +1 -1
  144. package/dist/src/bitgo/index.js +31 -11
  145. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  146. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  147. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  148. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  149. package/dist/src/bitgo/internal/index.js +6 -2
  150. package/dist/src/bitgo/internal/internal.js +5 -6
  151. package/dist/src/bitgo/internal/keycard.d.ts +12 -8
  152. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  153. package/dist/src/bitgo/internal/keycard.js +60 -48
  154. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +14 -0
  155. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  156. package/dist/src/bitgo/keychain/decryptKeychain.js +36 -0
  157. package/dist/src/bitgo/keychain/iKeychains.d.ts +128 -11
  158. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  159. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  160. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  161. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  162. package/dist/src/bitgo/keychain/index.js +7 -2
  163. package/dist/src/bitgo/keychain/keychains.d.ts +55 -7
  164. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  165. package/dist/src/bitgo/keychain/keychains.js +282 -52
  166. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  167. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  168. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  169. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  170. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  171. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  172. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  173. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  174. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  175. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  176. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  177. package/dist/src/bitgo/market/index.js +6 -2
  178. package/dist/src/bitgo/market/markets.js +23 -9
  179. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +5 -1
  180. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  181. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  182. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  183. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  184. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/pendingApproval.js +246 -111
  186. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  187. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  188. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  189. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  190. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  191. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  192. package/dist/src/bitgo/proofs/index.js +6 -0
  193. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  194. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  195. package/dist/src/bitgo/proofs/types.js +80 -0
  196. package/dist/src/bitgo/recovery/index.js +6 -2
  197. package/dist/src/bitgo/recovery/initiate.d.ts +13 -3
  198. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  199. package/dist/src/bitgo/recovery/initiate.js +49 -41
  200. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts +88 -0
  201. package/dist/src/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  202. package/dist/src/bitgo/safe/derivableEd25519Pub.js +204 -0
  203. package/dist/src/bitgo/safe/iSafe.d.ts +87 -0
  204. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
  205. package/dist/src/bitgo/safe/iSafe.js +3 -0
  206. package/dist/src/bitgo/safe/iSafes.d.ts +94 -0
  207. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
  208. package/dist/src/bitgo/safe/iSafes.js +3 -0
  209. package/dist/src/bitgo/safe/index.d.ts +7 -0
  210. package/dist/src/bitgo/safe/index.d.ts.map +1 -0
  211. package/dist/src/bitgo/safe/index.js +23 -0
  212. package/dist/src/bitgo/safe/safe.d.ts +61 -0
  213. package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
  214. package/dist/src/bitgo/safe/safe.js +230 -0
  215. package/dist/src/bitgo/safe/safeDerivation.d.ts +30 -0
  216. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -0
  217. package/dist/src/bitgo/safe/safeDerivation.js +122 -0
  218. package/dist/src/bitgo/safe/safes.d.ts +107 -0
  219. package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
  220. package/dist/src/bitgo/safe/safes.js +315 -0
  221. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  222. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  223. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  224. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  225. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  226. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  227. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  228. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  229. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  230. package/dist/src/bitgo/staking/iStakingWallet.d.ts +157 -8
  231. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  232. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  233. package/dist/src/bitgo/staking/index.d.ts +3 -0
  234. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  235. package/dist/src/bitgo/staking/index.js +9 -2
  236. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  237. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  238. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  239. package/dist/src/bitgo/trading/iTradingAccount.d.ts +13 -1
  240. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  241. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  242. package/dist/src/bitgo/trading/index.d.ts +1 -0
  243. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  244. package/dist/src/bitgo/trading/index.js +7 -2
  245. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  246. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  247. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  248. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  249. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  250. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  251. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  252. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  253. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  254. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  255. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  256. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  257. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  258. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  259. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  260. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  261. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  262. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  263. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  264. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  265. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  266. package/dist/src/bitgo/trading/network/index.d.ts +2 -0
  267. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -1
  268. package/dist/src/bitgo/trading/network/index.js +8 -2
  269. package/dist/src/bitgo/trading/network/network.d.ts +4 -3
  270. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -1
  271. package/dist/src/bitgo/trading/network/network.js +24 -27
  272. package/dist/src/bitgo/trading/network/types.d.ts +79 -46
  273. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -1
  274. package/dist/src/bitgo/trading/network/types.js +1 -1
  275. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  276. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  277. package/dist/src/bitgo/trading/network/utils.js +54 -0
  278. package/dist/src/bitgo/trading/tradingAccount.d.ts +15 -1
  279. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  280. package/dist/src/bitgo/trading/tradingAccount.js +55 -7
  281. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +49 -0
  282. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  283. package/dist/src/bitgo/tss/bitgoPubKeys.js +92 -0
  284. package/dist/src/bitgo/tss/common.d.ts +41 -6
  285. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  286. package/dist/src/bitgo/tss/common.js +127 -17
  287. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  288. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  289. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  290. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  291. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  292. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  293. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  294. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  295. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  296. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  297. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  298. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  299. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  300. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  301. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  302. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +42 -0
  303. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  304. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +104 -0
  305. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  306. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  307. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  308. package/dist/src/bitgo/tss/index.d.ts +3 -2
  309. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  310. package/dist/src/bitgo/tss/index.js +26 -10
  311. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts +50 -0
  312. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  313. package/dist/src/bitgo/tss/redpallas/redpallasMPCv2.js +112 -0
  314. package/dist/src/bitgo/tss/types.d.ts +3 -3
  315. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  316. package/dist/src/bitgo/tss/types.js +2 -2
  317. package/dist/src/bitgo/types.d.ts +3 -3
  318. package/dist/src/bitgo/types.d.ts.map +1 -1
  319. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +10 -0
  320. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  321. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +76 -14
  322. package/dist/src/bitgo/utils/codecProps.js +24 -11
  323. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  324. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  325. package/dist/src/bitgo/utils/codecs.js +59 -0
  326. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/decode.js +30 -16
  328. package/dist/src/bitgo/utils/index.d.ts +4 -2
  329. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  330. package/dist/src/bitgo/utils/index.js +27 -11
  331. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  332. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  333. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  334. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  335. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  336. package/dist/src/bitgo/utils/mpcUtils.js +189 -14
  337. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  338. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  339. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  340. package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -7
  341. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  342. package/dist/src/bitgo/utils/opengpgUtils.js +79 -62
  343. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  344. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  345. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  346. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  347. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  348. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  349. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  350. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  351. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  352. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  353. package/dist/src/bitgo/utils/triple.js +2 -3
  354. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  355. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  356. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  357. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +94 -17
  358. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  359. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +305 -45
  360. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +432 -55
  361. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  362. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  363. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  364. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  367. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  368. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  369. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +25 -51
  370. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  371. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +173 -246
  372. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +216 -0
  373. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  374. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1053 -0
  375. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  376. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  377. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +16 -0
  378. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  379. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  380. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  381. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  382. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  383. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  384. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  385. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  386. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  387. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  388. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  391. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  392. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  393. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +38 -11
  394. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  395. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +254 -96
  396. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +204 -0
  397. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  398. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +862 -0
  399. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  400. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  401. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +16 -0
  402. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  403. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  404. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  405. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  406. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  407. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  408. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  409. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  410. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  411. package/dist/src/bitgo/utils/tss/index.d.ts +5 -0
  412. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  413. package/dist/src/bitgo/utils/tss/index.js +29 -10
  414. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  415. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  416. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  417. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +41 -0
  418. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  419. package/dist/src/bitgo/utils/tss/recipientUtils.js +154 -0
  420. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts +29 -0
  421. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.d.ts.map +1 -0
  422. package/dist/src/bitgo/utils/tss/redpallas/SMC/utils.js +126 -0
  423. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts +4 -0
  424. package/dist/src/bitgo/utils/tss/redpallas/index.d.ts.map +1 -0
  425. package/dist/src/bitgo/utils/tss/redpallas/index.js +20 -0
  426. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +27 -0
  427. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  428. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2.js +43 -0
  429. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts +45 -0
  430. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.d.ts.map +1 -0
  431. package/dist/src/bitgo/utils/tss/redpallas/redpallasMPCv2KeyGenSender.js +55 -0
  432. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts +8 -0
  433. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.d.ts.map +1 -0
  434. package/dist/src/bitgo/utils/tss/serializedTxHexVerify.js +13 -0
  435. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts +12 -0
  436. package/dist/src/bitgo/utils/tss/signableConsistency.d.ts.map +1 -0
  437. package/dist/src/bitgo/utils/tss/signableConsistency.js +9 -0
  438. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  439. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  440. package/dist/src/bitgo/utils/txRequest.js +49 -0
  441. package/dist/src/bitgo/utils/util.js +24 -10
  442. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  443. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  444. package/dist/src/bitgo/utils/wallet.js +48 -0
  445. package/dist/src/bitgo/v1Wallets.d.ts +170 -0
  446. package/dist/src/bitgo/v1Wallets.d.ts.map +1 -0
  447. package/dist/src/bitgo/v1Wallets.js +3 -0
  448. package/dist/src/bitgo/wallet/BuildParams.d.ts +81 -1
  449. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  450. package/dist/src/bitgo/wallet/BuildParams.js +85 -11
  451. package/dist/src/bitgo/wallet/iWallet.d.ts +580 -31
  452. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  453. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  454. package/dist/src/bitgo/wallet/iWallets.d.ts +310 -16
  455. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  456. package/dist/src/bitgo/wallet/iWallets.js +84 -3
  457. package/dist/src/bitgo/wallet/index.d.ts +1 -0
  458. package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
  459. package/dist/src/bitgo/wallet/index.js +7 -2
  460. package/dist/src/bitgo/wallet/safeKeychain.d.ts +75 -0
  461. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -0
  462. package/dist/src/bitgo/wallet/safeKeychain.js +151 -0
  463. package/dist/src/bitgo/wallet/wallet.d.ts +367 -28
  464. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  465. package/dist/src/bitgo/wallet/wallet.js +2254 -381
  466. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  467. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  468. package/dist/src/bitgo/wallet/wallets.js +1242 -155
  469. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  470. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  471. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  472. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  473. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  474. package/dist/src/bitgo/walletUtil/index.js +19 -0
  475. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  476. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  477. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  478. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  479. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  480. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  481. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  482. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  483. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  484. package/dist/src/bitgo/webhook/index.js +6 -2
  485. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  486. package/dist/src/coins/fiat.d.ts +45 -0
  487. package/dist/src/coins/fiat.d.ts.map +1 -0
  488. package/dist/src/coins/fiat.js +94 -0
  489. package/dist/src/coins/index.d.ts +1 -6
  490. package/dist/src/coins/index.d.ts.map +1 -1
  491. package/dist/src/coins/index.js +7 -8
  492. package/dist/src/coins/ofc.d.ts +21 -2
  493. package/dist/src/coins/ofc.d.ts.map +1 -1
  494. package/dist/src/coins/ofc.js +29 -3
  495. package/dist/src/coins/ofcToken.d.ts +15 -4
  496. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  497. package/dist/src/coins/ofcToken.js +43 -5
  498. package/dist/src/coins/susd.d.ts +3 -2
  499. package/dist/src/coins/susd.d.ts.map +1 -1
  500. package/dist/src/coins/susd.js +5 -1
  501. package/dist/src/common.js +27 -13
  502. package/dist/src/index.d.ts +9 -1
  503. package/dist/src/index.d.ts.map +1 -1
  504. package/dist/src/index.js +40 -11
  505. package/dist/src/lightning.d.ts +20 -0
  506. package/dist/src/lightning.d.ts.map +1 -0
  507. package/dist/src/lightning.js +13 -0
  508. package/dist/src/units.js +5 -6
  509. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  510. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  511. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  512. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  513. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  514. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  515. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  516. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  517. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  518. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  519. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  520. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  521. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  522. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  523. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  524. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  525. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  526. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  527. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  528. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  529. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  530. package/dist/test/unit/bitgo/defi/defiVault.js +762 -0
  531. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  532. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  533. package/dist/test/unit/bitgo/environment.js +38 -0
  534. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  535. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  536. package/dist/test/unit/bitgo/errors.js +262 -0
  537. package/dist/test/unit/bitgo/keychain/keychains.d.ts +2 -0
  538. package/dist/test/unit/bitgo/keychain/keychains.d.ts.map +1 -0
  539. package/dist/test/unit/bitgo/keychain/keychains.js +155 -0
  540. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  541. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  542. package/dist/test/unit/bitgo/recovery/initiate.js +159 -0
  543. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts +2 -0
  544. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.d.ts.map +1 -0
  545. package/dist/test/unit/bitgo/safe/derivableEd25519Pub.js +137 -0
  546. package/dist/test/unit/bitgo/safe/fixtures/derivableEd25519Pub.json +197 -0
  547. package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
  548. package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
  549. package/dist/test/unit/bitgo/safe/safe.js +277 -0
  550. package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
  551. package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
  552. package/dist/test/unit/bitgo/safe/safes.js +364 -0
  553. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  554. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  555. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  556. package/dist/test/unit/bitgo/trading/network/network.test.d.ts +2 -0
  557. package/dist/test/unit/bitgo/trading/network/network.test.d.ts.map +1 -0
  558. package/dist/test/unit/bitgo/trading/network/network.test.js +136 -0
  559. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  560. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  561. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  562. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts +2 -0
  563. package/dist/test/unit/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  564. package/dist/test/unit/bitgo/tss/bitgoPubKeys.js +66 -0
  565. package/dist/test/unit/bitgo/tss/common.d.ts +2 -0
  566. package/dist/test/unit/bitgo/tss/common.d.ts.map +1 -0
  567. package/dist/test/unit/bitgo/tss/common.js +77 -0
  568. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  569. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  570. package/dist/test/unit/bitgo/tss/redpallas/redpallasMPCv2.js +181 -0
  571. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -4
  572. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  573. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  574. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  575. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts +2 -0
  576. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.d.ts.map +1 -0
  577. package/dist/test/unit/bitgo/utils/mpcUtils.wrapApprove.js +106 -0
  578. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  579. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  580. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  581. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  582. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  583. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  584. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  585. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  586. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  587. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +348 -0
  588. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  589. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  590. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  591. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  592. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  593. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1068 -0
  594. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  595. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  596. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  597. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  598. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  599. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  600. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  601. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  602. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1918 -0
  603. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  604. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  605. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  606. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  607. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  608. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  609. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  610. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  611. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +406 -0
  612. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts +2 -0
  613. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.d.ts.map +1 -0
  614. package/dist/test/unit/bitgo/utils/tss/redpallas/redpallasMPCv2.js +80 -0
  615. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts +2 -0
  616. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.d.ts.map +1 -0
  617. package/dist/test/unit/bitgo/utils/tss/redpallas/smcUtil.js +279 -0
  618. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts +2 -0
  619. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.d.ts.map +1 -0
  620. package/dist/test/unit/bitgo/utils/tss/redpallasBitgoGpgKey.js +111 -0
  621. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  622. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  623. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  624. package/dist/test/unit/bitgo/utils/wallet.d.ts +2 -0
  625. package/dist/test/unit/bitgo/utils/wallet.d.ts.map +1 -0
  626. package/dist/test/unit/bitgo/utils/wallet.js +55 -0
  627. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  628. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  629. package/dist/test/unit/bitgo/wallet/BuildParams.js +141 -0
  630. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +79 -9
  631. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  632. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  633. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  634. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts +2 -0
  635. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.d.ts.map +1 -0
  636. package/dist/test/unit/bitgo/wallet/getPotentialStuckTxs.js +88 -0
  637. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  638. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  639. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  640. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  641. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  642. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  643. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  644. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  645. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  646. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts +2 -0
  647. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.d.ts.map +1 -0
  648. package/dist/test/unit/bitgo/wallet/prebuildTransactionTypes.js +20 -0
  649. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  650. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  651. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  652. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts +5 -0
  653. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.d.ts.map +1 -0
  654. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +671 -0
  655. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts +9 -0
  656. package/dist/test/unit/bitgo/wallet/safeShareWallet.d.ts.map +1 -0
  657. package/dist/test/unit/bitgo/wallet/safeShareWallet.js +303 -0
  658. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  659. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  660. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  661. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  662. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  663. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  664. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  665. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  666. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +69 -0
  667. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  668. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  669. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  670. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  671. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  672. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +293 -0
  673. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  674. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  675. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  676. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  677. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  678. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +675 -0
  679. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts +2 -0
  680. package/dist/test/unit/bitgo/wallet/walletsGoAccount.d.ts.map +1 -0
  681. package/dist/test/unit/bitgo/wallet/walletsGoAccount.js +150 -0
  682. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  683. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  684. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +201 -0
  685. package/dist/test/unit/coins/ofc.d.ts +2 -0
  686. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  687. package/dist/test/unit/coins/ofc.js +124 -0
  688. package/dist/test/unit/lightning.d.ts +2 -0
  689. package/dist/test/unit/lightning.d.ts.map +1 -0
  690. package/dist/test/unit/lightning.js +23 -0
  691. package/dist/test/unit/units.d.ts.map +1 -1
  692. package/dist/test/unit/units.js +64 -64
  693. package/dist/tsconfig.tsbuildinfo +1 -1
  694. package/package.json +23 -21
  695. package/.eslintignore +0 -5
  696. package/CHANGELOG.md +0 -1712
  697. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  698. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  699. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  700. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  701. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  702. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  703. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  704. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  705. package/dist/src/bitgo/lightning/index.js +0 -17
  706. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  707. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  708. package/dist/src/bitgo/lightning/lightning.js +0 -111
  709. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  710. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  711. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  712. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  713. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  714. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  715. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  716. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  717. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  718. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  719. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  720. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  721. package/dist/src/coins/fiateur.d.ts +0 -31
  722. package/dist/src/coins/fiateur.d.ts.map +0 -1
  723. package/dist/src/coins/fiateur.js +0 -57
  724. package/dist/src/coins/fiatgbp.d.ts +0 -31
  725. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  726. package/dist/src/coins/fiatgbp.js +0 -57
  727. package/dist/src/coins/fiatusd.d.ts +0 -31
  728. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  729. package/dist/src/coins/fiatusd.js +0 -57
  730. package/dist/src/coins/tfiateur.d.ts +0 -11
  731. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  732. package/dist/src/coins/tfiateur.js +0 -17
  733. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  734. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  735. package/dist/src/coins/tfiatgbp.js +0 -17
  736. package/dist/src/coins/tfiatusd.d.ts +0 -11
  737. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  738. package/dist/src/coins/tfiatusd.js +0 -17
  739. package/dist/src/openssl/index.d.ts +0 -5
  740. package/dist/src/openssl/index.d.ts.map +0 -1
  741. package/dist/src/openssl/index.js +0 -9
  742. package/dist/test/unit/openssl.d.ts +0 -2
  743. package/dist/test/unit/openssl.d.ts.map +0 -1
  744. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,762 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const sinon_1 = __importDefault(require("sinon"));
7
+ const assert_1 = __importDefault(require("assert"));
8
+ require("should");
9
+ const statics_1 = require("@bitgo-beta/statics");
10
+ const public_types_1 = require("@bitgo/public-types");
11
+ const src_1 = require("../../../../src");
12
+ describe('DefiVault', function () {
13
+ let wallet;
14
+ let defiVault;
15
+ let mockBitGo;
16
+ let mockBaseCoin;
17
+ // Helper to create a chainable request mock
18
+ function mockRequest(result) {
19
+ return {
20
+ send: sinon_1.default.stub().returnsThis(),
21
+ set: sinon_1.default.stub().returnsThis(),
22
+ query: sinon_1.default.stub().returnsThis(),
23
+ result: sinon_1.default.stub().resolves(result),
24
+ };
25
+ }
26
+ function makeConcreteVault(id) {
27
+ return {
28
+ id,
29
+ name: 'Concrete BTC Vault',
30
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
31
+ status: 'active',
32
+ coin: 'btc',
33
+ assetToken: 'btc',
34
+ shareToken: 'cbtc',
35
+ riskManager: 'manager-1',
36
+ custodyType: 'qualified',
37
+ vaultContractAddress: '0xVaultContract',
38
+ };
39
+ }
40
+ function makeMorphoVault(id) {
41
+ return {
42
+ id,
43
+ name: 'Morpho USDC Vault',
44
+ protocol: public_types_1.VaultProtocol.MORPHO,
45
+ status: 'active',
46
+ coin: 'eth',
47
+ assetToken: 'usdc',
48
+ shareToken: 'musdc',
49
+ riskManager: 'manager-2',
50
+ custodyType: 'qualified',
51
+ vaultContractAddress: '0xMorphoVault',
52
+ };
53
+ }
54
+ // A vault response whose `composition[]` no longer matches the strict
55
+ // GetVaultResponse codec — mirrors the prod incident where a display-only
56
+ // nested field was narrowed/removed server-side. The deposit dispatch path
57
+ // must not hard-fail on it because it only reads `protocol`.
58
+ function makeConcreteVaultWithStaleComposition(id) {
59
+ return {
60
+ ...makeConcreteVault(id),
61
+ composition: [{ asset: 'btc', apy: 'not-a-number' /* stale shape */ }],
62
+ };
63
+ }
64
+ beforeEach(function () {
65
+ mockBitGo = {
66
+ post: sinon_1.default.stub(),
67
+ get: sinon_1.default.stub(),
68
+ del: sinon_1.default.stub(),
69
+ url: sinon_1.default.stub().callsFake((path, version) => `https://bitgo.com/api/v${version}${path}`),
70
+ microservicesUrl: sinon_1.default.stub().callsFake((path) => `https://bitgo.com${path}`),
71
+ setRequestTracer: sinon_1.default.stub(),
72
+ };
73
+ mockBaseCoin = {
74
+ getFamily: sinon_1.default.stub().returns('eth'),
75
+ getConfig: sinon_1.default.stub().returns({ features: [statics_1.CoinFeature.EVM_COIN] }),
76
+ url: sinon_1.default.stub(),
77
+ keychains: sinon_1.default.stub(),
78
+ supportsTss: sinon_1.default.stub().returns(true),
79
+ getMPCAlgorithm: sinon_1.default.stub(),
80
+ };
81
+ const mockWalletData = {
82
+ id: 'test-wallet-id',
83
+ coin: 'eth',
84
+ keys: ['user-key', 'backup-key', 'bitgo-key'],
85
+ enterprise: 'test-enterprise-id',
86
+ };
87
+ wallet = new src_1.Wallet(mockBitGo, mockBaseCoin, mockWalletData);
88
+ defiVault = wallet.defi;
89
+ });
90
+ afterEach(function () {
91
+ sinon_1.default.restore();
92
+ });
93
+ describe('getVaultConfig', function () {
94
+ it('should fetch vault config for a given vaultId', async function () {
95
+ const vaultConfig = {
96
+ id: 'vlt-concrete-1',
97
+ name: 'Concrete BTC Vault',
98
+ protocol: public_types_1.VaultProtocol.CONCRETE_BTCCX,
99
+ status: 'active',
100
+ coin: 'btc',
101
+ assetToken: 'btc',
102
+ shareToken: 'cbtc',
103
+ riskManager: 'manager-1',
104
+ custodyType: 'qualified',
105
+ vaultContractAddress: '0xVaultContract',
106
+ concreteConfig: {
107
+ sourceWalletId: 'src-wallet',
108
+ escrowWalletId: 'escrow-wallet',
109
+ escrowDepositAddress: '1ExampleBtcAddress',
110
+ positionWalletId: 'pos-wallet',
111
+ positionBaseAddress: '1PositionAddress',
112
+ },
113
+ };
114
+ const req = mockRequest(vaultConfig);
115
+ mockBitGo.get.returns(req);
116
+ const result = await defiVault.getVaultConfig({ vaultId: 'vlt-concrete-1' });
117
+ result.should.deepEqual(vaultConfig);
118
+ mockBitGo.get.calledWith('https://bitgo.com/api/defi-service/v1/vaults/vlt-concrete-1').should.be.true();
119
+ req.set.calledWith('enterprise-id', 'test-enterprise-id').should.be.true();
120
+ });
121
+ it('should throw if vaultId is missing', async function () {
122
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: '' }), {
123
+ message: 'vaultId is required',
124
+ });
125
+ });
126
+ it('should propagate errors from the API (e.g. 404)', async function () {
127
+ const req = mockRequest(null);
128
+ req.result.rejects(new Error('Not Found'));
129
+ mockBitGo.get.returns(req);
130
+ await assert_1.default.rejects(() => defiVault.getVaultConfig({ vaultId: 'vlt-not-found' }), {
131
+ message: 'Not Found',
132
+ });
133
+ });
134
+ });
135
+ describe('getVaultProtocol', function () {
136
+ it('should fetch only the protocol for a given vaultId', async function () {
137
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-morpho-1')));
138
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-morpho-1' });
139
+ protocol.should.equal(public_types_1.VaultProtocol.MORPHO);
140
+ mockBitGo.get.calledWith('https://bitgo.com/api/defi-service/v1/vaults/vlt-morpho-1').should.be.true();
141
+ });
142
+ it('should return CONCRETE_BTCCX for a concrete vault', async function () {
143
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-concrete-1')));
144
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-concrete-1' });
145
+ protocol.should.equal(public_types_1.VaultProtocol.CONCRETE_BTCCX);
146
+ });
147
+ it('should tolerate a stale/invalid composition[] field the full GetVaultResponse codec would reject', async function () {
148
+ // The dispatch codec reads only `protocol`, so a display-only nested
149
+ // field going stale server-side must not break this call.
150
+ mockBitGo.get.returns(mockRequest(makeConcreteVaultWithStaleComposition('vlt-stale-1')));
151
+ const protocol = await defiVault.getVaultProtocol({ vaultId: 'vlt-stale-1' });
152
+ protocol.should.equal(public_types_1.VaultProtocol.CONCRETE_BTCCX);
153
+ });
154
+ it('should throw if vaultId is missing', async function () {
155
+ await assert_1.default.rejects(() => defiVault.getVaultProtocol({ vaultId: '' }), {
156
+ message: 'vaultId is required',
157
+ });
158
+ });
159
+ it('should propagate errors from the API (e.g. 404)', async function () {
160
+ const req = mockRequest(null);
161
+ req.result.rejects(new Error('Not Found'));
162
+ mockBitGo.get.returns(req);
163
+ await assert_1.default.rejects(() => defiVault.getVaultProtocol({ vaultId: 'vlt-not-found' }), {
164
+ message: 'Not Found',
165
+ });
166
+ });
167
+ });
168
+ describe('depositToVault', function () {
169
+ describe('concrete_btccx provider', function () {
170
+ it('should call sendMany once with defi-deposit type and no recipients', async function () {
171
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-1')));
172
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
173
+ pendingApproval: {
174
+ id: 'pa-uuid-123',
175
+ state: 'awaitingSignature',
176
+ },
177
+ });
178
+ const result = await defiVault.depositToVault({
179
+ vaultId: 'vlt-btc-1',
180
+ amount: '5000000',
181
+ });
182
+ // Returns ConcreteDepositResult shape
183
+ result.pendingApprovalId.should.equal('pa-uuid-123');
184
+ result.state.should.equal('awaitingSignature');
185
+ // Only one sendMany call — no second deposit sendMany
186
+ sendManyStub.calledOnce.should.be.true();
187
+ const callArgs = sendManyStub.firstCall.args[0];
188
+ callArgs.type.should.equal('defi-deposit');
189
+ callArgs.defiParams.vaultId.should.equal('vlt-btc-1');
190
+ callArgs.defiParams.amount.should.equal('5000000');
191
+ callArgs.defiParams.actionType.should.equal('defi-deposit');
192
+ // No recipients key at all
193
+ assert_1.default.strictEqual(callArgs.recipients, undefined);
194
+ });
195
+ it('should pass walletPassphrase when provided', async function () {
196
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-2')));
197
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
198
+ pendingApproval: { id: 'pa-uuid-456', state: 'awaitingSignature' },
199
+ });
200
+ await defiVault.depositToVault({
201
+ vaultId: 'vlt-btc-2',
202
+ amount: '1000000',
203
+ walletPassphrase: 'hunter2',
204
+ });
205
+ const callArgs = sendManyStub.firstCall.args[0];
206
+ callArgs.walletPassphrase.should.equal('hunter2');
207
+ });
208
+ it('should default state to awaitingSignature when absent from pendingApproval', async function () {
209
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-3')));
210
+ sinon_1.default.stub(wallet, 'sendMany').resolves({
211
+ pendingApproval: { id: 'pa-no-state' },
212
+ });
213
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-btc-3', amount: '1000000' });
214
+ result.state.should.equal('awaitingSignature');
215
+ });
216
+ it('should tolerate a stale/invalid composition[] field that the full GetVaultResponse codec would reject', async function () {
217
+ // Regression guard for the cross-repo codec-drift incident: the
218
+ // deposit dispatch path reads only `protocol`, so a display-only
219
+ // nested field going stale server-side must not break deposits.
220
+ mockBitGo.get.returns(mockRequest(makeConcreteVaultWithStaleComposition('vlt-btc-stale')));
221
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany').resolves({
222
+ pendingApproval: { id: 'pa-stale', state: 'awaitingSignature' },
223
+ });
224
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-btc-stale', amount: '1000000' });
225
+ result.pendingApprovalId.should.equal('pa-stale');
226
+ sendManyStub.calledOnce.should.be.true();
227
+ });
228
+ it('should throw when sendMany returns no pendingApproval', async function () {
229
+ mockBitGo.get.returns(mockRequest(makeConcreteVault('vlt-btc-4')));
230
+ sinon_1.default.stub(wallet, 'sendMany').resolves({ txRequest: { txRequestId: 'unexpected' } });
231
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-btc-4', amount: '1000000' }), {
232
+ message: 'defi-deposit sendMany response: unknown; unknown',
233
+ });
234
+ });
235
+ });
236
+ describe('morpho provider', function () {
237
+ it('should call sendMany for approve and deposit on happy path', async function () {
238
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
239
+ const operationId = 'op-uuid-123';
240
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
241
+ // WP writes operationId into the built tx's coinSpecific (full apiVersion),
242
+ // not into the intent — mirror that real shape here.
243
+ sendManyStub.onFirstCall().resolves({
244
+ txRequest: {
245
+ txRequestId: 'txreq-approve-1',
246
+ intent: { intentType: 'defi-approve' },
247
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
248
+ },
249
+ });
250
+ sendManyStub.onSecondCall().resolves({
251
+ txRequest: {
252
+ txRequestId: 'txreq-deposit-1',
253
+ intent: { intentType: 'defi-deposit' },
254
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
255
+ },
256
+ });
257
+ const result = await defiVault.depositToVault({
258
+ vaultId: 'vlt-galaxy-usdc',
259
+ amount: '1000000',
260
+ });
261
+ result.operationId.should.equal(operationId);
262
+ result.txRequestIds.approve.should.equal('txreq-approve-1');
263
+ result.txRequestIds.deposit.should.equal('txreq-deposit-1');
264
+ // Verify sendMany was called with correct params for approve
265
+ sendManyStub.calledTwice.should.be.true();
266
+ const approveArgs = sendManyStub.firstCall.args[0];
267
+ approveArgs.type.should.equal('defiApprove');
268
+ approveArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
269
+ approveArgs.defiParams.amount.should.equal('1000000');
270
+ // Verify sendMany was called with correct params for deposit
271
+ const depositArgs = sendManyStub.secondCall.args[0];
272
+ depositArgs.type.should.equal('defiDeposit');
273
+ depositArgs.defiParams.operationId.should.equal(operationId);
274
+ });
275
+ it('should extract operationId from the lite apiVersion coinSpecific', async function () {
276
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
277
+ const operationId = 'op-uuid-lite';
278
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
279
+ sendManyStub.onFirstCall().resolves({
280
+ txRequest: {
281
+ txRequestId: 'txreq-approve-lite',
282
+ intent: { intentType: 'defi-approve' },
283
+ unsignedTxs: [{ coinSpecific: { operationId } }],
284
+ },
285
+ });
286
+ sendManyStub.onSecondCall().resolves({
287
+ txRequest: { txRequestId: 'txreq-deposit-lite' },
288
+ });
289
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
290
+ result.operationId.should.equal(operationId);
291
+ const depositArgs = sendManyStub.secondCall.args[0];
292
+ depositArgs.defiParams.operationId.should.equal(operationId);
293
+ });
294
+ it('should fall back to intent.operationId for forward-compat', async function () {
295
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
296
+ const operationId = 'op-uuid-intent';
297
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
298
+ sendManyStub.onFirstCall().resolves({
299
+ txRequest: {
300
+ txRequestId: 'txreq-approve-intent',
301
+ intent: { intentType: 'defi-approve', operationId },
302
+ },
303
+ });
304
+ sendManyStub.onSecondCall().resolves({
305
+ txRequest: { txRequestId: 'txreq-deposit-intent' },
306
+ });
307
+ const result = await defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' });
308
+ result.operationId.should.equal(operationId);
309
+ });
310
+ it('should throw when operationId is absent from the approve txRequest', async function () {
311
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
312
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
313
+ sendManyStub.onFirstCall().resolves({
314
+ txRequest: {
315
+ txRequestId: 'txreq-approve-missing',
316
+ intent: { intentType: 'defi-approve' },
317
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
318
+ },
319
+ });
320
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
321
+ message: 'operationId not found in approve txRequest response',
322
+ });
323
+ // Deposit sendMany must not be issued when the operationId is missing
324
+ sendManyStub.calledOnce.should.be.true();
325
+ });
326
+ // TODO(CGD-1709): Re-enable when active operation pre-flight check is restored
327
+ xit('should reject when an active operation already exists', async function () {
328
+ const preflightReq = mockRequest({
329
+ items: [{ operationId: 'existing-op-id', state: 'APPROVE_TX_REQUESTED' }],
330
+ });
331
+ mockBitGo.get.returns(preflightReq);
332
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), (err) => {
333
+ (err instanceof src_1.ActiveOperationExistsError).should.be.true();
334
+ err.operationId.should.equal('existing-op-id');
335
+ return true;
336
+ });
337
+ });
338
+ it('should propagate deposit sendMany failure without cleanup', async function () {
339
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-galaxy-usdc')));
340
+ const operationId = 'op-uuid-456';
341
+ // Mock sendMany: approve succeeds, deposit fails
342
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
343
+ sendManyStub.onFirstCall().resolves({
344
+ txRequest: {
345
+ txRequestId: 'txreq-approve-2',
346
+ intent: { intentType: 'defi-approve' },
347
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
348
+ },
349
+ });
350
+ sendManyStub.onSecondCall().rejects(new Error('deposit creation failed'));
351
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-galaxy-usdc', amount: '1000000' }), {
352
+ message: 'deposit creation failed',
353
+ });
354
+ // SDK does not attempt cleanup — reconciler handles orphaned approvals
355
+ mockBitGo.del.called.should.be.false();
356
+ });
357
+ it('should throw if vaultId is missing', async function () {
358
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
359
+ message: 'vaultId is required',
360
+ });
361
+ });
362
+ it('should throw if amount is missing', async function () {
363
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
364
+ message: 'amount is required',
365
+ });
366
+ });
367
+ });
368
+ it('should throw if vaultId is missing', async function () {
369
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: '', amount: '1000000' }), {
370
+ message: 'vaultId is required',
371
+ });
372
+ });
373
+ it('should throw if amount is missing', async function () {
374
+ mockBitGo.get.returns(mockRequest(makeMorphoVault('vlt-1')));
375
+ await assert_1.default.rejects(() => defiVault.depositToVault({ vaultId: 'vlt-1', amount: '' }), {
376
+ message: 'amount is required',
377
+ });
378
+ });
379
+ });
380
+ describe('resumeDeposit', function () {
381
+ it('should issue the deposit sendMany for a partial operation', async function () {
382
+ const operation = {
383
+ operationId: 'op-resume-1',
384
+ walletId: 'test-wallet-id',
385
+ vaultId: 'vlt-galaxy-usdc',
386
+ type: 'DEPOSIT',
387
+ assetAmount: '1000000',
388
+ state: 'APPROVE_TX_REQUESTED',
389
+ txRequestId: 'txreq-approve-existing',
390
+ associatedTxRequestId: undefined,
391
+ createdAt: '2026-05-14T07:12:00Z',
392
+ updatedAt: '2026-05-14T07:12:00Z',
393
+ };
394
+ // getOperation call
395
+ const getOpReq = mockRequest(operation);
396
+ mockBitGo.get.returns(getOpReq);
397
+ // deposit sendMany
398
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
399
+ sendManyStub.resolves({
400
+ txRequest: {
401
+ txRequestId: 'txreq-deposit-resume',
402
+ intent: { intentType: 'defi-deposit', operationId: 'op-resume-1' },
403
+ },
404
+ });
405
+ const result = await defiVault.resumeDeposit({ operationId: 'op-resume-1' });
406
+ result.operationId.should.equal('op-resume-1');
407
+ result.txRequestIds.approve.should.equal('txreq-approve-existing');
408
+ result.txRequestIds.deposit.should.equal('txreq-deposit-resume');
409
+ // Verify sendMany was called with correct defiParams
410
+ const depositArgs = sendManyStub.firstCall.args[0];
411
+ depositArgs.type.should.equal('defiDeposit');
412
+ depositArgs.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
413
+ depositArgs.defiParams.amount.should.equal('1000000');
414
+ depositArgs.defiParams.operationId.should.equal('op-resume-1');
415
+ });
416
+ it('should throw if deposit txRequest already exists', async function () {
417
+ const operation = {
418
+ operationId: 'op-already-done',
419
+ walletId: 'test-wallet-id',
420
+ vaultId: 'vlt-galaxy-usdc',
421
+ type: 'DEPOSIT',
422
+ assetAmount: '1000000',
423
+ state: 'DEPOSIT_TX_REQUESTED',
424
+ txRequestId: 'txreq-approve-x',
425
+ associatedTxRequestId: 'txreq-deposit-x',
426
+ createdAt: '2026-05-14T07:12:00Z',
427
+ updatedAt: '2026-05-14T07:12:00Z',
428
+ };
429
+ const getOpReq = mockRequest(operation);
430
+ mockBitGo.get.returns(getOpReq);
431
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: 'op-already-done' }), {
432
+ message: 'Deposit txRequest already exists for this operation; nothing to resume',
433
+ });
434
+ });
435
+ it('should throw if operationId is missing', async function () {
436
+ await assert_1.default.rejects(() => defiVault.resumeDeposit({ operationId: '' }), { message: 'operationId is required' });
437
+ });
438
+ });
439
+ describe('getOperation', function () {
440
+ it('should fetch an operation by ID', async function () {
441
+ const operation = {
442
+ operationId: 'op-get-1',
443
+ walletId: 'test-wallet-id',
444
+ vaultId: 'vlt-galaxy-usdc',
445
+ type: 'DEPOSIT',
446
+ assetAmount: '1000000',
447
+ state: 'COMPLETED',
448
+ txRequestId: 'txreq-1',
449
+ associatedTxRequestId: 'txreq-2',
450
+ createdAt: '2026-05-14T07:12:00Z',
451
+ updatedAt: '2026-05-14T07:18:00Z',
452
+ };
453
+ const req = mockRequest(operation);
454
+ mockBitGo.get.returns(req);
455
+ const result = await defiVault.getOperation({ operationId: 'op-get-1' });
456
+ result.should.deepEqual(operation);
457
+ });
458
+ it('should throw if operationId is missing', async function () {
459
+ await assert_1.default.rejects(() => defiVault.getOperation({ operationId: '' }), { message: 'operationId is required' });
460
+ });
461
+ });
462
+ describe('listOperations', function () {
463
+ it('should list operations for a vault', async function () {
464
+ const listResult = {
465
+ items: [
466
+ {
467
+ operationId: 'op-1',
468
+ walletId: 'test-wallet-id',
469
+ vaultId: 'vlt-galaxy-usdc',
470
+ type: 'DEPOSIT',
471
+ assetAmount: '1000000',
472
+ state: 'COMPLETED',
473
+ createdAt: '2026-05-14T07:12:00Z',
474
+ updatedAt: '2026-05-14T07:18:00Z',
475
+ },
476
+ ],
477
+ nextCursor: 'cursor-abc',
478
+ };
479
+ const req = mockRequest(listResult);
480
+ mockBitGo.get.returns(req);
481
+ const result = await defiVault.listOperations({
482
+ vaultId: 'vlt-galaxy-usdc',
483
+ state: 'COMPLETED',
484
+ limit: 10,
485
+ });
486
+ result.items.length.should.equal(1);
487
+ result.nextCursor.should.equal('cursor-abc');
488
+ // Verify query params
489
+ const queryArgs = req.query.firstCall.args[0];
490
+ queryArgs.vaultId.should.equal('vlt-galaxy-usdc');
491
+ queryArgs.state.should.equal('COMPLETED');
492
+ queryArgs.limit.should.equal(10);
493
+ });
494
+ it('should throw if vaultId is missing', async function () {
495
+ await assert_1.default.rejects(() => defiVault.listOperations({ vaultId: '' }), { message: 'vaultId is required' });
496
+ });
497
+ });
498
+ describe('withdrawFromVault', function () {
499
+ it('should call sendMany with defiWithdraw and return operationId + txRequestId', async function () {
500
+ const operationId = 'op-withdraw-1';
501
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
502
+ sendManyStub.resolves({
503
+ txRequest: {
504
+ txRequestId: 'txreq-withdraw-1',
505
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
506
+ },
507
+ });
508
+ const result = await defiVault.withdrawFromVault({
509
+ vaultId: 'vlt-galaxy-usdc',
510
+ amount: '500000',
511
+ });
512
+ result.operationId.should.equal(operationId);
513
+ result.txRequestId.should.equal('txreq-withdraw-1');
514
+ sendManyStub.calledOnce.should.be.true();
515
+ const args = sendManyStub.firstCall.args[0];
516
+ args.type.should.equal('defiWithdraw');
517
+ args.defiParams.vaultId.should.equal('vlt-galaxy-usdc');
518
+ args.defiParams.amount.should.equal('500000');
519
+ });
520
+ it('should extract operationId from lite apiVersion coinSpecific', async function () {
521
+ const operationId = 'op-withdraw-lite';
522
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
523
+ sendManyStub.resolves({
524
+ txRequest: {
525
+ txRequestId: 'txreq-withdraw-lite',
526
+ unsignedTxs: [{ coinSpecific: { operationId } }],
527
+ },
528
+ });
529
+ const result = await defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' });
530
+ result.operationId.should.equal(operationId);
531
+ result.txRequestId.should.equal('txreq-withdraw-lite');
532
+ });
533
+ it('should throw when operationId is absent from the withdraw txRequest response', async function () {
534
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
535
+ sendManyStub.resolves({
536
+ txRequest: {
537
+ txRequestId: 'txreq-withdraw-missing',
538
+ transactions: [{ unsignedTx: { coinSpecific: {} } }],
539
+ },
540
+ });
541
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-galaxy-usdc', amount: '500000' }), {
542
+ message: 'operationId not found in withdraw txRequest response',
543
+ });
544
+ });
545
+ it('should pass walletPassphrase when provided', async function () {
546
+ const operationId = 'op-withdraw-opts';
547
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
548
+ sendManyStub.resolves({
549
+ txRequest: {
550
+ txRequestId: 'txreq-withdraw-opts',
551
+ transactions: [{ unsignedTx: { coinSpecific: { operationId } } }],
552
+ },
553
+ });
554
+ await defiVault.withdrawFromVault({
555
+ vaultId: 'vlt-galaxy-usdc',
556
+ amount: '500000',
557
+ walletPassphrase: 'test-passphrase',
558
+ });
559
+ const args = sendManyStub.firstCall.args[0];
560
+ args.walletPassphrase.should.equal('test-passphrase');
561
+ });
562
+ it('should throw if vaultId is missing', async function () {
563
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: '', amount: '500000' }), {
564
+ message: 'vaultId is required',
565
+ });
566
+ });
567
+ it('should throw if amount is missing', async function () {
568
+ await assert_1.default.rejects(() => defiVault.withdrawFromVault({ vaultId: 'vlt-1', amount: '' }), {
569
+ message: 'amount is required',
570
+ });
571
+ });
572
+ describe('prebuildTransactionTxRequests defiWithdraw defiParams validation', function () {
573
+ it('should throw when defiParams is missing', async function () {
574
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({ type: 'defiWithdraw' }), /defiWithdraw\.defiParams/);
575
+ });
576
+ it('should throw when vaultId is not a string', async function () {
577
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
578
+ type: 'defiWithdraw',
579
+ defiParams: { vaultId: 123, amount: '500000' },
580
+ }), /defiWithdraw\.defiParams/);
581
+ });
582
+ it('should throw when amount is not a string', async function () {
583
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
584
+ type: 'defiWithdraw',
585
+ defiParams: { vaultId: 'vlt-1', amount: 500000 },
586
+ }), /defiWithdraw\.defiParams/);
587
+ });
588
+ });
589
+ });
590
+ // wrap and unwrap are the same orchestrator with a different sendMany type, so
591
+ // the suite is generated over both to keep the two from drifting apart.
592
+ [
593
+ ['wrap', 'wrapNative'],
594
+ ['unwrap', 'unwrapNative'],
595
+ ].forEach(function ([method, sendManyType]) {
596
+ describe(method, function () {
597
+ it(`should call sendMany once with ${sendManyType} type and return txRequestId`, async function () {
598
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
599
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-1` } });
600
+ const result = await defiVault[method]({
601
+ vaultId: 'vlt-galaxy-weth',
602
+ amount: '1000000000000000000',
603
+ });
604
+ result.txRequestId.should.equal(`txreq-${method}-1`);
605
+ sendManyStub.calledOnce.should.be.true();
606
+ const args = sendManyStub.firstCall.args[0];
607
+ args.type.should.equal(sendManyType);
608
+ args.defiParams.should.deepEqual({
609
+ vaultId: 'vlt-galaxy-weth',
610
+ amount: '1000000000000000000',
611
+ });
612
+ });
613
+ it('should extract txRequestId from the lite sendMany response shape', async function () {
614
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
615
+ sendManyStub.resolves({ txRequestId: `txreq-${method}-lite` });
616
+ const result = await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
617
+ result.txRequestId.should.equal(`txreq-${method}-lite`);
618
+ });
619
+ it('should throw when txRequestId is absent from the sendMany response', async function () {
620
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
621
+ sendManyStub.resolves({ txRequest: {} });
622
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' }), {
623
+ message: 'txRequestId not found in sendMany response',
624
+ });
625
+ });
626
+ it('should leave operationId undefined in v1', async function () {
627
+ // No operation is minted for wrap/unwrap until M5. Assert it stays absent
628
+ // even when the response happens to carry one, so nobody "fixes" this by
629
+ // wiring up extractOperationId.
630
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
631
+ sendManyStub.resolves({
632
+ txRequest: {
633
+ txRequestId: `txreq-${method}-noop`,
634
+ transactions: [{ unsignedTx: { coinSpecific: { operationId: 'op-should-be-ignored' } } }],
635
+ },
636
+ });
637
+ const result = await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
638
+ assert_1.default.strictEqual(result.operationId, undefined);
639
+ });
640
+ it('should forward walletPassphrase when provided', async function () {
641
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
642
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-hot` } });
643
+ await defiVault[method]({
644
+ vaultId: 'vlt-galaxy-weth',
645
+ amount: '5000',
646
+ walletPassphrase: 'test-passphrase',
647
+ });
648
+ const args = sendManyStub.firstCall.args[0];
649
+ args.walletPassphrase.should.equal('test-passphrase');
650
+ });
651
+ it('should omit walletPassphrase entirely when absent (custody path)', async function () {
652
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
653
+ sendManyStub.resolves({ txRequest: { txRequestId: `txreq-${method}-custody` } });
654
+ await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' });
655
+ const args = sendManyStub.firstCall.args[0];
656
+ args.should.not.have.property('walletPassphrase');
657
+ });
658
+ it('should throw if vaultId is missing, without any network call', async function () {
659
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
660
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: '', amount: '5000' }), {
661
+ message: 'vaultId is required',
662
+ });
663
+ sendManyStub.called.should.be.false();
664
+ });
665
+ it('should throw if amount is missing, without any network call', async function () {
666
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
667
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '' }), {
668
+ message: 'amount must be a positive unsigned decimal integer string',
669
+ });
670
+ sendManyStub.called.should.be.false();
671
+ });
672
+ describe('amount boundary validation', function () {
673
+ // The downstream BigIntFromString codec accepts all of these via JS's BigInt() constructor,
674
+ // so the client-side guard is the only thing standing between a malformed/malicious amount
675
+ // and a value-moving WETH9 deposit()/withdraw() call.
676
+ const rejectedAmounts = [
677
+ ['-1', 'negative'],
678
+ ['0', 'zero'],
679
+ ['0xabc', 'hexadecimal'],
680
+ ['1.5', 'decimal point'],
681
+ ['1e18', 'scientific notation'],
682
+ ['+100', 'explicit sign'],
683
+ [' 100', 'leading whitespace'],
684
+ ['100 ', 'trailing whitespace'],
685
+ ['abc', 'non-numeric'],
686
+ ];
687
+ rejectedAmounts.forEach(([amount, why]) => {
688
+ it(`should reject a ${why} amount (${JSON.stringify(amount)}), without any network call`, async function () {
689
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
690
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount }), {
691
+ message: 'amount must be a positive unsigned decimal integer string',
692
+ });
693
+ sendManyStub.called.should.be.false();
694
+ });
695
+ });
696
+ ['1', '1000000000000000000', '007'].forEach((amount) => {
697
+ it(`should accept amount ${JSON.stringify(amount)} and forward it verbatim`, async function () {
698
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
699
+ sendManyStub.resolves({ txRequest: { txRequestId: 'txreq-boundary' } });
700
+ await defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount });
701
+ const args = sendManyStub.firstCall.args[0];
702
+ args.defiParams.amount.should.equal(amount);
703
+ });
704
+ });
705
+ });
706
+ describe('vaultId trimming', function () {
707
+ it('should throw for a whitespace-only vaultId, without any network call', async function () {
708
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
709
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: ' ', amount: '5000' }), {
710
+ message: 'vaultId is required',
711
+ });
712
+ sendManyStub.called.should.be.false();
713
+ });
714
+ it('should trim surrounding whitespace from vaultId before calling sendMany', async function () {
715
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
716
+ sendManyStub.resolves({ txRequest: { txRequestId: 'txreq-trim' } });
717
+ await defiVault[method]({ vaultId: ' vlt-galaxy-weth ', amount: '5000' });
718
+ const args = sendManyStub.firstCall.args[0];
719
+ args.defiParams.vaultId.should.equal('vlt-galaxy-weth');
720
+ });
721
+ });
722
+ it('should throw a clear client-side error for a non-EVM coin, without any network call', async function () {
723
+ mockBaseCoin.getFamily.returns('btc');
724
+ mockBaseCoin.getConfig.returns({ features: [] });
725
+ const sendManyStub = sinon_1.default.stub(wallet, 'sendMany');
726
+ await assert_1.default.rejects(() => defiVault[method]({ vaultId: 'vlt-galaxy-weth', amount: '5000' }), {
727
+ message: 'wrap/unwrap is not supported for btc wallets',
728
+ });
729
+ sendManyStub.called.should.be.false();
730
+ });
731
+ describe(`prebuildTransactionTxRequests ${sendManyType} defiParams validation`, function () {
732
+ it('should throw when defiParams is missing', async function () {
733
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({ type: sendManyType }), new RegExp(`${sendManyType}\\.defiParams`));
734
+ });
735
+ it('should throw when vaultId is not a string', async function () {
736
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
737
+ type: sendManyType,
738
+ defiParams: { vaultId: 123, amount: '5000' },
739
+ }), new RegExp(`${sendManyType}\\.defiParams`));
740
+ });
741
+ it('should throw when amount is not a numeric string', async function () {
742
+ await assert_1.default.rejects(() => wallet.prebuildTransactionTxRequests({
743
+ type: sendManyType,
744
+ defiParams: { vaultId: 'vlt-1', amount: 5000 },
745
+ }), new RegExp(`${sendManyType}\\.defiParams`));
746
+ });
747
+ });
748
+ });
749
+ });
750
+ describe('wallet.defi getter', function () {
751
+ it('should return a DefiVault instance', function () {
752
+ const defi = wallet.defi;
753
+ (defi instanceof src_1.DefiVault).should.be.true();
754
+ });
755
+ it('should return the same instance on subsequent calls', function () {
756
+ const defi1 = wallet.defi;
757
+ const defi2 = wallet.defi;
758
+ (defi1 === defi2).should.be.true();
759
+ });
760
+ });
761
+ });
762
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsa0RBQTBCO0FBQzFCLG9EQUE0QjtBQUM1QixrQkFBZ0I7QUFDaEIsaURBQWtEO0FBQ2xELHNEQUFvRDtBQUNwRCx5Q0FBZ0Y7QUFFaEYsUUFBUSxDQUFDLFdBQVcsRUFBRTtJQUNwQixJQUFJLE1BQWMsQ0FBQztJQUNuQixJQUFJLFNBQW9CLENBQUM7SUFDekIsSUFBSSxTQUFjLENBQUM7SUFDbkIsSUFBSSxZQUFpQixDQUFDO0lBRXRCLDRDQUE0QztJQUM1QyxTQUFTLFdBQVcsQ0FBQyxNQUFXO1FBQzlCLE9BQU87WUFDTCxJQUFJLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNoQyxHQUFHLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUMvQixLQUFLLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxNQUFNLEVBQUUsZUFBSyxDQUFDLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQVU7UUFDbkMsT0FBTztZQUNMLEVBQUU7WUFDRixJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLFFBQVEsRUFBRSw0QkFBYSxDQUFDLGNBQWM7WUFDdEMsTUFBTSxFQUFFLFFBQVE7WUFDaEIsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVLEVBQUUsS0FBSztZQUNqQixVQUFVLEVBQUUsTUFBTTtZQUNsQixXQUFXLEVBQUUsV0FBVztZQUN4QixXQUFXLEVBQUUsV0FBVztZQUN4QixvQkFBb0IsRUFBRSxpQkFBaUI7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLGVB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SUFBSSxNQUFNLENBQUMsR0FBRyxZQUFZLGVBQWUsQ0FBQyxDQUMzQyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1FBQzdCLEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRTtZQUN2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3pCLENBQUMsSUFBSSxZQUFZLGVBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscURBQXFELEVBQUU7WUFDeEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQzFCLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCB7IENvaW5GZWF0dXJlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBWYXVsdFByb3RvY29sIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvciwgRGVmaVZhdWx0LCBXYWxsZXQgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnRGVmaVZhdWx0JywgZnVuY3Rpb24gKCkge1xuICBsZXQgd2FsbGV0OiBXYWxsZXQ7XG4gIGxldCBkZWZpVmF1bHQ6IERlZmlWYXVsdDtcbiAgbGV0IG1vY2tCaXRHbzogYW55O1xuICBsZXQgbW9ja0Jhc2VDb2luOiBhbnk7XG5cbiAgLy8gSGVscGVyIHRvIGNyZWF0ZSBhIGNoYWluYWJsZSByZXF1ZXN0IG1vY2tcbiAgZnVuY3Rpb24gbW9ja1JlcXVlc3QocmVzdWx0OiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VuZDogc2lub24uc3R1YigpLnJldHVybnNUaGlzKCksXG4gICAgICBzZXQ6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcXVlcnk6IHNpbm9uLnN0dWIoKS5yZXR1cm5zVGhpcygpLFxuICAgICAgcmVzdWx0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMocmVzdWx0KSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUNvbmNyZXRlVmF1bHQoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6ICdDb25jcmV0ZSBCVEMgVmF1bHQnLFxuICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuQ09OQ1JFVEVfQlRDQ1gsXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgY29pbjogJ2J0YycsXG4gICAgICBhc3NldFRva2VuOiAnYnRjJyxcbiAgICAgIHNoYXJlVG9rZW46ICdjYnRjJyxcbiAgICAgIHJpc2tNYW5hZ2VyOiAnbWFuYWdlci0xJyxcbiAgICAgIGN1c3RvZHlUeXBlOiAncXVhbGlmaWVkJyxcbiAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhWYXVsdENvbnRyYWN0JyxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1vcnBob1ZhdWx0KGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQsXG4gICAgICBuYW1lOiAnTW9ycGhvIFVTREMgVmF1bHQnLFxuICAgICAgcHJvdG9jb2w6IFZhdWx0UHJvdG9jb2wuTU9SUEhPLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGNvaW46ICdldGgnLFxuICAgICAgYXNzZXRUb2tlbjogJ3VzZGMnLFxuICAgICAgc2hhcmVUb2tlbjogJ211c2RjJyxcbiAgICAgIHJpc2tNYW5hZ2VyOiAnbWFuYWdlci0yJyxcbiAgICAgIGN1c3RvZHlUeXBlOiAncXVhbGlmaWVkJyxcbiAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhNb3JwaG9WYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgdmF1bHQgcmVzcG9uc2Ugd2hvc2UgYGNvbXBvc2l0aW9uW11gIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBzdHJpY3RcbiAgLy8gR2V0VmF1bHRSZXNwb25zZSBjb2RlYyDigJQgbWlycm9ycyB0aGUgcHJvZCBpbmNpZGVudCB3aGVyZSBhIGRpc3BsYXktb25seVxuICAvLyBuZXN0ZWQgZmllbGQgd2FzIG5hcnJvd2VkL3JlbW92ZWQgc2VydmVyLXNpZGUuIFRoZSBkZXBvc2l0IGRpc3BhdGNoIHBhdGhcbiAgLy8gbXVzdCBub3QgaGFyZC1mYWlsIG9uIGl0IGJlY2F1c2UgaXQgb25seSByZWFkcyBgcHJvdG9jb2xgLlxuICBmdW5jdGlvbiBtYWtlQ29uY3JldGVWYXVsdFdpdGhTdGFsZUNvbXBvc2l0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWFrZUNvbmNyZXRlVmF1bHQoaWQpLFxuICAgICAgY29tcG9zaXRpb246IFt7IGFzc2V0OiAnYnRjJywgYXB5OiAnbm90LWEtbnVtYmVyJyAvKiBzdGFsZSBzaGFwZSAqLyB9XSxcbiAgICB9O1xuICB9XG5cbiAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgbW9ja0JpdEdvID0ge1xuICAgICAgcG9zdDogc2lub24uc3R1YigpLFxuICAgICAgZ2V0OiBzaW5vbi5zdHViKCksXG4gICAgICBkZWw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIHVybDogc2lub24uc3R1YigpLmNhbGxzRmFrZSgocGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBudW1iZXIpID0+IGBodHRwczovL2JpdGdvLmNvbS9hcGkvdiR7dmVyc2lvbn0ke3BhdGh9YCksXG4gICAgICBtaWNyb3NlcnZpY2VzVXJsOiBzaW5vbi5zdHViKCkuY2FsbHNGYWtlKChwYXRoOiBzdHJpbmcpID0+IGBodHRwczovL2JpdGdvLmNvbSR7cGF0aH1gKSxcbiAgICAgIHNldFJlcXVlc3RUcmFjZXI6IHNpbm9uLnN0dWIoKSxcbiAgICB9O1xuXG4gICAgbW9ja0Jhc2VDb2luID0ge1xuICAgICAgZ2V0RmFtaWx5OiBzaW5vbi5zdHViKCkucmV0dXJucygnZXRoJyksXG4gICAgICBnZXRDb25maWc6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHsgZmVhdHVyZXM6IFtDb2luRmVhdHVyZS5FVk1fQ09JTl0gfSksXG4gICAgICB1cmw6IHNpbm9uLnN0dWIoKSxcbiAgICAgIGtleWNoYWluczogc2lub24uc3R1YigpLFxuICAgICAgc3VwcG9ydHNUc3M6IHNpbm9uLnN0dWIoKS5yZXR1cm5zKHRydWUpLFxuICAgICAgZ2V0TVBDQWxnb3JpdGhtOiBzaW5vbi5zdHViKCksXG4gICAgfTtcblxuICAgIGNvbnN0IG1vY2tXYWxsZXREYXRhID0ge1xuICAgICAgaWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICBjb2luOiAnZXRoJyxcbiAgICAgIGtleXM6IFsndXNlci1rZXknLCAnYmFja3VwLWtleScsICdiaXRnby1rZXknXSxcbiAgICAgIGVudGVycHJpc2U6ICd0ZXN0LWVudGVycHJpc2UtaWQnLFxuICAgIH07XG5cbiAgICB3YWxsZXQgPSBuZXcgV2FsbGV0KG1vY2tCaXRHbywgbW9ja0Jhc2VDb2luLCBtb2NrV2FsbGV0RGF0YSk7XG4gICAgZGVmaVZhdWx0ID0gd2FsbGV0LmRlZmk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2lub24ucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0VmF1bHRDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmZXRjaCB2YXVsdCBjb25maWcgZm9yIGEgZ2l2ZW4gdmF1bHRJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhdWx0Q29uZmlnID0ge1xuICAgICAgICBpZDogJ3ZsdC1jb25jcmV0ZS0xJyxcbiAgICAgICAgbmFtZTogJ0NvbmNyZXRlIEJUQyBWYXVsdCcsXG4gICAgICAgIHByb3RvY29sOiBWYXVsdFByb3RvY29sLkNPTkNSRVRFX0JUQ0NYLFxuICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgICBjb2luOiAnYnRjJyxcbiAgICAgICAgYXNzZXRUb2tlbjogJ2J0YycsXG4gICAgICAgIHNoYXJlVG9rZW46ICdjYnRjJyxcbiAgICAgICAgcmlza01hbmFnZXI6ICdtYW5hZ2VyLTEnLFxuICAgICAgICBjdXN0b2R5VHlwZTogJ3F1YWxpZmllZCcsXG4gICAgICAgIHZhdWx0Q29udHJhY3RBZGRyZXNzOiAnMHhWYXVsdENvbnRyYWN0JyxcbiAgICAgICAgY29uY3JldGVDb25maWc6IHtcbiAgICAgICAgICBzb3VyY2VXYWxsZXRJZDogJ3NyYy13YWxsZXQnLFxuICAgICAgICAgIGVzY3Jvd1dhbGxldElkOiAnZXNjcm93LXdhbGxldCcsXG4gICAgICAgICAgZXNjcm93RGVwb3NpdEFkZHJlc3M6ICcxRXhhbXBsZUJ0Y0FkZHJlc3MnLFxuICAgICAgICAgIHBvc2l0aW9uV2FsbGV0SWQ6ICdwb3Mtd2FsbGV0JyxcbiAgICAgICAgICBwb3NpdGlvbkJhc2VBZGRyZXNzOiAnMVBvc2l0aW9uQWRkcmVzcycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdCh2YXVsdENvbmZpZyk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmdldFZhdWx0Q29uZmlnKHsgdmF1bHRJZDogJ3ZsdC1jb25jcmV0ZS0xJyB9KTtcblxuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwodmF1bHRDb25maWcpO1xuICAgICAgbW9ja0JpdEdvLmdldC5jYWxsZWRXaXRoKCdodHRwczovL2JpdGdvLmNvbS9hcGkvZGVmaS1zZXJ2aWNlL3YxL3ZhdWx0cy92bHQtY29uY3JldGUtMScpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICByZXEuc2V0LmNhbGxlZFdpdGgoJ2VudGVycHJpc2UtaWQnLCAndGVzdC1lbnRlcnByaXNlLWlkJykuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmdldFZhdWx0Q29uZmlnKHsgdmF1bHRJZDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSB0aGUgQVBJIChlLmcuIDQwNCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChudWxsKTtcbiAgICAgIHJlcS5yZXN1bHQucmVqZWN0cyhuZXcgRXJyb3IoJ05vdCBGb3VuZCcpKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0VmF1bHRDb25maWcoeyB2YXVsdElkOiAndmx0LW5vdC1mb3VuZCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ05vdCBGb3VuZCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFZhdWx0UHJvdG9jb2wnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBmZXRjaCBvbmx5IHRoZSBwcm90b2NvbCBmb3IgYSBnaXZlbiB2YXVsdElkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LW1vcnBoby0xJykpKTtcblxuICAgICAgY29uc3QgcHJvdG9jb2wgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtbW9ycGhvLTEnIH0pO1xuXG4gICAgICBwcm90b2NvbC5zaG91bGQuZXF1YWwoVmF1bHRQcm90b2NvbC5NT1JQSE8pO1xuICAgICAgbW9ja0JpdEdvLmdldC5jYWxsZWRXaXRoKCdodHRwczovL2JpdGdvLmNvbS9hcGkvZGVmaS1zZXJ2aWNlL3YxL3ZhdWx0cy92bHQtbW9ycGhvLTEnKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gQ09OQ1JFVEVfQlRDQ1ggZm9yIGEgY29uY3JldGUgdmF1bHQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHQoJ3ZsdC1jb25jcmV0ZS0xJykpKTtcblxuICAgICAgY29uc3QgcHJvdG9jb2wgPSBhd2FpdCBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtY29uY3JldGUtMScgfSk7XG5cbiAgICAgIHByb3RvY29sLnNob3VsZC5lcXVhbChWYXVsdFByb3RvY29sLkNPTkNSRVRFX0JUQ0NYKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdG9sZXJhdGUgYSBzdGFsZS9pbnZhbGlkIGNvbXBvc2l0aW9uW10gZmllbGQgdGhlIGZ1bGwgR2V0VmF1bHRSZXNwb25zZSBjb2RlYyB3b3VsZCByZWplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgZGlzcGF0Y2ggY29kZWMgcmVhZHMgb25seSBgcHJvdG9jb2xgLCBzbyBhIGRpc3BsYXktb25seSBuZXN0ZWRcbiAgICAgIC8vIGZpZWxkIGdvaW5nIHN0YWxlIHNlcnZlci1zaWRlIG11c3Qgbm90IGJyZWFrIHRoaXMgY2FsbC5cbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQ29uY3JldGVWYXVsdFdpdGhTdGFsZUNvbXBvc2l0aW9uKCd2bHQtc3RhbGUtMScpKSk7XG5cbiAgICAgIGNvbnN0IHByb3RvY29sID0gYXdhaXQgZGVmaVZhdWx0LmdldFZhdWx0UHJvdG9jb2woeyB2YXVsdElkOiAndmx0LXN0YWxlLTEnIH0pO1xuXG4gICAgICBwcm90b2NvbC5zaG91bGQuZXF1YWwoVmF1bHRQcm90b2NvbC5DT05DUkVURV9CVENDWCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRWYXVsdFByb3RvY29sKHsgdmF1bHRJZDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3BhZ2F0ZSBlcnJvcnMgZnJvbSB0aGUgQVBJIChlLmcuIDQwNCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdChudWxsKTtcbiAgICAgIHJlcS5yZXN1bHQucmVqZWN0cyhuZXcgRXJyb3IoJ05vdCBGb3VuZCcpKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhyZXEpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZ2V0VmF1bHRQcm90b2NvbCh7IHZhdWx0SWQ6ICd2bHQtbm90LWZvdW5kJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnTm90IEZvdW5kJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVwb3NpdFRvVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgZGVzY3JpYmUoJ2NvbmNyZXRlX2J0Y2N4IHByb3ZpZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55IG9uY2Ugd2l0aCBkZWZpLWRlcG9zaXQgdHlwZSBhbmQgbm8gcmVjaXBpZW50cycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTEnKSkpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7XG4gICAgICAgICAgICBpZDogJ3BhLXV1aWQtMTIzJyxcbiAgICAgICAgICAgIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMScsXG4gICAgICAgICAgYW1vdW50OiAnNTAwMDAwMCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJldHVybnMgQ29uY3JldGVEZXBvc2l0UmVzdWx0IHNoYXBlXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5wZW5kaW5nQXBwcm92YWxJZC5zaG91bGQuZXF1YWwoJ3BhLXV1aWQtMTIzJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5zdGF0ZS5zaG91bGQuZXF1YWwoJ2F3YWl0aW5nU2lnbmF0dXJlJyk7XG5cbiAgICAgICAgLy8gT25seSBvbmUgc2VuZE1hbnkgY2FsbCDigJQgbm8gc2Vjb25kIGRlcG9zaXQgc2VuZE1hbnlcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIGNhbGxBcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1idGMtMScpO1xuICAgICAgICBjYWxsQXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMDAwMDAnKTtcbiAgICAgICAgY2FsbEFyZ3MuZGVmaVBhcmFtcy5hY3Rpb25UeXBlLnNob3VsZC5lcXVhbCgnZGVmaS1kZXBvc2l0Jyk7XG4gICAgICAgIC8vIE5vIHJlY2lwaWVudHMga2V5IGF0IGFsbFxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY2FsbEFyZ3MucmVjaXBpZW50cywgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgd2FsbGV0UGFzc3BocmFzZSB3aGVuIHByb3ZpZGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHQoJ3ZsdC1idGMtMicpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpLnJlc29sdmVzKHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHsgaWQ6ICdwYS11dWlkLTQ1NicsIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1idGMtMicsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ2h1bnRlcjInLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYWxsQXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBjYWxsQXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgnaHVudGVyMicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZGVmYXVsdCBzdGF0ZSB0byBhd2FpdGluZ1NpZ25hdHVyZSB3aGVuIGFic2VudCBmcm9tIHBlbmRpbmdBcHByb3ZhbCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VDb25jcmV0ZVZhdWx0KCd2bHQtYnRjLTMnKSkpO1xuXG4gICAgICAgIHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKS5yZXNvbHZlcyh7XG4gICAgICAgICAgcGVuZGluZ0FwcHJvdmFsOiB7IGlkOiAncGEtbm8tc3RhdGUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnN0YXRlLnNob3VsZC5lcXVhbCgnYXdhaXRpbmdTaWduYXR1cmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRvbGVyYXRlIGEgc3RhbGUvaW52YWxpZCBjb21wb3NpdGlvbltdIGZpZWxkIHRoYXQgdGhlIGZ1bGwgR2V0VmF1bHRSZXNwb25zZSBjb2RlYyB3b3VsZCByZWplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFJlZ3Jlc3Npb24gZ3VhcmQgZm9yIHRoZSBjcm9zcy1yZXBvIGNvZGVjLWRyaWZ0IGluY2lkZW50OiB0aGVcbiAgICAgICAgLy8gZGVwb3NpdCBkaXNwYXRjaCBwYXRoIHJlYWRzIG9ubHkgYHByb3RvY29sYCwgc28gYSBkaXNwbGF5LW9ubHlcbiAgICAgICAgLy8gbmVzdGVkIGZpZWxkIGdvaW5nIHN0YWxlIHNlcnZlci1zaWRlIG11c3Qgbm90IGJyZWFrIGRlcG9zaXRzLlxuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZUNvbmNyZXRlVmF1bHRXaXRoU3RhbGVDb21wb3NpdGlvbigndmx0LWJ0Yy1zdGFsZScpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpLnJlc29sdmVzKHtcbiAgICAgICAgICBwZW5kaW5nQXBwcm92YWw6IHsgaWQ6ICdwYS1zdGFsZScsIHN0YXRlOiAnYXdhaXRpbmdTaWduYXR1cmUnIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLXN0YWxlJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnBlbmRpbmdBcHByb3ZhbElkLnNob3VsZC5lcXVhbCgncGEtc3RhbGUnKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gc2VuZE1hbnkgcmV0dXJucyBubyBwZW5kaW5nQXBwcm92YWwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlQ29uY3JldGVWYXVsdCgndmx0LWJ0Yy00JykpKTtcblxuICAgICAgICBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55JykucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd1bmV4cGVjdGVkJyB9IH0pO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtYnRjLTQnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZWZpLWRlcG9zaXQgc2VuZE1hbnkgcmVzcG9uc2U6IHVua25vd247IHVua25vd24nLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ21vcnBobyBwcm92aWRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgY2FsbCBzZW5kTWFueSBmb3IgYXBwcm92ZSBhbmQgZGVwb3NpdCBvbiBoYXBweSBwYXRoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMobW9ja1JlcXVlc3QobWFrZU1vcnBob1ZhdWx0KCd2bHQtZ2FsYXh5LXVzZGMnKSkpO1xuXG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXV1aWQtMTIzJztcblxuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIC8vIFdQIHdyaXRlcyBvcGVyYXRpb25JZCBpbnRvIHRoZSBidWlsdCB0eCdzIGNvaW5TcGVjaWZpYyAoZnVsbCBhcGlWZXJzaW9uKSxcbiAgICAgICAgLy8gbm90IGludG8gdGhlIGludGVudCDigJQgbWlycm9yIHRoYXQgcmVhbCBzaGFwZSBoZXJlLlxuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMScsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LTEnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWRlcG9zaXQnIH0sXG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICAocmVzdWx0IGFzIGFueSkub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLnR4UmVxdWVzdElkcy5hcHByb3ZlLnNob3VsZC5lcXVhbCgndHhyZXEtYXBwcm92ZS0xJyk7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtMScpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBwYXJhbXMgZm9yIGFwcHJvdmVcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZFR3aWNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgIGFwcHJvdmVBcmdzLnR5cGUuc2hvdWxkLmVxdWFsKCdkZWZpQXBwcm92ZScpO1xuICAgICAgICBhcHByb3ZlQXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgICAgYXBwcm92ZUFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMDAwMDAwJyk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlbmRNYW55IHdhcyBjYWxsZWQgd2l0aCBjb3JyZWN0IHBhcmFtcyBmb3IgZGVwb3NpdFxuICAgICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLnNlY29uZENhbGwuYXJnc1swXTtcbiAgICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKG9wZXJhdGlvbklkKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGV4dHJhY3Qgb3BlcmF0aW9uSWQgZnJvbSB0aGUgbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWxpdGUnO1xuXG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uRmlyc3RDYWxsKCkucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLWxpdGUnLFxuICAgICAgICAgICAgaW50ZW50OiB7IGludGVudFR5cGU6ICdkZWZpLWFwcHJvdmUnIH0sXG4gICAgICAgICAgICB1bnNpZ25lZFR4czogW3sgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5vblNlY29uZENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiAndHhyZXEtZGVwb3NpdC1saXRlJyB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnMTAwMDAwMCcgfSk7XG5cbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICAgIGNvbnN0IGRlcG9zaXRBcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuc2Vjb25kQ2FsbC5hcmdzWzBdO1xuICAgICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBmYWxsIGJhY2sgdG8gaW50ZW50Lm9wZXJhdGlvbklkIGZvciBmb3J3YXJkLWNvbXBhdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LWdhbGF4eS11c2RjJykpKTtcblxuICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC11dWlkLWludGVudCc7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtaW50ZW50JyxcbiAgICAgICAgICAgIGludGVudDogeyBpbnRlbnRUeXBlOiAnZGVmaS1hcHByb3ZlJywgb3BlcmF0aW9uSWQgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgc2VuZE1hbnlTdHViLm9uU2Vjb25kQ2FsbCgpLnJlc29sdmVzKHtcbiAgICAgICAgICB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LWludGVudCcgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pO1xuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBvcGVyYXRpb25JZCBpcyBhYnNlbnQgZnJvbSB0aGUgYXBwcm92ZSB0eFJlcXVlc3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtbWlzc2luZycsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHt9IH0gfV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsIGFtb3VudDogJzEwMDAwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiBhcHByb3ZlIHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIERlcG9zaXQgc2VuZE1hbnkgbXVzdCBub3QgYmUgaXNzdWVkIHdoZW4gdGhlIG9wZXJhdGlvbklkIGlzIG1pc3NpbmdcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZE9uY2Uuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUT0RPKENHRC0xNzA5KTogUmUtZW5hYmxlIHdoZW4gYWN0aXZlIG9wZXJhdGlvbiBwcmUtZmxpZ2h0IGNoZWNrIGlzIHJlc3RvcmVkXG4gICAgICB4aXQoJ3Nob3VsZCByZWplY3Qgd2hlbiBhbiBhY3RpdmUgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBwcmVmbGlnaHRSZXEgPSBtb2NrUmVxdWVzdCh7XG4gICAgICAgICAgaXRlbXM6IFt7IG9wZXJhdGlvbklkOiAnZXhpc3Rpbmctb3AtaWQnLCBzdGF0ZTogJ0FQUFJPVkVfVFhfUkVRVUVTVEVEJyB9XSxcbiAgICAgICAgfSk7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhwcmVmbGlnaHRSZXEpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSxcbiAgICAgICAgICAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgKGVyciBpbnN0YW5jZW9mIEFjdGl2ZU9wZXJhdGlvbkV4aXN0c0Vycm9yKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgICAgICAgKGVyciBhcyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcikub3BlcmF0aW9uSWQuc2hvdWxkLmVxdWFsKCdleGlzdGluZy1vcC1pZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcHJvcGFnYXRlIGRlcG9zaXQgc2VuZE1hbnkgZmFpbHVyZSB3aXRob3V0IGNsZWFudXAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhtb2NrUmVxdWVzdChtYWtlTW9ycGhvVmF1bHQoJ3ZsdC1nYWxheHktdXNkYycpKSk7XG5cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAnb3AtdXVpZC00NTYnO1xuXG4gICAgICAgIC8vIE1vY2sgc2VuZE1hbnk6IGFwcHJvdmUgc3VjY2VlZHMsIGRlcG9zaXQgZmFpbHNcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIub25GaXJzdENhbGwoKS5yZXNvbHZlcyh7XG4gICAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWFwcHJvdmUtMicsXG4gICAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktYXBwcm92ZScgfSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIub25TZWNvbmRDYWxsKCkucmVqZWN0cyhuZXcgRXJyb3IoJ2RlcG9zaXQgY3JlYXRpb24gZmFpbGVkJykpO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdkZXBvc2l0IGNyZWF0aW9uIGZhaWxlZCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNESyBkb2VzIG5vdCBhdHRlbXB0IGNsZWFudXAg4oCUIHJlY29uY2lsZXIgaGFuZGxlcyBvcnBoYW5lZCBhcHByb3ZhbHNcbiAgICAgICAgbW9ja0JpdEdvLmRlbC5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5kZXBvc2l0VG9WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICcxMDAwMDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LmRlcG9zaXRUb1ZhdWx0KHsgdmF1bHRJZDogJ3ZsdC0xJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiB2YXVsdElkIGlzIG1pc3NpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAnJywgYW1vdW50OiAnMTAwMDAwMCcgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGFtb3VudCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0JpdEdvLmdldC5yZXR1cm5zKG1vY2tSZXF1ZXN0KG1ha2VNb3JwaG9WYXVsdCgndmx0LTEnKSkpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQuZGVwb3NpdFRvVmF1bHQoeyB2YXVsdElkOiAndmx0LTEnLCBhbW91bnQ6ICcnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgaXMgcmVxdWlyZWQnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXN1bWVEZXBvc2l0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaXNzdWUgdGhlIGRlcG9zaXQgc2VuZE1hbnkgZm9yIGEgcGFydGlhbCBvcGVyYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb24gPSB7XG4gICAgICAgIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnLFxuICAgICAgICB3YWxsZXRJZDogJ3Rlc3Qtd2FsbGV0LWlkJyxcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgYXNzZXRBbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgc3RhdGU6ICdBUFBST1ZFX1RYX1JFUVVFU1RFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtYXBwcm92ZS1leGlzdGluZycsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogdW5kZWZpbmVkLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGdldE9wZXJhdGlvbiBjYWxsXG4gICAgICBjb25zdCBnZXRPcFJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMoZ2V0T3BSZXEpO1xuXG4gICAgICAvLyBkZXBvc2l0IHNlbmRNYW55XG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyxcbiAgICAgICAgICBpbnRlbnQ6IHsgaW50ZW50VHlwZTogJ2RlZmktZGVwb3NpdCcsIG9wZXJhdGlvbklkOiAnb3AtcmVzdW1lLTEnIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJ29wLXJlc3VtZS0xJyB9KTtcblxuICAgICAgKHJlc3VsdCBhcyBhbnkpLm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbCgnb3AtcmVzdW1lLTEnKTtcbiAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuYXBwcm92ZS5zaG91bGQuZXF1YWwoJ3R4cmVxLWFwcHJvdmUtZXhpc3RpbmcnKTtcbiAgICAgIChyZXN1bHQgYXMgYW55KS50eFJlcXVlc3RJZHMuZGVwb3NpdC5zaG91bGQuZXF1YWwoJ3R4cmVxLWRlcG9zaXQtcmVzdW1lJyk7XG5cbiAgICAgIC8vIFZlcmlmeSBzZW5kTWFueSB3YXMgY2FsbGVkIHdpdGggY29ycmVjdCBkZWZpUGFyYW1zXG4gICAgICBjb25zdCBkZXBvc2l0QXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgZGVwb3NpdEFyZ3MudHlwZS5zaG91bGQuZXF1YWwoJ2RlZmlEZXBvc2l0Jyk7XG4gICAgICBkZXBvc2l0QXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXVzZGMnKTtcbiAgICAgIGRlcG9zaXRBcmdzLmRlZmlQYXJhbXMuYW1vdW50LnNob3VsZC5lcXVhbCgnMTAwMDAwMCcpO1xuICAgICAgZGVwb3NpdEFyZ3MuZGVmaVBhcmFtcy5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwoJ29wLXJlc3VtZS0xJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIGRlcG9zaXQgdHhSZXF1ZXN0IGFscmVhZHkgZXhpc3RzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3BlcmF0aW9uID0ge1xuICAgICAgICBvcGVyYXRpb25JZDogJ29wLWFscmVhZHktZG9uZScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0RFUE9TSVRfVFhfUkVRVUVTVEVEJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS1hcHByb3ZlLXgnLFxuICAgICAgICBhc3NvY2lhdGVkVHhSZXF1ZXN0SWQ6ICd0eHJlcS1kZXBvc2l0LXgnLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTI6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGdldE9wUmVxID0gbW9ja1JlcXVlc3Qob3BlcmF0aW9uKTtcbiAgICAgIG1vY2tCaXRHby5nZXQucmV0dXJucyhnZXRPcFJlcSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5yZXN1bWVEZXBvc2l0KHsgb3BlcmF0aW9uSWQ6ICdvcC1hbHJlYWR5LWRvbmUnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZXBvc2l0IHR4UmVxdWVzdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBvcGVyYXRpb247IG5vdGhpbmcgdG8gcmVzdW1lJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBvcGVyYXRpb25JZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0LnJlc3VtZURlcG9zaXQoeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldE9wZXJhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGZldGNoIGFuIG9wZXJhdGlvbiBieSBJRCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdvcC1nZXQtMScsXG4gICAgICAgIHdhbGxldElkOiAndGVzdC13YWxsZXQtaWQnLFxuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgdHlwZTogJ0RFUE9TSVQnLFxuICAgICAgICBhc3NldEFtb3VudDogJzEwMDAwMDAnLFxuICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtMScsXG4gICAgICAgIGFzc29jaWF0ZWRUeFJlcXVlc3RJZDogJ3R4cmVxLTInLFxuICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgIHVwZGF0ZWRBdDogJzIwMjYtMDUtMTRUMDc6MTg6MDBaJyxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcSA9IG1vY2tSZXF1ZXN0KG9wZXJhdGlvbik7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0LmdldE9wZXJhdGlvbih7IG9wZXJhdGlvbklkOiAnb3AtZ2V0LTEnIH0pO1xuICAgICAgcmVzdWx0LnNob3VsZC5kZWVwRXF1YWwob3BlcmF0aW9uKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgb3BlcmF0aW9uSWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC5nZXRPcGVyYXRpb24oeyBvcGVyYXRpb25JZDogJycgfSksIHsgbWVzc2FnZTogJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2xpc3RPcGVyYXRpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbGlzdCBvcGVyYXRpb25zIGZvciBhIHZhdWx0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbGlzdFJlc3VsdCA9IHtcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcGVyYXRpb25JZDogJ29wLTEnLFxuICAgICAgICAgICAgd2FsbGV0SWQ6ICd0ZXN0LXdhbGxldC1pZCcsXG4gICAgICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgICAgIHR5cGU6ICdERVBPU0lUJyxcbiAgICAgICAgICAgIGFzc2V0QW1vdW50OiAnMTAwMDAwMCcsXG4gICAgICAgICAgICBzdGF0ZTogJ0NPTVBMRVRFRCcsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjEyOjAwWicsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6ICcyMDI2LTA1LTE0VDA3OjE4OjAwWicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbmV4dEN1cnNvcjogJ2N1cnNvci1hYmMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3QobGlzdFJlc3VsdCk7XG4gICAgICBtb2NrQml0R28uZ2V0LnJldHVybnMocmVxKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHtcbiAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktdXNkYycsXG4gICAgICAgIHN0YXRlOiAnQ09NUExFVEVEJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5pdGVtcy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgcmVzdWx0Lm5leHRDdXJzb3IhLnNob3VsZC5lcXVhbCgnY3Vyc29yLWFiYycpO1xuXG4gICAgICAvLyBWZXJpZnkgcXVlcnkgcGFyYW1zXG4gICAgICBjb25zdCBxdWVyeUFyZ3MgPSByZXEucXVlcnkuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICBxdWVyeUFyZ3MudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgcXVlcnlBcmdzLnN0YXRlLnNob3VsZC5lcXVhbCgnQ09NUExFVEVEJyk7XG4gICAgICBxdWVyeUFyZ3MubGltaXQuc2hvdWxkLmVxdWFsKDEwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0Lmxpc3RPcGVyYXRpb25zKHsgdmF1bHRJZDogJycgfSksIHsgbWVzc2FnZTogJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aGRyYXdGcm9tVmF1bHQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjYWxsIHNlbmRNYW55IHdpdGggZGVmaVdpdGhkcmF3IGFuZCByZXR1cm4gb3BlcmF0aW9uSWQgKyB0eFJlcXVlc3RJZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXdpdGhkcmF3LTEnO1xuXG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLXdpdGhkcmF3LTEnLFxuICAgICAgICAgIHRyYW5zYWN0aW9uczogW3sgdW5zaWduZWRUeDogeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9IH1dLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7XG4gICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXVzZGMnLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdC5vcGVyYXRpb25JZC5zaG91bGQuZXF1YWwob3BlcmF0aW9uSWQpO1xuICAgICAgcmVzdWx0LnR4UmVxdWVzdElkLnNob3VsZC5lcXVhbCgndHhyZXEtd2l0aGRyYXctMScpO1xuXG4gICAgICBzZW5kTWFueVN0dWIuY2FsbGVkT25jZS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXJncy50eXBlLnNob3VsZC5lcXVhbCgnZGVmaVdpdGhkcmF3Jyk7XG4gICAgICBhcmdzLmRlZmlQYXJhbXMudmF1bHRJZC5zaG91bGQuZXF1YWwoJ3ZsdC1nYWxheHktdXNkYycpO1xuICAgICAgYXJncy5kZWZpUGFyYW1zLmFtb3VudC5zaG91bGQuZXF1YWwoJzUwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IG9wZXJhdGlvbklkIGZyb20gbGl0ZSBhcGlWZXJzaW9uIGNvaW5TcGVjaWZpYycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gJ29wLXdpdGhkcmF3LWxpdGUnO1xuXG4gICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICB0eFJlcXVlc3Q6IHtcbiAgICAgICAgICB0eFJlcXVlc3RJZDogJ3R4cmVxLXdpdGhkcmF3LWxpdGUnLFxuICAgICAgICAgIHVuc2lnbmVkVHhzOiBbeyBjb2luU3BlY2lmaWM6IHsgb3BlcmF0aW9uSWQgfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnNTAwMDAwJyB9KTtcblxuICAgICAgcmVzdWx0Lm9wZXJhdGlvbklkLnNob3VsZC5lcXVhbChvcGVyYXRpb25JZCk7XG4gICAgICByZXN1bHQudHhSZXF1ZXN0SWQuc2hvdWxkLmVxdWFsKCd0eHJlcS13aXRoZHJhdy1saXRlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gb3BlcmF0aW9uSWQgaXMgYWJzZW50IGZyb20gdGhlIHdpdGhkcmF3IHR4UmVxdWVzdCByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7XG4gICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgIHR4UmVxdWVzdElkOiAndHhyZXEtd2l0aGRyYXctbWlzc2luZycsXG4gICAgICAgICAgdHJhbnNhY3Rpb25zOiBbeyB1bnNpZ25lZFR4OiB7IGNvaW5TcGVjaWZpYzoge30gfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoeyB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJywgYW1vdW50OiAnNTAwMDAwJyB9KSwge1xuICAgICAgICBtZXNzYWdlOiAnb3BlcmF0aW9uSWQgbm90IGZvdW5kIGluIHdpdGhkcmF3IHR4UmVxdWVzdCByZXNwb25zZScsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB3YWxsZXRQYXNzcGhyYXNlIHdoZW4gcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBvcGVyYXRpb25JZCA9ICdvcC13aXRoZHJhdy1vcHRzJztcblxuICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHtcbiAgICAgICAgdHhSZXF1ZXN0OiB7XG4gICAgICAgICAgdHhSZXF1ZXN0SWQ6ICd0eHJlcS13aXRoZHJhdy1vcHRzJyxcbiAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkIH0gfSB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBkZWZpVmF1bHQud2l0aGRyYXdGcm9tVmF1bHQoe1xuICAgICAgICB2YXVsdElkOiAndmx0LWdhbGF4eS11c2RjJyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QtcGFzc3BocmFzZScsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgYXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgndGVzdC1wYXNzcGhyYXNlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGlmIHZhdWx0SWQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICc1MDAwMDAnIH0pLCB7XG4gICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdC53aXRoZHJhd0Zyb21WYXVsdCh7IHZhdWx0SWQ6ICd2bHQtMScsIGFtb3VudDogJycgfSksIHtcbiAgICAgICAgbWVzc2FnZTogJ2Ftb3VudCBpcyByZXF1aXJlZCcsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdwcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyBkZWZpV2l0aGRyYXcgZGVmaVBhcmFtcyB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGRlZmlQYXJhbXMgaXMgbWlzc2luZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgKCkgPT4gKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHsgdHlwZTogJ2RlZmlXaXRoZHJhdycgfSksXG4gICAgICAgICAgL2RlZmlXaXRoZHJhd1xcLmRlZmlQYXJhbXMvXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHZhdWx0SWQgaXMgbm90IGEgc3RyaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHtcbiAgICAgICAgICAgICAgdHlwZTogJ2RlZmlXaXRoZHJhdycsXG4gICAgICAgICAgICAgIGRlZmlQYXJhbXM6IHsgdmF1bHRJZDogMTIzLCBhbW91bnQ6ICc1MDAwMDAnIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvZGVmaVdpdGhkcmF3XFwuZGVmaVBhcmFtcy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGlzIG5vdCBhIHN0cmluZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICh3YWxsZXQgYXMgYW55KS5wcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyh7XG4gICAgICAgICAgICAgIHR5cGU6ICdkZWZpV2l0aGRyYXcnLFxuICAgICAgICAgICAgICBkZWZpUGFyYW1zOiB7IHZhdWx0SWQ6ICd2bHQtMScsIGFtb3VudDogNTAwMDAwIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAvZGVmaVdpdGhkcmF3XFwuZGVmaVBhcmFtcy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB3cmFwIGFuZCB1bndyYXAgYXJlIHRoZSBzYW1lIG9yY2hlc3RyYXRvciB3aXRoIGEgZGlmZmVyZW50IHNlbmRNYW55IHR5cGUsIHNvXG4gIC8vIHRoZSBzdWl0ZSBpcyBnZW5lcmF0ZWQgb3ZlciBib3RoIHRvIGtlZXAgdGhlIHR3byBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuICAoXG4gICAgW1xuICAgICAgWyd3cmFwJywgJ3dyYXBOYXRpdmUnXSxcbiAgICAgIFsndW53cmFwJywgJ3Vud3JhcE5hdGl2ZSddLFxuICAgIF0gYXMgY29uc3RcbiAgKS5mb3JFYWNoKGZ1bmN0aW9uIChbbWV0aG9kLCBzZW5kTWFueVR5cGVdKSB7XG4gICAgZGVzY3JpYmUobWV0aG9kLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdChgc2hvdWxkIGNhbGwgc2VuZE1hbnkgb25jZSB3aXRoICR7c2VuZE1hbnlUeXBlfSB0eXBlIGFuZCByZXR1cm4gdHhSZXF1ZXN0SWRgLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHsgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiBgdHhyZXEtJHttZXRob2R9LTFgIH0gfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oe1xuICAgICAgICAgIHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLFxuICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXN1bHQudHhSZXF1ZXN0SWQuc2hvdWxkLmVxdWFsKGB0eHJlcS0ke21ldGhvZH0tMWApO1xuXG4gICAgICAgIHNlbmRNYW55U3R1Yi5jYWxsZWRPbmNlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgICAgYXJncy50eXBlLnNob3VsZC5lcXVhbChzZW5kTWFueVR5cGUpO1xuICAgICAgICBhcmdzLmRlZmlQYXJhbXMuc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsXG4gICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZXh0cmFjdCB0eFJlcXVlc3RJZCBmcm9tIHRoZSBsaXRlIHNlbmRNYW55IHJlc3BvbnNlIHNoYXBlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdElkOiBgdHhyZXEtJHttZXRob2R9LWxpdGVgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsIGFtb3VudDogJzUwMDAnIH0pO1xuXG4gICAgICAgIHJlc3VsdC50eFJlcXVlc3RJZC5zaG91bGQuZXF1YWwoYHR4cmVxLSR7bWV0aG9kfS1saXRlYCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHR4UmVxdWVzdElkIGlzIGFic2VudCBmcm9tIHRoZSBzZW5kTWFueSByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoeyB0eFJlcXVlc3Q6IHt9IH0pO1xuXG4gICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IGRlZmlWYXVsdFttZXRob2RdKHsgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsIGFtb3VudDogJzUwMDAnIH0pLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ3R4UmVxdWVzdElkIG5vdCBmb3VuZCBpbiBzZW5kTWFueSByZXNwb25zZScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbGVhdmUgb3BlcmF0aW9uSWQgdW5kZWZpbmVkIGluIHYxJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBObyBvcGVyYXRpb24gaXMgbWludGVkIGZvciB3cmFwL3Vud3JhcCB1bnRpbCBNNS4gQXNzZXJ0IGl0IHN0YXlzIGFic2VudFxuICAgICAgICAvLyBldmVuIHdoZW4gdGhlIHJlc3BvbnNlIGhhcHBlbnMgdG8gY2Fycnkgb25lLCBzbyBub2JvZHkgXCJmaXhlc1wiIHRoaXMgYnlcbiAgICAgICAgLy8gd2lyaW5nIHVwIGV4dHJhY3RPcGVyYXRpb25JZC5cbiAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICBzZW5kTWFueVN0dWIucmVzb2x2ZXMoe1xuICAgICAgICAgIHR4UmVxdWVzdDoge1xuICAgICAgICAgICAgdHhSZXF1ZXN0SWQ6IGB0eHJlcS0ke21ldGhvZH0tbm9vcGAsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IFt7IHVuc2lnbmVkVHg6IHsgY29pblNwZWNpZmljOiB7IG9wZXJhdGlvbklkOiAnb3Atc2hvdWxkLWJlLWlnbm9yZWQnIH0gfSB9XSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLCBhbW91bnQ6ICc1MDAwJyB9KTtcblxuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0Lm9wZXJhdGlvbklkLCB1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZm9yd2FyZCB3YWxsZXRQYXNzcGhyYXNlIHdoZW4gcHJvdmlkZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHsgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiBgdHhyZXEtJHttZXRob2R9LWhvdGAgfSB9KTtcblxuICAgICAgICBhd2FpdCBkZWZpVmF1bHRbbWV0aG9kXSh7XG4gICAgICAgICAgdmF1bHRJZDogJ3ZsdC1nYWxheHktd2V0aCcsXG4gICAgICAgICAgYW1vdW50OiAnNTAwMCcsXG4gICAgICAgICAgd2FsbGV0UGFzc3BocmFzZTogJ3Rlc3QtcGFzc3BocmFzZScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgICAgYXJncy53YWxsZXRQYXNzcGhyYXNlLnNob3VsZC5lcXVhbCgndGVzdC1wYXNzcGhyYXNlJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBvbWl0IHdhbGxldFBhc3NwaHJhc2UgZW50aXJlbHkgd2hlbiBhYnNlbnQgKGN1c3RvZHkgcGF0aCknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgc2VuZE1hbnlTdHViLnJlc29sdmVzKHsgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkOiBgdHhyZXEtJHttZXRob2R9LWN1c3RvZHlgIH0gfSk7XG5cbiAgICAgICAgYXdhaXQgZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50OiAnNTAwMCcgfSk7XG5cbiAgICAgICAgY29uc3QgYXJnczogYW55ID0gc2VuZE1hbnlTdHViLmZpcnN0Q2FsbC5hcmdzWzBdO1xuICAgICAgICBhcmdzLnNob3VsZC5ub3QuaGF2ZS5wcm9wZXJ0eSgnd2FsbGV0UGFzc3BocmFzZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgdmF1bHRJZCBpcyBtaXNzaW5nLCB3aXRob3V0IGFueSBuZXR3b3JrIGNhbGwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICcnLCBhbW91bnQ6ICc1MDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHNlbmRNYW55U3R1Yi5jYWxsZWQuc2hvdWxkLmJlLmZhbHNlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhbW91bnQgaXMgbWlzc2luZywgd2l0aG91dCBhbnkgbmV0d29yayBjYWxsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzZW5kTWFueVN0dWIgPSBzaW5vbi5zdHViKHdhbGxldCwgJ3NlbmRNYW55Jyk7XG5cbiAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50OiAnJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBzdHJpbmcnLFxuICAgICAgICB9KTtcbiAgICAgICAgc2VuZE1hbnlTdHViLmNhbGxlZC5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnYW1vdW50IGJvdW5kYXJ5IHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFRoZSBkb3duc3RyZWFtIEJpZ0ludEZyb21TdHJpbmcgY29kZWMgYWNjZXB0cyBhbGwgb2YgdGhlc2UgdmlhIEpTJ3MgQmlnSW50KCkgY29uc3RydWN0b3IsXG4gICAgICAgIC8vIHNvIHRoZSBjbGllbnQtc2lkZSBndWFyZCBpcyB0aGUgb25seSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGEgbWFsZm9ybWVkL21hbGljaW91cyBhbW91bnRcbiAgICAgICAgLy8gYW5kIGEgdmFsdWUtbW92aW5nIFdFVEg5IGRlcG9zaXQoKS93aXRoZHJhdygpIGNhbGwuXG4gICAgICAgIGNvbnN0IHJlamVjdGVkQW1vdW50cyA9IFtcbiAgICAgICAgICBbJy0xJywgJ25lZ2F0aXZlJ10sXG4gICAgICAgICAgWycwJywgJ3plcm8nXSxcbiAgICAgICAgICBbJzB4YWJjJywgJ2hleGFkZWNpbWFsJ10sXG4gICAgICAgICAgWycxLjUnLCAnZGVjaW1hbCBwb2ludCddLFxuICAgICAgICAgIFsnMWUxOCcsICdzY2llbnRpZmljIG5vdGF0aW9uJ10sXG4gICAgICAgICAgWycrMTAwJywgJ2V4cGxpY2l0IHNpZ24nXSxcbiAgICAgICAgICBbJyAxMDAnLCAnbGVhZGluZyB3aGl0ZXNwYWNlJ10sXG4gICAgICAgICAgWycxMDAgJywgJ3RyYWlsaW5nIHdoaXRlc3BhY2UnXSxcbiAgICAgICAgICBbJ2FiYycsICdub24tbnVtZXJpYyddLFxuICAgICAgICBdIGFzIGNvbnN0O1xuICAgICAgICByZWplY3RlZEFtb3VudHMuZm9yRWFjaCgoW2Ftb3VudCwgd2h5XSkgPT4ge1xuICAgICAgICAgIGl0KGBzaG91bGQgcmVqZWN0IGEgJHt3aHl9IGFtb3VudCAoJHtKU09OLnN0cmluZ2lmeShhbW91bnQpfSksIHdpdGhvdXQgYW55IG5ldHdvcmsgY2FsbGAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcblxuICAgICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAndmx0LWdhbGF4eS13ZXRoJywgYW1vdW50IH0pLCB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdhbW91bnQgbXVzdCBiZSBhIHBvc2l0aXZlIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBzdHJpbmcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBbJzEnLCAnMTAwMDAwMDAwMDAwMDAwMDAwMCcsICcwMDcnXS5mb3JFYWNoKChhbW91bnQpID0+IHtcbiAgICAgICAgICBpdChgc2hvdWxkIGFjY2VwdCBhbW91bnQgJHtKU09OLnN0cmluZ2lmeShhbW91bnQpfSBhbmQgZm9yd2FyZCBpdCB2ZXJiYXRpbWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcbiAgICAgICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdDogeyB0eFJlcXVlc3RJZDogJ3R4cmVxLWJvdW5kYXJ5JyB9IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLCBhbW91bnQgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFyZ3M6IGFueSA9IHNlbmRNYW55U3R1Yi5maXJzdENhbGwuYXJnc1swXTtcbiAgICAgICAgICAgIGFyZ3MuZGVmaVBhcmFtcy5hbW91bnQuc2hvdWxkLmVxdWFsKGFtb3VudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd2YXVsdElkIHRyaW1taW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBhIHdoaXRlc3BhY2Utb25seSB2YXVsdElkLCB3aXRob3V0IGFueSBuZXR3b3JrIGNhbGwnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuXG4gICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gZGVmaVZhdWx0W21ldGhvZF0oeyB2YXVsdElkOiAnICAgJywgYW1vdW50OiAnNTAwMCcgfSksIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd2YXVsdElkIGlzIHJlcXVpcmVkJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRyaW0gc3Vycm91bmRpbmcgd2hpdGVzcGFjZSBmcm9tIHZhdWx0SWQgYmVmb3JlIGNhbGxpbmcgc2VuZE1hbnknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3Qgc2VuZE1hbnlTdHViID0gc2lub24uc3R1Yih3YWxsZXQsICdzZW5kTWFueScpO1xuICAgICAgICAgIHNlbmRNYW55U3R1Yi5yZXNvbHZlcyh7IHR4UmVxdWVzdDogeyB0eFJlcXVlc3RJZDogJ3R4cmVxLXRyaW0nIH0gfSk7XG5cbiAgICAgICAgICBhd2FpdCBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICcgIHZsdC1nYWxheHktd2V0aCAgJywgYW1vdW50OiAnNTAwMCcgfSk7XG5cbiAgICAgICAgICBjb25zdCBhcmdzOiBhbnkgPSBzZW5kTWFueVN0dWIuZmlyc3RDYWxsLmFyZ3NbMF07XG4gICAgICAgICAgYXJncy5kZWZpUGFyYW1zLnZhdWx0SWQuc2hvdWxkLmVxdWFsKCd2bHQtZ2FsYXh5LXdldGgnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBhIGNsZWFyIGNsaWVudC1zaWRlIGVycm9yIGZvciBhIG5vbi1FVk0gY29pbiwgd2l0aG91dCBhbnkgbmV0d29yayBjYWxsJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBtb2NrQmFzZUNvaW4uZ2V0RmFtaWx5LnJldHVybnMoJ2J0YycpO1xuICAgICAgICBtb2NrQmFzZUNvaW4uZ2V0Q29uZmlnLnJldHVybnMoeyBmZWF0dXJlczogW10gfSk7XG4gICAgICAgIGNvbnN0IHNlbmRNYW55U3R1YiA9IHNpbm9uLnN0dWIod2FsbGV0LCAnc2VuZE1hbnknKTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBkZWZpVmF1bHRbbWV0aG9kXSh7IHZhdWx0SWQ6ICd2bHQtZ2FsYXh5LXdldGgnLCBhbW91bnQ6ICc1MDAwJyB9KSwge1xuICAgICAgICAgIG1lc3NhZ2U6ICd3cmFwL3Vud3JhcCBpcyBub3Qgc3VwcG9ydGVkIGZvciBidGMgd2FsbGV0cycsXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kTWFueVN0dWIuY2FsbGVkLnNob3VsZC5iZS5mYWxzZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKGBwcmVidWlsZFRyYW5zYWN0aW9uVHhSZXF1ZXN0cyAke3NlbmRNYW55VHlwZX0gZGVmaVBhcmFtcyB2YWxpZGF0aW9uYCwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gZGVmaVBhcmFtcyBpcyBtaXNzaW5nJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICAgICAgKCkgPT4gKHdhbGxldCBhcyBhbnkpLnByZWJ1aWxkVHJhbnNhY3Rpb25UeFJlcXVlc3RzKHsgdHlwZTogc2VuZE1hbnlUeXBlIH0pLFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChgJHtzZW5kTWFueVR5cGV9XFxcXC5kZWZpUGFyYW1zYClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gdmF1bHRJZCBpcyBub3QgYSBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAod2FsbGV0IGFzIGFueSkucHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHNlbmRNYW55VHlwZSxcbiAgICAgICAgICAgICAgICBkZWZpUGFyYW1zOiB7IHZhdWx0SWQ6IDEyMywgYW1vdW50OiAnNTAwMCcgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgUmVnRXhwKGAke3NlbmRNYW55VHlwZX1cXFxcLmRlZmlQYXJhbXNgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBhbW91bnQgaXMgbm90IGEgbnVtZXJpYyBzdHJpbmcnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAod2FsbGV0IGFzIGFueSkucHJlYnVpbGRUcmFuc2FjdGlvblR4UmVxdWVzdHMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IHNlbmRNYW55VHlwZSxcbiAgICAgICAgICAgICAgICBkZWZpUGFyYW1zOiB7IHZhdWx0SWQ6ICd2bHQtMScsIGFtb3VudDogNTAwMCB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBSZWdFeHAoYCR7c2VuZE1hbnlUeXBlfVxcXFwuZGVmaVBhcmFtc2ApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dhbGxldC5kZWZpIGdldHRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIERlZmlWYXVsdCBpbnN0YW5jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlZmkgPSB3YWxsZXQuZGVmaTtcbiAgICAgIChkZWZpIGluc3RhbmNlb2YgRGVmaVZhdWx0KS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb24gc3Vic2VxdWVudCBjYWxscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRlZmkxID0gd2FsbGV0LmRlZmk7XG4gICAgICBjb25zdCBkZWZpMiA9IHdhbGxldC5kZWZpO1xuICAgICAgKGRlZmkxID09PSBkZWZpMikuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==