@bitgo-beta/sdk-core 8.2.1-beta.189 → 8.2.1-beta.1890

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 (643) 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 +53 -5
  10. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  11. package/dist/src/account-lib/baseCoin/enum.js +97 -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 +61 -0
  87. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  88. package/dist/src/bitgo/address-book/address-book.js +150 -0
  89. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  90. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  91. package/dist/src/bitgo/address-book/index.js +19 -0
  92. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  93. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  94. package/dist/src/bitgo/address-book/types.js +3 -0
  95. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +112 -11
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  97. package/dist/src/bitgo/baseCoin/baseCoin.js +183 -16
  98. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +271 -27
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.js +14 -3
  101. package/dist/src/bitgo/baseCoin/index.js +6 -2
  102. package/dist/src/bitgo/bip32util.d.ts +3 -16
  103. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  104. package/dist/src/bitgo/bip32util.js +4 -56
  105. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  106. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  107. package/dist/src/bitgo/bitcoin.js +26 -13
  108. package/dist/src/bitgo/bitgoBase.d.ts +8 -1
  109. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  110. package/dist/src/bitgo/bitgoBase.js +1 -1
  111. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  112. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  113. package/dist/src/bitgo/coinFactory.js +26 -3
  114. package/dist/src/bitgo/config.d.ts +3 -95
  115. package/dist/src/bitgo/config.d.ts.map +1 -1
  116. package/dist/src/bitgo/config.js +26 -15
  117. package/dist/src/bitgo/defi/defiVault.d.ts +87 -0
  118. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -0
  119. package/dist/src/bitgo/defi/defiVault.js +225 -0
  120. package/dist/src/bitgo/defi/iDefiVault.d.ts +59 -0
  121. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -0
  122. package/dist/src/bitgo/defi/iDefiVault.js +6 -0
  123. package/dist/src/bitgo/defi/index.d.ts +3 -0
  124. package/dist/src/bitgo/defi/index.d.ts.map +1 -0
  125. package/dist/src/bitgo/defi/index.js +22 -0
  126. package/dist/src/bitgo/ecdh.d.ts +0 -1
  127. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  128. package/dist/src/bitgo/ecdh.js +26 -13
  129. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -4
  130. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  131. package/dist/src/bitgo/enterprise/enterprise.js +39 -21
  132. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  133. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -3
  134. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  135. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  136. package/dist/src/bitgo/enterprise/index.js +6 -2
  137. package/dist/src/bitgo/environments.d.ts +69 -5
  138. package/dist/src/bitgo/environments.d.ts.map +1 -1
  139. package/dist/src/bitgo/environments.js +409 -40
  140. package/dist/src/bitgo/errors.d.ts +175 -0
  141. package/dist/src/bitgo/errors.d.ts.map +1 -1
  142. package/dist/src/bitgo/errors.js +166 -2
  143. package/dist/src/bitgo/evm/evmUtils.d.ts +26 -0
  144. package/dist/src/bitgo/evm/evmUtils.d.ts.map +1 -0
  145. package/dist/src/bitgo/evm/evmUtils.js +50 -0
  146. package/dist/src/bitgo/index.d.ts +4 -1
  147. package/dist/src/bitgo/index.d.ts.map +1 -1
  148. package/dist/src/bitgo/index.js +30 -11
  149. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  150. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  151. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  152. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  153. package/dist/src/bitgo/internal/index.js +6 -2
  154. package/dist/src/bitgo/internal/internal.js +5 -6
  155. package/dist/src/bitgo/internal/keycard.d.ts +19 -6
  156. package/dist/src/bitgo/internal/keycard.d.ts.map +1 -1
  157. package/dist/src/bitgo/internal/keycard.js +108 -48
  158. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +24 -0
  159. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  160. package/dist/src/bitgo/keychain/decryptKeychain.js +67 -0
  161. package/dist/src/bitgo/keychain/iKeychains.d.ts +95 -9
  162. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  163. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  164. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  165. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  166. package/dist/src/bitgo/keychain/index.js +7 -2
  167. package/dist/src/bitgo/keychain/keychains.d.ts +49 -6
  168. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  169. package/dist/src/bitgo/keychain/keychains.js +249 -46
  170. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  171. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  172. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  173. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  174. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  175. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  176. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  177. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  178. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  179. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  180. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  181. package/dist/src/bitgo/market/index.js +6 -2
  182. package/dist/src/bitgo/market/markets.js +23 -9
  183. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  184. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  185. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  186. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  187. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  188. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  189. package/dist/src/bitgo/pendingApproval/pendingApproval.js +228 -110
  190. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  191. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  192. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  193. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  194. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  195. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  196. package/dist/src/bitgo/proofs/index.js +6 -0
  197. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  198. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  199. package/dist/src/bitgo/proofs/types.js +80 -0
  200. package/dist/src/bitgo/recovery/index.js +6 -2
  201. package/dist/src/bitgo/recovery/initiate.d.ts +24 -1
  202. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  203. package/dist/src/bitgo/recovery/initiate.js +88 -40
  204. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +136 -0
  205. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  206. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  207. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  208. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  209. package/dist/src/bitgo/staking/goStakingWallet.js +141 -0
  210. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  211. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  212. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  213. package/dist/src/bitgo/staking/iStakingWallet.d.ts +178 -7
  214. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  215. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  216. package/dist/src/bitgo/staking/index.d.ts +3 -0
  217. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  218. package/dist/src/bitgo/staking/index.js +9 -2
  219. package/dist/src/bitgo/staking/stakingWallet.d.ts +21 -8
  220. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  221. package/dist/src/bitgo/staking/stakingWallet.js +140 -7
  222. package/dist/src/bitgo/trading/iTradingAccount.d.ts +15 -1
  223. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  224. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  225. package/dist/src/bitgo/trading/index.d.ts +1 -0
  226. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  227. package/dist/src/bitgo/trading/index.js +7 -2
  228. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  229. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  230. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  231. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  232. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  233. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  234. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  235. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  236. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  237. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  238. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  239. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  240. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  241. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  242. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  243. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  244. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  245. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  246. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  247. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  248. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  249. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  250. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  251. package/dist/src/bitgo/trading/network/index.js +21 -0
  252. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  253. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  254. package/dist/src/bitgo/trading/network/network.js +99 -0
  255. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  256. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  257. package/dist/src/bitgo/trading/network/types.js +3 -0
  258. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  259. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  260. package/dist/src/bitgo/trading/network/utils.js +54 -0
  261. package/dist/src/bitgo/trading/tradingAccount.d.ts +22 -1
  262. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  263. package/dist/src/bitgo/trading/tradingAccount.js +64 -7
  264. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +38 -0
  265. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  266. package/dist/src/bitgo/tss/bitgoPubKeys.js +72 -0
  267. package/dist/src/bitgo/tss/common.d.ts +40 -6
  268. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  269. package/dist/src/bitgo/tss/common.js +122 -17
  270. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  271. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  272. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  273. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  274. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  275. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +167 -0
  276. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  277. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  278. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  279. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  280. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  281. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  282. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  283. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  284. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  285. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts +37 -0
  286. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  287. package/dist/src/bitgo/tss/eddsa/eddsaMPCv2.js +95 -0
  288. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  289. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  290. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  291. package/dist/src/bitgo/tss/index.d.ts +3 -2
  292. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  293. package/dist/src/bitgo/tss/index.js +26 -10
  294. package/dist/src/bitgo/tss/types.d.ts +3 -3
  295. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  296. package/dist/src/bitgo/tss/types.js +2 -2
  297. package/dist/src/bitgo/types.d.ts +3 -3
  298. package/dist/src/bitgo/types.d.ts.map +1 -1
  299. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +8 -0
  300. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  301. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +55 -13
  302. package/dist/src/bitgo/utils/codecProps.js +24 -11
  303. package/dist/src/bitgo/utils/codecs.d.ts +11 -0
  304. package/dist/src/bitgo/utils/codecs.d.ts.map +1 -0
  305. package/dist/src/bitgo/utils/codecs.js +59 -0
  306. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  307. package/dist/src/bitgo/utils/decode.js +30 -16
  308. package/dist/src/bitgo/utils/index.d.ts +4 -2
  309. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  310. package/dist/src/bitgo/utils/index.js +27 -11
  311. package/dist/src/bitgo/utils/messageTypes.d.ts +40 -0
  312. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  313. package/dist/src/bitgo/utils/messageTypes.js +17 -0
  314. package/dist/src/bitgo/utils/mpcUtils.d.ts +4 -4
  315. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  316. package/dist/src/bitgo/utils/mpcUtils.js +153 -14
  317. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  318. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  319. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  320. package/dist/src/bitgo/utils/opengpgUtils.d.ts +10 -7
  321. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  322. package/dist/src/bitgo/utils/opengpgUtils.js +75 -62
  323. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  324. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  325. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  326. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  327. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  328. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  329. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  330. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  331. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  332. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  333. package/dist/src/bitgo/utils/triple.js +2 -3
  334. package/dist/src/bitgo/utils/tss/addressVerification.d.ts +62 -0
  335. package/dist/src/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  336. package/dist/src/bitgo/utils/tss/addressVerification.js +93 -0
  337. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +97 -18
  338. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  339. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +307 -46
  340. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +414 -46
  341. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  342. package/dist/src/bitgo/utils/tss/baseTypes.js +47 -22
  343. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  345. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  346. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  347. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  348. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  349. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +24 -51
  350. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  351. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +172 -246
  352. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +219 -0
  353. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  354. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +1132 -0
  355. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  356. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  357. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  358. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  359. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  360. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  361. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  362. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  363. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  364. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  365. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  366. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  367. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts +21 -0
  368. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.d.ts.map +1 -0
  369. package/dist/src/bitgo/utils/tss/eddsa/SMC/utils.js +118 -0
  370. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts +18 -0
  371. package/dist/src/bitgo/utils/tss/eddsa/base.d.ts.map +1 -0
  372. package/dist/src/bitgo/utils/tss/eddsa/base.js +64 -0
  373. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +37 -11
  374. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  375. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +266 -99
  376. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +137 -0
  377. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  378. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +662 -0
  379. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +6 -0
  380. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -0
  381. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +13 -0
  382. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts +4 -0
  383. package/dist/src/bitgo/utils/tss/eddsa/index.d.ts.map +1 -1
  384. package/dist/src/bitgo/utils/tss/eddsa/index.js +29 -8
  385. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +12 -7
  386. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  387. package/dist/src/bitgo/utils/tss/eddsa/types.js +1 -1
  388. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts +40 -0
  389. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.d.ts.map +1 -0
  390. package/dist/src/bitgo/utils/tss/eddsa/typesEddsaMPCv2.js +44 -0
  391. package/dist/src/bitgo/utils/tss/index.d.ts +3 -0
  392. package/dist/src/bitgo/utils/tss/index.d.ts.map +1 -1
  393. package/dist/src/bitgo/utils/tss/index.js +26 -9
  394. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts +23 -0
  395. package/dist/src/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  396. package/dist/src/bitgo/utils/tss/preHashedSignable.js +26 -0
  397. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +33 -0
  398. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  399. package/dist/src/bitgo/utils/tss/recipientUtils.js +117 -0
  400. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  401. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  402. package/dist/src/bitgo/utils/txRequest.js +49 -0
  403. package/dist/src/bitgo/utils/util.js +24 -10
  404. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  405. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  406. package/dist/src/bitgo/utils/wallet.js +48 -0
  407. package/dist/src/bitgo/wallet/BuildParams.d.ts +50 -1
  408. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  409. package/dist/src/bitgo/wallet/BuildParams.js +58 -11
  410. package/dist/src/bitgo/wallet/iWallet.d.ts +496 -21
  411. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  412. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  413. package/dist/src/bitgo/wallet/iWallets.d.ts +251 -16
  414. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  415. package/dist/src/bitgo/wallet/iWallets.js +63 -3
  416. package/dist/src/bitgo/wallet/index.js +6 -2
  417. package/dist/src/bitgo/wallet/wallet.d.ts +360 -24
  418. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  419. package/dist/src/bitgo/wallet/wallet.js +2019 -356
  420. package/dist/src/bitgo/wallet/wallets.d.ts +93 -4
  421. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  422. package/dist/src/bitgo/wallet/wallets.js +1144 -155
  423. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts +12 -0
  424. package/dist/src/bitgo/walletUtil/iMessageProvider.d.ts.map +1 -0
  425. package/dist/src/bitgo/walletUtil/iMessageProvider.js +3 -0
  426. package/dist/src/bitgo/walletUtil/index.d.ts +3 -0
  427. package/dist/src/bitgo/walletUtil/index.d.ts.map +1 -0
  428. package/dist/src/bitgo/walletUtil/index.js +19 -0
  429. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts +22 -0
  430. package/dist/src/bitgo/walletUtil/midnightMessageProvider.d.ts.map +1 -0
  431. package/dist/src/bitgo/walletUtil/midnightMessageProvider.js +95 -0
  432. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts +9 -0
  433. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.d.ts.map +1 -0
  434. package/dist/src/bitgo/walletUtil/signAccountBasedMidnightClaimMessages.js +72 -0
  435. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts +15 -0
  436. package/dist/src/bitgo/walletUtil/utxoMessageProof.d.ts.map +1 -0
  437. package/dist/src/bitgo/walletUtil/utxoMessageProof.js +40 -0
  438. package/dist/src/bitgo/webhook/index.js +6 -2
  439. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  440. package/dist/src/coins/fiat.d.ts +45 -0
  441. package/dist/src/coins/fiat.d.ts.map +1 -0
  442. package/dist/src/coins/fiat.js +94 -0
  443. package/dist/src/coins/index.d.ts +1 -6
  444. package/dist/src/coins/index.d.ts.map +1 -1
  445. package/dist/src/coins/index.js +7 -8
  446. package/dist/src/coins/ofc.d.ts +21 -2
  447. package/dist/src/coins/ofc.d.ts.map +1 -1
  448. package/dist/src/coins/ofc.js +29 -3
  449. package/dist/src/coins/ofcToken.d.ts +15 -4
  450. package/dist/src/coins/ofcToken.d.ts.map +1 -1
  451. package/dist/src/coins/ofcToken.js +43 -5
  452. package/dist/src/coins/susd.d.ts +3 -2
  453. package/dist/src/coins/susd.d.ts.map +1 -1
  454. package/dist/src/coins/susd.js +5 -1
  455. package/dist/src/common.js +27 -13
  456. package/dist/src/index.d.ts +7 -1
  457. package/dist/src/index.d.ts.map +1 -1
  458. package/dist/src/index.js +32 -11
  459. package/dist/src/lightning.d.ts +20 -0
  460. package/dist/src/lightning.d.ts.map +1 -0
  461. package/dist/src/lightning.js +13 -0
  462. package/dist/src/units.js +5 -6
  463. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  464. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  465. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  466. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  467. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  468. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  469. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  470. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  471. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  472. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  473. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  474. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  475. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +91 -29
  476. package/dist/test/unit/account-lib/mpc/util.d.ts +2 -0
  477. package/dist/test/unit/account-lib/mpc/util.d.ts.map +1 -0
  478. package/dist/test/unit/account-lib/mpc/util.js +53 -0
  479. package/dist/test/unit/bitgo/address-book/address-book.d.ts +2 -0
  480. package/dist/test/unit/bitgo/address-book/address-book.d.ts.map +1 -0
  481. package/dist/test/unit/bitgo/address-book/address-book.js +159 -0
  482. package/dist/test/unit/bitgo/defi/defiVault.d.ts +2 -0
  483. package/dist/test/unit/bitgo/defi/defiVault.d.ts.map +1 -0
  484. package/dist/test/unit/bitgo/defi/defiVault.js +338 -0
  485. package/dist/test/unit/bitgo/environment.d.ts +2 -0
  486. package/dist/test/unit/bitgo/environment.d.ts.map +1 -0
  487. package/dist/test/unit/bitgo/environment.js +38 -0
  488. package/dist/test/unit/bitgo/errors.d.ts +2 -0
  489. package/dist/test/unit/bitgo/errors.d.ts.map +1 -0
  490. package/dist/test/unit/bitgo/errors.js +262 -0
  491. package/dist/test/unit/bitgo/recovery/initiate.d.ts +2 -0
  492. package/dist/test/unit/bitgo/recovery/initiate.d.ts.map +1 -0
  493. package/dist/test/unit/bitgo/recovery/initiate.js +230 -0
  494. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  495. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  496. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  497. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts +2 -0
  498. package/dist/test/unit/bitgo/trading/tradingAccount.d.ts.map +1 -0
  499. package/dist/test/unit/bitgo/trading/tradingAccount.js +192 -0
  500. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +24 -4
  501. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  502. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  503. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  504. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  505. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  506. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  507. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  508. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts +2 -0
  509. package/dist/test/unit/bitgo/utils/tss/addressVerification.d.ts.map +1 -0
  510. package/dist/test/unit/bitgo/utils/tss/addressVerification.js +251 -0
  511. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts +2 -0
  512. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -0
  513. package/dist/test/unit/bitgo/utils/tss/baseTSSUtils.js +399 -0
  514. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts +2 -0
  515. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.d.ts.map +1 -0
  516. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaEncryptionVersion.js +94 -0
  517. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +2 -0
  518. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  519. package/dist/test/unit/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +999 -0
  520. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts +5 -0
  521. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.d.ts.map +1 -0
  522. package/dist/test/unit/bitgo/utils/tss/ecdsa/gpgKeys.js +36 -0
  523. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts +2 -0
  524. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.d.ts.map +1 -0
  525. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaExternalSigner.js +158 -0
  526. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +2 -0
  527. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -0
  528. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +1310 -0
  529. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts +2 -0
  530. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.d.ts.map +1 -0
  531. package/dist/test/unit/bitgo/utils/tss/eddsa/smcUtil.js +311 -0
  532. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts +2 -0
  533. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.d.ts.map +1 -0
  534. package/dist/test/unit/bitgo/utils/tss/preHashedSignable.js +55 -0
  535. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts +2 -0
  536. package/dist/test/unit/bitgo/utils/tss/recipientUtils.d.ts.map +1 -0
  537. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +171 -0
  538. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  539. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  540. package/dist/test/unit/bitgo/utils/txRequest.js +179 -0
  541. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  542. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  543. package/dist/test/unit/bitgo/wallet/BuildParams.js +97 -0
  544. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +23 -9
  545. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts +2 -0
  546. package/dist/test/unit/bitgo/wallet/getAccountResources.d.ts.map +1 -0
  547. package/dist/test/unit/bitgo/wallet/getAccountResources.js +133 -0
  548. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts +2 -0
  549. package/dist/test/unit/bitgo/wallet/getResourceDelegations.d.ts.map +1 -0
  550. package/dist/test/unit/bitgo/wallet/getResourceDelegations.js +118 -0
  551. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts +2 -0
  552. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.d.ts.map +1 -0
  553. package/dist/test/unit/bitgo/wallet/ofcWalletAddressCreation.js +141 -0
  554. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts +2 -0
  555. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.d.ts.map +1 -0
  556. package/dist/test/unit/bitgo/wallet/ofcWalletSignTransaction.js +185 -0
  557. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts +3 -0
  558. package/dist/test/unit/bitgo/wallet/resourceManagement.d.ts.map +1 -0
  559. package/dist/test/unit/bitgo/wallet/resourceManagement.js +441 -0
  560. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts +2 -0
  561. package/dist/test/unit/bitgo/wallet/tokenApproval.d.ts.map +1 -0
  562. package/dist/test/unit/bitgo/wallet/tokenApproval.js +201 -0
  563. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts +2 -0
  564. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.d.ts.map +1 -0
  565. package/dist/test/unit/bitgo/wallet/walletEvmAddressCreation.js +181 -0
  566. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts +2 -0
  567. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.d.ts.map +1 -0
  568. package/dist/test/unit/bitgo/wallet/walletOptionsCodecs.js +43 -0
  569. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts +2 -0
  570. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.d.ts.map +1 -0
  571. package/dist/test/unit/bitgo/wallet/walletTssAddressVerification.js +320 -0
  572. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts +2 -0
  573. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.d.ts.map +1 -0
  574. package/dist/test/unit/bitgo/wallet/walletsEncryptionVersion.js +228 -0
  575. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts +2 -0
  576. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.d.ts.map +1 -0
  577. package/dist/test/unit/bitgo/wallet/walletsEvmKeyring.js +216 -0
  578. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts +2 -0
  579. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.d.ts.map +1 -0
  580. package/dist/test/unit/bitgo/wallet/walletsExternalSigner.js +670 -0
  581. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts +2 -0
  582. package/dist/test/unit/bitgo/wallet/walletsWebauthn.d.ts.map +1 -0
  583. package/dist/test/unit/bitgo/wallet/walletsWebauthn.js +204 -0
  584. package/dist/test/unit/coins/ofc.d.ts +2 -0
  585. package/dist/test/unit/coins/ofc.d.ts.map +1 -0
  586. package/dist/test/unit/coins/ofc.js +124 -0
  587. package/dist/test/unit/lightning.d.ts +2 -0
  588. package/dist/test/unit/lightning.d.ts.map +1 -0
  589. package/dist/test/unit/lightning.js +23 -0
  590. package/dist/test/unit/units.d.ts.map +1 -1
  591. package/dist/test/unit/units.js +64 -64
  592. package/dist/tsconfig.tsbuildinfo +1 -1
  593. package/package.json +24 -21
  594. package/.eslintignore +0 -5
  595. package/CHANGELOG.md +0 -1568
  596. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  597. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  598. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  599. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  600. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  601. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  602. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  603. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  604. package/dist/src/bitgo/lightning/index.js +0 -17
  605. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  606. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  607. package/dist/src/bitgo/lightning/lightning.js +0 -111
  608. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  609. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  610. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  611. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  612. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  613. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  614. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  615. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  616. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  617. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  618. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  619. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  620. package/dist/src/coins/fiateur.d.ts +0 -31
  621. package/dist/src/coins/fiateur.d.ts.map +0 -1
  622. package/dist/src/coins/fiateur.js +0 -57
  623. package/dist/src/coins/fiatgbp.d.ts +0 -31
  624. package/dist/src/coins/fiatgbp.d.ts.map +0 -1
  625. package/dist/src/coins/fiatgbp.js +0 -57
  626. package/dist/src/coins/fiatusd.d.ts +0 -31
  627. package/dist/src/coins/fiatusd.d.ts.map +0 -1
  628. package/dist/src/coins/fiatusd.js +0 -57
  629. package/dist/src/coins/tfiateur.d.ts +0 -11
  630. package/dist/src/coins/tfiateur.d.ts.map +0 -1
  631. package/dist/src/coins/tfiateur.js +0 -17
  632. package/dist/src/coins/tfiatgbp.d.ts +0 -11
  633. package/dist/src/coins/tfiatgbp.d.ts.map +0 -1
  634. package/dist/src/coins/tfiatgbp.js +0 -17
  635. package/dist/src/coins/tfiatusd.d.ts +0 -11
  636. package/dist/src/coins/tfiatusd.d.ts.map +0 -1
  637. package/dist/src/coins/tfiatusd.js +0 -17
  638. package/dist/src/openssl/index.d.ts +0 -5
  639. package/dist/src/openssl/index.d.ts.map +0 -1
  640. package/dist/src/openssl/index.js +0 -9
  641. package/dist/test/unit/openssl.d.ts +0 -2
  642. package/dist/test/unit/openssl.d.ts.map +0 -1
  643. package/dist/test/unit/openssl.js +0 -39
@@ -0,0 +1,662 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.EddsaMPCv2RecoveryFunctions = exports.EddsaMPCv2Utils = void 0;
40
+ exports.isEddsaMpcV1SigningMaterial = isEddsaMpcV1SigningMaterial;
41
+ exports.getEddsaMpcV2RecoveryKeySharesFromReducedKey = getEddsaMpcV2RecoveryKeySharesFromReducedKey;
42
+ exports.signRecoveryEddsaMPCv2 = signRecoveryEddsaMPCv2;
43
+ const assert_1 = __importDefault(require("assert"));
44
+ const pgp = __importStar(require("openpgp"));
45
+ const sjcl = __importStar(require("@bitgo-beta/sjcl"));
46
+ const io_ts_types_1 = require("io-ts-types");
47
+ const public_types_1 = require("@bitgo/public-types");
48
+ const ed25519_1 = require("@noble/curves/ed25519");
49
+ const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
50
+ const bitgoPubKeys_1 = require("../../../tss/bitgoPubKeys");
51
+ const common_1 = require("../../../tss/common");
52
+ const codecs_1 = require("../../codecs");
53
+ const eddsaMPCv2_1 = require("../../../tss/eddsa/eddsaMPCv2");
54
+ const eddsa_1 = require("../../../tss/eddsa/eddsa");
55
+ const opengpgUtils_1 = require("../../opengpgUtils");
56
+ const typesMPCv2_1 = require("../ecdsa/typesMPCv2");
57
+ const baseTypes_1 = require("../baseTypes");
58
+ const base_1 = require("./base");
59
+ const eddsaMPCv2KeyGenSender_1 = require("./eddsaMPCv2KeyGenSender");
60
+ class EddsaMPCv2Utils extends base_1.BaseEddsaUtils {
61
+ /** @inheritdoc */
62
+ async createKeychains(params) {
63
+ const userKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
64
+ const userGpgKey = await pgp.readPrivateKey({ armoredKey: userKeyPair.privateKey });
65
+ const userGpgPublicKey = userKeyPair.publicKey;
66
+ const [userPk, userSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(userGpgKey);
67
+ const backupKeyPair = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
68
+ const backupGpgKey = await pgp.readPrivateKey({ armoredKey: backupKeyPair.privateKey });
69
+ const backupGpgPublicKey = backupKeyPair.publicKey;
70
+ const [backupPk, backupSk] = await sdk_lib_mpc_1.MPSComms.extractEd25519KeyPair(backupGpgKey);
71
+ // Get the BitGo EdDSA MPCv2 public key (ed25519). Using the default mpcv2PublicKey (secp256k1)
72
+ // here would cause a WASM "Invalid Input" error, so we require the dedicated eddsaMpcv2PublicKey.
73
+ const { eddsaMpcv2PublicKey } = await this.getBitgoGpgPubkeyBasedOnFeatureFlags(params.enterprise, true);
74
+ const bitgoPublicGpgKey = eddsaMpcv2PublicKey ?? this.bitgoEddsaMpcv2PublicGpgKey;
75
+ (0, assert_1.default)(bitgoPublicGpgKey, 'Failed to get BitGo EdDSA MPCv2 GPG public key');
76
+ const bitgoPublicGpgKeyArmored = bitgoPublicGpgKey.armor();
77
+ if ((0, bitgoPubKeys_1.envRequiresBitgoPubGpgKeyConfig)(this.bitgo.getEnv())) {
78
+ (0, assert_1.default)((0, bitgoPubKeys_1.isBitgoEddsaMpcv2PubKey)(bitgoPublicGpgKeyArmored), 'Invalid BitGo GPG public key');
79
+ }
80
+ const bitgoKeyObj = await pgp.readKey({ armoredKey: bitgoPublicGpgKeyArmored });
81
+ const bitgoPk = await sdk_lib_mpc_1.MPSComms.extractEd25519PublicKey(bitgoKeyObj);
82
+ // Create DKG sessions for user (party 0) and backup (party 1)
83
+ const userDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.USER);
84
+ const backupDkg = new sdk_lib_mpc_1.EddsaMPSDkg.DKG(3, 2, typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
85
+ // #region round 1
86
+ await userDkg.initDkg(userSk, [backupPk, bitgoPk]);
87
+ await backupDkg.initDkg(backupSk, [userPk, bitgoPk]);
88
+ const userMsg1 = userDkg.getFirstMessage();
89
+ const backupMsg1 = backupDkg.getFirstMessage();
90
+ const userSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg1.payload), userGpgKey);
91
+ const backupSignedMsg1 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg1.payload), backupGpgKey);
92
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(userGpgPublicKey), 'User GPG public key is required');
93
+ (0, assert_1.default)(io_ts_types_1.NonEmptyString.is(backupGpgPublicKey), 'Backup GPG public key is required');
94
+ const { sessionId, bitgoMsg1 } = await this.sendKeyGenerationRound1(params.enterprise, {
95
+ userGpgPublicKey,
96
+ backupGpgPublicKey,
97
+ userMsg1: userSignedMsg1,
98
+ backupMsg1: backupSignedMsg1,
99
+ });
100
+ // #endregion
101
+ // #region round 2
102
+ const bitgoRawMsg1Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg1, bitgoKeyObj);
103
+ const bitgoDeserializedMsg1 = {
104
+ from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
105
+ payload: new Uint8Array(bitgoRawMsg1Bytes),
106
+ };
107
+ const round1Messages = [userMsg1, backupMsg1, bitgoDeserializedMsg1];
108
+ const userRound2Msgs = userDkg.handleIncomingMessages(round1Messages);
109
+ const backupRound2Msgs = backupDkg.handleIncomingMessages(round1Messages);
110
+ (0, assert_1.default)(userRound2Msgs.length === 1, 'User round 1 should produce exactly one round 2 message');
111
+ (0, assert_1.default)(backupRound2Msgs.length === 1, 'Backup round 1 should produce exactly one round 2 message');
112
+ const userMsg2 = userRound2Msgs[0];
113
+ const backupMsg2 = backupRound2Msgs[0];
114
+ const userSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(userMsg2.payload), userGpgKey);
115
+ const backupSignedMsg2 = await sdk_lib_mpc_1.MPSComms.detachSignMpsMessage(Buffer.from(backupMsg2.payload), backupGpgKey);
116
+ const { sessionId: sessionIdRound2, commonPublicKeychain, bitgoMsg2, } = await this.sendKeyGenerationRound2(params.enterprise, {
117
+ sessionId,
118
+ userMsg2: userSignedMsg2,
119
+ backupMsg2: backupSignedMsg2,
120
+ });
121
+ // #endregion
122
+ // #region keychain creation
123
+ assert_1.default.equal(sessionId, sessionIdRound2, 'Round 1 and round 2 session IDs do not match');
124
+ const bitgoRawMsg2Bytes = await sdk_lib_mpc_1.MPSComms.verifyMpsMessage(bitgoMsg2, bitgoKeyObj);
125
+ const bitgoDeserializedMsg2 = {
126
+ from: typesMPCv2_1.MPCv2PartiesEnum.BITGO,
127
+ payload: new Uint8Array(bitgoRawMsg2Bytes),
128
+ };
129
+ const round2Messages = [userMsg2, backupMsg2, bitgoDeserializedMsg2];
130
+ const userFinalMsgs = userDkg.handleIncomingMessages(round2Messages);
131
+ const backupFinalMsgs = backupDkg.handleIncomingMessages(round2Messages);
132
+ (0, assert_1.default)(userFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for user');
133
+ (0, assert_1.default)(backupFinalMsgs.length === 0, 'WASM round 2 should produce no output messages for backup');
134
+ const userCommonKeychain = userDkg.getCommonKeychain();
135
+ const backupCommonKeychain = backupDkg.getCommonKeychain();
136
+ assert_1.default.equal(userCommonKeychain, commonPublicKeychain, 'User computed keychain does not match BitGo common keychain');
137
+ assert_1.default.equal(backupCommonKeychain, commonPublicKeychain, 'Backup computed keychain does not match BitGo common keychain');
138
+ const userPrivateMaterial = userDkg.getKeyShare();
139
+ const backupPrivateMaterial = backupDkg.getKeyShare();
140
+ const userReducedPrivateMaterial = userDkg.getReducedKeyShare();
141
+ const backupReducedPrivateMaterial = backupDkg.getReducedKeyShare();
142
+ const userKeychainPromise = this.addUserKeychain(userCommonKeychain, userPrivateMaterial, userReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.webauthnInfo, params.encryptionVersion, params.enterprise);
143
+ const backupKeychainPromise = this.addBackupKeychain(backupCommonKeychain, backupPrivateMaterial, backupReducedPrivateMaterial, params.passphrase, params.originalPasscodeEncryptionCode, params.encryptionVersion);
144
+ const bitgoKeychainPromise = this.addBitgoKeychain(userCommonKeychain);
145
+ const [userKeychain, backupKeychain, bitgoKeychain] = await Promise.all([
146
+ userKeychainPromise,
147
+ backupKeychainPromise,
148
+ bitgoKeychainPromise,
149
+ ]);
150
+ // #endregion
151
+ return {
152
+ userKeychain,
153
+ backupKeychain,
154
+ bitgoKeychain,
155
+ };
156
+ }
157
+ // #region keychain utils
158
+ async createParticipantKeychain(participantIndex, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise) {
159
+ let source;
160
+ let encryptedPrv = undefined;
161
+ let reducedEncryptedPrv = undefined;
162
+ let privateMaterialBase64 = undefined;
163
+ switch (participantIndex) {
164
+ case typesMPCv2_1.MPCv2PartiesEnum.USER:
165
+ case typesMPCv2_1.MPCv2PartiesEnum.BACKUP:
166
+ source = participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER ? 'user' : 'backup';
167
+ (0, assert_1.default)(privateMaterial, `Private material is required for ${source} keychain`);
168
+ (0, assert_1.default)(reducedPrivateMaterial, `Reduced private material is required for ${source} keychain`);
169
+ (0, assert_1.default)(passphrase, `Passphrase is required for ${source} keychain`);
170
+ privateMaterialBase64 = privateMaterial.toString('base64');
171
+ encryptedPrv = await this.bitgo.encryptAsync({
172
+ input: privateMaterialBase64,
173
+ password: passphrase,
174
+ encryptionVersion,
175
+ });
176
+ // Encrypts the CBOR-encoded ReducedKeyShare (which contains the party's public
177
+ // key) with the wallet passphrase. The result is stored as reducedEncryptedPrv
178
+ // on the key card QR code and represents a second copy of key material
179
+ // beyond the server-stored encryptedPrv.
180
+ reducedEncryptedPrv = await this.bitgo.encryptAsync({
181
+ // Buffer.toString('base64') can not be used here as it does not work on the browser.
182
+ // The browser deals with a Buffer as Uint8Array, therefore in the browser .toString('base64') just creates a comma separated string of the array values.
183
+ input: btoa(String.fromCharCode.apply(null, Array.from(new Uint8Array(reducedPrivateMaterial)))),
184
+ password: passphrase,
185
+ encryptionVersion,
186
+ });
187
+ break;
188
+ case typesMPCv2_1.MPCv2PartiesEnum.BITGO:
189
+ source = 'bitgo';
190
+ break;
191
+ default:
192
+ throw new Error('Invalid participant index');
193
+ }
194
+ const keychainParams = {
195
+ source,
196
+ keyType: 'tss',
197
+ commonKeychain,
198
+ encryptedPrv,
199
+ originalPasscodeEncryptionCode,
200
+ isMPCv2: true,
201
+ };
202
+ if (webauthnInfo && participantIndex === typesMPCv2_1.MPCv2PartiesEnum.USER && privateMaterialBase64) {
203
+ // Send the passkey as `webauthnInfo`; the deprecated `webauthnDevices` array is ignored by POST /key.
204
+ (0, assert_1.default)(enterprise, 'enterprise is required to attach a webauthn device to the user keychain');
205
+ keychainParams.webauthnInfo = {
206
+ otpDeviceId: webauthnInfo.otpDeviceId,
207
+ prfSalt: webauthnInfo.prfSalt,
208
+ encryptedPrv: await this.bitgo.encryptAsync({
209
+ input: privateMaterialBase64,
210
+ password: webauthnInfo.passphrase,
211
+ encryptionVersion,
212
+ }),
213
+ enterpriseId: enterprise,
214
+ };
215
+ }
216
+ const keychains = this.baseCoin.keychains();
217
+ return { ...(await keychains.add(keychainParams)), reducedEncryptedPrv };
218
+ }
219
+ async addUserKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise) {
220
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.USER, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, webauthnInfo, encryptionVersion, enterprise);
221
+ }
222
+ async addBackupKeychain(commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, encryptionVersion) {
223
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BACKUP, commonKeychain, privateMaterial, reducedPrivateMaterial, passphrase, originalPasscodeEncryptionCode, undefined, encryptionVersion);
224
+ }
225
+ async addBitgoKeychain(commonKeychain) {
226
+ return this.createParticipantKeychain(typesMPCv2_1.MPCv2PartiesEnum.BITGO, commonKeychain);
227
+ }
228
+ // #endregion
229
+ async sendKeyGenerationRound1(enterprise, payload) {
230
+ return this.sendKeyGenerationRound1BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
231
+ }
232
+ async sendKeyGenerationRound1BySender(senderFn, payload) {
233
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R1'], payload);
234
+ }
235
+ async sendKeyGenerationRound2(enterprise, payload) {
236
+ return this.sendKeyGenerationRound2BySender((0, eddsaMPCv2KeyGenSender_1.KeyGenSenderForEnterprise)(this.bitgo, enterprise), payload);
237
+ }
238
+ async sendKeyGenerationRound2BySender(senderFn, payload) {
239
+ return senderFn(public_types_1.MPCv2KeyGenStateEnum['MPCv2-R2'], payload);
240
+ }
241
+ // #endregion
242
+ // #region sign tx request
243
+ /**
244
+ * Signs the transaction associated with the transaction request.
245
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
246
+ * @param {string} params.prv - decrypted private key
247
+ * @param {string} params.reqId - request id
248
+ * @returns {Promise<TxRequest>} fully signed TxRequest
249
+ */
250
+ async signTxRequest(params) {
251
+ this.bitgo.setRequestTracer(params.reqId);
252
+ return this.signRequestBase(params, baseTypes_1.RequestType.tx);
253
+ }
254
+ /**
255
+ * Signs the message associated with the transaction request.
256
+ * @param {string | TxRequest} params.txRequest - transaction request object or id
257
+ * @param {string} params.prv - decrypted private key
258
+ * @param {string} params.reqId - request id
259
+ * @returns {Promise<TxRequest>} fully signed TxRequest
260
+ */
261
+ async signTxRequestForMessage(params) {
262
+ this.bitgo.setRequestTracer(params.reqId);
263
+ return this.signRequestBase(params, baseTypes_1.RequestType.message);
264
+ }
265
+ /**
266
+ * Full 3-round EdDSA MPCv2 (MPS) online signing orchestration.
267
+ *
268
+ * Protocol overview:
269
+ * WASM Round 0 → getFirstMessage() (produces userMsg1)
270
+ * API Round 1 → send userMsg1 / recv bitgoMsg1
271
+ * WASM Round 1 → handleIncomingMessages([userMsg1, bitgoMsg1]) (produces userMsg2)
272
+ * API Round 2 → send userMsg2 / recv bitgoMsg2
273
+ * WASM Round 2 → handleIncomingMessages([userMsg2, bitgoMsg2]) (produces userMsg3)
274
+ * API Round 3 → send userMsg3 (WP finalises; no BitGo msg returned to client)
275
+ */
276
+ async signRequestBase(params, requestType) {
277
+ const userKeyShare = Buffer.from(params.prv, 'base64');
278
+ const txRequest = typeof params.txRequest === 'string'
279
+ ? await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), params.txRequest, params.reqId)
280
+ : params.txRequest;
281
+ let txOrMessageToSign;
282
+ let derivationPath;
283
+ let bufferContent;
284
+ // One fresh ed25519 GPG key pair per signing session, reused across all signing rounds.
285
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
286
+ const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
287
+ const bitgoGpgPubKey = await this.pickBitgoPubGpgKeyForSigning(true, params.reqId, txRequest.enterpriseId, true);
288
+ (0, assert_1.default)(bitgoGpgPubKey, 'Missing BitGo GPG key for MPCv2');
289
+ if (requestType === baseTypes_1.RequestType.tx) {
290
+ (0, assert_1.default)(txRequest.transactions || txRequest.unsignedTxs, 'Unable to find transactions in txRequest');
291
+ const unsignedTx = txRequest.apiVersion === 'full' ? txRequest.transactions[0].unsignedTx : txRequest.unsignedTxs[0];
292
+ txOrMessageToSign = unsignedTx.signableHex;
293
+ (0, assert_1.default)(txOrMessageToSign, 'Missing signableHex in unsignedTx');
294
+ derivationPath = unsignedTx.derivationPath;
295
+ bufferContent = Buffer.from(txOrMessageToSign, 'hex');
296
+ await this.baseCoin.verifyTransaction({
297
+ txPrebuild: { txHex: unsignedTx.serializedTxHex ?? txOrMessageToSign },
298
+ txParams: params.txParams || { recipients: [] },
299
+ wallet: this.wallet,
300
+ walletType: this.wallet.multisigType(),
301
+ });
302
+ }
303
+ else if (requestType === baseTypes_1.RequestType.message) {
304
+ (0, assert_1.default)(txRequest.messages && txRequest.messages.length > 0, 'Unable to find messages in txRequest');
305
+ txOrMessageToSign = txRequest.messages[0].messageEncoded;
306
+ (0, assert_1.default)(txOrMessageToSign, 'Missing messageEncoded in messages[0]');
307
+ derivationPath = txRequest.messages[0].derivationPath || 'm/0';
308
+ bufferContent = Buffer.from(txOrMessageToSign, 'hex');
309
+ }
310
+ else {
311
+ throw new Error('Invalid request type');
312
+ }
313
+ // ── WASM Round 0 ──────────────────────────────────────────────────────────
314
+ const partyId = params.mpcv2PartyId ?? typesMPCv2_1.MPCv2PartiesEnum.USER;
315
+ const signerShareType = partyId === typesMPCv2_1.MPCv2PartiesEnum.USER ? baseTypes_1.SignatureShareType.USER : baseTypes_1.SignatureShareType.BACKUP;
316
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(partyId);
317
+ await userDsg.initDsg(userKeyShare, bufferContent, derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
318
+ const userMsg1 = userDsg.getFirstMessage();
319
+ // ── API Round 1 ───────────────────────────────────────────────────────────
320
+ const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey, partyId);
321
+ let latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
322
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 1');
323
+ const signatureShares1 = requestType === baseTypes_1.RequestType.tx
324
+ ? latestTxRequest.transactions[0].signatureShares
325
+ : latestTxRequest.messages[0].signatureShares;
326
+ const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares1, signerShareType, 'round1Output');
327
+ const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
328
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
329
+ throw new Error('Unexpected signature share response. Unable to parse data.');
330
+ }
331
+ const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgPubKey);
332
+ // ── WASM Round 1 ──────────────────────────────────────────────────────────
333
+ const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
334
+ (0, assert_1.default)(userMsg2, 'WASM round 1 produced no message');
335
+ // ── API Round 2 ───────────────────────────────────────────────────────────
336
+ const signatureShareRoundTwo = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey, partyId);
337
+ latestTxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRoundTwo], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
338
+ (0, assert_1.default)(latestTxRequest.transactions || latestTxRequest.messages, 'Invalid txRequest object after round 2');
339
+ const txRequestSignatureShares = requestType === baseTypes_1.RequestType.tx
340
+ ? latestTxRequest.transactions[0].signatureShares
341
+ : latestTxRequest.messages[0].signatureShares;
342
+ const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(txRequestSignatureShares, signerShareType, 'round2Output');
343
+ const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
344
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
345
+ throw new Error('Unexpected signature share response. Unable to parse data.');
346
+ }
347
+ const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgPubKey);
348
+ // ── WASM Round 2 ──────────────────────────────────────────────────────────
349
+ const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
350
+ (0, assert_1.default)(userMsg3, 'WASM round 2 produced no message');
351
+ // ── API Round 3 ───────────────────────────────────────────────────────────
352
+ // No BitGo response to verify; WP finalises the signing server-side
353
+ const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey, partyId);
354
+ const round3TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequest.walletId, txRequest.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgKey.publicKey, undefined, this.wallet.multisigTypeVersion(), params.reqId);
355
+ (0, assert_1.default)(round3TxRequest?.txRequestId === txRequest.txRequestId, 'Invalid txRequest object after round 3');
356
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequest.walletId, txRequest.txRequestId, requestType, params.reqId);
357
+ }
358
+ // #endregion
359
+ // #region external signer
360
+ // #region Round1Share
361
+ async createOfflineRound1Share(params) {
362
+ const { prv, walletPassphrase, txRequest, encryptedPrv } = params;
363
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
364
+ const adata = `${signableHex}:${derivationPath}`;
365
+ const userKeyShare = Buffer.from(prv, 'base64');
366
+ const userGpgKey = await (0, opengpgUtils_1.generateGPGKeyPair)('ed25519');
367
+ const userGpgPrvKey = await pgp.readPrivateKey({ armoredKey: userGpgKey.privateKey });
368
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
369
+ await userDsg.initDsg(userKeyShare, Buffer.from(signableHex, 'hex'), derivationPath, typesMPCv2_1.MPCv2PartiesEnum.BITGO);
370
+ const userMsg1 = userDsg.getFirstMessage();
371
+ const signatureShareRound1 = await (0, eddsaMPCv2_1.getSignatureShareRoundOne)(userMsg1, userGpgPrvKey);
372
+ const sessionPayload = JSON.stringify({
373
+ dsgSession: userDsg.getSession(),
374
+ userMsgPayload: Buffer.from(userMsg1.payload).toString('base64'),
375
+ });
376
+ const userGpgPubKey = userGpgKey.publicKey;
377
+ const useV2 = encryptedPrv !== undefined && (0, baseTypes_1.isV2Envelope)(encryptedPrv);
378
+ if (useV2) {
379
+ const session = await this.bitgo.createEncryptionSession(walletPassphrase);
380
+ try {
381
+ const encryptedRound1Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`);
382
+ const encryptedUserGpgPrvKey = await session.encrypt(userGpgKey.privateKey, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`);
383
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
384
+ }
385
+ finally {
386
+ session.destroy();
387
+ }
388
+ }
389
+ const encryptedRound1Session = await this.bitgo.encryptAsync({
390
+ input: sessionPayload,
391
+ password: walletPassphrase,
392
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE}:${adata}`,
393
+ encryptionVersion: 1,
394
+ });
395
+ const encryptedUserGpgPrvKey = await this.bitgo.encryptAsync({
396
+ input: userGpgKey.privateKey,
397
+ password: walletPassphrase,
398
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY}:${adata}`,
399
+ encryptionVersion: 1,
400
+ });
401
+ return { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey };
402
+ }
403
+ // #endregion
404
+ // #region Round2Share
405
+ async createOfflineRound2Share(params) {
406
+ const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound1Session, bitgoPublicGpgKey, txRequest } = params;
407
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
408
+ const adata = `${signableHex}:${derivationPath}`;
409
+ const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound1Session);
410
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
411
+ const transactions = txRequest.transactions;
412
+ (0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
413
+ const signatureShares = transactions[0].signatureShares;
414
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 1 txRequest');
415
+ const bitgoShareRoundOne = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round1Output');
416
+ const parsedBitGoToUserSigShareRoundOne = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound1Output, JSON.parse(bitgoShareRoundOne.share), 'Unexpected signature share response. Unable to parse data.');
417
+ if (parsedBitGoToUserSigShareRoundOne.type !== 'round1Output') {
418
+ throw new Error('Unexpected signature share response. Unable to parse data.');
419
+ }
420
+ const bitgoDeserializedMsg1 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundOne)(parsedBitGoToUserSigShareRoundOne, bitgoGpgKey);
421
+ this.validateAdata(adata, encryptedRound1Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE);
422
+ let decryptedRound1Session;
423
+ if (useV2) {
424
+ decryptedRound1Session = await this.bitgo.decryptAsync({
425
+ input: encryptedRound1Session,
426
+ password: walletPassphrase,
427
+ });
428
+ }
429
+ else {
430
+ decryptedRound1Session = this.bitgo.decrypt({
431
+ input: encryptedRound1Session,
432
+ password: walletPassphrase,
433
+ });
434
+ }
435
+ const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound1Session);
436
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
437
+ await userDsg.restoreSession(dsgSession);
438
+ const userMsg1 = {
439
+ from: typesMPCv2_1.MPCv2PartiesEnum.USER,
440
+ payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
441
+ };
442
+ const [userMsg2] = userDsg.handleIncomingMessages([userMsg1, bitgoDeserializedMsg1]);
443
+ (0, assert_1.default)(userMsg2, 'DSG handleIncomingMessages produced no round-2 output');
444
+ const signatureShareRound2 = await (0, eddsaMPCv2_1.getSignatureShareRoundTwo)(userMsg2, userGpgPrvKey);
445
+ const sessionPayload = JSON.stringify({
446
+ dsgSession: userDsg.getSession(),
447
+ userMsgPayload: Buffer.from(userMsg2.payload).toString('base64'),
448
+ });
449
+ if (useV2) {
450
+ const session = await this.bitgo.createEncryptionSession(walletPassphrase);
451
+ try {
452
+ const encryptedRound2Session = await session.encrypt(sessionPayload, `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`);
453
+ return { signatureShareRound2, encryptedRound2Session };
454
+ }
455
+ finally {
456
+ session.destroy();
457
+ }
458
+ }
459
+ const encryptedRound2Session = await this.bitgo.encryptAsync({
460
+ input: sessionPayload,
461
+ password: walletPassphrase,
462
+ adata: `${EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE}:${adata}`,
463
+ encryptionVersion: 1,
464
+ });
465
+ return { signatureShareRound2, encryptedRound2Session };
466
+ }
467
+ // #endregion
468
+ // #region Round3Share
469
+ async createOfflineRound3Share(params) {
470
+ const { walletPassphrase, encryptedUserGpgPrvKey, encryptedRound2Session, bitgoPublicGpgKey, txRequest } = params;
471
+ const { signableHex, derivationPath } = this.getSignableHexAndDerivationPath(txRequest, 'Unable to find transactions in txRequest');
472
+ const adata = `${signableHex}:${derivationPath}`;
473
+ const useV2 = (0, baseTypes_1.isV2Envelope)(encryptedRound2Session);
474
+ const { bitgoGpgKey, userGpgPrvKey } = await this.getBitgoAndUserGpgKeys(bitgoPublicGpgKey, encryptedUserGpgPrvKey, walletPassphrase, adata, EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY);
475
+ const transactions = txRequest.transactions;
476
+ (0, assert_1.default)(Array.isArray(transactions) && transactions.length === 1, 'txRequest must have exactly one transaction');
477
+ const signatureShares = transactions[0].signatureShares;
478
+ (0, assert_1.default)(signatureShares, 'Missing signature shares in round 2 txRequest');
479
+ const bitgoShareRoundTwo = (0, common_1.getBitgoSignatureShare)(signatureShares, baseTypes_1.SignatureShareType.USER, 'round2Output');
480
+ const parsedBitGoToUserSigShareRoundTwo = (0, codecs_1.decodeWithCodec)(public_types_1.EddsaMPCv2SignatureShareRound2Output, JSON.parse(bitgoShareRoundTwo.share), 'Unexpected signature share response. Unable to parse data.');
481
+ if (parsedBitGoToUserSigShareRoundTwo.type !== 'round2Output') {
482
+ throw new Error('Unexpected signature share response. Unable to parse data.');
483
+ }
484
+ const bitgoDeserializedMsg2 = await (0, eddsaMPCv2_1.verifyPeerMessageRoundTwo)(parsedBitGoToUserSigShareRoundTwo, bitgoGpgKey);
485
+ this.validateAdata(adata, encryptedRound2Session, EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE);
486
+ let decryptedRound2Session;
487
+ if (useV2) {
488
+ decryptedRound2Session = await this.bitgo.decryptAsync({
489
+ input: encryptedRound2Session,
490
+ password: walletPassphrase,
491
+ });
492
+ }
493
+ else {
494
+ decryptedRound2Session = this.bitgo.decrypt({
495
+ input: encryptedRound2Session,
496
+ password: walletPassphrase,
497
+ });
498
+ }
499
+ const { dsgSession, userMsgPayload } = JSON.parse(decryptedRound2Session);
500
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
501
+ await userDsg.restoreSession(dsgSession);
502
+ const userMsg2 = {
503
+ from: typesMPCv2_1.MPCv2PartiesEnum.USER,
504
+ payload: new Uint8Array(Buffer.from(userMsgPayload, 'base64')),
505
+ };
506
+ const [userMsg3] = userDsg.handleIncomingMessages([userMsg2, bitgoDeserializedMsg2]);
507
+ (0, assert_1.default)(userMsg3, 'DSG handleIncomingMessages produced no round-3 output');
508
+ const signatureShareRound3 = await (0, eddsaMPCv2_1.getSignatureShareRoundThree)(userMsg3, userGpgPrvKey);
509
+ return { signatureShareRound3 };
510
+ }
511
+ // #endregion
512
+ /** @inheritdoc */
513
+ async signEddsaMPCv2TssUsingExternalSigner(params, externalSignerEddsaMPCv2SigningRound1Generator, externalSignerEddsaMPCv2SigningRound2Generator, externalSignerEddsaMPCv2SigningRound3Generator, requestType = baseTypes_1.RequestType.tx) {
514
+ const { txRequest, reqId } = params;
515
+ // TODO(WP-2176): Add support for message signing
516
+ (0, assert_1.default)(requestType === baseTypes_1.RequestType.tx, 'Only transaction signing is supported for external signer, got: ' + requestType);
517
+ let txRequestResolved;
518
+ if (typeof txRequest === 'string') {
519
+ txRequestResolved = await (0, common_1.getTxRequest)(this.bitgo, this.wallet.id(), txRequest, reqId);
520
+ }
521
+ else {
522
+ txRequestResolved = txRequest;
523
+ }
524
+ const bitgoPublicGpgKey = await this.pickBitgoPubGpgKeyForSigning(true, reqId, txRequestResolved.enterpriseId, true);
525
+ if (!bitgoPublicGpgKey) {
526
+ throw new Error('Missing BitGo GPG key for MPCv2');
527
+ }
528
+ // round 1
529
+ const { signatureShareRound1, userGpgPubKey, encryptedRound1Session, encryptedUserGpgPrvKey } = await externalSignerEddsaMPCv2SigningRound1Generator({ txRequest: txRequestResolved });
530
+ const round1TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound1], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
531
+ // round 2
532
+ const { signatureShareRound2, encryptedRound2Session } = await externalSignerEddsaMPCv2SigningRound2Generator({
533
+ txRequest: round1TxRequest,
534
+ encryptedRound1Session,
535
+ encryptedUserGpgPrvKey,
536
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
537
+ });
538
+ const round2TxRequest = await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound2], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
539
+ (0, assert_1.default)(round2TxRequest.transactions && round2TxRequest.transactions[0].signatureShares, 'Missing signature shares in round 2 txRequest');
540
+ // round 3
541
+ const { signatureShareRound3 } = await externalSignerEddsaMPCv2SigningRound3Generator({
542
+ txRequest: round2TxRequest,
543
+ encryptedRound2Session,
544
+ encryptedUserGpgPrvKey,
545
+ bitgoPublicGpgKey: bitgoPublicGpgKey.armor(),
546
+ });
547
+ await (0, common_1.sendSignatureShareV2)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, [signatureShareRound3], requestType, this.baseCoin.getMPCAlgorithm(), userGpgPubKey, undefined, this.wallet.multisigTypeVersion(), reqId);
548
+ return (0, common_1.sendTxRequest)(this.bitgo, txRequestResolved.walletId, txRequestResolved.txRequestId, requestType, reqId);
549
+ }
550
+ }
551
+ exports.EddsaMPCv2Utils = EddsaMPCv2Utils;
552
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_USER_GPG_KEY = 'MPS_DSG_SIGNING_USER_GPG_KEY';
553
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND1_STATE = 'MPS_DSG_SIGNING_ROUND1_STATE';
554
+ EddsaMPCv2Utils.MPS_DSG_SIGNING_ROUND2_STATE = 'MPS_DSG_SIGNING_ROUND2_STATE';
555
+ /**
556
+ * Detect whether an encrypted keycard contains MPCv1 signing material.
557
+ *
558
+ * Decrypts the keycard and checks for the JSON shape produced by the MPCv1 TSS
559
+ * key-generation flow (uShare.seed + bitgoYShare.u + backupYShare.u / userYShare.u).
560
+ * Returns false for MPCv2 CBOR keycards, wrong passwords, or any decryption error.
561
+ *
562
+ * @param encryptedKeyShare encrypted user or backup keycard
563
+ * @param walletPassphrase passphrase used to encrypt the keycard
564
+ * @param bitgo optional BitGoBase instance; when provided, decrypts via
565
+ * bitgo.decryptAsync (supports both v1 SJCL and v2 Argon2id envelopes);
566
+ * when absent, falls back to sjcl.decrypt (v1 only)
567
+ */
568
+ async function isEddsaMpcV1SigningMaterial(encryptedKeyShare, walletPassphrase, bitgo) {
569
+ const prv = bitgo
570
+ ? await bitgo.decryptAsync({ input: encryptedKeyShare, password: walletPassphrase })
571
+ : sjcl.decrypt(walletPassphrase, encryptedKeyShare);
572
+ try {
573
+ const m = JSON.parse(prv);
574
+ return (typeof m?.uShare?.seed === 'string' &&
575
+ typeof m?.bitgoYShare?.u === 'string' &&
576
+ (typeof m?.backupYShare?.u === 'string' || typeof m?.userYShare?.u === 'string'));
577
+ }
578
+ catch {
579
+ // JSON parse error indicates MPCv2 CBOR format, not JSON.
580
+ return false;
581
+ }
582
+ }
583
+ /**
584
+ * Get EdDSA MPCv2 recovery key shares from encrypted reduced user and backup keys.
585
+ *
586
+ * The encrypted inputs are the `reducedEncryptedPrv` values stored on EdDSA MPCv2
587
+ * key cards. They decrypt to CBOR-encoded reduced shares that contain the opaque
588
+ * MPS signing key-share bytes plus the common public keychain material.
589
+ *
590
+ * @param encryptedUserKey encrypted EdDSA MPCv2 reduced user key
591
+ * @param encryptedBackupKey encrypted EdDSA MPCv2 reduced backup key
592
+ * @param walletPassphrase password for user and backup keys
593
+ * @returns EdDSA MPCv2 recovery key shares and common keychain
594
+ */
595
+ async function getEddsaMpcV2RecoveryKeySharesFromReducedKey(encryptedUserKey, encryptedBackupKey, walletPassphrase, bitgo) {
596
+ const decodeKey = async (encryptedKey) => {
597
+ const decrypted = bitgo
598
+ ? await bitgo.decryptAsync({ input: encryptedKey, password: walletPassphrase })
599
+ : sjcl.decrypt(walletPassphrase, encryptedKey);
600
+ let reduced;
601
+ try {
602
+ reduced = sdk_lib_mpc_1.MPSTypes.getDecodedReducedKeyShare(Buffer.from(decrypted, 'base64'));
603
+ }
604
+ catch {
605
+ throw new Error('EdDSA MPCv2 recovery: unable to decode reduced key share from keycard material. The encrypted key may be corrupted, malformed, or not an EdDSA MPCv2 reduced key.');
606
+ }
607
+ if (!reduced.keyShare?.length || !reduced.pub?.length || !reduced.rootChainCode?.length) {
608
+ throw new Error('EdDSA MPCv2 recovery: reduced key share is missing keyShare, pub, or rootChainCode. This keycard may be public-only and cannot be used for recovery.');
609
+ }
610
+ return reduced;
611
+ };
612
+ const [userReduced, backupReduced] = await Promise.all([decodeKey(encryptedUserKey), decodeKey(encryptedBackupKey)]);
613
+ const userPub = Buffer.from(userReduced.pub).toString('hex');
614
+ const backupPub = Buffer.from(backupReduced.pub).toString('hex');
615
+ if (userPub !== backupPub) {
616
+ throw new Error('EdDSA MPCv2 recovery: user and backup pub keys do not match');
617
+ }
618
+ const userChainCode = Buffer.from(userReduced.rootChainCode).toString('hex');
619
+ const backupChainCode = Buffer.from(backupReduced.rootChainCode).toString('hex');
620
+ if (userChainCode !== backupChainCode) {
621
+ throw new Error('EdDSA MPCv2 recovery: user and backup rootChainCodes do not match');
622
+ }
623
+ return {
624
+ userKeyShare: Buffer.from(userReduced.keyShare),
625
+ backupKeyShare: Buffer.from(backupReduced.keyShare),
626
+ commonKeyChain: userPub + userChainCode,
627
+ };
628
+ }
629
+ /**
630
+ * Sign a message for recovery using EdDSA MPCv2 (MPS) with user and backup key shares.
631
+ *
632
+ * Runs the MPS DSG protocol locally to round 3, then verifies the resulting
633
+ * Ed25519 signature against the public key derived from the common keychain.
634
+ *
635
+ * @param message raw bytes to sign
636
+ * @param derivationPath BIP-32-style derivation path, e.g. `"m/0"`
637
+ * @param userKeyShare opaque MPS signing key-share bytes for the user party
638
+ * @param backupKeyShare opaque MPS signing key-share bytes for the backup party
639
+ * @param commonKeyChain 128-hex-char string: 32-byte pub + 32-byte rootChainCode
640
+ * @returns 64-byte Ed25519 signature Buffer
641
+ */
642
+ async function signRecoveryEddsaMPCv2(message, derivationPath, userKeyShare, backupKeyShare, commonKeyChain) {
643
+ const userDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.USER);
644
+ const backupDsg = new sdk_lib_mpc_1.EddsaMPSDsg.DSG(typesMPCv2_1.MPCv2PartiesEnum.BACKUP);
645
+ const signature = (await sdk_lib_mpc_1.MPSUtil.executeTillRound(3, userDsg, backupDsg, userKeyShare, backupKeyShare, message, derivationPath));
646
+ // Use Eddsa.deriveUnhardened (BIP32-Ed25519), which matches what DSG uses
647
+ // internally for path derivation since wasm-mps 1.9.0.
648
+ const mpc = await (0, eddsa_1.getInitializedMpcInstance)();
649
+ const derivedKeychain = mpc.deriveUnhardened(commonKeyChain, derivationPath);
650
+ const publicKeyBytes = Buffer.from(derivedKeychain.slice(0, 64), 'hex');
651
+ const verified = ed25519_1.ed25519.verify(new Uint8Array(signature), new Uint8Array(message), new Uint8Array(publicKeyBytes));
652
+ if (!verified) {
653
+ throw new Error('EdDSA MPCv2 recovery signature verification failed');
654
+ }
655
+ return signature;
656
+ }
657
+ exports.EddsaMPCv2RecoveryFunctions = {
658
+ isEddsaMpcV1SigningMaterial,
659
+ getEddsaMpcV2RecoveryKeySharesFromReducedKey,
660
+ signRecoveryEddsaMPCv2,
661
+ };
662
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRkc2FNUEN2Mi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9iaXRnby91dGlscy90c3MvZWRkc2EvZWRkc2FNUEN2Mi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrNkJBLGtFQW9CQztBQWNELG9HQTZDQztBQWVELHdEQWdDQztBQWhpQ0Qsb0RBQTRCO0FBQzVCLDZDQUErQjtBQUMvQix1REFBeUM7QUFDekMsNkNBQTZDO0FBQzdDLHNEQVM2QjtBQUM3QixtREFBZ0Q7QUFDaEQseURBQWdHO0FBR2hHLDREQUFxRztBQUNyRyxnREFBZ0g7QUFDaEgseUNBQStDO0FBQy9DLDhEQU11QztBQUN2QyxvREFBcUU7QUFDckUscURBQXdEO0FBQ3hELG9EQUF1RDtBQUN2RCw0Q0Fhc0I7QUFHdEIsaUNBQXdDO0FBQ3hDLHFFQUE2RjtBQUc3RixNQUFhLGVBQWdCLFNBQVEscUJBQWM7SUFLakQsa0JBQWtCO0lBQ2xCLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFNckI7UUFDQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUMvQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sc0JBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxRSxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUEsaUNBQWtCLEVBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsY0FBYyxDQUFDLEVB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RyxpQkFBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3BILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVZLFFBQUEsMkJBQTJCLEdBQUc7SUFDekMsMkJBQTJCO0lBQzNCLDRDQUE0QztJQUM1QyxzQkFBc0I7Q0FDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIHBncCBmcm9tICdvcGVucGdwJztcbmltcG9ydCAqIGFzIHNqY2wgZnJvbSAnQGJpdGdvLWJldGEvc2pjbCc7XG5pbXBvcnQgeyBOb25FbXB0eVN0cmluZyB9IGZyb20gJ2lvLXRzLXR5cGVzJztcbmltcG9ydCB7XG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2UsXG4gIEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0LFxuICBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVzcG9uc2UsXG4gIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgRWRkc2FNUEN2MlNpZ25hdHVyZVNoYXJlUm91bmQyT3V0cHV0LFxuICBNUEN2MktleUdlblN0YXRlRW51bSxcbiAgTVBDdjJQYXJ0eUZyb21TdHJpbmdPck51bWJlcixcbn0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBlZDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbmltcG9ydCB7IEVkZHNhTVBTRGtnLCBFZGRzYU1QU0RzZywgTVBTQ29tbXMsIE1QU1R5cGVzLCBNUFNVdGlsIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHsgS2V5Y2hhaW5zVHJpcGxldCB9IGZyb20gJy4uLy4uLy4uL2Jhc2VDb2luJztcbmltcG9ydCB7IEFkZEtleWNoYWluT3B0aW9ucywgS2V5Y2hhaW4sIEtleVR5cGUsIFdlYmF1dGhuS2V5RW5jcnlwdGlvbkluZm8gfSBmcm9tICcuLi8uLi8uLi9rZXljaGFpbic7XG5pbXBvcnQgeyBlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnLCBpc0JpdGdvRWRkc2FNcGN2MlB1YktleSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9iaXRnb1B1YktleXMnO1xuaW1wb3J0IHsgZ2V0Qml0Z29TaWduYXR1cmVTaGFyZSwgZ2V0VHhSZXF1ZXN0LCBzZW5kU2lnbmF0dXJlU2hhcmVWMiwgc2VuZFR4UmVxdWVzdCB9IGZyb20gJy4uLy4uLy4uL3Rzcy9jb21tb24nO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vLi4vY29kZWNzJztcbmltcG9ydCB7XG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUsXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28sXG4gIGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZSxcbiAgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byxcbn0gZnJvbSAnLi4vLi4vLi4vdHNzL2VkZHNhL2VkZHNhTVBDdjInO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRNcGNJbnN0YW5jZSB9IGZyb20gJy4uLy4uLy4uL3Rzcy9lZGRzYS9lZGRzYSc7XG5pbXBvcnQgeyBnZW5lcmF0ZUdQR0tleVBhaXIgfSBmcm9tICcuLi8uLi9vcGVuZ3BnVXRpbHMnO1xuaW1wb3J0IHsgTVBDdjJQYXJ0aWVzRW51bSB9IGZyb20gJy4uL2VjZHNhL3R5cGVzTVBDdjInO1xuaW1wb3J0IHtcbiAgQ3VzdG9tRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0aW5nRnVuY3Rpb24sXG4gIEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICBDdXN0b21FZGRzYU1QQ3YyU2lnbmluZ1JvdW5kM0dlbmVyYXRpbmdGdW5jdGlvbixcbiAgUmVxdWVzdFR5cGUsXG4gIFNpZ25hdHVyZVNoYXJlUmVjb3JkLFxuICBTaWduYXR1cmVTaGFyZVR5cGUsXG4gIFRTU1BhcmFtcyxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZSxcbiAgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gIFRTU1BhcmFtc1dpdGhQcnYsXG4gIFR4UmVxdWVzdCxcbiAgaXNWMkVudmVsb3BlLFxufSBmcm9tICcuLi9iYXNlVHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9hcGknO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vLi4vLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IEJhc2VFZGRzYVV0aWxzIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm4sIEtleUdlblNlbmRlckZvckVudGVycHJpc2UgfSBmcm9tICcuL2VkZHNhTVBDdjJLZXlHZW5TZW5kZXInO1xuaW1wb3J0IHsgRWRkc2FNUEN2MlJlY292ZXJ5S2V5U2hhcmVzIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBFZGRzYU1QQ3YyVXRpbHMgZXh0ZW5kcyBCYXNlRWRkc2FVdGlscyB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVkgPSAnTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMV9TVEFURSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEUgPSAnTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSc7XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGFzeW5jIGNyZWF0ZUtleWNoYWlucyhwYXJhbXM6IHtcbiAgICBwYXNzcGhyYXNlOiBzdHJpbmc7XG4gICAgZW50ZXJwcmlzZTogc3RyaW5nO1xuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZztcbiAgICB3ZWJhdXRobkluZm8/OiBXZWJhdXRobktleUVuY3J5cHRpb25JbmZvO1xuICAgIGVuY3J5cHRpb25WZXJzaW9uPzogRW5jcnlwdGlvblZlcnNpb247XG4gIH0pOiBQcm9taXNlPEtleWNoYWluc1RyaXBsZXQ+IHtcbiAgICBjb25zdCB1c2VyS2V5UGFpciA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyS2V5UGFpci5wcml2YXRlS2V5IH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJsaWNLZXkgPSB1c2VyS2V5UGFpci5wdWJsaWNLZXk7XG4gICAgY29uc3QgW3VzZXJQaywgdXNlclNrXSA9IGF3YWl0IE1QU0NvbW1zLmV4dHJhY3RFZDI1NTE5S2V5UGFpcih1c2VyR3BnS2V5KTtcblxuICAgIGNvbnN0IGJhY2t1cEtleVBhaXIgPSBhd2FpdCBnZW5lcmF0ZUdQR0tleVBhaXIoJ2VkMjU1MTknKTtcbiAgICBjb25zdCBiYWNrdXBHcGdLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiBiYWNrdXBLZXlQYWlyLnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYmFja3VwR3BnUHVibGljS2V5ID0gYmFja3VwS2V5UGFpci5wdWJsaWNLZXk7XG4gICAgY29uc3QgW2JhY2t1cFBrLCBiYWNrdXBTa10gPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOUtleVBhaXIoYmFja3VwR3BnS2V5KTtcblxuICAgIC8vIEdldCB0aGUgQml0R28gRWREU0EgTVBDdjIgcHVibGljIGtleSAoZWQyNTUxOSkuIFVzaW5nIHRoZSBkZWZhdWx0IG1wY3YyUHVibGljS2V5IChzZWNwMjU2azEpXG4gICAgLy8gaGVyZSB3b3VsZCBjYXVzZSBhIFdBU00gXCJJbnZhbGlkIElucHV0XCIgZXJyb3IsIHNvIHdlIHJlcXVpcmUgdGhlIGRlZGljYXRlZCBlZGRzYU1wY3YyUHVibGljS2V5LlxuICAgIGNvbnN0IHsgZWRkc2FNcGN2MlB1YmxpY0tleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0dwZ1B1YmtleUJhc2VkT25GZWF0dXJlRmxhZ3MocGFyYW1zLmVudGVycHJpc2UsIHRydWUpO1xuICAgIGNvbnN0IGJpdGdvUHVibGljR3BnS2V5ID0gZWRkc2FNcGN2MlB1YmxpY0tleSA/PyB0aGlzLmJpdGdvRWRkc2FNcGN2MlB1YmxpY0dwZ0tleTtcbiAgICBhc3NlcnQoYml0Z29QdWJsaWNHcGdLZXksICdGYWlsZWQgdG8gZ2V0IEJpdEdvIEVkRFNBIE1QQ3YyIEdQRyBwdWJsaWMga2V5Jyk7XG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkID0gYml0Z29QdWJsaWNHcGdLZXkuYXJtb3IoKTtcblxuICAgIGlmIChlbnZSZXF1aXJlc0JpdGdvUHViR3BnS2V5Q29uZmlnKHRoaXMuYml0Z28uZ2V0RW52KCkpKSB7XG4gICAgICBhc3NlcnQoaXNCaXRnb0VkZHNhTXBjdjJQdWJLZXkoYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkKSwgJ0ludmFsaWQgQml0R28gR1BHIHB1YmxpYyBrZXknKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0tleU9iaiA9IGF3YWl0IHBncC5yZWFkS2V5KHsgYXJtb3JlZEtleTogYml0Z29QdWJsaWNHcGdLZXlBcm1vcmVkIH0pO1xuICAgIGNvbnN0IGJpdGdvUGsgPSBhd2FpdCBNUFNDb21tcy5leHRyYWN0RWQyNTUxOVB1YmxpY0tleShiaXRnb0tleU9iaik7XG5cbiAgICAvLyBDcmVhdGUgREtHIHNlc3Npb25zIGZvciB1c2VyIChwYXJ0eSAwKSBhbmQgYmFja3VwIChwYXJ0eSAxKVxuICAgIGNvbnN0IHVzZXJEa2cgPSBuZXcgRWRkc2FNUFNEa2cuREtHKDMsIDIsIE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgY29uc3QgYmFja3VwRGtnID0gbmV3IEVkZHNhTVBTRGtnLkRLRygzLCAyLCBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG5cbiAgICAvLyAjcmVnaW9uIHJvdW5kIDFcbiAgICBhd2FpdCB1c2VyRGtnLmluaXREa2codXNlclNrLCBbYmFja3VwUGssIGJpdGdvUGtdKTtcbiAgICBhd2FpdCBiYWNrdXBEa2cuaW5pdERrZyhiYWNrdXBTaywgW3VzZXJQaywgYml0Z29Qa10pO1xuXG4gICAgY29uc3QgdXNlck1zZzEgPSB1c2VyRGtnLmdldEZpcnN0TWVzc2FnZSgpO1xuICAgIGNvbnN0IGJhY2t1cE1zZzEgPSBiYWNrdXBEa2cuZ2V0Rmlyc3RNZXNzYWdlKCk7XG5cbiAgICBjb25zdCB1c2VyU2lnbmVkTXNnMSA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cxLnBheWxvYWQpLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBiYWNrdXBTaWduZWRNc2cxID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYmFja3VwTXNnMS5wYXlsb2FkKSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGFzc2VydChOb25FbXB0eVN0cmluZy5pcyh1c2VyR3BnUHVibGljS2V5KSwgJ1VzZXIgR1BHIHB1YmxpYyBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICBhc3NlcnQoTm9uRW1wdHlTdHJpbmcuaXMoYmFja3VwR3BnUHVibGljS2V5KSwgJ0JhY2t1cCBHUEcgcHVibGljIGtleSBpcyByZXF1aXJlZCcpO1xuXG4gICAgY29uc3QgeyBzZXNzaW9uSWQsIGJpdGdvTXNnMSB9ID0gYXdhaXQgdGhpcy5zZW5kS2V5R2VuZXJhdGlvblJvdW5kMShwYXJhbXMuZW50ZXJwcmlzZSwge1xuICAgICAgdXNlckdwZ1B1YmxpY0tleSxcbiAgICAgIGJhY2t1cEdwZ1B1YmxpY0tleSxcbiAgICAgIHVzZXJNc2cxOiB1c2VyU2lnbmVkTXNnMSxcbiAgICAgIGJhY2t1cE1zZzE6IGJhY2t1cFNpZ25lZE1zZzEsXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiByb3VuZCAyXG4gICAgY29uc3QgYml0Z29SYXdNc2cxQnl0ZXMgPSBhd2FpdCBNUFNDb21tcy52ZXJpZnlNcHNNZXNzYWdlKGJpdGdvTXNnMSwgYml0Z29LZXlPYmopO1xuICAgIGNvbnN0IGJpdGdvRGVzZXJpYWxpemVkTXNnMTogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uQklUR08sXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShiaXRnb1Jhd01zZzFCeXRlcyksXG4gICAgfTtcblxuICAgIGNvbnN0IHJvdW5kMU1lc3NhZ2VzOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlcyA9IFt1c2VyTXNnMSwgYmFja3VwTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXTtcblxuICAgIGNvbnN0IHVzZXJSb3VuZDJNc2dzID0gdXNlckRrZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKHJvdW5kMU1lc3NhZ2VzKTtcbiAgICBjb25zdCBiYWNrdXBSb3VuZDJNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQxTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJSb3VuZDJNc2dzLmxlbmd0aCA9PT0gMSwgJ1VzZXIgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcbiAgICBhc3NlcnQoYmFja3VwUm91bmQyTXNncy5sZW5ndGggPT09IDEsICdCYWNrdXAgcm91bmQgMSBzaG91bGQgcHJvZHVjZSBleGFjdGx5IG9uZSByb3VuZCAyIG1lc3NhZ2UnKTtcblxuICAgIGNvbnN0IHVzZXJNc2cyID0gdXNlclJvdW5kMk1zZ3NbMF07XG4gICAgY29uc3QgYmFja3VwTXNnMiA9IGJhY2t1cFJvdW5kMk1zZ3NbMF07XG5cbiAgICBjb25zdCB1c2VyU2lnbmVkTXNnMiA9IGF3YWl0IE1QU0NvbW1zLmRldGFjaFNpZ25NcHNNZXNzYWdlKEJ1ZmZlci5mcm9tKHVzZXJNc2cyLnBheWxvYWQpLCB1c2VyR3BnS2V5KTtcbiAgICBjb25zdCBiYWNrdXBTaWduZWRNc2cyID0gYXdhaXQgTVBTQ29tbXMuZGV0YWNoU2lnbk1wc01lc3NhZ2UoQnVmZmVyLmZyb20oYmFja3VwTXNnMi5wYXlsb2FkKSwgYmFja3VwR3BnS2V5KTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHNlc3Npb25JZDogc2Vzc2lvbklkUm91bmQyLFxuICAgICAgY29tbW9uUHVibGljS2V5Y2hhaW4sXG4gICAgICBiaXRnb01zZzIsXG4gICAgfSA9IGF3YWl0IHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIocGFyYW1zLmVudGVycHJpc2UsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHVzZXJNc2cyOiB1c2VyU2lnbmVkTXNnMixcbiAgICAgIGJhY2t1cE1zZzI6IGJhY2t1cFNpZ25lZE1zZzIsXG4gICAgfSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuXG4gICAgLy8gI3JlZ2lvbiBrZXljaGFpbiBjcmVhdGlvblxuICAgIGFzc2VydC5lcXVhbChzZXNzaW9uSWQsIHNlc3Npb25JZFJvdW5kMiwgJ1JvdW5kIDEgYW5kIHJvdW5kIDIgc2Vzc2lvbiBJRHMgZG8gbm90IG1hdGNoJyk7XG5cbiAgICBjb25zdCBiaXRnb1Jhd01zZzJCeXRlcyA9IGF3YWl0IE1QU0NvbW1zLnZlcmlmeU1wc01lc3NhZ2UoYml0Z29Nc2cyLCBiaXRnb0tleU9iaik7XG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyOiBNUFNUeXBlcy5EZXNlcmlhbGl6ZWRNZXNzYWdlID0ge1xuICAgICAgZnJvbTogTVBDdjJQYXJ0aWVzRW51bS5CSVRHTyxcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KGJpdGdvUmF3TXNnMkJ5dGVzKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgcm91bmQyTWVzc2FnZXM6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2VzID0gW3VzZXJNc2cyLCBiYWNrdXBNc2cyLCBiaXRnb0Rlc2VyaWFsaXplZE1zZzJdO1xuXG4gICAgY29uc3QgdXNlckZpbmFsTXNncyA9IHVzZXJEa2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhyb3VuZDJNZXNzYWdlcyk7XG4gICAgY29uc3QgYmFja3VwRmluYWxNc2dzID0gYmFja3VwRGtnLmhhbmRsZUluY29taW5nTWVzc2FnZXMocm91bmQyTWVzc2FnZXMpO1xuXG4gICAgYXNzZXJ0KHVzZXJGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgdXNlcicpO1xuICAgIGFzc2VydChiYWNrdXBGaW5hbE1zZ3MubGVuZ3RoID09PSAwLCAnV0FTTSByb3VuZCAyIHNob3VsZCBwcm9kdWNlIG5vIG91dHB1dCBtZXNzYWdlcyBmb3IgYmFja3VwJyk7XG5cbiAgICBjb25zdCB1c2VyQ29tbW9uS2V5Y2hhaW4gPSB1c2VyRGtnLmdldENvbW1vbktleWNoYWluKCk7XG4gICAgY29uc3QgYmFja3VwQ29tbW9uS2V5Y2hhaW4gPSBiYWNrdXBEa2cuZ2V0Q29tbW9uS2V5Y2hhaW4oKTtcblxuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIHVzZXJDb21tb25LZXljaGFpbixcbiAgICAgIGNvbW1vblB1YmxpY0tleWNoYWluLFxuICAgICAgJ1VzZXIgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgYmFja3VwQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBjb21tb25QdWJsaWNLZXljaGFpbixcbiAgICAgICdCYWNrdXAgY29tcHV0ZWQga2V5Y2hhaW4gZG9lcyBub3QgbWF0Y2ggQml0R28gY29tbW9uIGtleWNoYWluJ1xuICAgICk7XG5cbiAgICBjb25zdCB1c2VyUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IGJhY2t1cFByaXZhdGVNYXRlcmlhbCA9IGJhY2t1cERrZy5nZXRLZXlTaGFyZSgpO1xuICAgIGNvbnN0IHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gdXNlckRrZy5nZXRSZWR1Y2VkS2V5U2hhcmUoKTtcbiAgICBjb25zdCBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsID0gYmFja3VwRGtnLmdldFJlZHVjZWRLZXlTaGFyZSgpO1xuXG4gICAgY29uc3QgdXNlcktleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkVXNlcktleWNoYWluKFxuICAgICAgdXNlckNvbW1vbktleWNoYWluLFxuICAgICAgdXNlclByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHVzZXJSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcGFyYW1zLndlYmF1dGhuSW5mbyxcbiAgICAgIHBhcmFtcy5lbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgIHBhcmFtcy5lbnRlcnByaXNlXG4gICAgKTtcbiAgICBjb25zdCBiYWNrdXBLZXljaGFpblByb21pc2UgPSB0aGlzLmFkZEJhY2t1cEtleWNoYWluKFxuICAgICAgYmFja3VwQ29tbW9uS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBiYWNrdXBSZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsLFxuICAgICAgcGFyYW1zLnBhc3NwaHJhc2UsXG4gICAgICBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgcGFyYW1zLmVuY3J5cHRpb25WZXJzaW9uXG4gICAgKTtcbiAgICBjb25zdCBiaXRnb0tleWNoYWluUHJvbWlzZSA9IHRoaXMuYWRkQml0Z29LZXljaGFpbih1c2VyQ29tbW9uS2V5Y2hhaW4pO1xuXG4gICAgY29uc3QgW3VzZXJLZXljaGFpbiwgYmFja3VwS2V5Y2hhaW4sIGJpdGdvS2V5Y2hhaW5dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdXNlcktleWNoYWluUHJvbWlzZSxcbiAgICAgIGJhY2t1cEtleWNoYWluUHJvbWlzZSxcbiAgICAgIGJpdGdvS2V5Y2hhaW5Qcm9taXNlLFxuICAgIF0pO1xuICAgIC8vICNlbmRyZWdpb25cblxuICAgIHJldHVybiB7XG4gICAgICB1c2VyS2V5Y2hhaW4sXG4gICAgICBiYWNrdXBLZXljaGFpbixcbiAgICAgIGJpdGdvS2V5Y2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIC8vICNyZWdpb24ga2V5Y2hhaW4gdXRpbHNcbiAgYXN5bmMgY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihcbiAgICBwYXJ0aWNpcGFudEluZGV4OiBNUEN2MlBhcnR5RnJvbVN0cmluZ09yTnVtYmVyLFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsPzogQnVmZmVyLFxuICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWw/OiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZT86IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBsZXQgZW5jcnlwdGVkUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IHJlZHVjZWRFbmNyeXB0ZWRQcnY6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKHBhcnRpY2lwYW50SW5kZXgpIHtcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5VU0VSOlxuICAgICAgY2FzZSBNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUDpcbiAgICAgICAgc291cmNlID0gcGFydGljaXBhbnRJbmRleCA9PT0gTVBDdjJQYXJ0aWVzRW51bS5VU0VSID8gJ3VzZXInIDogJ2JhY2t1cCc7XG4gICAgICAgIGFzc2VydChwcml2YXRlTWF0ZXJpYWwsIGBQcml2YXRlIG1hdGVyaWFsIGlzIHJlcXVpcmVkIGZvciAke3NvdXJjZX0ga2V5Y2hhaW5gKTtcbiAgICAgICAgYXNzZXJ0KHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsIGBSZWR1Y2VkIHByaXZhdGUgbWF0ZXJpYWwgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBhc3NlcnQocGFzc3BocmFzZSwgYFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yICR7c291cmNlfSBrZXljaGFpbmApO1xuICAgICAgICBwcml2YXRlTWF0ZXJpYWxCYXNlNjQgPSBwcml2YXRlTWF0ZXJpYWwudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICBlbmNyeXB0ZWRQcnYgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICAgICAgaW5wdXQ6IHByaXZhdGVNYXRlcmlhbEJhc2U2NCxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3BocmFzZSxcbiAgICAgICAgICBlbmNyeXB0aW9uVmVyc2lvbixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEVuY3J5cHRzIHRoZSBDQk9SLWVuY29kZWQgUmVkdWNlZEtleVNoYXJlICh3aGljaCBjb250YWlucyB0aGUgcGFydHkncyBwdWJsaWNcbiAgICAgICAgLy8ga2V5KSB3aXRoIHRoZSB3YWxsZXQgcGFzc3BocmFzZS4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgYXMgcmVkdWNlZEVuY3J5cHRlZFBydlxuICAgICAgICAvLyBvbiB0aGUga2V5IGNhcmQgUVIgY29kZSBhbmQgcmVwcmVzZW50cyBhIHNlY29uZCBjb3B5IG9mIGtleSBtYXRlcmlhbFxuICAgICAgICAvLyBiZXlvbmQgdGhlIHNlcnZlci1zdG9yZWQgZW5jcnlwdGVkUHJ2LlxuICAgICAgICByZWR1Y2VkRW5jcnlwdGVkUHJ2ID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgIC8vIEJ1ZmZlci50b1N0cmluZygnYmFzZTY0JykgY2FuIG5vdCBiZSB1c2VkIGhlcmUgYXMgaXQgZG9lcyBub3Qgd29yayBvbiB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAvLyBUaGUgYnJvd3NlciBkZWFscyB3aXRoIGEgQnVmZmVyIGFzIFVpbnQ4QXJyYXksIHRoZXJlZm9yZSBpbiB0aGUgYnJvd3NlciAudG9TdHJpbmcoJ2Jhc2U2NCcpIGp1c3QgY3JlYXRlcyBhIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgdGhlIGFycmF5IHZhbHVlcy5cbiAgICAgICAgICBpbnB1dDogYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkocmVkdWNlZFByaXZhdGVNYXRlcmlhbCkpKSksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsXG4gICAgICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTVBDdjJQYXJ0aWVzRW51bS5CSVRHTzpcbiAgICAgICAgc291cmNlID0gJ2JpdGdvJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFydGljaXBhbnQgaW5kZXgnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpblBhcmFtczogQWRkS2V5Y2hhaW5PcHRpb25zID0ge1xuICAgICAgc291cmNlLFxuICAgICAga2V5VHlwZTogJ3RzcycgYXMgS2V5VHlwZSxcbiAgICAgIGNvbW1vbktleWNoYWluLFxuICAgICAgZW5jcnlwdGVkUHJ2LFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgaXNNUEN2MjogdHJ1ZSxcbiAgICB9O1xuXG4gICAgaWYgKHdlYmF1dGhuSW5mbyAmJiBwYXJ0aWNpcGFudEluZGV4ID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgJiYgcHJpdmF0ZU1hdGVyaWFsQmFzZTY0KSB7XG4gICAgICAvLyBTZW5kIHRoZSBwYXNza2V5IGFzIGB3ZWJhdXRobkluZm9gOyB0aGUgZGVwcmVjYXRlZCBgd2ViYXV0aG5EZXZpY2VzYCBhcnJheSBpcyBpZ25vcmVkIGJ5IFBPU1QgL2tleS5cbiAgICAgIGFzc2VydChlbnRlcnByaXNlLCAnZW50ZXJwcmlzZSBpcyByZXF1aXJlZCB0byBhdHRhY2ggYSB3ZWJhdXRobiBkZXZpY2UgdG8gdGhlIHVzZXIga2V5Y2hhaW4nKTtcbiAgICAgIGtleWNoYWluUGFyYW1zLndlYmF1dGhuSW5mbyA9IHtcbiAgICAgICAgb3RwRGV2aWNlSWQ6IHdlYmF1dGhuSW5mby5vdHBEZXZpY2VJZCxcbiAgICAgICAgcHJmU2FsdDogd2ViYXV0aG5JbmZvLnByZlNhbHQsXG4gICAgICAgIGVuY3J5cHRlZFBydjogYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgICAgIGlucHV0OiBwcml2YXRlTWF0ZXJpYWxCYXNlNjQsXG4gICAgICAgICAgcGFzc3dvcmQ6IHdlYmF1dGhuSW5mby5wYXNzcGhyYXNlLFxuICAgICAgICAgIGVuY3J5cHRpb25WZXJzaW9uLFxuICAgICAgICB9KSxcbiAgICAgICAgZW50ZXJwcmlzZUlkOiBlbnRlcnByaXNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbnMgPSB0aGlzLmJhc2VDb2luLmtleWNoYWlucygpO1xuICAgIHJldHVybiB7IC4uLihhd2FpdCBrZXljaGFpbnMuYWRkKGtleWNoYWluUGFyYW1zKSksIHJlZHVjZWRFbmNyeXB0ZWRQcnYgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkVXNlcktleWNoYWluKFxuICAgIGNvbW1vbktleWNoYWluOiBzdHJpbmcsXG4gICAgcHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcmVkdWNlZFByaXZhdGVNYXRlcmlhbDogQnVmZmVyLFxuICAgIHBhc3NwaHJhc2U6IHN0cmluZyxcbiAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU/OiBzdHJpbmcsXG4gICAgd2ViYXV0aG5JbmZvPzogV2ViYXV0aG5LZXlFbmNyeXB0aW9uSW5mbyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uLFxuICAgIGVudGVycHJpc2U/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxLZXljaGFpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVBhcnRpY2lwYW50S2V5Y2hhaW4oXG4gICAgICBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgd2ViYXV0aG5JbmZvLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb24sXG4gICAgICBlbnRlcnByaXNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYWRkQmFja3VwS2V5Y2hhaW4oXG4gICAgY29tbW9uS2V5Y2hhaW46IHN0cmluZyxcbiAgICBwcml2YXRlTWF0ZXJpYWw6IEJ1ZmZlcixcbiAgICByZWR1Y2VkUHJpdmF0ZU1hdGVyaWFsOiBCdWZmZXIsXG4gICAgcGFzc3BocmFzZTogc3RyaW5nLFxuICAgIG9yaWdpbmFsUGFzc2NvZGVFbmNyeXB0aW9uQ29kZT86IHN0cmluZyxcbiAgICBlbmNyeXB0aW9uVmVyc2lvbj86IEVuY3J5cHRpb25WZXJzaW9uXG4gICk6IFByb21pc2U8S2V5Y2hhaW4+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVQYXJ0aWNpcGFudEtleWNoYWluKFxuICAgICAgTVBDdjJQYXJ0aWVzRW51bS5CQUNLVVAsXG4gICAgICBjb21tb25LZXljaGFpbixcbiAgICAgIHByaXZhdGVNYXRlcmlhbCxcbiAgICAgIHJlZHVjZWRQcml2YXRlTWF0ZXJpYWwsXG4gICAgICBwYXNzcGhyYXNlLFxuICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZW5jcnlwdGlvblZlcnNpb25cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRCaXRnb0tleWNoYWluKGNvbW1vbktleWNoYWluOiBzdHJpbmcpOiBQcm9taXNlPEtleWNoYWluPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUGFydGljaXBhbnRLZXljaGFpbihNUEN2MlBhcnRpZXNFbnVtLkJJVEdPLCBjb21tb25LZXljaGFpbik7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQxKFxuICAgIGVudGVycHJpc2U6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLnNlbmRLZXlHZW5lcmF0aW9uUm91bmQxQnlTZW5kZXIoS2V5R2VuU2VuZGVyRm9yRW50ZXJwcmlzZSh0aGlzLmJpdGdvLCBlbnRlcnByaXNlKSwgcGF5bG9hZCk7XG4gIH1cblxuICBhc3luYyBzZW5kS2V5R2VuZXJhdGlvblJvdW5kMUJ5U2VuZGVyKFxuICAgIHNlbmRlckZuOiBFZGRzYU1QQ3YyS2V5R2VuU2VuZEZuPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDFSZXNwb25zZT4sXG4gICAgcGF5bG9hZDogRWRkc2FNUEN2MktleUdlblJvdW5kMVJlcXVlc3RcbiAgKTogUHJvbWlzZTxFZGRzYU1QQ3YyS2V5R2VuUm91bmQxUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2VuZGVyRm4oTVBDdjJLZXlHZW5TdGF0ZUVudW1bJ01QQ3YyLVIxJ10sIHBheWxvYWQpO1xuICB9XG5cbiAgYXN5bmMgc2VuZEtleUdlbmVyYXRpb25Sb3VuZDIoXG4gICAgZW50ZXJwcmlzZTogc3RyaW5nLFxuICAgIHBheWxvYWQ6IEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXF1ZXN0XG4gICk6IFByb21pc2U8RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEtleUdlbmVyYXRpb25Sb3VuZDJCeVNlbmRlcihLZXlHZW5TZW5kZXJGb3JFbnRlcnByaXNlKHRoaXMuYml0Z28sIGVudGVycHJpc2UpLCBwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNlbmRLZXlHZW5lcmF0aW9uUm91bmQyQnlTZW5kZXIoXG4gICAgc2VuZGVyRm46IEVkZHNhTVBDdjJLZXlHZW5TZW5kRm48RWRkc2FNUEN2MktleUdlblJvdW5kMlJlc3BvbnNlPixcbiAgICBwYXlsb2FkOiBFZGRzYU1QQ3YyS2V5R2VuUm91bmQyUmVxdWVzdFxuICApOiBQcm9taXNlPEVkZHNhTVBDdjJLZXlHZW5Sb3VuZDJSZXNwb25zZT4ge1xuICAgIHJldHVybiBzZW5kZXJGbihNUEN2MktleUdlblN0YXRlRW51bVsnTVBDdjItUjInXSwgcGF5bG9hZCk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBzaWduIHR4IHJlcXVlc3RcblxuICAvKipcbiAgICogU2lnbnMgdGhlIHRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0KHBhcmFtczogVFNTUGFyYW1zV2l0aFBydik6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgdGhpcy5iaXRnby5zZXRSZXF1ZXN0VHJhY2VyKHBhcmFtcy5yZXFJZCk7XG4gICAgcmV0dXJuIHRoaXMuc2lnblJlcXVlc3RCYXNlKHBhcmFtcywgUmVxdWVzdFR5cGUudHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25zIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBUeFJlcXVlc3R9IHBhcmFtcy50eFJlcXVlc3QgLSB0cmFuc2FjdGlvbiByZXF1ZXN0IG9iamVjdCBvciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnBydiAtIGRlY3J5cHRlZCBwcml2YXRlIGtleVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnJlcUlkIC0gcmVxdWVzdCBpZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUeFJlcXVlc3Q+fSBmdWxseSBzaWduZWQgVHhSZXF1ZXN0XG4gICAqL1xuICBhc3luYyBzaWduVHhSZXF1ZXN0Rm9yTWVzc2FnZShwYXJhbXM6IFRTU1BhcmFtc0Zvck1lc3NhZ2VXaXRoUHJ2KTogUHJvbWlzZTxUeFJlcXVlc3Q+IHtcbiAgICB0aGlzLmJpdGdvLnNldFJlcXVlc3RUcmFjZXIocGFyYW1zLnJlcUlkKTtcbiAgICByZXR1cm4gdGhpcy5zaWduUmVxdWVzdEJhc2UocGFyYW1zLCBSZXF1ZXN0VHlwZS5tZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxsIDMtcm91bmQgRWREU0EgTVBDdjIgKE1QUykgb25saW5lIHNpZ25pbmcgb3JjaGVzdHJhdGlvbi5cbiAgICpcbiAgICogUHJvdG9jb2wgb3ZlcnZpZXc6XG4gICAqICAgV0FTTSBSb3VuZCAwICDihpIgZ2V0Rmlyc3RNZXNzYWdlKCkgICAgICAocHJvZHVjZXMgdXNlck1zZzEpXG4gICAqICAgQVBJICBSb3VuZCAxICDihpIgc2VuZCB1c2VyTXNnMSAvIHJlY3YgYml0Z29Nc2cxXG4gICAqICAgV0FTTSBSb3VuZCAxICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvTXNnMV0pICAocHJvZHVjZXMgdXNlck1zZzIpXG4gICAqICAgQVBJICBSb3VuZCAyICDihpIgc2VuZCB1c2VyTXNnMiAvIHJlY3YgYml0Z29Nc2cyXG4gICAqICAgV0FTTSBSb3VuZCAyICDihpIgaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvTXNnMl0pICAocHJvZHVjZXMgdXNlck1zZzMpXG4gICAqICAgQVBJICBSb3VuZCAzICDihpIgc2VuZCB1c2VyTXNnMyAoV1AgZmluYWxpc2VzOyBubyBCaXRHbyBtc2cgcmV0dXJuZWQgdG8gY2xpZW50KVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaWduUmVxdWVzdEJhc2UoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXNXaXRoUHJ2IHwgVFNTUGFyYW1zRm9yTWVzc2FnZVdpdGhQcnYsXG4gICAgcmVxdWVzdFR5cGU6IFJlcXVlc3RUeXBlXG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgdXNlcktleVNoYXJlID0gQnVmZmVyLmZyb20ocGFyYW1zLnBydiwgJ2Jhc2U2NCcpO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0OiBUeFJlcXVlc3QgPVxuICAgICAgdHlwZW9mIHBhcmFtcy50eFJlcXVlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgID8gYXdhaXQgZ2V0VHhSZXF1ZXN0KHRoaXMuYml0Z28sIHRoaXMud2FsbGV0LmlkKCksIHBhcmFtcy50eFJlcXVlc3QsIHBhcmFtcy5yZXFJZClcbiAgICAgICAgOiBwYXJhbXMudHhSZXF1ZXN0O1xuXG4gICAgbGV0IHR4T3JNZXNzYWdlVG9TaWduO1xuICAgIGxldCBkZXJpdmF0aW9uUGF0aDtcbiAgICBsZXQgYnVmZmVyQ29udGVudDtcbiAgICAvLyBPbmUgZnJlc2ggZWQyNTUxOSBHUEcga2V5IHBhaXIgcGVyIHNpZ25pbmcgc2Vzc2lvbiwgcmV1c2VkIGFjcm9zcyBhbGwgc2lnbmluZyByb3VuZHMuXG4gICAgY29uc3QgdXNlckdwZ0tleSA9IGF3YWl0IGdlbmVyYXRlR1BHS2V5UGFpcignZWQyNTUxOScpO1xuICAgIGNvbnN0IHVzZXJHcGdQcnZLZXkgPSBhd2FpdCBwZ3AucmVhZFByaXZhdGVLZXkoeyBhcm1vcmVkS2V5OiB1c2VyR3BnS2V5LnByaXZhdGVLZXkgfSk7XG4gICAgY29uc3QgYml0Z29HcGdQdWJLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcodHJ1ZSwgcGFyYW1zLnJlcUlkLCB0eFJlcXVlc3QuZW50ZXJwcmlzZUlkLCB0cnVlKTtcbiAgICBhc3NlcnQoYml0Z29HcGdQdWJLZXksICdNaXNzaW5nIEJpdEdvIEdQRyBrZXkgZm9yIE1QQ3YyJyk7XG5cbiAgICBpZiAocmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4KSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyB8fCB0eFJlcXVlc3QudW5zaWduZWRUeHMsICdVbmFibGUgdG8gZmluZCB0cmFuc2FjdGlvbnMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID1cbiAgICAgICAgdHhSZXF1ZXN0LmFwaVZlcnNpb24gPT09ICdmdWxsJyA/IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMhWzBdLnVuc2lnbmVkVHggOiB0eFJlcXVlc3QudW5zaWduZWRUeHMhWzBdO1xuICAgICAgdHhPck1lc3NhZ2VUb1NpZ24gPSB1bnNpZ25lZFR4LnNpZ25hYmxlSGV4O1xuICAgICAgYXNzZXJ0KHR4T3JNZXNzYWdlVG9TaWduLCAnTWlzc2luZyBzaWduYWJsZUhleCBpbiB1bnNpZ25lZFR4Jyk7XG4gICAgICBkZXJpdmF0aW9uUGF0aCA9IHVuc2lnbmVkVHguZGVyaXZhdGlvblBhdGg7XG4gICAgICBidWZmZXJDb250ZW50ID0gQnVmZmVyLmZyb20odHhPck1lc3NhZ2VUb1NpZ24sICdoZXgnKTtcbiAgICAgIGF3YWl0IHRoaXMuYmFzZUNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiB1bnNpZ25lZFR4LnNlcmlhbGl6ZWRUeEhleCA/PyB0eE9yTWVzc2FnZVRvU2lnbiB9LFxuICAgICAgICB0eFBhcmFtczogcGFyYW1zLnR4UGFyYW1zIHx8IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgd2FsbGV0OiB0aGlzLndhbGxldCxcbiAgICAgICAgd2FsbGV0VHlwZTogdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlKCksXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RUeXBlID09PSBSZXF1ZXN0VHlwZS5tZXNzYWdlKSB7XG4gICAgICBhc3NlcnQodHhSZXF1ZXN0Lm1lc3NhZ2VzICYmIHR4UmVxdWVzdC5tZXNzYWdlcy5sZW5ndGggPiAwLCAnVW5hYmxlIHRvIGZpbmQgbWVzc2FnZXMgaW4gdHhSZXF1ZXN0Jyk7XG4gICAgICB0eE9yTWVzc2FnZVRvU2lnbiA9IHR4UmVxdWVzdC5tZXNzYWdlc1swXS5tZXNzYWdlRW5jb2RlZDtcbiAgICAgIGFzc2VydCh0eE9yTWVzc2FnZVRvU2lnbiwgJ01pc3NpbmcgbWVzc2FnZUVuY29kZWQgaW4gbWVzc2FnZXNbMF0nKTtcbiAgICAgIGRlcml2YXRpb25QYXRoID0gdHhSZXF1ZXN0Lm1lc3NhZ2VzWzBdLmRlcml2YXRpb25QYXRoIHx8ICdtLzAnO1xuICAgICAgYnVmZmVyQ29udGVudCA9IEJ1ZmZlci5mcm9tKHR4T3JNZXNzYWdlVG9TaWduLCAnaGV4Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByZXF1ZXN0IHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyDilIDilIAgV0FTTSBSb3VuZCAwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIGNvbnN0IHBhcnR5SWQgPSBwYXJhbXMubXBjdjJQYXJ0eUlkID8/IE1QQ3YyUGFydGllc0VudW0uVVNFUjtcbiAgICBjb25zdCBzaWduZXJTaGFyZVR5cGUgPSBwYXJ0eUlkID09PSBNUEN2MlBhcnRpZXNFbnVtLlVTRVIgPyBTaWduYXR1cmVTaGFyZVR5cGUuVVNFUiA6IFNpZ25hdHVyZVNoYXJlVHlwZS5CQUNLVVA7XG4gICAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0cocGFydHlJZCk7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgYnVmZmVyQ29udGVudCwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXksIHBhcnR5SWQpO1xuICAgIGxldCBsYXRlc3RUeFJlcXVlc3QgPSBhd2FpdCBzZW5kU2lnbmF0dXJlU2hhcmVWMihcbiAgICAgIHRoaXMuYml0Z28sXG4gICAgICB0eFJlcXVlc3Qud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3QudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDFdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDEnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlczEgPVxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4XG4gICAgICAgID8gbGF0ZXN0VHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyFbMF0uc2lnbmF0dXJlU2hhcmVzXG4gICAgICAgIDogbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzIVswXS5zaWduYXR1cmVTaGFyZXM7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlczEsIHNpZ25lclNoYXJlVHlwZSwgJ3JvdW5kMU91dHB1dCcpO1xuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMU91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kT25lLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kT25lLnR5cGUgIT09ICdyb3VuZDFPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzEgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kT25lKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZSwgYml0Z29HcGdQdWJLZXkpO1xuXG4gICAgLy8g4pSA4pSAIFdBU00gUm91bmQgMSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBbdXNlck1zZzJdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMSwgYml0Z29EZXNlcmlhbGl6ZWRNc2cxXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2cyLCAnV0FTTSByb3VuZCAxIHByb2R1Y2VkIG5vIG1lc3NhZ2UnKTtcblxuICAgIC8vIOKUgOKUgCBBUEkgUm91bmQgMiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kVHdvID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFR3byh1c2VyTXNnMiwgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgbGF0ZXN0VHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmRUd29dLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ0tleS5wdWJsaWNLZXksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLndhbGxldC5tdWx0aXNpZ1R5cGVWZXJzaW9uKCksXG4gICAgICBwYXJhbXMucmVxSWRcbiAgICApO1xuXG4gICAgYXNzZXJ0KGxhdGVzdFR4UmVxdWVzdC50cmFuc2FjdGlvbnMgfHwgbGF0ZXN0VHhSZXF1ZXN0Lm1lc3NhZ2VzLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDInKTtcblxuICAgIGNvbnN0IHR4UmVxdWVzdFNpZ25hdHVyZVNoYXJlcyA9XG4gICAgICByZXF1ZXN0VHlwZSA9PT0gUmVxdWVzdFR5cGUudHhcbiAgICAgICAgPyBsYXRlc3RUeFJlcXVlc3QudHJhbnNhY3Rpb25zIVswXS5zaWduYXR1cmVTaGFyZXNcbiAgICAgICAgOiBsYXRlc3RUeFJlcXVlc3QubWVzc2FnZXMhWzBdLnNpZ25hdHVyZVNoYXJlcztcblxuICAgIGNvbnN0IGJpdGdvU2hhcmVSb3VuZFR3byA9IGdldEJpdGdvU2lnbmF0dXJlU2hhcmUodHhSZXF1ZXN0U2lnbmF0dXJlU2hhcmVzLCBzaWduZXJTaGFyZVR5cGUsICdyb3VuZDJPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28gPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDJPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZFR3by5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3by50eXBlICE9PSAncm91bmQyT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cyID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZFR3byhwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRUd28sIGJpdGdvR3BnUHViS2V5KTtcblxuICAgIC8vIOKUgOKUgCBXQVNNIFJvdW5kIDIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgY29uc3QgW3VzZXJNc2czXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzIsIGJpdGdvRGVzZXJpYWxpemVkTXNnMl0pO1xuICAgIGFzc2VydCh1c2VyTXNnMywgJ1dBU00gcm91bmQgMiBwcm9kdWNlZCBubyBtZXNzYWdlJyk7XG5cbiAgICAvLyDilIDilIAgQVBJIFJvdW5kIDMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gTm8gQml0R28gcmVzcG9uc2UgdG8gdmVyaWZ5OyBXUCBmaW5hbGlzZXMgdGhlIHNpZ25pbmcgc2VydmVyLXNpZGVcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMyA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUaHJlZSh1c2VyTXNnMywgdXNlckdwZ1BydktleSwgcGFydHlJZCk7XG4gICAgY29uc3Qgcm91bmQzVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0LndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLFxuICAgICAgW3NpZ25hdHVyZVNoYXJlUm91bmQzXSxcbiAgICAgIHJlcXVlc3RUeXBlLFxuICAgICAgdGhpcy5iYXNlQ29pbi5nZXRNUENBbGdvcml0aG0oKSxcbiAgICAgIHVzZXJHcGdLZXkucHVibGljS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcGFyYW1zLnJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQocm91bmQzVHhSZXF1ZXN0Py50eFJlcXVlc3RJZCA9PT0gdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCAnSW52YWxpZCB0eFJlcXVlc3Qgb2JqZWN0IGFmdGVyIHJvdW5kIDMnKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdC53YWxsZXRJZCwgdHhSZXF1ZXN0LnR4UmVxdWVzdElkLCByZXF1ZXN0VHlwZSwgcGFyYW1zLnJlcUlkKTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICAvLyAjcmVnaW9uIGV4dGVybmFsIHNpZ25lclxuXG4gIC8vICNyZWdpb24gUm91bmQxU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kMVNoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHBydjogc3RyaW5nO1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRQcnY/OiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMTogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gICAgdXNlckdwZ1B1YktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHBydiwgd2FsbGV0UGFzc3BocmFzZSwgdHhSZXF1ZXN0LCBlbmNyeXB0ZWRQcnYgfSA9IHBhcmFtcztcbiAgICBjb25zdCB7IHNpZ25hYmxlSGV4LCBkZXJpdmF0aW9uUGF0aCB9ID0gdGhpcy5nZXRTaWduYWJsZUhleEFuZERlcml2YXRpb25QYXRoKFxuICAgICAgdHhSZXF1ZXN0LFxuICAgICAgJ1VuYWJsZSB0byBmaW5kIHRyYW5zYWN0aW9ucyBpbiB0eFJlcXVlc3QnXG4gICAgKTtcbiAgICBjb25zdCBhZGF0YSA9IGAke3NpZ25hYmxlSGV4fToke2Rlcml2YXRpb25QYXRofWA7XG5cbiAgICBjb25zdCB1c2VyS2V5U2hhcmUgPSBCdWZmZXIuZnJvbShwcnYsICdiYXNlNjQnKTtcbiAgICBjb25zdCB1c2VyR3BnS2V5ID0gYXdhaXQgZ2VuZXJhdGVHUEdLZXlQYWlyKCdlZDI1NTE5Jyk7XG4gICAgY29uc3QgdXNlckdwZ1BydktleSA9IGF3YWl0IHBncC5yZWFkUHJpdmF0ZUtleSh7IGFybW9yZWRLZXk6IHVzZXJHcGdLZXkucHJpdmF0ZUtleSB9KTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5pbml0RHNnKHVzZXJLZXlTaGFyZSwgQnVmZmVyLmZyb20oc2lnbmFibGVIZXgsICdoZXgnKSwgZGVyaXZhdGlvblBhdGgsIE1QQ3YyUGFydGllc0VudW0uQklUR08pO1xuICAgIGNvbnN0IHVzZXJNc2cxID0gdXNlckRzZy5nZXRGaXJzdE1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMSA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRPbmUodXNlck1zZzEsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzEucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuICAgIGNvbnN0IHVzZXJHcGdQdWJLZXkgPSB1c2VyR3BnS2V5LnB1YmxpY0tleTtcblxuICAgIGNvbnN0IHVzZVYyID0gZW5jcnlwdGVkUHJ2ICE9PSB1bmRlZmluZWQgJiYgaXNWMkVudmVsb3BlKGVuY3J5cHRlZFBydik7XG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5ID0gYXdhaXQgc2Vzc2lvbi5lbmNyeXB0KFxuICAgICAgICAgIHVzZXJHcGdLZXkucHJpdmF0ZUtleSxcbiAgICAgICAgICBgJHtFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1VTRVJfR1BHX0tFWX06JHthZGF0YX1gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXNzaW9uLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5lbmNyeXB0QXN5bmMoe1xuICAgICAgaW5wdXQ6IHNlc3Npb25QYXlsb2FkLFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEV9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuICAgIGNvbnN0IGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHRBc3luYyh7XG4gICAgICBpbnB1dDogdXNlckdwZ0tleS5wcml2YXRlS2V5LFxuICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICBhZGF0YTogYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVl9OiR7YWRhdGF9YCxcbiAgICAgIGVuY3J5cHRpb25WZXJzaW9uOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgc2lnbmF0dXJlU2hhcmVSb3VuZDEsIHVzZXJHcGdQdWJLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXkgfTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG5cbiAgLy8gI3JlZ2lvbiBSb3VuZDJTaGFyZVxuICBhc3luYyBjcmVhdGVPZmZsaW5lUm91bmQyU2hhcmUocGFyYW1zOiB7XG4gICAgdHhSZXF1ZXN0OiBUeFJlcXVlc3Q7XG4gICAgd2FsbGV0UGFzc3BocmFzZTogc3RyaW5nO1xuICAgIGJpdGdvUHVibGljR3BnS2V5OiBzdHJpbmc7XG4gICAgZW5jcnlwdGVkVXNlckdwZ1BydktleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgfSk6IFByb21pc2U8e1xuICAgIHNpZ25hdHVyZVNoYXJlUm91bmQyOiBTaWduYXR1cmVTaGFyZVJlY29yZDtcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMVNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDEgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRPbmUgPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDFPdXRwdXQnKTtcbiAgICBjb25zdCBwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUgPSBkZWNvZGVXaXRoQ29kZWMoXG4gICAgICBFZGRzYU1QQ3YyU2lnbmF0dXJlU2hhcmVSb3VuZDFPdXRwdXQsXG4gICAgICBKU09OLnBhcnNlKGJpdGdvU2hhcmVSb3VuZE9uZS5zaGFyZSksXG4gICAgICAnVW5leHBlY3RlZCBzaWduYXR1cmUgc2hhcmUgcmVzcG9uc2UuIFVuYWJsZSB0byBwYXJzZSBkYXRhLidcbiAgICApO1xuXG4gICAgaWYgKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZE9uZS50eXBlICE9PSAncm91bmQxT3V0cHV0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29EZXNlcmlhbGl6ZWRNc2cxID0gYXdhaXQgdmVyaWZ5UGVlck1lc3NhZ2VSb3VuZE9uZShwYXJzZWRCaXRHb1RvVXNlclNpZ1NoYXJlUm91bmRPbmUsIGJpdGdvR3BnS2V5KTtcblxuICAgIHRoaXMudmFsaWRhdGVBZGF0YShhZGF0YSwgZW5jcnlwdGVkUm91bmQxU2Vzc2lvbiwgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDFfU1RBVEUpO1xuXG4gICAgbGV0IGRlY3J5cHRlZFJvdW5kMVNlc3Npb246IHN0cmluZztcbiAgICBpZiAodXNlVjIpIHtcbiAgICAgIGRlY3J5cHRlZFJvdW5kMVNlc3Npb24gPSBhd2FpdCB0aGlzLmJpdGdvLmRlY3J5cHRBc3luYyh7XG4gICAgICAgIGlucHV0OiBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgICBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMVNlc3Npb24sXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBkc2dTZXNzaW9uLCB1c2VyTXNnUGF5bG9hZCB9ID0gSlNPTi5wYXJzZShkZWNyeXB0ZWRSb3VuZDFTZXNzaW9uKSBhcyB7XG4gICAgICBkc2dTZXNzaW9uOiBzdHJpbmc7XG4gICAgICB1c2VyTXNnUGF5bG9hZDogc3RyaW5nO1xuICAgIH07XG5cbiAgICBjb25zdCB1c2VyRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLlVTRVIpO1xuICAgIGF3YWl0IHVzZXJEc2cucmVzdG9yZVNlc3Npb24oZHNnU2Vzc2lvbik7XG4gICAgY29uc3QgdXNlck1zZzE6IE1QU1R5cGVzLkRlc2VyaWFsaXplZE1lc3NhZ2UgPSB7XG4gICAgICBmcm9tOiBNUEN2MlBhcnRpZXNFbnVtLlVTRVIsXG4gICAgICBwYXlsb2FkOiBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh1c2VyTXNnUGF5bG9hZCwgJ2Jhc2U2NCcpKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW3VzZXJNc2cyXSA9IHVzZXJEc2cuaGFuZGxlSW5jb21pbmdNZXNzYWdlcyhbdXNlck1zZzEsIGJpdGdvRGVzZXJpYWxpemVkTXNnMV0pO1xuICAgIGFzc2VydCh1c2VyTXNnMiwgJ0RTRyBoYW5kbGVJbmNvbWluZ01lc3NhZ2VzIHByb2R1Y2VkIG5vIHJvdW5kLTIgb3V0cHV0Jyk7XG5cbiAgICBjb25zdCBzaWduYXR1cmVTaGFyZVJvdW5kMiA9IGF3YWl0IGdldFNpZ25hdHVyZVNoYXJlUm91bmRUd28odXNlck1zZzIsIHVzZXJHcGdQcnZLZXkpO1xuICAgIGNvbnN0IHNlc3Npb25QYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZHNnU2Vzc2lvbjogdXNlckRzZy5nZXRTZXNzaW9uKCksXG4gICAgICB1c2VyTXNnUGF5bG9hZDogQnVmZmVyLmZyb20odXNlck1zZzIucGF5bG9hZCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIH0pO1xuXG4gICAgaWYgKHVzZVYyKSB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgdGhpcy5iaXRnby5jcmVhdGVFbmNyeXB0aW9uU2Vzc2lvbih3YWxsZXRQYXNzcGhyYXNlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gPSBhd2FpdCBzZXNzaW9uLmVuY3J5cHQoXG4gICAgICAgICAgc2Vzc2lvblBheWxvYWQsXG4gICAgICAgICAgYCR7RWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19ST1VORDJfU1RBVEV9OiR7YWRhdGF9YFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4geyBzaWduYXR1cmVTaGFyZVJvdW5kMiwgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiB9O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2Vzc2lvbi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZW5jcnlwdEFzeW5jKHtcbiAgICAgIGlucHV0OiBzZXNzaW9uUGF5bG9hZCxcbiAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgYWRhdGE6IGAke0VkZHNhTVBDdjJVdGlscy5NUFNfRFNHX1NJR05JTkdfUk9VTkQyX1NUQVRFfToke2FkYXRhfWAsXG4gICAgICBlbmNyeXB0aW9uVmVyc2lvbjogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQyLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gUm91bmQzU2hhcmVcbiAgYXN5bmMgY3JlYXRlT2ZmbGluZVJvdW5kM1NoYXJlKHBhcmFtczoge1xuICAgIHR4UmVxdWVzdDogVHhSZXF1ZXN0O1xuICAgIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgICBiaXRnb1B1YmxpY0dwZ0tleTogc3RyaW5nO1xuICAgIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXk6IHN0cmluZztcbiAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBzaWduYXR1cmVTaGFyZVJvdW5kMzogU2lnbmF0dXJlU2hhcmVSZWNvcmQ7XG4gIH0+IHtcbiAgICBjb25zdCB7IHdhbGxldFBhc3NwaHJhc2UsIGVuY3J5cHRlZFVzZXJHcGdQcnZLZXksIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sIGJpdGdvUHVibGljR3BnS2V5LCB0eFJlcXVlc3QgfSA9IHBhcmFtcztcblxuICAgIGNvbnN0IHsgc2lnbmFibGVIZXgsIGRlcml2YXRpb25QYXRoIH0gPSB0aGlzLmdldFNpZ25hYmxlSGV4QW5kRGVyaXZhdGlvblBhdGgoXG4gICAgICB0eFJlcXVlc3QsXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgdHJhbnNhY3Rpb25zIGluIHR4UmVxdWVzdCdcbiAgICApO1xuICAgIGNvbnN0IGFkYXRhID0gYCR7c2lnbmFibGVIZXh9OiR7ZGVyaXZhdGlvblBhdGh9YDtcblxuICAgIGNvbnN0IHVzZVYyID0gaXNWMkVudmVsb3BlKGVuY3J5cHRlZFJvdW5kMlNlc3Npb24pO1xuXG4gICAgY29uc3QgeyBiaXRnb0dwZ0tleSwgdXNlckdwZ1BydktleSB9ID0gYXdhaXQgdGhpcy5nZXRCaXRnb0FuZFVzZXJHcGdLZXlzKFxuICAgICAgYml0Z29QdWJsaWNHcGdLZXksXG4gICAgICBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5LFxuICAgICAgd2FsbGV0UGFzc3BocmFzZSxcbiAgICAgIGFkYXRhLFxuICAgICAgRWRkc2FNUEN2MlV0aWxzLk1QU19EU0dfU0lHTklOR19VU0VSX0dQR19LRVlcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucztcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh0cmFuc2FjdGlvbnMpICYmIHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDEsICd0eFJlcXVlc3QgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHRyYW5zYWN0aW9uJyk7XG4gICAgY29uc3Qgc2lnbmF0dXJlU2hhcmVzID0gdHJhbnNhY3Rpb25zWzBdLnNpZ25hdHVyZVNoYXJlcztcbiAgICBhc3NlcnQoc2lnbmF0dXJlU2hhcmVzLCAnTWlzc2luZyBzaWduYXR1cmUgc2hhcmVzIGluIHJvdW5kIDIgdHhSZXF1ZXN0Jyk7XG5cbiAgICBjb25zdCBiaXRnb1NoYXJlUm91bmRUd28gPSBnZXRCaXRnb1NpZ25hdHVyZVNoYXJlKHNpZ25hdHVyZVNoYXJlcywgU2lnbmF0dXJlU2hhcmVUeXBlLlVTRVIsICdyb3VuZDJPdXRwdXQnKTtcblxuICAgIGNvbnN0IHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3byA9IGRlY29kZVdpdGhDb2RlYyhcbiAgICAgIEVkZHNhTVBDdjJTaWduYXR1cmVTaGFyZVJvdW5kMk91dHB1dCxcbiAgICAgIEpTT04ucGFyc2UoYml0Z29TaGFyZVJvdW5kVHdvLnNoYXJlKSxcbiAgICAgICdVbmV4cGVjdGVkIHNpZ25hdHVyZSBzaGFyZSByZXNwb25zZS4gVW5hYmxlIHRvIHBhcnNlIGRhdGEuJ1xuICAgICk7XG5cbiAgICBpZiAocGFyc2VkQml0R29Ub1VzZXJTaWdTaGFyZVJvdW5kVHdvLnR5cGUgIT09ICdyb3VuZDJPdXRwdXQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgc2lnbmF0dXJlIHNoYXJlIHJlc3BvbnNlLiBVbmFibGUgdG8gcGFyc2UgZGF0YS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBiaXRnb0Rlc2VyaWFsaXplZE1zZzIgPSBhd2FpdCB2ZXJpZnlQZWVyTWVzc2FnZVJvdW5kVHdvKHBhcnNlZEJpdEdvVG9Vc2VyU2lnU2hhcmVSb3VuZFR3bywgYml0Z29HcGdLZXkpO1xuXG4gICAgdGhpcy52YWxpZGF0ZUFkYXRhKGFkYXRhLCBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLCBFZGRzYU1QQ3YyVXRpbHMuTVBTX0RTR19TSUdOSU5HX1JPVU5EMl9TVEFURSk7XG5cbiAgICBsZXQgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbjogc3RyaW5nO1xuICAgIGlmICh1c2VWMikge1xuICAgICAgZGVjcnlwdGVkUm91bmQyU2Vzc2lvbiA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdEFzeW5jKHtcbiAgICAgICAgaW5wdXQ6IGVuY3J5cHRlZFJvdW5kMlNlc3Npb24sXG4gICAgICAgIHBhc3N3b3JkOiB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlY3J5cHRlZFJvdW5kMlNlc3Npb24gPSB0aGlzLmJpdGdvLmRlY3J5cHQoe1xuICAgICAgICBpbnB1dDogZW5jcnlwdGVkUm91bmQyU2Vzc2lvbixcbiAgICAgICAgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRzZ1Nlc3Npb24sIHVzZXJNc2dQYXlsb2FkIH0gPSBKU09OLnBhcnNlKGRlY3J5cHRlZFJvdW5kMlNlc3Npb24pIGFzIHtcbiAgICAgIGRzZ1Nlc3Npb246IHN0cmluZztcbiAgICAgIHVzZXJNc2dQYXlsb2FkOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGNvbnN0IHVzZXJEc2cgPSBuZXcgRWRkc2FNUFNEc2cuRFNHKE1QQ3YyUGFydGllc0VudW0uVVNFUik7XG4gICAgYXdhaXQgdXNlckRzZy5yZXN0b3JlU2Vzc2lvbihkc2dTZXNzaW9uKTtcbiAgICBjb25zdCB1c2VyTXNnMjogTVBTVHlwZXMuRGVzZXJpYWxpemVkTWVzc2FnZSA9IHtcbiAgICAgIGZyb206IE1QQ3YyUGFydGllc0VudW0uVVNFUixcbiAgICAgIHBheWxvYWQ6IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHVzZXJNc2dQYXlsb2FkLCAnYmFzZTY0JykpLFxuICAgIH07XG5cbiAgICBjb25zdCBbdXNlck1zZzNdID0gdXNlckRzZy5oYW5kbGVJbmNvbWluZ01lc3NhZ2VzKFt1c2VyTXNnMiwgYml0Z29EZXNlcmlhbGl6ZWRNc2cyXSk7XG4gICAgYXNzZXJ0KHVzZXJNc2czLCAnRFNHIGhhbmRsZUluY29taW5nTWVzc2FnZXMgcHJvZHVjZWQgbm8gcm91bmQtMyBvdXRwdXQnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZVNoYXJlUm91bmQzID0gYXdhaXQgZ2V0U2lnbmF0dXJlU2hhcmVSb3VuZFRocmVlKHVzZXJNc2czLCB1c2VyR3BnUHJ2S2V5KTtcblxuICAgIHJldHVybiB7IHNpZ25hdHVyZVNoYXJlUm91bmQzIH07XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhc3luYyBzaWduRWRkc2FNUEN2MlRzc1VzaW5nRXh0ZXJuYWxTaWduZXIoXG4gICAgcGFyYW1zOiBUU1NQYXJhbXMgfCBUU1NQYXJhbXNGb3JNZXNzYWdlLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDFHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQxR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQyR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3I6IEN1c3RvbUVkZHNhTVBDdjJTaWduaW5nUm91bmQzR2VuZXJhdGluZ0Z1bmN0aW9uLFxuICAgIHJlcXVlc3RUeXBlOiBSZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlLnR4XG4gICk6IFByb21pc2U8VHhSZXF1ZXN0PiB7XG4gICAgY29uc3QgeyB0eFJlcXVlc3QsIHJlcUlkIH0gPSBwYXJhbXM7XG5cbiAgICAvLyBUT0RPKFdQLTIxNzYpOiBBZGQgc3VwcG9ydCBmb3IgbWVzc2FnZSBzaWduaW5nXG4gICAgYXNzZXJ0KFxuICAgICAgcmVxdWVzdFR5cGUgPT09IFJlcXVlc3RUeXBlLnR4LFxuICAgICAgJ09ubHkgdHJhbnNhY3Rpb24gc2lnbmluZyBpcyBzdXBwb3J0ZWQgZm9yIGV4dGVybmFsIHNpZ25lciwgZ290OiAnICsgcmVxdWVzdFR5cGVcbiAgICApO1xuXG4gICAgbGV0IHR4UmVxdWVzdFJlc29sdmVkOiBUeFJlcXVlc3Q7XG4gICAgaWYgKHR5cGVvZiB0eFJlcXVlc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZCA9IGF3YWl0IGdldFR4UmVxdWVzdCh0aGlzLmJpdGdvLCB0aGlzLndhbGxldC5pZCgpLCB0eFJlcXVlc3QsIHJlcUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQgPSB0eFJlcXVlc3Q7XG4gICAgfVxuXG4gICAgY29uc3QgYml0Z29QdWJsaWNHcGdLZXkgPSBhd2FpdCB0aGlzLnBpY2tCaXRnb1B1YkdwZ0tleUZvclNpZ25pbmcoXG4gICAgICB0cnVlLFxuICAgICAgcmVxSWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC5lbnRlcnByaXNlSWQsXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIGlmICghYml0Z29QdWJsaWNHcGdLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBCaXRHbyBHUEcga2V5IGZvciBNUEN2MicpO1xuICAgIH1cblxuICAgIC8vIHJvdW5kIDFcbiAgICBjb25zdCB7IHNpZ25hdHVyZVNoYXJlUm91bmQxLCB1c2VyR3BnUHViS2V5LCBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLCBlbmNyeXB0ZWRVc2VyR3BnUHJ2S2V5IH0gPVxuICAgICAgYXdhaXQgZXh0ZXJuYWxTaWduZXJFZGRzYU1QQ3YyU2lnbmluZ1JvdW5kMUdlbmVyYXRvcih7IHR4UmVxdWVzdDogdHhSZXF1ZXN0UmVzb2x2ZWQgfSk7XG4gICAgY29uc3Qgcm91bmQxVHhSZXF1ZXN0ID0gYXdhaXQgc2VuZFNpZ25hdHVyZVNoYXJlVjIoXG4gICAgICB0aGlzLmJpdGdvLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQud2FsbGV0SWQsXG4gICAgICB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCxcbiAgICAgIFtzaWduYXR1cmVTaGFyZVJvdW5kMV0sXG4gICAgICByZXF1ZXN0VHlwZSxcbiAgICAgIHRoaXMuYmFzZUNvaW4uZ2V0TVBDQWxnb3JpdGhtKCksXG4gICAgICB1c2VyR3BnUHViS2V5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy53YWxsZXQubXVsdGlzaWdUeXBlVmVyc2lvbigpLFxuICAgICAgcmVxSWRcbiAgICApO1xuXG4gICAgLy8gcm91bmQgMlxuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDIsIGVuY3J5cHRlZFJvdW5kMlNlc3Npb24gfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDJHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDFUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDFTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHJvdW5kMlR4UmVxdWVzdCA9IGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDJdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcbiAgICBhc3NlcnQoXG4gICAgICByb3VuZDJUeFJlcXVlc3QudHJhbnNhY3Rpb25zICYmIHJvdW5kMlR4UmVxdWVzdC50cmFuc2FjdGlvbnNbMF0uc2lnbmF0dXJlU2hhcmVzLFxuICAgICAgJ01pc3Npbmcgc2lnbmF0dXJlIHNoYXJlcyBpbiByb3VuZCAyIHR4UmVxdWVzdCdcbiAgICApO1xuXG4gICAgLy8gcm91bmQgM1xuICAgIGNvbnN0IHsgc2lnbmF0dXJlU2hhcmVSb3VuZDMgfSA9IGF3YWl0IGV4dGVybmFsU2lnbmVyRWRkc2FNUEN2MlNpZ25pbmdSb3VuZDNHZW5lcmF0b3Ioe1xuICAgICAgdHhSZXF1ZXN0OiByb3VuZDJUeFJlcXVlc3QsXG4gICAgICBlbmNyeXB0ZWRSb3VuZDJTZXNzaW9uLFxuICAgICAgZW5jcnlwdGVkVXNlckdwZ1BydktleSxcbiAgICAgIGJpdGdvUHVibGljR3BnS2V5OiBiaXRnb1B1YmxpY0dwZ0tleS5hcm1vcigpLFxuICAgIH0pO1xuICAgIGF3YWl0IHNlbmRTaWduYXR1cmVTaGFyZVYyKFxuICAgICAgdGhpcy5iaXRnbyxcbiAgICAgIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLFxuICAgICAgdHhSZXF1ZXN0UmVzb2x2ZWQudHhSZXF1ZXN0SWQsXG4gICAgICBbc2lnbmF0dXJlU2hhcmVSb3VuZDNdLFxuICAgICAgcmVxdWVzdFR5cGUsXG4gICAgICB0aGlzLmJhc2VDb2luLmdldE1QQ0FsZ29yaXRobSgpLFxuICAgICAgdXNlckdwZ1B1YktleSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMud2FsbGV0Lm11bHRpc2lnVHlwZVZlcnNpb24oKSxcbiAgICAgIHJlcUlkXG4gICAgKTtcblxuICAgIHJldHVybiBzZW5kVHhSZXF1ZXN0KHRoaXMuYml0Z28sIHR4UmVxdWVzdFJlc29sdmVkLndhbGxldElkLCB0eFJlcXVlc3RSZXNvbHZlZC50eFJlcXVlc3RJZCwgcmVxdWVzdFR5cGUsIHJlcUlkKTtcbiAgfVxuICAvLyAjZW5kcmVnaW9uXG59XG5cbi8qKlxuICogRGV0ZWN0IHdoZXRoZXIgYW4gZW5jcnlwdGVkIGtleWNhcmQgY29udGFpbnMgTVBDdjEgc2lnbmluZyBtYXRlcmlhbC5cbiAqXG4gKiBEZWNyeXB0cyB0aGUga2V5Y2FyZCBhbmQgY2hlY2tzIGZvciB0aGUgSlNPTiBzaGFwZSBwcm9kdWNlZCBieSB0aGUgTVBDdjEgVFNTXG4gKiBrZXktZ2VuZXJhdGlvbiBmbG93ICh1U2hhcmUuc2VlZCArIGJpdGdvWVNoYXJlLnUgKyBiYWNrdXBZU2hhcmUudSAvIHVzZXJZU2hhcmUudSkuXG4gKiBSZXR1cm5zIGZhbHNlIGZvciBNUEN2MiBDQk9SIGtleWNhcmRzLCB3cm9uZyBwYXNzd29yZHMsIG9yIGFueSBkZWNyeXB0aW9uIGVycm9yLlxuICpcbiAqIEBwYXJhbSBlbmNyeXB0ZWRLZXlTaGFyZSBlbmNyeXB0ZWQgdXNlciBvciBiYWNrdXAga2V5Y2FyZFxuICogQHBhcmFtIHdhbGxldFBhc3NwaHJhc2UgcGFzc3BocmFzZSB1c2VkIHRvIGVuY3J5cHQgdGhlIGtleWNhcmRcbiAqIEBwYXJhbSBiaXRnbyBvcHRpb25hbCBCaXRHb0Jhc2UgaW5zdGFuY2U7IHdoZW4gcHJvdmlkZWQsIGRlY3J5cHRzIHZpYVxuICogICBiaXRnby5kZWNyeXB0QXN5bmMgKHN1cHBvcnRzIGJvdGggdjEgU0pDTCBhbmQgdjIgQXJnb24yaWQgZW52ZWxvcGVzKTtcbiAqICAgd2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gc2pjbC5kZWNyeXB0ICh2MSBvbmx5KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNFZGRzYU1wY1YxU2lnbmluZ01hdGVyaWFsKFxuICBlbmNyeXB0ZWRLZXlTaGFyZTogc3RyaW5nLFxuICB3YWxsZXRQYXNzcGhyYXNlOiBzdHJpbmcsXG4gIGJpdGdvPzogQml0R29CYXNlXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHJ2ID0gYml0Z29cbiAgICA/IGF3YWl0IGJpdGdvLmRlY3J5cHRBc3luYyh7IGlucHV0OiBlbmNyeXB0ZWRLZXlTaGFyZSwgcGFzc3dvcmQ6IHdhbGxldFBhc3NwaHJhc2UgfSlcbiAgICA6IHNqY2wuZGVjcnlwdCh3YWxsZXRQYXNzcGhyYXNlLCBlbmNyeXB0ZWRLZXlTaGFyZSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtID0gSlNPTi5wYXJzZShwcnYpO1xuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgbT8udVNoYXJlPy5zZWVkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIG0/LmJpdGdvWVNoYXJlPy51ID09PSAnc3RyaW5nJyAmJlxuICAgICAgKHR5cGVvZiBtPy5iYWNrdXBZU2hhcmU/LnUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtPy51c2VyWVNoYXJlPy51ID09PSAnc3RyaW5nJylcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBKU09OIHBhcnNlIGVycm9yIGluZGljYXRlcyBNUEN2MiBDQk9SIGZvcm1hdCwgbm90IEpTT04uXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IEVkRFNBIE1QQ3YyIHJlY292ZXJ5IGtleSBzaGFyZXMgZnJvbSBlbmNyeXB0ZWQgcmVkdWNlZCB1c2VyIGFuZCBiYWNrdXAga2V5cy5cbiAqXG4gKiBUaGUgZW5jcnlwdGVkIGlucHV0cyBhcmUgdGhlIGByZWR1Y2VkRW5jcnlwdGVkUHJ2YCB2YWx1ZXMgc3RvcmVkIG9uIEVkRFNBIE1QQ3YyXG4gKiBrZXkgY2FyZHMuIFRoZXkgZGVjcnlwdCB0byBDQk9SLWVuY29kZWQgcmVkdWNlZCBzaGFyZXMgdGhhdCBjb250YWluIHRoZSBvcGFxdWVcbiAqIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBwbHVzIHRoZSBjb21tb24gcHVibGljIGtleWNoYWluIG1hdGVyaWFsLlxuICpcbiAqIEBwYXJhbSBlbmNyeXB0ZWRVc2VyS2V5IGVuY3J5cHRlZCBFZERTQSBNUEN2MiByZWR1Y2VkIHVzZXIga2V5XG4gKiBAcGFyYW0gZW5jcnlwdGVkQmFja3VwS2V5IGVuY3J5cHRlZCBFZERTQSBNUEN2MiByZWR1Y2VkIGJhY2t1cCBrZXlcbiAqIEBwYXJhbSB3YWxsZXRQYXNzcGhyYXNlIHBhc3N3b3JkIGZvciB1c2VyIGFuZCBiYWNrdXAga2V5c1xuICogQHJldHVybnMgRWREU0EgTVBDdjIgcmVjb3Zlcnkga2V5IHNoYXJlcyBhbmQgY29tbW9uIGtleWNoYWluXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFZGRzYU1wY1YyUmVjb3ZlcnlLZXlTaGFyZXNGcm9tUmVkdWNlZEtleShcbiAgZW5jcnlwdGVkVXNlcktleTogc3RyaW5nLFxuICBlbmNyeXB0ZWRCYWNrdXBLZXk6IHN0cmluZyxcbiAgd2FsbGV0UGFzc3BocmFzZT86IHN0cmluZyxcbiAgYml0Z28/OiBCaXRHb0Jhc2Vcbik6IFByb21pc2U8RWRkc2FNUEN2MlJlY292ZXJ5S2V5U2hhcmVzPiB7XG4gIGNvbnN0IGRlY29kZUtleSA9IGFzeW5jIChlbmNyeXB0ZWRLZXk6IHN0cmluZyk6IFByb21pc2U8TVBTVHlwZXMuRWRkc2FSZWR1Y2VkS2V5U2hhcmU+ID0+IHtcbiAgICBjb25zdCBkZWNyeXB0ZWQgPSBiaXRnb1xuICAgICAgPyBhd2FpdCBiaXRnby5kZWNyeXB0QXN5bmMoeyBpbnB1dDogZW5jcnlwdGVkS2V5LCBwYXNzd29yZDogd2FsbGV0UGFzc3BocmFzZSB9KVxuICAgICAgOiBzamNsLmRlY3J5cHQod2FsbGV0UGFzc3BocmFzZSwgZW5jcnlwdGVkS2V5KTtcbiAgICBsZXQgcmVkdWNlZDogTVBTVHlwZXMuRWRkc2FSZWR1Y2VkS2V5U2hhcmU7XG4gICAgdHJ5IHtcbiAgICAgIHJlZHVjZWQgPSBNUFNUeXBlcy5nZXREZWNvZGVkUmVkdWNlZEtleVNoYXJlKEJ1ZmZlci5mcm9tKGRlY3J5cHRlZCwgJ2Jhc2U2NCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1bmFibGUgdG8gZGVjb2RlIHJlZHVjZWQga2V5IHNoYXJlIGZyb20ga2V5Y2FyZCBtYXRlcmlhbC4gVGhlIGVuY3J5cHRlZCBrZXkgbWF5IGJlIGNvcnJ1cHRlZCwgbWFsZm9ybWVkLCBvciBub3QgYW4gRWREU0EgTVBDdjIgcmVkdWNlZCBrZXkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFyZWR1Y2VkLmtleVNoYXJlPy5sZW5ndGggfHwgIXJlZHVjZWQucHViPy5sZW5ndGggfHwgIXJlZHVjZWQucm9vdENoYWluQ29kZT8ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdFZERTQSBNUEN2MiByZWNvdmVyeTogcmVkdWNlZCBrZXkgc2hhcmUgaXMgbWlzc2luZyBrZXlTaGFyZSwgcHViLCBvciByb290Q2hhaW5Db2RlLiBUaGlzIGtleWNhcmQgbWF5IGJlIHB1YmxpYy1vbmx5IGFuZCBjYW5ub3QgYmUgdXNlZCBmb3IgcmVjb3ZlcnkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZHVjZWQ7XG4gIH07XG5cbiAgY29uc3QgW3VzZXJSZWR1Y2VkLCBiYWNrdXBSZWR1Y2VkXSA9IGF3YWl0IFByb21pc2UuYWxsKFtkZWNvZGVLZXkoZW5jcnlwdGVkVXNlcktleSksIGRlY29kZUtleShlbmNyeXB0ZWRCYWNrdXBLZXkpXSk7XG5cbiAgY29uc3QgdXNlclB1YiA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBiYWNrdXBQdWIgPSBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLnB1YikudG9TdHJpbmcoJ2hleCcpO1xuICBpZiAodXNlclB1YiAhPT0gYmFja3VwUHViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFZERTQSBNUEN2MiByZWNvdmVyeTogdXNlciBhbmQgYmFja3VwIHB1YiBrZXlzIGRvIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgdXNlckNoYWluQ29kZSA9IEJ1ZmZlci5mcm9tKHVzZXJSZWR1Y2VkLnJvb3RDaGFpbkNvZGUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgYmFja3VwQ2hhaW5Db2RlID0gQnVmZmVyLmZyb20oYmFja3VwUmVkdWNlZC5yb290Q2hhaW5Db2RlKS50b1N0cmluZygnaGV4Jyk7XG4gIGlmICh1c2VyQ2hhaW5Db2RlICE9PSBiYWNrdXBDaGFpbkNvZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VkRFNBIE1QQ3YyIHJlY292ZXJ5OiB1c2VyIGFuZCBiYWNrdXAgcm9vdENoYWluQ29kZXMgZG8gbm90IG1hdGNoJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVzZXJLZXlTaGFyZTogQnVmZmVyLmZyb20odXNlclJlZHVjZWQua2V5U2hhcmUpLFxuICAgIGJhY2t1cEtleVNoYXJlOiBCdWZmZXIuZnJvbShiYWNrdXBSZWR1Y2VkLmtleVNoYXJlKSxcbiAgICBjb21tb25LZXlDaGFpbjogdXNlclB1YiArIHVzZXJDaGFpbkNvZGUsXG4gIH07XG59XG5cbi8qKlxuICogU2lnbiBhIG1lc3NhZ2UgZm9yIHJlY292ZXJ5IHVzaW5nIEVkRFNBIE1QQ3YyIChNUFMpIHdpdGggdXNlciBhbmQgYmFja3VwIGtleSBzaGFyZXMuXG4gKlxuICogUnVucyB0aGUgTVBTIERTRyBwcm90b2NvbCBsb2NhbGx5IHRvIHJvdW5kIDMsIHRoZW4gdmVyaWZpZXMgdGhlIHJlc3VsdGluZ1xuICogRWQyNTUxOSBzaWduYXR1cmUgYWdhaW5zdCB0aGUgcHVibGljIGtleSBkZXJpdmVkIGZyb20gdGhlIGNvbW1vbiBrZXljaGFpbi5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSByYXcgYnl0ZXMgdG8gc2lnblxuICogQHBhcmFtIGRlcml2YXRpb25QYXRoIEJJUC0zMi1zdHlsZSBkZXJpdmF0aW9uIHBhdGgsIGUuZy4gYFwibS8wXCJgXG4gKiBAcGFyYW0gdXNlcktleVNoYXJlIG9wYXF1ZSBNUFMgc2lnbmluZyBrZXktc2hhcmUgYnl0ZXMgZm9yIHRoZSB1c2VyIHBhcnR5XG4gKiBAcGFyYW0gYmFja3VwS2V5U2hhcmUgb3BhcXVlIE1QUyBzaWduaW5nIGtleS1zaGFyZSBieXRlcyBmb3IgdGhlIGJhY2t1cCBwYXJ0eVxuICogQHBhcmFtIGNvbW1vbktleUNoYWluIDEyOC1oZXgtY2hhciBzdHJpbmc6IDMyLWJ5dGUgcHViICsgMzItYnl0ZSByb290Q2hhaW5Db2RlXG4gKiBAcmV0dXJucyA2NC1ieXRlIEVkMjU1MTkgc2lnbmF0dXJlIEJ1ZmZlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblJlY292ZXJ5RWRkc2FNUEN2MihcbiAgbWVzc2FnZTogQnVmZmVyLFxuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLFxuICB1c2VyS2V5U2hhcmU6IEJ1ZmZlcixcbiAgYmFja3VwS2V5U2hhcmU6IEJ1ZmZlcixcbiAgY29tbW9uS2V5Q2hhaW46IHN0cmluZ1xuKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgdXNlckRzZyA9IG5ldyBFZGRzYU1QU0RzZy5EU0coTVBDdjJQYXJ0aWVzRW51bS5VU0VSKTtcbiAgY29uc3QgYmFja3VwRHNnID0gbmV3IEVkZHNhTVBTRHNnLkRTRyhNUEN2MlBhcnRpZXNFbnVtLkJBQ0tVUCk7XG5cbiAgY29uc3Qgc2lnbmF0dXJlID0gKGF3YWl0IE1QU1V0aWwuZXhlY3V0ZVRpbGxSb3VuZChcbiAgICAzLFxuICAgIHVzZXJEc2csXG4gICAgYmFja3VwRHNnLFxuICAgIHVzZXJLZXlTaGFyZSxcbiAgICBiYWNrdXBLZXlTaGFyZSxcbiAgICBtZXNzYWdlLFxuICAgIGRlcml2YXRpb25QYXRoXG4gICkpIGFzIEJ1ZmZlcjtcblxuICAvLyBVc2UgRWRkc2EuZGVyaXZlVW5oYXJkZW5lZCAoQklQMzItRWQyNTUxOSksIHdoaWNoIG1hdGNoZXMgd2hhdCBEU0cgdXNlc1xuICAvLyBpbnRlcm5hbGx5IGZvciBwYXRoIGRlcml2YXRpb24gc2luY2Ugd2FzbS1tcHMgMS45LjAuXG4gIGNvbnN0IG1wYyA9IGF3YWl0IGdldEluaXRpYWxpemVkTXBjSW5zdGFuY2UoKTtcbiAgY29uc3QgZGVyaXZlZEtleWNoYWluID0gbXBjLmRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Q2hhaW4sIGRlcml2YXRpb25QYXRoKTtcbiAgY29uc3QgcHVibGljS2V5Qnl0ZXMgPSBCdWZmZXIuZnJvbShkZXJpdmVkS2V5Y2hhaW4uc2xpY2UoMCwgNjQpLCAnaGV4Jyk7XG5cbiAgY29uc3QgdmVyaWZpZWQgPSBlZDI1NTE5LnZlcmlmeShuZXcgVWludDhBcnJheShzaWduYXR1cmUpLCBuZXcgVWludDhBcnJheShtZXNzYWdlKSwgbmV3IFVpbnQ4QXJyYXkocHVibGljS2V5Qnl0ZXMpKTtcbiAgaWYgKCF2ZXJpZmllZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRWREU0EgTVBDdjIgcmVjb3Zlcnkgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIHJldHVybiBzaWduYXR1cmU7XG59XG5cbmV4cG9ydCBjb25zdCBFZGRzYU1QQ3YyUmVjb3ZlcnlGdW5jdGlvbnMgPSB7XG4gIGlzRWRkc2FNcGNWMVNpZ25pbmdNYXRlcmlhbCxcbiAgZ2V0RWRkc2FNcGNWMlJlY292ZXJ5S2V5U2hhcmVzRnJvbVJlZHVjZWRLZXksXG4gIHNpZ25SZWNvdmVyeUVkZHNhTVBDdjIsXG59O1xuIl19