@bitgo-beta/sdk-core 8.2.1-beta.113 → 8.2.1-beta.1131

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 (531) hide show
  1. package/CHANGELOG.md +2760 -0
  2. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +0 -1
  3. package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -1
  4. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +3 -3
  5. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -1
  6. package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +4 -3
  7. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +1 -0
  8. package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -1
  9. package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +41 -29
  10. package/dist/src/account-lib/baseCoin/enum.d.ts +17 -3
  11. package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
  12. package/dist/src/account-lib/baseCoin/enum.js +32 -7
  13. package/dist/src/account-lib/baseCoin/errors.d.ts +3 -0
  14. package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -1
  15. package/dist/src/account-lib/baseCoin/errors.js +8 -2
  16. package/dist/src/account-lib/baseCoin/iface.d.ts +19 -35
  17. package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -1
  18. package/dist/src/account-lib/baseCoin/iface.js +26 -18
  19. package/dist/src/account-lib/baseCoin/index.d.ts +1 -1
  20. package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -1
  21. package/dist/src/account-lib/baseCoin/index.js +8 -5
  22. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts +88 -0
  23. package/dist/src/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  24. package/dist/src/account-lib/baseCoin/messages/baseMessage.js +154 -0
  25. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +67 -0
  26. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  27. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilder.js +144 -0
  28. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +33 -0
  29. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  30. package/dist/src/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +45 -0
  31. package/dist/src/account-lib/baseCoin/messages/iface.d.ts +164 -0
  32. package/dist/src/account-lib/baseCoin/messages/iface.d.ts.map +1 -0
  33. package/dist/src/account-lib/baseCoin/messages/iface.js +3 -0
  34. package/dist/src/account-lib/baseCoin/messages/index.d.ts +6 -0
  35. package/dist/src/account-lib/baseCoin/messages/index.d.ts.map +1 -0
  36. package/dist/src/account-lib/baseCoin/messages/index.js +22 -0
  37. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts +3 -0
  38. package/dist/src/account-lib/baseCoin/messages/simple/index.d.ts.map +1 -0
  39. package/dist/src/account-lib/baseCoin/messages/simple/index.js +19 -0
  40. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts +13 -0
  41. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.d.ts.map +1 -0
  42. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessage.js +28 -0
  43. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts +21 -0
  44. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.d.ts.map +1 -0
  45. package/dist/src/account-lib/baseCoin/messages/simple/simpleMessageBuilder.js +28 -0
  46. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +1 -2
  47. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -1
  48. package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +38 -26
  49. package/dist/src/account-lib/index.js +23 -9
  50. package/dist/src/account-lib/mpc/index.d.ts +1 -1
  51. package/dist/src/account-lib/mpc/index.d.ts.map +1 -1
  52. package/dist/src/account-lib/mpc/index.js +6 -2
  53. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +38 -8
  54. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -1
  55. package/dist/src/account-lib/mpc/tss/ecdsa/ecdsa.js +493 -344
  56. package/dist/src/account-lib/mpc/tss/ecdsa/index.js +23 -9
  57. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts +2 -2
  58. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.d.ts.map +1 -1
  59. package/dist/src/account-lib/mpc/tss/ecdsa/rangeproof.js +3 -3
  60. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts +73 -52
  61. package/dist/src/account-lib/mpc/tss/ecdsa/types.d.ts.map +1 -1
  62. package/dist/src/account-lib/mpc/tss/ecdsa/types.js +1 -1
  63. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts +0 -1
  64. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.d.ts.map +1 -1
  65. package/dist/src/account-lib/mpc/tss/eddsa/eddsa.js +66 -69
  66. package/dist/src/account-lib/mpc/tss/eddsa/index.js +23 -9
  67. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts +1 -1
  68. package/dist/src/account-lib/mpc/tss/eddsa/types.d.ts.map +1 -1
  69. package/dist/src/account-lib/mpc/tss/eddsa/types.js +1 -1
  70. package/dist/src/account-lib/mpc/tss/index.js +23 -9
  71. package/dist/src/account-lib/mpc/util.d.ts +7 -1
  72. package/dist/src/account-lib/mpc/util.d.ts.map +1 -1
  73. package/dist/src/account-lib/mpc/util.js +19 -1
  74. package/dist/src/account-lib/staking/index.js +6 -2
  75. package/dist/src/account-lib/staking/utils.js +3 -3
  76. package/dist/src/account-lib/util/crypto.d.ts +8 -2
  77. package/dist/src/account-lib/util/crypto.d.ts.map +1 -1
  78. package/dist/src/account-lib/util/crypto.js +69 -38
  79. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +2 -1
  80. package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -1
  81. package/dist/src/account-lib/util/ed25519KeyDeriver.js +5 -3
  82. package/dist/src/api/bip32path.js +2 -3
  83. package/dist/src/api/index.js +6 -2
  84. package/dist/src/api/types.d.ts +8 -0
  85. package/dist/src/api/types.d.ts.map +1 -1
  86. package/dist/src/api/types.js +1 -1
  87. package/dist/src/bitgo/address-book/address-book.d.ts +61 -0
  88. package/dist/src/bitgo/address-book/address-book.d.ts.map +1 -0
  89. package/dist/src/bitgo/address-book/address-book.js +139 -0
  90. package/dist/src/bitgo/address-book/index.d.ts +3 -0
  91. package/dist/src/bitgo/address-book/index.d.ts.map +1 -0
  92. package/dist/src/bitgo/address-book/index.js +19 -0
  93. package/dist/src/bitgo/address-book/types.d.ts +170 -0
  94. package/dist/src/bitgo/address-book/types.d.ts.map +1 -0
  95. package/dist/src/bitgo/address-book/types.js +3 -0
  96. package/dist/src/bitgo/baseCoin/baseCoin.d.ts +90 -10
  97. package/dist/src/bitgo/baseCoin/baseCoin.d.ts.map +1 -1
  98. package/dist/src/bitgo/baseCoin/baseCoin.js +142 -16
  99. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts +115 -19
  100. package/dist/src/bitgo/baseCoin/iBaseCoin.d.ts.map +1 -1
  101. package/dist/src/bitgo/baseCoin/iBaseCoin.js +7 -3
  102. package/dist/src/bitgo/baseCoin/index.js +6 -2
  103. package/dist/src/bitgo/bip32util.d.ts +3 -16
  104. package/dist/src/bitgo/bip32util.d.ts.map +1 -1
  105. package/dist/src/bitgo/bip32util.js +4 -56
  106. package/dist/src/bitgo/bitcoin.d.ts +0 -1
  107. package/dist/src/bitgo/bitcoin.d.ts.map +1 -1
  108. package/dist/src/bitgo/bitcoin.js +26 -13
  109. package/dist/src/bitgo/bitgoBase.d.ts +4 -1
  110. package/dist/src/bitgo/bitgoBase.d.ts.map +1 -1
  111. package/dist/src/bitgo/bitgoBase.js +1 -1
  112. package/dist/src/bitgo/coinFactory.d.ts +17 -3
  113. package/dist/src/bitgo/coinFactory.d.ts.map +1 -1
  114. package/dist/src/bitgo/coinFactory.js +26 -3
  115. package/dist/src/bitgo/config.d.ts +116 -20
  116. package/dist/src/bitgo/config.d.ts.map +1 -1
  117. package/dist/src/bitgo/config.js +26 -15
  118. package/dist/src/bitgo/ecdh.d.ts +0 -1
  119. package/dist/src/bitgo/ecdh.d.ts.map +1 -1
  120. package/dist/src/bitgo/ecdh.js +26 -13
  121. package/dist/src/bitgo/enterprise/enterprise.d.ts +3 -13
  122. package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
  123. package/dist/src/bitgo/enterprise/enterprise.js +39 -34
  124. package/dist/src/bitgo/enterprise/enterprises.js +27 -13
  125. package/dist/src/bitgo/enterprise/iEnterprise.d.ts +2 -6
  126. package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
  127. package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
  128. package/dist/src/bitgo/enterprise/index.js +6 -2
  129. package/dist/src/bitgo/environments.d.ts +69 -5
  130. package/dist/src/bitgo/environments.d.ts.map +1 -1
  131. package/dist/src/bitgo/environments.js +183 -32
  132. package/dist/src/bitgo/errors.d.ts +9 -0
  133. package/dist/src/bitgo/errors.d.ts.map +1 -1
  134. package/dist/src/bitgo/errors.js +20 -2
  135. package/dist/src/bitgo/index.d.ts +2 -1
  136. package/dist/src/bitgo/index.d.ts.map +1 -1
  137. package/dist/src/bitgo/index.js +28 -11
  138. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts +3 -3
  139. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.d.ts.map +1 -1
  140. package/dist/src/bitgo/inscriptionBuilder/iInscriptionBuilder.js +1 -1
  141. package/dist/src/bitgo/inscriptionBuilder/index.js +6 -2
  142. package/dist/src/bitgo/internal/index.js +6 -2
  143. package/dist/src/bitgo/internal/internal.js +5 -6
  144. package/dist/src/bitgo/internal/keycard.js +6 -7
  145. package/dist/src/bitgo/keychain/decryptKeychain.d.ts +13 -0
  146. package/dist/src/bitgo/keychain/decryptKeychain.d.ts.map +1 -0
  147. package/dist/src/bitgo/keychain/decryptKeychain.js +35 -0
  148. package/dist/src/bitgo/keychain/iKeychains.d.ts +58 -7
  149. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  150. package/dist/src/bitgo/keychain/iKeychains.js +2 -2
  151. package/dist/src/bitgo/keychain/index.d.ts +1 -0
  152. package/dist/src/bitgo/keychain/index.d.ts.map +1 -1
  153. package/dist/src/bitgo/keychain/index.js +7 -2
  154. package/dist/src/bitgo/keychain/keychains.d.ts +13 -3
  155. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  156. package/dist/src/bitgo/keychain/keychains.js +128 -37
  157. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts +3 -3
  158. package/dist/src/bitgo/keychain/ovcJsonCodec.d.ts.map +1 -1
  159. package/dist/src/bitgo/keychain/ovcJsonCodec.js +23 -9
  160. package/dist/src/bitgo/legacyBitcoin.d.ts +0 -1
  161. package/dist/src/bitgo/legacyBitcoin.d.ts.map +1 -1
  162. package/dist/src/bitgo/legacyBitcoin.js +27 -13
  163. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts +7 -0
  164. package/dist/src/bitgo/lightning/lightningWalletUtil.d.ts.map +1 -0
  165. package/dist/src/bitgo/lightning/lightningWalletUtil.js +25 -0
  166. package/dist/src/bitgo/market/iMarkets.d.ts +2 -2
  167. package/dist/src/bitgo/market/iMarkets.d.ts.map +1 -1
  168. package/dist/src/bitgo/market/index.js +6 -2
  169. package/dist/src/bitgo/market/markets.js +23 -9
  170. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts +1 -0
  171. package/dist/src/bitgo/pendingApproval/iPendingApproval.d.ts.map +1 -1
  172. package/dist/src/bitgo/pendingApproval/iPendingApproval.js +4 -4
  173. package/dist/src/bitgo/pendingApproval/index.js +6 -2
  174. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts +20 -8
  175. package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
  176. package/dist/src/bitgo/pendingApproval/pendingApproval.js +221 -107
  177. package/dist/src/bitgo/pendingApproval/pendingApprovals.js +23 -9
  178. package/dist/src/bitgo/proofs/WalletProofs.d.ts +19 -0
  179. package/dist/src/bitgo/proofs/WalletProofs.d.ts.map +1 -0
  180. package/dist/src/bitgo/proofs/WalletProofs.js +37 -0
  181. package/dist/src/bitgo/proofs/index.d.ts +2 -0
  182. package/dist/src/bitgo/proofs/index.d.ts.map +1 -0
  183. package/dist/src/bitgo/proofs/index.js +6 -0
  184. package/dist/src/bitgo/proofs/types.d.ts +80 -0
  185. package/dist/src/bitgo/proofs/types.d.ts.map +1 -0
  186. package/dist/src/bitgo/proofs/types.js +80 -0
  187. package/dist/src/bitgo/recovery/index.js +6 -2
  188. package/dist/src/bitgo/recovery/initiate.d.ts +8 -1
  189. package/dist/src/bitgo/recovery/initiate.d.ts.map +1 -1
  190. package/dist/src/bitgo/recovery/initiate.js +14 -8
  191. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts +129 -0
  192. package/dist/src/bitgo/staking/goStakingInterfaces.d.ts.map +1 -0
  193. package/dist/src/bitgo/staking/goStakingInterfaces.js +3 -0
  194. package/dist/src/bitgo/staking/goStakingWallet.d.ts +62 -0
  195. package/dist/src/bitgo/staking/goStakingWallet.d.ts.map +1 -0
  196. package/dist/src/bitgo/staking/goStakingWallet.js +143 -0
  197. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts +17 -0
  198. package/dist/src/bitgo/staking/iGoStakingWallet.d.ts.map +1 -0
  199. package/dist/src/bitgo/staking/iGoStakingWallet.js +3 -0
  200. package/dist/src/bitgo/staking/iStakingWallet.d.ts +133 -5
  201. package/dist/src/bitgo/staking/iStakingWallet.d.ts.map +1 -1
  202. package/dist/src/bitgo/staking/iStakingWallet.js +2 -2
  203. package/dist/src/bitgo/staking/index.d.ts +3 -0
  204. package/dist/src/bitgo/staking/index.d.ts.map +1 -1
  205. package/dist/src/bitgo/staking/index.js +9 -2
  206. package/dist/src/bitgo/staking/stakingWallet.d.ts +14 -2
  207. package/dist/src/bitgo/staking/stakingWallet.d.ts.map +1 -1
  208. package/dist/src/bitgo/staking/stakingWallet.js +104 -5
  209. package/dist/src/bitgo/trading/iTradingAccount.d.ts +2 -32
  210. package/dist/src/bitgo/trading/iTradingAccount.d.ts.map +1 -1
  211. package/dist/src/bitgo/trading/iTradingAccount.js +1 -1
  212. package/dist/src/bitgo/trading/index.d.ts +1 -15
  213. package/dist/src/bitgo/trading/index.d.ts.map +1 -1
  214. package/dist/src/bitgo/trading/index.js +7 -17
  215. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts +8 -0
  216. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.d.ts.map +1 -0
  217. package/dist/src/bitgo/trading/network/decrypt-aes-gcm.js +31 -0
  218. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts +8 -0
  219. package/dist/src/bitgo/trading/network/decrypt-rsa.d.ts.map +1 -0
  220. package/dist/src/bitgo/trading/network/decrypt-rsa.js +23 -0
  221. package/dist/src/bitgo/trading/network/decrypt.d.ts +14 -0
  222. package/dist/src/bitgo/trading/network/decrypt.d.ts.map +1 -0
  223. package/dist/src/bitgo/trading/network/decrypt.js +23 -0
  224. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts +8 -0
  225. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.d.ts.map +1 -0
  226. package/dist/src/bitgo/trading/network/encrypt-aes-gcm.js +25 -0
  227. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts +8 -0
  228. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.d.ts.map +1 -0
  229. package/dist/src/bitgo/trading/network/encrypt-rsa-browser.js +65 -0
  230. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts +8 -0
  231. package/dist/src/bitgo/trading/network/encrypt-rsa.d.ts.map +1 -0
  232. package/dist/src/bitgo/trading/network/encrypt-rsa.js +23 -0
  233. package/dist/src/bitgo/trading/network/encrypt.d.ts +37 -0
  234. package/dist/src/bitgo/trading/network/encrypt.d.ts.map +1 -0
  235. package/dist/src/bitgo/trading/network/encrypt.js +58 -0
  236. package/dist/src/bitgo/trading/network/index.d.ts +5 -0
  237. package/dist/src/bitgo/trading/network/index.d.ts.map +1 -0
  238. package/dist/src/bitgo/trading/network/index.js +21 -0
  239. package/dist/src/bitgo/trading/network/network.d.ts +36 -0
  240. package/dist/src/bitgo/trading/network/network.d.ts.map +1 -0
  241. package/dist/src/bitgo/trading/network/network.js +101 -0
  242. package/dist/src/bitgo/trading/network/types.d.ts +277 -0
  243. package/dist/src/bitgo/trading/network/types.d.ts.map +1 -0
  244. package/dist/src/bitgo/trading/network/types.js +3 -0
  245. package/dist/src/bitgo/trading/network/utils.d.ts +20 -0
  246. package/dist/src/bitgo/trading/network/utils.d.ts.map +1 -0
  247. package/dist/src/bitgo/trading/network/utils.js +54 -0
  248. package/dist/src/bitgo/trading/tradingAccount.d.ts +11 -35
  249. package/dist/src/bitgo/trading/tradingAccount.d.ts.map +1 -1
  250. package/dist/src/bitgo/trading/tradingAccount.js +9 -96
  251. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts +27 -0
  252. package/dist/src/bitgo/tss/bitgoPubKeys.d.ts.map +1 -0
  253. package/dist/src/bitgo/tss/bitgoPubKeys.js +61 -0
  254. package/dist/src/bitgo/tss/common.d.ts +37 -5
  255. package/dist/src/bitgo/tss/common.d.ts.map +1 -1
  256. package/dist/src/bitgo/tss/common.js +103 -17
  257. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts +6 -4
  258. package/dist/src/bitgo/tss/ecdsa/ecdsa.d.ts.map +1 -1
  259. package/dist/src/bitgo/tss/ecdsa/ecdsa.js +78 -66
  260. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts +15 -0
  261. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  262. package/dist/src/bitgo/tss/ecdsa/ecdsaMPCv2.js +162 -0
  263. package/dist/src/bitgo/tss/ecdsa/index.d.ts +1 -0
  264. package/dist/src/bitgo/tss/ecdsa/index.d.ts.map +1 -1
  265. package/dist/src/bitgo/tss/ecdsa/index.js +25 -10
  266. package/dist/src/bitgo/tss/ecdsa/types.d.ts +27 -27
  267. package/dist/src/bitgo/tss/ecdsa/types.d.ts.map +1 -1
  268. package/dist/src/bitgo/tss/ecdsa/types.js +3 -3
  269. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts +15 -6
  270. package/dist/src/bitgo/tss/eddsa/eddsa.d.ts.map +1 -1
  271. package/dist/src/bitgo/tss/eddsa/eddsa.js +47 -40
  272. package/dist/src/bitgo/tss/eddsa/index.js +23 -9
  273. package/dist/src/bitgo/tss/eddsa/types.d.ts +4 -4
  274. package/dist/src/bitgo/tss/eddsa/types.d.ts.map +1 -1
  275. package/dist/src/bitgo/tss/index.d.ts +3 -2
  276. package/dist/src/bitgo/tss/index.d.ts.map +1 -1
  277. package/dist/src/bitgo/tss/index.js +26 -10
  278. package/dist/src/bitgo/tss/types.d.ts +3 -3
  279. package/dist/src/bitgo/tss/types.d.ts.map +1 -1
  280. package/dist/src/bitgo/tss/types.js +2 -2
  281. package/dist/src/bitgo/types.d.ts +3 -3
  282. package/dist/src/bitgo/types.d.ts.map +1 -1
  283. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts +11 -0
  284. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -1
  285. package/dist/src/bitgo/utils/abstractUtxoCoinUtil.js +66 -10
  286. package/dist/src/bitgo/utils/codecProps.js +24 -11
  287. package/dist/src/bitgo/utils/decode.d.ts.map +1 -1
  288. package/dist/src/bitgo/utils/decode.js +30 -16
  289. package/dist/src/bitgo/utils/index.d.ts +3 -2
  290. package/dist/src/bitgo/utils/index.d.ts.map +1 -1
  291. package/dist/src/bitgo/utils/index.js +26 -11
  292. package/dist/src/bitgo/utils/messageTypes.d.ts +37 -0
  293. package/dist/src/bitgo/utils/messageTypes.d.ts.map +1 -0
  294. package/dist/src/bitgo/utils/messageTypes.js +14 -0
  295. package/dist/src/bitgo/utils/mpcUtils.d.ts +2 -3
  296. package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
  297. package/dist/src/bitgo/utils/mpcUtils.js +45 -13
  298. package/dist/src/bitgo/utils/notEmpty.d.ts +2 -0
  299. package/dist/src/bitgo/utils/notEmpty.d.ts.map +1 -0
  300. package/dist/src/bitgo/utils/notEmpty.js +7 -0
  301. package/dist/src/bitgo/utils/opengpgUtils.d.ts +11 -9
  302. package/dist/src/bitgo/utils/opengpgUtils.d.ts.map +1 -1
  303. package/dist/src/bitgo/utils/opengpgUtils.js +68 -64
  304. package/dist/src/bitgo/utils/postWithCodec.d.ts.map +1 -1
  305. package/dist/src/bitgo/utils/postWithCodec.js +4 -38
  306. package/dist/src/bitgo/utils/promise-utils.d.ts +1 -1
  307. package/dist/src/bitgo/utils/promise-utils.d.ts.map +1 -1
  308. package/dist/src/bitgo/utils/promise-utils.js +2 -3
  309. package/dist/src/bitgo/utils/transactionUtils.d.ts +9 -0
  310. package/dist/src/bitgo/utils/transactionUtils.d.ts.map +1 -0
  311. package/dist/src/bitgo/utils/transactionUtils.js +29 -0
  312. package/dist/src/bitgo/utils/triple.d.ts +1 -1
  313. package/dist/src/bitgo/utils/triple.d.ts.map +1 -1
  314. package/dist/src/bitgo/utils/triple.js +2 -3
  315. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts +52 -14
  316. package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
  317. package/dist/src/bitgo/utils/tss/baseTSSUtils.js +186 -44
  318. package/dist/src/bitgo/utils/tss/baseTypes.d.ts +158 -37
  319. package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
  320. package/dist/src/bitgo/utils/tss/baseTypes.js +22 -20
  321. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts +23 -0
  322. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.d.ts.map +1 -0
  323. package/dist/src/bitgo/utils/tss/ecdsa/SMC/utils.js +157 -0
  324. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts +28 -0
  325. package/dist/src/bitgo/utils/tss/ecdsa/base.d.ts.map +1 -0
  326. package/dist/src/bitgo/utils/tss/ecdsa/base.js +53 -0
  327. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +17 -50
  328. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
  329. package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +132 -238
  330. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +199 -0
  331. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -0
  332. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +950 -0
  333. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +8 -0
  334. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -0
  335. package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +13 -0
  336. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts +4 -0
  337. package/dist/src/bitgo/utils/tss/ecdsa/index.d.ts.map +1 -1
  338. package/dist/src/bitgo/utils/tss/ecdsa/index.js +10 -2
  339. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts +7 -10
  340. package/dist/src/bitgo/utils/tss/ecdsa/types.d.ts.map +1 -1
  341. package/dist/src/bitgo/utils/tss/ecdsa/types.js +1 -1
  342. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts +107 -0
  343. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.d.ts.map +1 -0
  344. package/dist/src/bitgo/utils/tss/ecdsa/typesMPCv2.js +55 -0
  345. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +22 -8
  346. package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
  347. package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +111 -60
  348. package/dist/src/bitgo/utils/tss/eddsa/index.js +23 -9
  349. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts +7 -7
  350. package/dist/src/bitgo/utils/tss/eddsa/types.d.ts.map +1 -1
  351. package/dist/src/bitgo/utils/tss/index.js +23 -9
  352. package/dist/src/bitgo/utils/txRequest.d.ts +10 -0
  353. package/dist/src/bitgo/utils/txRequest.d.ts.map +1 -0
  354. package/dist/src/bitgo/utils/txRequest.js +47 -0
  355. package/dist/src/bitgo/utils/util.js +24 -10
  356. package/dist/src/bitgo/utils/wallet.d.ts +7 -0
  357. package/dist/src/bitgo/utils/wallet.d.ts.map +1 -0
  358. package/dist/src/bitgo/utils/wallet.js +48 -0
  359. package/dist/src/bitgo/wallet/BuildParams.d.ts +23 -1
  360. package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
  361. package/dist/src/bitgo/wallet/BuildParams.js +40 -12
  362. package/dist/src/bitgo/wallet/iWallet.d.ts +220 -19
  363. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  364. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  365. package/dist/src/bitgo/wallet/iWallets.d.ts +91 -16
  366. package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
  367. package/dist/src/bitgo/wallet/iWallets.js +43 -3
  368. package/dist/src/bitgo/wallet/index.js +6 -2
  369. package/dist/src/bitgo/wallet/wallet.d.ts +198 -25
  370. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  371. package/dist/src/bitgo/wallet/wallet.js +1017 -311
  372. package/dist/src/bitgo/wallet/wallets.d.ts +97 -9
  373. package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
  374. package/dist/src/bitgo/wallet/wallets.js +870 -193
  375. package/dist/src/bitgo/webhook/index.js +6 -2
  376. package/dist/src/bitgo/webhook/webhooks.js +23 -9
  377. package/dist/src/coins/fiataed.d.ts +32 -0
  378. package/dist/src/coins/fiataed.d.ts.map +1 -0
  379. package/dist/src/coins/fiataed.js +61 -0
  380. package/dist/src/coins/fiateur.d.ts +3 -2
  381. package/dist/src/coins/fiateur.d.ts.map +1 -1
  382. package/dist/src/coins/fiateur.js +5 -1
  383. package/dist/src/coins/fiatgbp.d.ts +3 -2
  384. package/dist/src/coins/fiatgbp.d.ts.map +1 -1
  385. package/dist/src/coins/fiatgbp.js +5 -1
  386. package/dist/src/coins/fiatsgd.d.ts +32 -0
  387. package/dist/src/coins/fiatsgd.d.ts.map +1 -0
  388. package/dist/src/coins/fiatsgd.js +61 -0
  389. package/dist/src/coins/fiatusd.d.ts +3 -2
  390. package/dist/src/coins/fiatusd.d.ts.map +1 -1
  391. package/dist/src/coins/fiatusd.js +5 -1
  392. package/dist/src/coins/index.d.ts +4 -0
  393. package/dist/src/coins/index.d.ts.map +1 -1
  394. package/dist/src/coins/index.js +10 -2
  395. package/dist/src/coins/ofc.d.ts +3 -2
  396. package/dist/src/coins/ofc.d.ts.map +1 -1
  397. package/dist/src/coins/ofc.js +6 -2
  398. package/dist/src/coins/ofcToken.js +2 -2
  399. package/dist/src/coins/susd.d.ts +3 -2
  400. package/dist/src/coins/susd.d.ts.map +1 -1
  401. package/dist/src/coins/susd.js +5 -1
  402. package/dist/src/coins/tfiataed.d.ts +11 -0
  403. package/dist/src/coins/tfiataed.d.ts.map +1 -0
  404. package/dist/src/coins/tfiataed.js +17 -0
  405. package/dist/src/coins/tfiatsgd.d.ts +11 -0
  406. package/dist/src/coins/tfiatsgd.d.ts.map +1 -0
  407. package/dist/src/coins/tfiatsgd.js +17 -0
  408. package/dist/src/common.js +27 -13
  409. package/dist/src/index.d.ts +2 -1
  410. package/dist/src/index.d.ts.map +1 -1
  411. package/dist/src/index.js +26 -11
  412. package/dist/src/units.js +5 -6
  413. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts +2 -0
  414. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.d.ts.map +1 -0
  415. package/dist/test/unit/account-lib/baseCoin/messages/baseMessage.js +207 -0
  416. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts +2 -0
  417. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.d.ts.map +1 -0
  418. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilder.js +174 -0
  419. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts +2 -0
  420. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.d.ts.map +1 -0
  421. package/dist/test/unit/account-lib/baseCoin/messages/baseMessageBuilderFactory.js +108 -0
  422. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts +46 -0
  423. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.d.ts.map +1 -0
  424. package/dist/test/unit/account-lib/baseCoin/messages/fixtures.js +69 -0
  425. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts +2 -0
  426. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.d.ts.map +1 -0
  427. package/dist/test/unit/account-lib/mpc/tss/ecdsa/ecdsa.js +233 -0
  428. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts +3 -0
  429. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.d.ts.map +1 -0
  430. package/dist/test/unit/account-lib/mpc/tss/ecdsa/fixtures.js +24 -0
  431. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts +2 -0
  432. package/dist/test/unit/bitgo/trading/network/encrypt.d.ts.map +1 -0
  433. package/dist/test/unit/bitgo/trading/network/encrypt.js +71 -0
  434. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.d.ts +2 -0
  435. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.d.ts.map +1 -0
  436. package/dist/test/unit/bitgo/utils/abstractUtxoCoinUtil.js +45 -0
  437. package/dist/test/unit/bitgo/utils/messageTypes.d.ts +2 -0
  438. package/dist/test/unit/bitgo/utils/messageTypes.d.ts.map +1 -0
  439. package/dist/test/unit/bitgo/utils/messageTypes.js +64 -0
  440. package/dist/test/unit/bitgo/utils/notEmpty.d.ts +2 -0
  441. package/dist/test/unit/bitgo/utils/notEmpty.d.ts.map +1 -0
  442. package/dist/test/unit/bitgo/utils/notEmpty.js +15 -0
  443. package/dist/test/unit/bitgo/utils/postWithCodec.js +32 -38
  444. package/dist/test/unit/bitgo/utils/txRequest.d.ts +2 -0
  445. package/dist/test/unit/bitgo/utils/txRequest.d.ts.map +1 -0
  446. package/dist/test/unit/bitgo/utils/txRequest.js +105 -0
  447. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts +2 -0
  448. package/dist/test/unit/bitgo/wallet/BuildParams.d.ts.map +1 -0
  449. package/dist/test/unit/bitgo/wallet/BuildParams.js +68 -0
  450. package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +27 -18
  451. package/dist/test/unit/units.js +63 -63
  452. package/dist/tsconfig.tsbuildinfo +1 -1
  453. package/package.json +23 -20
  454. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +0 -77
  455. package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +0 -1
  456. package/dist/src/account-lib/baseCoin/blsKeyPair.js +0 -209
  457. package/dist/src/bitgo/lightning/iLightning.d.ts +0 -186
  458. package/dist/src/bitgo/lightning/iLightning.d.ts.map +0 -1
  459. package/dist/src/bitgo/lightning/iLightning.js +0 -106
  460. package/dist/src/bitgo/lightning/index.d.ts +0 -5
  461. package/dist/src/bitgo/lightning/index.d.ts.map +0 -1
  462. package/dist/src/bitgo/lightning/index.js +0 -17
  463. package/dist/src/bitgo/lightning/lightning.d.ts +0 -25
  464. package/dist/src/bitgo/lightning/lightning.d.ts.map +0 -1
  465. package/dist/src/bitgo/lightning/lightning.js +0 -111
  466. package/dist/src/bitgo/lightning/lightningUtils.d.ts +0 -46
  467. package/dist/src/bitgo/lightning/lightningUtils.d.ts.map +0 -1
  468. package/dist/src/bitgo/lightning/lightningUtils.js +0 -133
  469. package/dist/src/bitgo/lightning/lnurlCodec.d.ts +0 -3
  470. package/dist/src/bitgo/lightning/lnurlCodec.d.ts.map +0 -1
  471. package/dist/src/bitgo/lightning/lnurlCodec.js +0 -28
  472. package/dist/src/bitgo/trading/affirmation.d.ts +0 -35
  473. package/dist/src/bitgo/trading/affirmation.d.ts.map +0 -1
  474. package/dist/src/bitgo/trading/affirmation.js +0 -53
  475. package/dist/src/bitgo/trading/affirmations.d.ts +0 -23
  476. package/dist/src/bitgo/trading/affirmations.d.ts.map +0 -1
  477. package/dist/src/bitgo/trading/affirmations.js +0 -45
  478. package/dist/src/bitgo/trading/iAffirmation.d.ts +0 -15
  479. package/dist/src/bitgo/trading/iAffirmation.d.ts.map +0 -1
  480. package/dist/src/bitgo/trading/iAffirmation.js +0 -13
  481. package/dist/src/bitgo/trading/iAffirmations.d.ts +0 -10
  482. package/dist/src/bitgo/trading/iAffirmations.d.ts.map +0 -1
  483. package/dist/src/bitgo/trading/iAffirmations.js +0 -3
  484. package/dist/src/bitgo/trading/iSettlement.d.ts +0 -25
  485. package/dist/src/bitgo/trading/iSettlement.d.ts.map +0 -1
  486. package/dist/src/bitgo/trading/iSettlement.js +0 -17
  487. package/dist/src/bitgo/trading/iSettlements.d.ts +0 -19
  488. package/dist/src/bitgo/trading/iSettlements.d.ts.map +0 -1
  489. package/dist/src/bitgo/trading/iSettlements.js +0 -3
  490. package/dist/src/bitgo/trading/iTradingPartner.d.ts +0 -14
  491. package/dist/src/bitgo/trading/iTradingPartner.d.ts.map +0 -1
  492. package/dist/src/bitgo/trading/iTradingPartner.js +0 -17
  493. package/dist/src/bitgo/trading/iTradingPartners.d.ts +0 -15
  494. package/dist/src/bitgo/trading/iTradingPartners.d.ts.map +0 -1
  495. package/dist/src/bitgo/trading/iTradingPartners.js +0 -9
  496. package/dist/src/bitgo/trading/lock.d.ts +0 -16
  497. package/dist/src/bitgo/trading/lock.d.ts.map +0 -1
  498. package/dist/src/bitgo/trading/lock.js +0 -12
  499. package/dist/src/bitgo/trading/payload.d.ts +0 -22
  500. package/dist/src/bitgo/trading/payload.d.ts.map +0 -1
  501. package/dist/src/bitgo/trading/payload.js +0 -3
  502. package/dist/src/bitgo/trading/settlement.d.ts +0 -16
  503. package/dist/src/bitgo/trading/settlement.d.ts.map +0 -1
  504. package/dist/src/bitgo/trading/settlement.js +0 -21
  505. package/dist/src/bitgo/trading/settlements.d.ts +0 -32
  506. package/dist/src/bitgo/trading/settlements.d.ts.map +0 -1
  507. package/dist/src/bitgo/trading/settlements.js +0 -61
  508. package/dist/src/bitgo/trading/trade.d.ts +0 -29
  509. package/dist/src/bitgo/trading/trade.d.ts.map +0 -1
  510. package/dist/src/bitgo/trading/trade.js +0 -11
  511. package/dist/src/bitgo/trading/tradingPartner.d.ts +0 -26
  512. package/dist/src/bitgo/trading/tradingPartner.d.ts.map +0 -1
  513. package/dist/src/bitgo/trading/tradingPartner.js +0 -31
  514. package/dist/src/bitgo/trading/tradingPartners.d.ts +0 -24
  515. package/dist/src/bitgo/trading/tradingPartners.d.ts.map +0 -1
  516. package/dist/src/bitgo/trading/tradingPartners.js +0 -32
  517. package/dist/src/bitgo/utils/blsUtils.d.ts +0 -52
  518. package/dist/src/bitgo/utils/blsUtils.d.ts.map +0 -1
  519. package/dist/src/bitgo/utils/blsUtils.js +0 -237
  520. package/dist/src/bitgo/utils/iBlsUtils.d.ts +0 -14
  521. package/dist/src/bitgo/utils/iBlsUtils.d.ts.map +0 -1
  522. package/dist/src/bitgo/utils/iBlsUtils.js +0 -3
  523. package/dist/src/bitgo/wallet/SendTransactionRequest.d.ts +0 -92
  524. package/dist/src/bitgo/wallet/SendTransactionRequest.d.ts.map +0 -1
  525. package/dist/src/bitgo/wallet/SendTransactionRequest.js +0 -41
  526. package/dist/src/openssl/index.d.ts +0 -5
  527. package/dist/src/openssl/index.d.ts.map +0 -1
  528. package/dist/src/openssl/index.js +0 -9
  529. package/dist/test/unit/openssl.d.ts +0 -2
  530. package/dist/test/unit/openssl.d.ts.map +0 -1
  531. package/dist/test/unit/openssl.js +0 -39
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[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);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,27 +15,35 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
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
+ })();
24
35
  Object.defineProperty(exports, "__esModule", { value: true });
25
36
  const paillierBigint = __importStar(require("paillier-bigint"));
26
37
  const bigintCryptoUtils = __importStar(require("bigint-crypto-utils"));
27
- const secp = __importStar(require("@noble/secp256k1"));
38
+ const secp256k1_1 = require("@noble/curves/secp256k1");
28
39
  const crypto_1 = require("crypto");
29
40
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
30
41
  const util_1 = require("../../util");
31
42
  const curves_1 = require("../../curves");
32
- const shamir_1 = __importDefault(require("../../shamir"));
33
43
  const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
34
44
  const _5n = BigInt(5);
45
+ // Size of alpha and mu shares in bytes expected by the implementation of the protocol
46
+ const ALPHAMUSIZE = 768;
35
47
  /**
36
48
  * ECDSA TSS implementation supporting 2:n Threshold
37
49
  */
@@ -42,12 +54,11 @@ class Ecdsa {
42
54
  * @param {number} threshold Signing threshold
43
55
  * @param {number} numShares Number of shares
44
56
  * @param {Buffer} seed optional 64 byte seed to use for key generation
45
- * @param {Boolean} sync optional sync flag, if true then a synchronous version of Paillier key generation is used that does not spawn Worker threads.
57
+ * @param sync optional sync flag, if true then a synchronous version of Paillier key generation is used that does not spawn Worker threads.
46
58
  * @returns {Promise<KeyShare>} Returns the private p-share
47
59
  * and n-shares to be distributed to participants at their corresponding index.
48
60
  */
49
61
  async keyShare(index, threshold, numShares, seed, sync = false) {
50
- var _a, _b;
51
62
  if (!(index > 0 && index <= numShares && threshold <= numShares && threshold === 2)) {
52
63
  throw 'Invalid KeyShare Config';
53
64
  }
@@ -57,7 +68,7 @@ class Ecdsa {
57
68
  let seedWithValidLength = seed;
58
69
  if (seed && seed.length > 64) {
59
70
  // if seed length is greater than 64 bytes, hash seed to 64 bytes.
60
- seedWithValidLength = crypto_1.createHash('sha512').update(seed).digest();
71
+ seedWithValidLength = (0, crypto_1.createHash)('sha512').update(seed).digest();
61
72
  }
62
73
  // Generate additively homomorphic encryption key.
63
74
  let paillierKeyPair;
@@ -65,25 +76,27 @@ class Ecdsa {
65
76
  paillierKeyPair = await paillierBigint.generateRandomKeys(sdk_lib_mpc_1.minModulusBitLength, true);
66
77
  }
67
78
  else {
79
+ // eslint-disable-next-line no-sync
68
80
  paillierKeyPair = paillierBigint.generateRandomKeysSync(sdk_lib_mpc_1.minModulusBitLength, true);
69
81
  }
70
82
  const { publicKey, privateKey } = paillierKeyPair;
71
83
  // Accept a 64 byte seed and create an extended private key from that seed
72
84
  const secretKey = seedWithValidLength && utxo_lib_1.bip32.fromSeed(seedWithValidLength);
73
- const u = (_a = (secretKey && secretKey.privateKey && util_1.bigIntFromU8ABE(new Uint8Array(secretKey.privateKey)))) !== null && _a !== void 0 ? _a : Ecdsa.curve.scalarRandom();
85
+ const u = (secretKey && secretKey.privateKey && (0, util_1.bigIntFromU8ABE)(new Uint8Array(secretKey.privateKey))) ??
86
+ Ecdsa.curve.scalarRandom();
74
87
  const y = Ecdsa.curve.basePointMult(u);
75
- const chaincode = (_b = (secretKey && secretKey.chainCode)) !== null && _b !== void 0 ? _b : crypto_1.randomBytes(32);
88
+ const chaincode = (secretKey && secretKey.chainCode) ?? (0, crypto_1.randomBytes)(32);
76
89
  // Compute secret shares of the private key
77
90
  const { shares: uShares, v } = Ecdsa.shamir.split(u, threshold, numShares);
78
91
  const currentParticipant = {
79
92
  i: index,
80
93
  t: threshold,
81
94
  c: numShares,
82
- l: util_1.bigIntToBufferBE(privateKey.lambda, 192).toString('hex'),
83
- m: util_1.bigIntToBufferBE(privateKey.mu, 192).toString('hex'),
84
- n: util_1.bigIntToBufferBE(publicKey.n, 384).toString('hex'),
85
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
86
- u: util_1.bigIntToBufferBE(uShares[index], 32).toString('hex'),
95
+ l: (0, util_1.bigIntToBufferBE)(privateKey.lambda, 192).toString('hex'),
96
+ m: (0, util_1.bigIntToBufferBE)(privateKey.mu, 192).toString('hex'),
97
+ n: (0, util_1.bigIntToBufferBE)(publicKey.n, 384).toString('hex'),
98
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
99
+ u: (0, util_1.bigIntToBufferBE)(uShares[index], 32).toString('hex'),
87
100
  uu: u.toString(),
88
101
  chaincode: chaincode.toString('hex'),
89
102
  };
@@ -98,9 +111,9 @@ class Ecdsa {
98
111
  i: participantIndex,
99
112
  j: currentParticipant['i'],
100
113
  n: publicKey.n.toString(16),
101
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
102
- v: util_1.bigIntToBufferBE(v[0], 33).toString('hex'),
103
- u: util_1.bigIntToBufferBE(uShares[participantIndex], 32).toString('hex'),
114
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
115
+ v: (0, util_1.bigIntToBufferBE)(v[0], 33).toString('hex'),
116
+ u: (0, util_1.bigIntToBufferBE)(uShares[participantIndex], 32).toString('hex'),
104
117
  chaincode: chaincode.toString('hex'),
105
118
  };
106
119
  }
@@ -117,22 +130,26 @@ class Ecdsa {
117
130
  keyCombine(pShare, nShares) {
118
131
  const allShares = [pShare, ...nShares];
119
132
  // Compute the public key.
120
- const y = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['y'])).reduce(Ecdsa.curve.pointAdd);
133
+ const y = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['y'])).reduce(Ecdsa.curve.pointAdd);
121
134
  // Add secret shares
122
- const x = allShares.map((participant) => sdk_lib_mpc_1.hexToBigInt(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
135
+ const x = allShares.map((participant) => (0, sdk_lib_mpc_1.hexToBigInt)(participant['u'])).reduce(Ecdsa.curve.scalarAdd);
123
136
  // Verify shares.
124
137
  for (const share of nShares) {
125
138
  if (share.v) {
126
139
  try {
127
- Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
140
+ Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
128
141
  }
129
142
  catch (err) {
130
143
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
131
144
  }
132
145
  }
133
146
  }
147
+ // Generate Schnorr proof of knowledge of the discrete log of X = xG.
148
+ const X = Ecdsa.curve.basePointMult(x);
149
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(y, Ecdsa.curve.pointBytes)).digest();
150
+ const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
134
151
  // Chaincode will be used in future when we add support for key derivation for ecdsa
135
- const chaincodes = [pShare, ...nShares].map(({ chaincode }) => util_1.bigIntFromBufferBE(Buffer.from(chaincode, 'hex')));
152
+ const chaincodes = [pShare, ...nShares].map(({ chaincode }) => (0, util_1.bigIntFromBufferBE)(Buffer.from(chaincode, 'hex')));
136
153
  const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % BigInt('0x010000000000000000000000000000000000000000000000000000000000000000') // 2^256
137
154
  );
138
155
  const participants = {
@@ -141,9 +158,10 @@ class Ecdsa {
141
158
  l: pShare.l,
142
159
  m: pShare.m,
143
160
  n: pShare.n,
144
- y: util_1.bigIntToBufferBE(y, 33).toString('hex'),
145
- x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
146
- chaincode: util_1.bigIntToBufferBE(chaincode, 32).toString('hex'),
161
+ y: (0, util_1.bigIntToBufferBE)(y, 33).toString('hex'),
162
+ x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
163
+ schnorrProofX: schnorrProofX,
164
+ chaincode: (0, util_1.bigIntToBufferBE)(chaincode, 32).toString('hex'),
147
165
  },
148
166
  yShares: {},
149
167
  };
@@ -166,17 +184,17 @@ class Ecdsa {
166
184
  * be distributed to participants at their corresponding index.
167
185
  */
168
186
  keyDerive(pShare, nShares, path) {
169
- const yValues = [pShare, ...nShares].map((share) => sdk_lib_mpc_1.hexToBigInt(share.y));
187
+ const yValues = [pShare, ...nShares].map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share.y));
170
188
  const y = yValues.reduce((partial, share) => Ecdsa.curve.pointAdd(partial, share));
171
189
  const u = BigInt(pShare.uu);
172
- let contribChaincode = sdk_lib_mpc_1.hexToBigInt(pShare.chaincode);
173
- const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => sdk_lib_mpc_1.hexToBigInt(chaincode))];
190
+ let contribChaincode = (0, sdk_lib_mpc_1.hexToBigInt)(pShare.chaincode);
191
+ const chaincodes = [contribChaincode, ...nShares.map(({ chaincode }) => (0, sdk_lib_mpc_1.hexToBigInt)(chaincode))];
174
192
  const chaincode = chaincodes.reduce((acc, chaincode) => (acc + chaincode) % sdk_lib_mpc_1.chaincodeBase);
175
193
  // Verify shares.
176
194
  for (const share of nShares) {
177
195
  if (share.v) {
178
196
  try {
179
- Ecdsa.shamir.verify(sdk_lib_mpc_1.hexToBigInt(share.u), [sdk_lib_mpc_1.hexToBigInt(share.y), sdk_lib_mpc_1.hexToBigInt(share.v)], pShare.i);
197
+ Ecdsa.shamir.verify((0, sdk_lib_mpc_1.hexToBigInt)(share.u), [(0, sdk_lib_mpc_1.hexToBigInt)(share.y), (0, sdk_lib_mpc_1.hexToBigInt)(share.v)], pShare.i);
180
198
  }
181
199
  catch (err) {
182
200
  throw new Error(`Could not verify share from participant ${share.j}. Verification error: ${err}`);
@@ -193,15 +211,20 @@ class Ecdsa {
193
211
  // Calculate new u values.
194
212
  const { shares: split_u, v } = Ecdsa.shamir.split(subkey.sk, pShare.t || 2, pShare.c || 3);
195
213
  // Calculate new signing key.
196
- const x = [split_u[pShare.i], ...nShares.map(({ u }) => sdk_lib_mpc_1.hexToBigInt(u))].reduce(Ecdsa.curve.scalarAdd);
214
+ const x = [split_u[pShare.i], ...nShares.map(({ u }) => (0, sdk_lib_mpc_1.hexToBigInt)(u))].reduce(Ecdsa.curve.scalarAdd);
215
+ // Generate Schnorr proof of knowledge of the discrete log of X = xG.
216
+ const X = Ecdsa.curve.basePointMult(x);
217
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(subkey.pk, Ecdsa.curve.pointBytes)).digest();
218
+ const schnorrProofX = sdk_lib_mpc_1.Schnorr.createSchnorrProof(X, x, Ecdsa.curve, proofContext);
197
219
  const P_i = {
198
220
  i: pShare.i,
199
221
  l: pShare.l,
200
222
  m: pShare.m,
201
223
  n: pShare.n,
202
- y: util_1.bigIntToBufferBE(subkey.pk, 33).toString('hex'),
203
- x: util_1.bigIntToBufferBE(x, 32).toString('hex'),
204
- chaincode: util_1.bigIntToBufferBE(subkey.chaincode, 32).toString('hex'),
224
+ y: (0, util_1.bigIntToBufferBE)(subkey.pk, 33).toString('hex'),
225
+ x: (0, util_1.bigIntToBufferBE)(x, 32).toString('hex'),
226
+ schnorrProofX: schnorrProofX,
227
+ chaincode: (0, util_1.bigIntToBufferBE)(subkey.chaincode, 32).toString('hex'),
205
228
  };
206
229
  const shares = {
207
230
  xShare: P_i,
@@ -213,14 +236,36 @@ class Ecdsa {
213
236
  i: P_j.j,
214
237
  j: P_i.i,
215
238
  n: P_i.n,
216
- u: util_1.bigIntToBufferBE(split_u[P_j.j], 32).toString('hex'),
217
- y: util_1.bigIntToBufferBE(contribY, 32).toString('hex'),
218
- v: util_1.bigIntToBufferBE(v[0], 32).toString('hex'),
219
- chaincode: util_1.bigIntToBufferBE(contribChaincode, 32).toString('hex'),
239
+ u: (0, util_1.bigIntToBufferBE)(split_u[P_j.j], 32).toString('hex'),
240
+ y: (0, util_1.bigIntToBufferBE)(contribY, 32).toString('hex'),
241
+ v: (0, util_1.bigIntToBufferBE)(v[0], 32).toString('hex'),
242
+ chaincode: (0, util_1.bigIntToBufferBE)(contribChaincode, 32).toString('hex'),
220
243
  };
221
244
  }
222
245
  return shares;
223
246
  }
247
+ /**
248
+ * Verify Schnorr proof of knowledge of the discrete log of X_i = x_i * G.
249
+ * @param Y The combined public key.
250
+ * @param VSSs The VSS shares received from all participants.
251
+ * @param index The i of X_i.
252
+ * @param proof The schnorr proof.
253
+ * @returns True if it's a valid proof with regards to Y and VSSs.
254
+ */
255
+ verifySchnorrProofX(Y, VSSs, index, proof) {
256
+ if (index < 1 || index > VSSs.length) {
257
+ throw new Error('Invalid value supplied for index');
258
+ }
259
+ // Calculate X_i from public information.
260
+ let X_i = Y;
261
+ VSSs.forEach((VSS) => {
262
+ VSS.forEach((v) => {
263
+ X_i = Ecdsa.curve.pointAdd(X_i, Ecdsa.curve.pointMultiply(v, BigInt(index)));
264
+ });
265
+ });
266
+ const proofContext = (0, crypto_1.createHash)('sha256').update((0, util_1.bigIntToBufferBE)(Y, Ecdsa.curve.pointBytes)).digest();
267
+ return sdk_lib_mpc_1.Schnorr.verifySchnorrProof(X_i, proof, Ecdsa.curve, proofContext);
268
+ }
224
269
  /**
225
270
  * Derives a child common keychain from common keychain
226
271
  *
@@ -234,11 +279,11 @@ class Ecdsa {
234
279
  }
235
280
  const keychain = Buffer.from(commonKeychain, 'hex');
236
281
  const derivedPublicKeychain = Ecdsa.hdTree.publicDerive({
237
- pk: util_1.bigIntFromBufferBE(keychain.slice(0, 33)),
238
- chaincode: util_1.bigIntFromBufferBE(keychain.slice(33)),
282
+ pk: (0, util_1.bigIntFromBufferBE)(keychain.slice(0, 33)),
283
+ chaincode: (0, util_1.bigIntFromBufferBE)(keychain.slice(33)),
239
284
  }, path);
240
- const derivedPk = util_1.bigIntToBufferBE(derivedPublicKeychain.pk, 33).toString('hex');
241
- const derivedChaincode = util_1.bigIntToBufferBE(derivedPublicKeychain.chaincode, 32).toString('hex');
285
+ const derivedPk = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.pk, 33).toString('hex');
286
+ const derivedChaincode = (0, util_1.bigIntToBufferBE)(derivedPublicKeychain.chaincode, 32).toString('hex');
242
287
  return derivedPk + derivedChaincode;
243
288
  }
244
289
  /**
@@ -267,15 +312,15 @@ class Ecdsa {
267
312
  * and k-share to be distributed to other participant signer
268
313
  */
269
314
  async signShare(xShare, yShare) {
270
- const pk = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(xShare.n));
315
+ const pk = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n));
271
316
  const k = Ecdsa.curve.scalarRandom();
272
- const rk = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pk.n);
317
+ const rk = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pk.n);
273
318
  const ck = pk.encrypt(k, rk);
274
319
  const gamma = Ecdsa.curve.scalarRandom();
275
320
  const d = Ecdsa.curve.scalarMult(Ecdsa.curve.scalarSub(BigInt(yShare.j), BigInt(xShare.i)), BigInt(xShare.i));
276
321
  const w = [
277
322
  Ecdsa.curve.scalarMult(BigInt(yShare.j), BigInt(xShare.i)),
278
- sdk_lib_mpc_1.hexToBigInt(xShare['x']),
323
+ (0, sdk_lib_mpc_1.hexToBigInt)(xShare['x']),
279
324
  Ecdsa.curve.scalarInvert(d),
280
325
  ].reduce(Ecdsa.curve.scalarMult);
281
326
  const { ntilde: ntildea, h1: h1a, h2: h2a } = xShare;
@@ -289,27 +334,27 @@ class Ecdsa {
289
334
  h1: h1a,
290
335
  h2: h2a,
291
336
  p: xShare.p,
292
- k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
293
- ck: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
294
- w: util_1.bigIntToBufferBE(w, 32).toString('hex'),
295
- gamma: util_1.bigIntToBufferBE(gamma, 32).toString('hex'),
337
+ k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
338
+ ck: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
339
+ w: (0, util_1.bigIntToBufferBE)(w, 32).toString('hex'),
340
+ gamma: (0, util_1.bigIntToBufferBE)(gamma, 32).toString('hex'),
296
341
  };
297
342
  const { ntilde: ntildeb, h1: h1b, h2: h2b } = yShare;
298
343
  const proof = await sdk_lib_mpc_1.EcdsaRangeProof.prove(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pk, {
299
- ntilde: sdk_lib_mpc_1.hexToBigInt(ntildeb),
300
- h1: sdk_lib_mpc_1.hexToBigInt(h1b),
301
- h2: sdk_lib_mpc_1.hexToBigInt(h2b),
344
+ ntilde: (0, sdk_lib_mpc_1.hexToBigInt)(ntildeb),
345
+ h1: (0, sdk_lib_mpc_1.hexToBigInt)(h1b),
346
+ h2: (0, sdk_lib_mpc_1.hexToBigInt)(h2b),
302
347
  }, ck, k, rk);
303
348
  // create paillier challenge proof based on the other signers challenge
304
349
  // only send sigma if we also send challenge p
305
- const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove(sdk_lib_mpc_1.hexToBigInt(xShare.n), sdk_lib_mpc_1.hexToBigInt(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
350
+ const sigma = sdk_lib_mpc_1.EcdsaPaillierProof.prove((0, sdk_lib_mpc_1.hexToBigInt)(xShare.n), (0, sdk_lib_mpc_1.hexToBigInt)(xShare.l), sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: yShare.p }).p);
306
351
  const proofShare = {
307
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
308
- u: util_1.bigIntToBufferBE(proof.u, 768).toString('hex'),
309
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
310
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
311
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
312
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
352
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
353
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 768).toString('hex'),
354
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
355
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
356
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
357
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
313
358
  };
314
359
  const kShare = {
315
360
  // this share will be sent to the other participant,
@@ -322,7 +367,7 @@ class Ecdsa {
322
367
  h1: h1a,
323
368
  h2: h2a,
324
369
  p: xShare.p,
325
- k: util_1.bigIntToBufferBE(ck, 768).toString('hex'),
370
+ k: (0, util_1.bigIntToBufferBE)(ck, 768).toString('hex'),
326
371
  sigma: sdk_lib_mpc_1.EcdsaTypes.serializePaillierChallengeProofs({ sigma: sigma }).sigma,
327
372
  proof: proofShare,
328
373
  };
@@ -357,17 +402,17 @@ class Ecdsa {
357
402
  throw new Error('Unexpected missing proof on aShareToBeSent');
358
403
  }
359
404
  // the other participants paillier public key
360
- const n = sdk_lib_mpc_1.hexToBigInt(receivedKShare.n);
361
- const pka = util_1.getPaillierPublicKey(n);
405
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.n);
406
+ const pka = (0, util_1.getPaillierPublicKey)(n);
362
407
  // the other participant's range proof challenge
363
- const ntildea = sdk_lib_mpc_1.hexToBigInt(receivedKShare.ntilde);
364
- const h1a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h1);
365
- const h2a = sdk_lib_mpc_1.hexToBigInt(receivedKShare.h2);
408
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.ntilde);
409
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h1);
410
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.h2);
366
411
  // the current participant's range proof challenge
367
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(shareParticipant.ntilde);
368
- const h1b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h1);
369
- const h2b = sdk_lib_mpc_1.hexToBigInt(shareParticipant.h2);
370
- const k = sdk_lib_mpc_1.hexToBigInt(receivedKShare.k);
412
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.ntilde);
413
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h1);
414
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.h2);
415
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.k);
371
416
  // the current participants paillier proof challenge
372
417
  const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shareParticipant.p });
373
418
  // the other signing parties proof to the current participants paillier proof challenge
@@ -382,23 +427,23 @@ class Ecdsa {
382
427
  h1: h1b,
383
428
  h2: h2b,
384
429
  }, {
385
- z: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.z),
386
- u: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.u),
387
- w: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.w),
388
- s: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s),
389
- s1: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s1),
390
- s2: sdk_lib_mpc_1.hexToBigInt(receivedKShare.proof.s2),
430
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.z),
431
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.u),
432
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.w),
433
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s),
434
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s1),
435
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedKShare.proof.s2),
391
436
  }, k)) {
392
437
  throw new Error('Could not verify signing A share proof');
393
438
  }
394
439
  // MtA $k_j, \gamma_i$.
395
440
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
396
- const beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
397
- const g = sdk_lib_mpc_1.hexToBigInt(shareParticipant.gamma);
398
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
441
+ const beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
442
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.gamma);
443
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
399
444
  const cb = pka.encrypt(beta0, rb);
400
445
  const alpha = pka.addition(pka.multiply(k, g), cb);
401
- const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
446
+ const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
402
447
  // Prove $\gamma_i \in Z_{N^2}$.
403
448
  const gx = Ecdsa.curve.basePointMult(g);
404
449
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -407,52 +452,52 @@ class Ecdsa {
407
452
  h2: h2a,
408
453
  }, k, alpha, g, beta0, rb, gx);
409
454
  const gammaProofToBeSent = {
410
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
411
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
412
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
413
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
414
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
415
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
416
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
417
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
418
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
419
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
420
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
421
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
455
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
456
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
457
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
458
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
459
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
460
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
461
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
462
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
463
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
464
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
465
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
466
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
422
467
  };
423
468
  // MtA $k_j, w_i$.
424
469
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
425
- const nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
426
- const w = sdk_lib_mpc_1.hexToBigInt(shareParticipant.w);
427
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
470
+ const nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
471
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(shareParticipant.w);
472
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
428
473
  const cn = pka.encrypt(nu0, rn);
429
474
  const mu = pka.addition(pka.multiply(k, w), cn);
430
- const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
475
+ const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
431
476
  // Prove $\w_i \in Z_{N^2}$.
432
477
  const wx = Ecdsa.curve.basePointMult(w);
433
478
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
434
479
  ntilde: ntildea,
435
480
  h1: h1a,
436
481
  h2: h2a,
437
- }, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
482
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
438
483
  const wProofToBeSent = {
439
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
440
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
441
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
442
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
443
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
444
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
445
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
446
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
447
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
448
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
449
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
450
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
484
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
485
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
486
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
487
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
488
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
489
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
490
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
491
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
492
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
493
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
494
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
495
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
451
496
  };
452
497
  const nToBeSent = signShare.kShare.n;
453
- const ntildeToBeSent = util_1.bigIntToBufferBE(ntildeb, 384).toString('hex');
454
- const h1ToBeSent = util_1.bigIntToBufferBE(h1b, 384).toString('hex');
455
- const h2ToBeSent = util_1.bigIntToBufferBE(h2b, 384).toString('hex');
498
+ const ntildeToBeSent = (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex');
499
+ const h1ToBeSent = (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex');
500
+ const h2ToBeSent = (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex');
456
501
  const kToBeSent = signShare.kShare.k;
457
502
  const proofToBeSent = signShare.kShare.proof;
458
503
  const [iToBeSent, jToBeSent] = [receivedKShare.j, receivedKShare.i];
@@ -497,13 +542,13 @@ class Ecdsa {
497
542
  if (!receivedAShare.wProof) {
498
543
  throw new Error('Unexpected missing wProof on aShareToBeSent');
499
544
  }
500
- const n = sdk_lib_mpc_1.hexToBigInt(receivedAShare.n); // Paillier pub from other signer
545
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.n); // Paillier pub from other signer
501
546
  // current participant public key
502
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.n));
503
- const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ntilde);
504
- const h1a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h1);
505
- const h2a = sdk_lib_mpc_1.hexToBigInt(shares.wShare.h2);
506
- const ck = sdk_lib_mpc_1.hexToBigInt(shares.wShare.ck);
547
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.n));
548
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ntilde);
549
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h1);
550
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.h2);
551
+ const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.ck);
507
552
  const shareParticipantPaillierChallenge = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallenge({ p: shares.wShare.p });
508
553
  const receivedPaillierChallengeProof = sdk_lib_mpc_1.EcdsaTypes.deserializePaillierChallengeProofs({
509
554
  sigma: shares.aShare.sigma,
@@ -517,18 +562,18 @@ class Ecdsa {
517
562
  h1: h1a,
518
563
  h2: h2a,
519
564
  }, {
520
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.z),
521
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.zprm),
522
- t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t),
523
- v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.v),
524
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.w),
525
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s),
526
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s1),
527
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.s2),
528
- t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t1),
529
- t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.t2),
530
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.u),
531
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedAShare.gammaProof.x))) {
565
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.z),
566
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.zprm),
567
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t),
568
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.v),
569
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.w),
570
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s),
571
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s1),
572
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.s2),
573
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t1),
574
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.t2),
575
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.u),
576
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.gammaProof.x))) {
532
577
  throw new Error('could not verify signing share for gamma proof');
533
578
  }
534
579
  // Verify $\w_i \in Z_{N^2}$.
@@ -537,54 +582,54 @@ class Ecdsa {
537
582
  h1: h1a,
538
583
  h2: h2a,
539
584
  }, {
540
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.z),
541
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.zprm),
542
- t: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t),
543
- v: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.v),
544
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.w),
545
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s),
546
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s1),
547
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.s2),
548
- t1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t1),
549
- t2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.t2),
550
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.u),
551
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedAShare.wProof.x))) {
585
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.z),
586
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.zprm),
587
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t),
588
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.v),
589
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.w),
590
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s),
591
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s1),
592
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.s2),
593
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t1),
594
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.t2),
595
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.u),
596
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.wProof.x))) {
552
597
  throw new Error('could not verify share for wProof');
553
598
  }
554
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.wShare.l), sdk_lib_mpc_1.hexToBigInt(shares.wShare.m), pka);
555
- const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.alpha))), 32).toString('hex');
556
- const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedAShare.mu))), // recheck encrypted number
599
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.m), pka);
600
+ const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.alpha))), 32).toString('hex');
601
+ const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.mu))), // recheck encrypted number
557
602
  32).toString('hex');
558
603
  if (!receivedAShare.proof) {
559
604
  throw new Error('Unexpected missing proof on aShareToBeSent');
560
605
  }
561
- const pkb = util_1.getPaillierPublicKey(n);
562
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(receivedAShare.ntilde);
563
- const h1b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h1);
564
- const h2b = sdk_lib_mpc_1.hexToBigInt(receivedAShare.h2);
565
- const k = sdk_lib_mpc_1.hexToBigInt(receivedAShare.k);
606
+ const pkb = (0, util_1.getPaillierPublicKey)(n);
607
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.ntilde);
608
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h1);
609
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.h2);
610
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.k);
566
611
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
567
612
  ntilde: ntildea,
568
613
  h1: h1a,
569
614
  h2: h2a,
570
615
  }, {
571
- z: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.z),
572
- u: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.u),
573
- w: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.w),
574
- s: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s),
575
- s1: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s1),
576
- s2: sdk_lib_mpc_1.hexToBigInt(receivedAShare.proof.s2),
616
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.z),
617
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.u),
618
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.w),
619
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s),
620
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s1),
621
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedAShare.proof.s2),
577
622
  }, k)) {
578
623
  throw new Error('Could not verify signing A share proof');
579
624
  }
580
625
  // MtA $k_j, \gamma_i$.
581
626
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
582
- const gShareBeta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
583
- const g = sdk_lib_mpc_1.hexToBigInt(shares.wShare.gamma);
584
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
627
+ const gShareBeta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
628
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.gamma);
629
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
585
630
  const cb = pkb.encrypt(beta0, rb);
586
631
  const alpha = pkb.addition(pkb.multiply(k, g), cb);
587
- const alphaToBeSent = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
632
+ const alphaToBeSent = (0, util_1.bigIntToBufferBE)(alpha, ALPHAMUSIZE).toString('hex');
588
633
  // Prove $\gamma_i \in Z_{N^2}$.
589
634
  const gx = Ecdsa.curve.basePointMult(g);
590
635
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
@@ -593,47 +638,47 @@ class Ecdsa {
593
638
  h2: h2b,
594
639
  }, k, alpha, g, beta0, rb, gx);
595
640
  const gammaProofToBeSent = {
596
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
597
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
598
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
599
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
600
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
601
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
602
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
603
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
604
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
605
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
606
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
607
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
641
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
642
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
643
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
644
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
645
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
646
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
647
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
648
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
649
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
650
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
651
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
652
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
608
653
  };
609
654
  // MtA $k_j, w_i$.
610
655
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
611
- const gShareNu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
612
- const w = sdk_lib_mpc_1.hexToBigInt(shares.wShare.w);
613
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pkb.n);
656
+ const gShareNu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
657
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(shares.wShare.w);
658
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pkb.n);
614
659
  const cn = pkb.encrypt(nu0, rn);
615
660
  const mu = pkb.addition(pkb.multiply(k, w), cn);
616
- const muToBeSent = util_1.bigIntToBufferBE(mu, 32).toString('hex');
661
+ const muToBeSent = (0, util_1.bigIntToBufferBE)(mu, ALPHAMUSIZE).toString('hex');
617
662
  // Prove $\w_i \in Z_{N^2}$.
618
663
  const wx = Ecdsa.curve.basePointMult(w);
619
664
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pkb, {
620
665
  ntilde: ntildeb,
621
666
  h1: h1b,
622
667
  h2: h2b,
623
- }, k, sdk_lib_mpc_1.hexToBigInt(muToBeSent), w, nu0, rn, wx);
668
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(muToBeSent), w, nu0, rn, wx);
624
669
  const wProofToBeSent = {
625
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
626
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
627
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
628
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
629
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
630
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
631
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
632
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
633
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
634
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
635
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
636
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
670
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
671
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
672
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
673
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
674
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
675
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
676
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
677
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
678
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
679
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
680
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
681
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
637
682
  };
638
683
  const [iToBeSent, jToBeSent] = [receivedAShare.j, receivedAShare.i];
639
684
  return {
@@ -674,29 +719,29 @@ class Ecdsa {
674
719
  if (!receivedMuShare.wProof) {
675
720
  throw new Error('Unexpected missing wProof on aShareToBeSent');
676
721
  }
677
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.n));
678
- const ntildea = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ntilde);
679
- const h1a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h1);
680
- const h2a = sdk_lib_mpc_1.hexToBigInt(shares.bShare.h2);
681
- const ck = sdk_lib_mpc_1.hexToBigInt(shares.bShare.ck);
722
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.n));
723
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ntilde);
724
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h1);
725
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.h2);
726
+ const ck = (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.ck);
682
727
  // Verify $\gamma_i \in Z_{N^2}$.
683
728
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
684
729
  ntilde: ntildea,
685
730
  h1: h1a,
686
731
  h2: h2a,
687
732
  }, {
688
- z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.z),
689
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.zprm),
690
- t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t),
691
- v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.v),
692
- w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.w),
693
- s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s),
694
- s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s1),
695
- s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.s2),
696
- t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t1),
697
- t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.t2),
698
- u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.u),
699
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.gammaProof.x))) {
733
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.z),
734
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.zprm),
735
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t),
736
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.v),
737
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.w),
738
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s),
739
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s1),
740
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.s2),
741
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t1),
742
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.t2),
743
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.u),
744
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.gammaProof.x))) {
700
745
  throw new Error('could not verify signing share for gamma proof');
701
746
  }
702
747
  // Verify $\w_i \in Z_{N^2}$.
@@ -705,25 +750,25 @@ class Ecdsa {
705
750
  h1: h1a,
706
751
  h2: h2a,
707
752
  }, {
708
- z: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.z),
709
- zprm: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.zprm),
710
- t: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t),
711
- v: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.v),
712
- w: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.w),
713
- s: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s),
714
- s1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s1),
715
- s2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.s2),
716
- t1: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t1),
717
- t2: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.t2),
718
- u: sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.u),
719
- }, ck, sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu), sdk_lib_mpc_1.hexToBigInt(receivedMuShare.wProof.x))) {
753
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.z),
754
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.zprm),
755
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t),
756
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.v),
757
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.w),
758
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s),
759
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s1),
760
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.s2),
761
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t1),
762
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.t2),
763
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.u),
764
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu), (0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.wProof.x))) {
720
765
  throw new Error('could not verify share for wProof');
721
766
  }
722
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(shares.bShare.l), sdk_lib_mpc_1.hexToBigInt(shares.bShare.m), pka);
723
- const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.alpha));
724
- const gShareAlpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
725
- const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(receivedMuShare.mu)); // recheck encrypted number
726
- const gShareMu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
767
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.l), (0, sdk_lib_mpc_1.hexToBigInt)(shares.bShare.m), pka);
768
+ const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.alpha));
769
+ const gShareAlpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
770
+ const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(receivedMuShare.mu)); // recheck encrypted number
771
+ const gShareMu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
727
772
  const [iToBeSent, jToBeSent] = [receivedMuShare.j, receivedMuShare.i];
728
773
  return {
729
774
  gShare: {
@@ -788,13 +833,13 @@ class Ecdsa {
788
833
  if (!aShareToBeSent.wProof) {
789
834
  throw new Error('Unexpected missing wProof on aShareToBeSent');
790
835
  }
791
- const pka = util_1.getPaillierPublicKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.n));
836
+ const pka = (0, util_1.getPaillierPublicKey)((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.n));
792
837
  let ntildea, h1a, h2a, ck;
793
838
  if (bShareParticipant.ntilde) {
794
- ntildea = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
795
- h1a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
796
- h2a = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
797
- ck = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ck);
839
+ ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
840
+ h1a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
841
+ h2a = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
842
+ ck = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ck);
798
843
  }
799
844
  // Verify $\gamma_i \in Z_{N^2}$.
800
845
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verifyWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -802,18 +847,18 @@ class Ecdsa {
802
847
  h1: h1a,
803
848
  h2: h2a,
804
849
  }, {
805
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.z),
806
- zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.zprm),
807
- t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t),
808
- v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.v),
809
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.w),
810
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s),
811
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s1),
812
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.s2),
813
- t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t1),
814
- t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.t2),
815
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.u),
816
- }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.gammaProof.x))) {
850
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.z),
851
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.zprm),
852
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t),
853
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.v),
854
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.w),
855
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s),
856
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s1),
857
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.s2),
858
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t1),
859
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.t2),
860
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.u),
861
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.gammaProof.x))) {
817
862
  throw new Error('could not verify signing share for gamma proof');
818
863
  }
819
864
  // Verify $\w_i \in Z_{N^2}$.
@@ -822,27 +867,27 @@ class Ecdsa {
822
867
  h1: h1a,
823
868
  h2: h2a,
824
869
  }, {
825
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.z),
826
- zprm: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.zprm),
827
- t: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t),
828
- v: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.v),
829
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.w),
830
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s),
831
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s1),
832
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.s2),
833
- t1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t1),
834
- t2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.t2),
835
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.u),
836
- }, ck, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.wProof.x))) {
870
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.z),
871
+ zprm: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.zprm),
872
+ t: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t),
873
+ v: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.v),
874
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.w),
875
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s),
876
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s1),
877
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.s2),
878
+ t1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t1),
879
+ t2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.t2),
880
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.u),
881
+ }, ck, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.wProof.x))) {
837
882
  throw new Error('could not verify share for wProof');
838
883
  }
839
- const sk = new paillierBigint.PrivateKey(sdk_lib_mpc_1.hexToBigInt(bShareParticipant.l), sdk_lib_mpc_1.hexToBigInt(bShareParticipant.m), pka);
884
+ const sk = new paillierBigint.PrivateKey((0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.l), (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.m), pka);
840
885
  const gShareParticipant = shareParticipant;
841
886
  const muShareToBeSent = shareToBeSent;
842
- const alpha = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.alpha));
843
- gShareParticipant.alpha = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
844
- const mu = sk.decrypt(sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu)); // recheck encrypted number
845
- gShareParticipant.mu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
887
+ const alpha = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.alpha));
888
+ gShareParticipant.alpha = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(alpha), 32).toString('hex');
889
+ const mu = sk.decrypt((0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu)); // recheck encrypted number
890
+ gShareParticipant.mu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarReduce(mu), 32).toString('hex');
846
891
  const partialShareParticipant = shareParticipant;
847
892
  const partialShareToBeSent = muShareToBeSent;
848
893
  delete partialShareParticipant.l;
@@ -856,37 +901,37 @@ class Ecdsa {
856
901
  if (!aShareToBeSent.proof) {
857
902
  throw new Error('Unexpected missing proof on aShareToBeSent');
858
903
  }
859
- const n = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.n); // Paillier pub from other signer
860
- const pka = util_1.getPaillierPublicKey(n);
861
- const ntildea = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.ntilde);
862
- const h1a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h1);
863
- const h2a = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.h2);
864
- const ntildeb = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.ntilde);
865
- const h1b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h1);
866
- const h2b = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.h2);
867
- const k = sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.k);
904
+ const n = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.n); // Paillier pub from other signer
905
+ const pka = (0, util_1.getPaillierPublicKey)(n);
906
+ const ntildea = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.ntilde);
907
+ const h1a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h1);
908
+ const h2a = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.h2);
909
+ const ntildeb = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.ntilde);
910
+ const h1b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h1);
911
+ const h2b = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.h2);
912
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.k);
868
913
  if (!sdk_lib_mpc_1.EcdsaRangeProof.verify(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
869
914
  ntilde: ntildeb,
870
915
  h1: h1b,
871
916
  h2: h2b,
872
917
  }, {
873
- z: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.z),
874
- u: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.u),
875
- w: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.w),
876
- s: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s),
877
- s1: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s1),
878
- s2: sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.proof.s2),
918
+ z: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.z),
919
+ u: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.u),
920
+ w: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.w),
921
+ s: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s),
922
+ s1: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s1),
923
+ s2: (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.proof.s2),
879
924
  }, k)) {
880
925
  throw new Error('Could not verify signing A share proof');
881
926
  }
882
927
  // MtA $k_j, \gamma_i$.
883
928
  const beta0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
884
- bShareParticipant.beta = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
885
- const g = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.gamma);
886
- const rb = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
929
+ bShareParticipant.beta = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(beta0)), 32).toString('hex');
930
+ const g = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.gamma);
931
+ const rb = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
887
932
  const cb = pka.encrypt(beta0, rb);
888
933
  const alpha = pka.addition(pka.multiply(k, g), cb);
889
- aShareToBeSent.alpha = util_1.bigIntToBufferBE(alpha, 32).toString('hex');
934
+ aShareToBeSent.alpha = (0, util_1.bigIntToBufferBE)(alpha, 32).toString('hex');
890
935
  // Prove $\gamma_i \in Z_{N^2}$.
891
936
  const gx = Ecdsa.curve.basePointMult(g);
892
937
  let proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
@@ -896,49 +941,49 @@ class Ecdsa {
896
941
  }, k, alpha, g, beta0, rb, gx);
897
942
  Object.assign(aShareToBeSent, {
898
943
  gammaProof: {
899
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
900
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
901
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
902
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
903
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
904
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
905
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
906
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
907
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
908
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
909
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
910
- x: util_1.bigIntToBufferBE(gx, 33).toString('hex'),
944
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
945
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
946
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
947
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
948
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
949
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
950
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
951
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
952
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
953
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
954
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
955
+ x: (0, util_1.bigIntToBufferBE)(gx, 33).toString('hex'),
911
956
  },
912
957
  });
913
958
  // MtA $k_j, w_i$.
914
959
  const nu0 = bigintCryptoUtils.randBetween(Ecdsa.curve.order() ** _5n);
915
- shareParticipant.nu = util_1.bigIntToBufferBE(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
916
- const w = sdk_lib_mpc_1.hexToBigInt(bShareParticipant.w);
917
- const rn = await sdk_lib_mpc_1.randomPositiveCoPrimeTo(pka.n);
960
+ shareParticipant.nu = (0, util_1.bigIntToBufferBE)(Ecdsa.curve.scalarNegate(Ecdsa.curve.scalarReduce(nu0)), 32).toString('hex');
961
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(bShareParticipant.w);
962
+ const rn = await (0, sdk_lib_mpc_1.randomPositiveCoPrimeTo)(pka.n);
918
963
  const cn = pka.encrypt(nu0, rn);
919
964
  const mu = pka.addition(pka.multiply(k, w), cn);
920
- shareToBeSent.mu = util_1.bigIntToBufferBE(mu, 32).toString('hex');
965
+ shareToBeSent.mu = (0, util_1.bigIntToBufferBE)(mu, 32).toString('hex');
921
966
  // Prove $\w_i \in Z_{N^2}$.
922
967
  const wx = Ecdsa.curve.basePointMult(w);
923
968
  proof = await sdk_lib_mpc_1.EcdsaRangeProof.proveWithCheck(Ecdsa.curve, sdk_lib_mpc_1.minModulusBitLength, pka, {
924
969
  ntilde: ntildea,
925
970
  h1: h1a,
926
971
  h2: h2a,
927
- }, k, sdk_lib_mpc_1.hexToBigInt(aShareToBeSent.mu), w, nu0, rn, wx);
972
+ }, k, (0, sdk_lib_mpc_1.hexToBigInt)(aShareToBeSent.mu), w, nu0, rn, wx);
928
973
  Object.assign(shareToBeSent, {
929
974
  wProof: {
930
- z: util_1.bigIntToBufferBE(proof.z, 384).toString('hex'),
931
- zprm: util_1.bigIntToBufferBE(proof.zprm, 384).toString('hex'),
932
- t: util_1.bigIntToBufferBE(proof.t, 384).toString('hex'),
933
- v: util_1.bigIntToBufferBE(proof.v, 768).toString('hex'),
934
- w: util_1.bigIntToBufferBE(proof.w, 384).toString('hex'),
935
- s: util_1.bigIntToBufferBE(proof.s, 384).toString('hex'),
936
- s1: util_1.bigIntToBufferBE(proof.s1, 96).toString('hex'),
937
- s2: util_1.bigIntToBufferBE(proof.s2, 480).toString('hex'),
938
- t1: util_1.bigIntToBufferBE(proof.t1, 224).toString('hex'),
939
- t2: util_1.bigIntToBufferBE(proof.t2, 480).toString('hex'),
940
- u: util_1.bigIntToBufferBE(proof.u, 33).toString('hex'),
941
- x: util_1.bigIntToBufferBE(wx, 33).toString('hex'),
975
+ z: (0, util_1.bigIntToBufferBE)(proof.z, 384).toString('hex'),
976
+ zprm: (0, util_1.bigIntToBufferBE)(proof.zprm, 384).toString('hex'),
977
+ t: (0, util_1.bigIntToBufferBE)(proof.t, 384).toString('hex'),
978
+ v: (0, util_1.bigIntToBufferBE)(proof.v, 768).toString('hex'),
979
+ w: (0, util_1.bigIntToBufferBE)(proof.w, 384).toString('hex'),
980
+ s: (0, util_1.bigIntToBufferBE)(proof.s, 384).toString('hex'),
981
+ s1: (0, util_1.bigIntToBufferBE)(proof.s1, 96).toString('hex'),
982
+ s2: (0, util_1.bigIntToBufferBE)(proof.s2, 480).toString('hex'),
983
+ t1: (0, util_1.bigIntToBufferBE)(proof.t1, 224).toString('hex'),
984
+ t2: (0, util_1.bigIntToBufferBE)(proof.t2, 480).toString('hex'),
985
+ u: (0, util_1.bigIntToBufferBE)(proof.u, 33).toString('hex'),
986
+ x: (0, util_1.bigIntToBufferBE)(wx, 33).toString('hex'),
942
987
  },
943
988
  });
944
989
  if (shareParticipant.alpha) {
@@ -958,9 +1003,9 @@ class Ecdsa {
958
1003
  else {
959
1004
  Object.assign(shareToBeSent, {
960
1005
  n: kShare.n,
961
- ntilde: util_1.bigIntToBufferBE(ntildeb, 384).toString('hex'),
962
- h1: util_1.bigIntToBufferBE(h1b, 384).toString('hex'),
963
- h2: util_1.bigIntToBufferBE(h2b, 384).toString('hex'),
1006
+ ntilde: (0, util_1.bigIntToBufferBE)(ntildeb, 384).toString('hex'),
1007
+ h1: (0, util_1.bigIntToBufferBE)(h1b, 384).toString('hex'),
1008
+ h2: (0, util_1.bigIntToBufferBE)(h2b, 384).toString('hex'),
964
1009
  k: kShare.k,
965
1010
  proof: kShare.proof,
966
1011
  });
@@ -998,13 +1043,13 @@ class Ecdsa {
998
1043
  signCombine(shares) {
999
1044
  const gShare = shares.gShare;
1000
1045
  const S = shares.signIndex;
1001
- const gamma = sdk_lib_mpc_1.hexToBigInt(gShare.gamma);
1002
- const alpha = sdk_lib_mpc_1.hexToBigInt(gShare.alpha);
1003
- const beta = sdk_lib_mpc_1.hexToBigInt(gShare.beta);
1004
- const mu = sdk_lib_mpc_1.hexToBigInt(gShare.mu);
1005
- const nu = sdk_lib_mpc_1.hexToBigInt(gShare.nu);
1006
- const k = sdk_lib_mpc_1.hexToBigInt(gShare.k);
1007
- const w = sdk_lib_mpc_1.hexToBigInt(gShare.w);
1046
+ const gamma = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.gamma);
1047
+ const alpha = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.alpha);
1048
+ const beta = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.beta);
1049
+ const mu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.mu);
1050
+ const nu = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.nu);
1051
+ const k = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.k);
1052
+ const w = (0, sdk_lib_mpc_1.hexToBigInt)(gShare.w);
1008
1053
  const delta = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, gamma), Ecdsa.curve.scalarAdd(alpha, beta));
1009
1054
  const omicron = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(k, w), Ecdsa.curve.scalarAdd(mu, nu));
1010
1055
  const Gamma = Ecdsa.curve.basePointMult(gamma);
@@ -1012,16 +1057,16 @@ class Ecdsa {
1012
1057
  oShare: {
1013
1058
  i: gShare.i,
1014
1059
  y: gShare.y,
1015
- k: util_1.bigIntToBufferBE(k, 32).toString('hex'),
1016
- omicron: util_1.bigIntToBufferBE(omicron, 32).toString('hex'),
1017
- delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
1018
- Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
1060
+ k: (0, util_1.bigIntToBufferBE)(k, 32).toString('hex'),
1061
+ omicron: (0, util_1.bigIntToBufferBE)(omicron, 32).toString('hex'),
1062
+ delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
1063
+ Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
1019
1064
  },
1020
1065
  dShare: {
1021
1066
  i: S.i,
1022
1067
  j: gShare.i,
1023
- delta: util_1.bigIntToBufferBE(delta, 32).toString('hex'),
1024
- Gamma: util_1.bigIntToBufferBE(Gamma, 33).toString('hex'),
1068
+ delta: (0, util_1.bigIntToBufferBE)(delta, 32).toString('hex'),
1069
+ Gamma: (0, util_1.bigIntToBufferBE)(Gamma, 33).toString('hex'),
1025
1070
  },
1026
1071
  };
1027
1072
  }
@@ -1031,23 +1076,127 @@ class Ecdsa {
1031
1076
  * @param {OShare} oShare private omicron share of current participant
1032
1077
  * @param {DShare} dShare delta share received from the other participant
1033
1078
  * @param {Hash} hash hashing algorithm implementing Node`s standard crypto hash interface
1034
- * @param {boolean} shouldHash if true, we hash the provided buffer before signing
1035
- * @returns {SShare}
1079
+ * @param shouldHash if true, we hash the provided buffer before signing
1080
+ * @returns {VAShare}
1036
1081
  */
1037
1082
  sign(M, oShare, dShare, hash, shouldHash = true) {
1038
- const m = shouldHash ? (hash || crypto_1.createHash('sha256')).update(M).digest() : M;
1039
- const delta = Ecdsa.curve.scalarAdd(sdk_lib_mpc_1.hexToBigInt(oShare.delta), sdk_lib_mpc_1.hexToBigInt(dShare.delta));
1040
- const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd(sdk_lib_mpc_1.hexToBigInt(oShare.Gamma), sdk_lib_mpc_1.hexToBigInt(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
1041
- const pointR = secp.Point.fromHex(util_1.bigIntToBufferBE(R, 32));
1083
+ const m = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(M).digest() : M;
1084
+ const delta = Ecdsa.curve.scalarAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.delta), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.delta));
1085
+ const R = Ecdsa.curve.pointMultiply(Ecdsa.curve.pointAdd((0, sdk_lib_mpc_1.hexToBigInt)(oShare.Gamma), (0, sdk_lib_mpc_1.hexToBigInt)(dShare.Gamma)), Ecdsa.curve.scalarInvert(delta));
1086
+ const pointR = secp256k1_1.secp256k1.ProjectivePoint.fromHex((0, util_1.bigIntToBufferBE)(R, 32));
1042
1087
  const r = pointR.x;
1043
- const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult(util_1.bigIntFromU8ABE(m), sdk_lib_mpc_1.hexToBigInt(oShare.k)), Ecdsa.curve.scalarMult(r, sdk_lib_mpc_1.hexToBigInt(oShare.omicron)));
1088
+ const s = Ecdsa.curve.scalarAdd(Ecdsa.curve.scalarMult((0, util_1.bigIntFromU8ABE)(m), (0, sdk_lib_mpc_1.hexToBigInt)(oShare.k)), Ecdsa.curve.scalarMult(r, (0, sdk_lib_mpc_1.hexToBigInt)(oShare.omicron)));
1089
+ const l = Ecdsa.curve.scalarRandom();
1090
+ const rho = Ecdsa.curve.scalarRandom();
1091
+ const V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointMultiply(R, s), Ecdsa.curve.basePointMult(l));
1092
+ const A = Ecdsa.curve.basePointMult(rho);
1093
+ const comDecom_V_A = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(V, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(A, Ecdsa.curve.pointBytes)]));
1044
1094
  return {
1045
1095
  i: oShare.i,
1046
1096
  y: oShare.y,
1047
1097
  R: pointR.toHex(true),
1048
- s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
1098
+ s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
1099
+ m: m,
1100
+ l: l,
1101
+ rho: rho,
1102
+ V: V,
1103
+ A: A,
1104
+ comDecomVA: comDecom_V_A,
1049
1105
  };
1050
1106
  }
1107
+ /**
1108
+ * Generate proofs of V_i and A_i values.
1109
+ * @param {Buffer} M Message to commit to as part of the context of the proof.
1110
+ * This doesn't need to be the same message that was signed in the sign function above.
1111
+ * But it should be the same for all participants for the purpose of providing proof context.
1112
+ * @param {VAShare} vaShare The VAShare to prove.
1113
+ * @returns {VAShareWithProofs}
1114
+ */
1115
+ generateVAProofs(M, vaShare) {
1116
+ const s = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.s);
1117
+ const R = (0, util_1.bigIntFromU8ABE)(secp256k1_1.secp256k1.ProjectivePoint.fromHex(vaShare.R).toRawBytes(true));
1118
+ const proofContext = (0, crypto_1.createHash)('sha256').update(M).update((0, util_1.bigIntToBufferBE)(R, Ecdsa.curve.pointBytes)).digest();
1119
+ const zkVProof = sdk_lib_mpc_1.EcdsaZkVProof.createZkVProof(vaShare.V, s, vaShare.l, R, Ecdsa.curve, proofContext);
1120
+ const schnorrProof = sdk_lib_mpc_1.Schnorr.createSchnorrProof(vaShare.A, vaShare.rho, Ecdsa.curve, proofContext);
1121
+ return {
1122
+ ...vaShare,
1123
+ proofContext: proofContext,
1124
+ zkVProofV: zkVProof,
1125
+ schnorrProofA: schnorrProof,
1126
+ };
1127
+ }
1128
+ /**
1129
+ * Verify V_i and A_i values of all other participants during signing phase 5 steps 5A and 5B.
1130
+ * @param {VAShareWithProofs} vaShare V_i, A_i info including SShare values of the currenct participant
1131
+ * @param {PublicVAShareWithProofs[]} publicVAShares public V_i, A_i info of all other participants
1132
+ * @returns {UTShare} U_i, T_i info of the current participant if all verifications pass
1133
+ */
1134
+ verifyVAShares(vaShare, publicVAShares) {
1135
+ publicVAShares.forEach((publicVAShare) => {
1136
+ if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicVAShare.comDecomVA.commitment, {
1137
+ secret: Buffer.concat([
1138
+ (0, util_1.bigIntToBufferBE)(publicVAShare.V, Ecdsa.curve.pointBytes),
1139
+ (0, util_1.bigIntToBufferBE)(publicVAShare.A, Ecdsa.curve.pointBytes),
1140
+ ]),
1141
+ blindingFactor: publicVAShare.comDecomVA.decommitment.blindingFactor,
1142
+ })) {
1143
+ throw new Error('Could not verify commitment of V_i and A_i');
1144
+ }
1145
+ if (!sdk_lib_mpc_1.Schnorr.verifySchnorrProof(publicVAShare.A, publicVAShare.schnorrProofA, Ecdsa.curve, vaShare.proofContext)) {
1146
+ throw new Error('Could not verify Schnorr proof of A_i');
1147
+ }
1148
+ if (!sdk_lib_mpc_1.EcdsaZkVProof.verifyZkVProof(publicVAShare.V, publicVAShare.zkVProofV, (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R), Ecdsa.curve, vaShare.proofContext)) {
1149
+ throw new Error('Could not verify ZK proof of V_i');
1150
+ }
1151
+ });
1152
+ const y = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.y);
1153
+ // r is R's x coordinate. R is in compressed form, so we need to slice off the first byte.
1154
+ const r = (0, sdk_lib_mpc_1.hexToBigInt)(vaShare.R.slice(2));
1155
+ // Calculate aggregation of all V_i and A_i.
1156
+ let V = Ecdsa.curve.pointAdd(Ecdsa.curve.pointAdd(Ecdsa.curve.basePointMult(Ecdsa.curve.scalarNegate((0, util_1.bigIntFromU8ABE)(vaShare.m))), Ecdsa.curve.pointMultiply(y, Ecdsa.curve.scalarNegate(r))), vaShare.V);
1157
+ let A = vaShare.A;
1158
+ publicVAShares.forEach((publicVAShare) => {
1159
+ V = Ecdsa.curve.pointAdd(V, publicVAShare.V);
1160
+ A = Ecdsa.curve.pointAdd(A, publicVAShare.A);
1161
+ });
1162
+ // Calculate U_i = rho_i * V and T_i = l_i * A.
1163
+ const U = Ecdsa.curve.pointMultiply(V, vaShare.rho);
1164
+ const T = Ecdsa.curve.pointMultiply(A, vaShare.l);
1165
+ const comDecom_U_T = sdk_lib_mpc_1.HashCommitment.createCommitment(Buffer.concat([(0, util_1.bigIntToBufferBE)(U, Ecdsa.curve.pointBytes), (0, util_1.bigIntToBufferBE)(T, Ecdsa.curve.pointBytes)]));
1166
+ return {
1167
+ ...vaShare,
1168
+ U,
1169
+ T,
1170
+ comDecomUT: comDecom_U_T,
1171
+ };
1172
+ }
1173
+ /**
1174
+ * Verify U_i and V_i values of all other participants during signing phase 5 steps 5C and 5D.
1175
+ * @param {UTShare} utShare U_i, T_i info including SShare values of the currenct participant
1176
+ * @param {PublicUTShare[]} publicUTShares public U_i, T_i info of all other participants
1177
+ * @returns {SShare} SShare of the current participant if all verifications pass
1178
+ */
1179
+ verifyUTShares(utShare, publicUTShares) {
1180
+ let sigmaU = utShare.U;
1181
+ let sigmaT = utShare.T;
1182
+ publicUTShares.forEach((publicUTShare) => {
1183
+ if (!sdk_lib_mpc_1.HashCommitment.verifyCommitment(publicUTShare.comDecomUT.commitment, {
1184
+ secret: Buffer.concat([
1185
+ (0, util_1.bigIntToBufferBE)(publicUTShare.U, Ecdsa.curve.pointBytes),
1186
+ (0, util_1.bigIntToBufferBE)(publicUTShare.T, Ecdsa.curve.pointBytes),
1187
+ ]),
1188
+ blindingFactor: publicUTShare.comDecomUT.decommitment.blindingFactor,
1189
+ })) {
1190
+ throw new Error('Could not verify commitment of U_i and T_i');
1191
+ }
1192
+ sigmaU = Ecdsa.curve.pointAdd(sigmaU, publicUTShare.U);
1193
+ sigmaT = Ecdsa.curve.pointAdd(sigmaT, publicUTShare.T);
1194
+ });
1195
+ if (sigmaU !== sigmaT) {
1196
+ throw new Error('Sum of all U_i does not match sum of all T_i');
1197
+ }
1198
+ return { ...utShare };
1199
+ }
1051
1200
  /**
1052
1201
  * Construct full signature by combining Sign Shares
1053
1202
  * @param {SShare[]} shares
@@ -1060,14 +1209,14 @@ class Ecdsa {
1060
1209
  if (!isRMatching) {
1061
1210
  throw new Error('R value should be consistent across all shares');
1062
1211
  }
1063
- let s = shares.map((share) => sdk_lib_mpc_1.hexToBigInt(share['s'])).reduce(Ecdsa.curve.scalarAdd);
1212
+ let s = shares.map((share) => (0, sdk_lib_mpc_1.hexToBigInt)(share['s'])).reduce(Ecdsa.curve.scalarAdd);
1064
1213
  const recid = (R.slice(0, 2) === '03' ? 1 : 0) ^ (s > Ecdsa.curve.order() / BigInt(2) ? 1 : 0);
1065
1214
  // Normalize s.
1066
1215
  s = s > Ecdsa.curve.order() / BigInt(2) ? Ecdsa.curve.order() - s : s;
1067
1216
  return {
1068
1217
  y: shares[0]['y'],
1069
1218
  r: R.slice(2),
1070
- s: util_1.bigIntToBufferBE(s, 32).toString('hex'),
1219
+ s: (0, util_1.bigIntToBufferBE)(s, 32).toString('hex'),
1071
1220
  recid: recid,
1072
1221
  };
1073
1222
  }
@@ -1080,12 +1229,12 @@ class Ecdsa {
1080
1229
  * @returns {boolean} True if signature is valid; False otherwise
1081
1230
  */
1082
1231
  verify(message, signature, hash, shouldHash = true) {
1083
- const messageToVerify = shouldHash ? (hash || crypto_1.createHash('sha256')).update(message).digest() : message;
1232
+ const messageToVerify = shouldHash ? (hash || (0, crypto_1.createHash)('sha256')).update(message).digest() : message;
1084
1233
  return Ecdsa.curve.verify(messageToVerify, Buffer.concat([
1085
1234
  Buffer.from([signature['recid']]),
1086
- util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['r']), 32),
1087
- util_1.bigIntToBufferBE(sdk_lib_mpc_1.hexToBigInt(signature['s']), 32),
1088
- ]), sdk_lib_mpc_1.hexToBigInt(signature['y']));
1235
+ (0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['r']), 32),
1236
+ (0, util_1.bigIntToBufferBE)((0, sdk_lib_mpc_1.hexToBigInt)(signature['s']), 32),
1237
+ ]), (0, sdk_lib_mpc_1.hexToBigInt)(signature['y']));
1089
1238
  }
1090
1239
  /**
1091
1240
  * Deserializes a challenge and it's proofs from hex strings to bigint
@@ -1103,8 +1252,8 @@ class Ecdsa {
1103
1252
  return sdk_lib_mpc_1.EcdsaTypes.serializeNtilde(challenge);
1104
1253
  }
1105
1254
  }
1106
- exports.default = Ecdsa;
1107
1255
  Ecdsa.curve = new curves_1.Secp256k1Curve();
1108
1256
  Ecdsa.hdTree = new sdk_lib_mpc_1.Secp256k1Bip32HdTree();
1109
- Ecdsa.shamir = new shamir_1.default(Ecdsa.curve);
1110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnRUFBa0Q7QUFDbEQsdUVBQXlEO0FBQ3pELHVEQUF5QztBQUN6QyxtQ0FBdUQ7QUFDdkQsbURBQTZDO0FBQzdDLHFDQUF5RztBQUN6Ryx5Q0FBOEM7QUFDOUMsMERBQWtDO0FBQ2xDLHlEQVVpQztBQWtDakMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRCOztHQUVHO0FBQ0gsTUFBcUIsS0FBSztJQUl4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsSUFBYSxFQUFFLElBQUksR0FBRyxLQUFLOztRQUM3RixJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkYsTUFBTSx5QkFBeUIsQ0FBQztTQUNqQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztTQUNqRTtRQUVELElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQy9CLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQzVCLGtFQUFrRTtZQUNsRSxtQkFBbUIsR0FBRyxtQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNsRTtRQUVELGtEQUFrRDtRQUNsRCxJQUFJ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QUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ3ZELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2pELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2xELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELEVBQUUsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ25ELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQ2hELENBQUMsRUFBRSx1QkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztpQkFDNUM7YUFDRixDQUFDLENBQUM7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aWVyQmlnaW50IGZyb20gJ3BhaWxsaWVyLWJpZ2ludCc7XG5pbXBvcnQgKiBhcyBiaWdpbnRDcnlwdG9VdGlscyBmcm9tICdiaWdpbnQtY3J5cHRvLXV0aWxzJztcbmltcG9ydCAqIGFzIHNlY3AgZnJvbSAnQG5vYmxlL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCBIYXNoLCByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IGJpZ0ludEZyb21CdWZmZXJCRSwgYmlnSW50RnJvbVU4QUJFLCBiaWdJbnRUb0J1ZmZlckJFLCBnZXRQYWlsbGllclB1YmxpY0tleSB9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHsgU2VjcDI1NmsxQ3VydmUgfSBmcm9tICcuLi8uLi9jdXJ2ZXMnO1xuaW1wb3J0IFNoYW1pciBmcm9tICcuLi8uLi9zaGFtaXInO1xuaW1wb3J0IHtcbiAgRWNkc2FQYWlsbGllclByb29mLFxuICBFY2RzYVJhbmdlUHJvb2YsXG4gIEVjZHNhVHlwZXMsXG4gIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvLFxuICBoZXhUb0JpZ0ludCxcbiAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgSERUcmVlLFxuICBTZWNwMjU2azFCaXAzMkhkVHJlZSxcbiAgY2hhaW5jb2RlQmFzZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuaW1wb3J0IHtcbiAgQVNoYXJlLFxuICBCU2hhcmUsXG4gIERTaGFyZSxcbiAgR1NoYXJlLFxuICBLZXlDb21iaW5lZCxcbiAgS2V5U2hhcmUsXG4gIEtTaGFyZSxcbiAgTVVTaGFyZSxcbiAgTlNoYXJlLFxuICBPU2hhcmUsXG4gIFBTaGFyZSxcbiAgUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlLFxuICBTaWduYXR1cmUsXG4gIFNpZ25Db21iaW5lLFxuICBTaWduQ29tYmluZVJULFxuICBTaWduQ29udmVydCxcbiAgU2lnbkNvbnZlcnRSVCxcbiAgU2lnbkNvbnZlcnRTdGVwMSxcbiAgU2lnbkNvbnZlcnRTdGVwMVJlc3BvbnNlLFxuICBTaWduQ29udmVydFN0ZXAyLFxuICBTaWduQ29udmVydFN0ZXAyUmVzcG9uc2UsXG4gIFNpZ25Db252ZXJ0U3RlcDMsXG4gIFNpZ25Db252ZXJ0U3RlcDNSZXNwb25zZSxcbiAgU2lnblNoYXJlUlQsXG4gIFNTaGFyZSxcbiAgU3Via2V5U2hhcmUsXG4gIFdTaGFyZSxcbiAgWFNoYXJlLFxuICBYU2hhcmVXaXRoQ2hhbGxlbmdlcyxcbiAgWVNoYXJlV2l0aENoYWxsZW5nZXMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IFNlY3AyNTZrMUJpcDMySGRUcmVlKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3luYyBvcHRpb25hbCBzeW5jIGZsYWcsIGlmIHRydWUgdGhlbiBhIHN5bmNocm9ub3VzIHZlcnNpb24gb2YgUGFpbGxpZXIga2V5IGdlbmVyYXRpb24gaXMgdXNlZCB0aGF0IGRvZXMgbm90IHNwYXduIFdvcmtlciB0aHJlYWRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlTaGFyZT59IFJldHVybnMgdGhlIHByaXZhdGUgcC1zaGFyZVxuICAgKiBhbmQgbi1zaGFyZXMgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gcGFydGljaXBhbnRzIGF0IHRoZWlyIGNvcnJlc3BvbmRpbmcgaW5kZXguXG4gICAqL1xuICBhc3luYyBrZXlTaGFyZShpbmRleDogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlciwgbnVtU2hhcmVzOiBudW1iZXIsIHNlZWQ/OiBCdWZmZXIsIHN5bmMgPSBmYWxzZSk6IFByb21pc2U8S2V5U2hhcmU+IHtcbiAgICBpZiAoIShpbmRleCA+IDAgJiYgaW5kZXggPD0gbnVtU2hhcmVzICYmIHRocmVzaG9sZCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkID09PSAyKSkge1xuICAgICAgdGhyb3cgJ0ludmFsaWQgS2V5U2hhcmUgQ29uZmlnJztcbiAgICB9XG5cbiAgICBpZiAoc2VlZCAmJiBzZWVkLmxlbmd0aCA8IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlZWQgbXVzdCBoYXZlIGEgbGVuZ3RoIG9mIGF0IGxlYXN0IDY0IGJ5dGVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHNlZWRXaXRoVmFsaWRMZW5ndGggPSBzZWVkO1xuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoID4gNjQpIHtcbiAgICAgIC8vIGlmIHNlZWQgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiA2NCBieXRlcywgaGFzaCBzZWVkIHRvIDY0IGJ5dGVzLlxuICAgICAgc2VlZFdpdGhWYWxpZExlbmd0aCA9IGNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzZWVkKS5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBhZGRpdGl2ZWx5IGhvbW9tb3JwaGljIGVuY3J5cHRpb24ga2V5LlxuICAgIGxldCBwYWlsbGllcktleVBhaXI6IHBhaWxsaWVyQmlnaW50LktleVBhaXI7XG4gICAgaWYgKCFzeW5jKSB7XG4gICAgICBwYWlsbGllcktleVBhaXIgPSBhd2FpdCBwYWlsbGllckJpZ2ludC5nZW5lcmF0ZVJhbmRvbUtleXMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYhKV0sIHBTaGFyZS5pKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZyb20gcGFydGljaXBhbnQgJHtzaGFyZS5qfS4gVmVyaWZpY2F0aW9uIGVycm9yOiAke2Vycn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoYWluY29kZSB3aWxsIGJlIHVzZWQgaW4gZnV0dXJlIHdoZW4gd2UgYWRkIHN1cHBvcnQgZm9yIGtleSBkZXJpdmF0aW9uIGZvciBlY2RzYVxuICAgIGNvbnN0IGNoYWluY29kZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHsgY2hhaW5jb2RlIH0pID0+IGJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShjaGFpbmNvZGUsICdoZXgnKSkpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKFxuICAgICAgKGFjYywgY2hhaW5jb2RlKSA9PlxuICAgICAgICAoYWNjICsgY2hhaW5jb2RlKSAlIEJpZ0ludCgnMHgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnKSAvLyAyXjI1NlxuICAgICk7XG5cbiAgICBjb25zdCBwYXJ0aWNpcGFudHM6IEtleUNvbWJpbmVkID0ge1xuICAgICAgeFNoYXJlOiB7XG4gICAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgICBsOiBwU2hhcmUubCxcbiAgICAgICAgbTogcFNoYXJlLm0sXG4gICAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoeCwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgICB5U2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzaGFyZSBpbiBuU2hhcmVzKSB7XG4gICAgICBjb25zdCBwYXJ0aWNpcGFudEluZGV4ID0gblNoYXJlc1tzaGFyZV1bJ2onXTtcbiAgICAgIHBhcnRpY2lwYW50cy55U2hhcmVzW3BhcnRpY2lwYW50SW5kZXhdID0ge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgajogblNoYXJlc1tzaGFyZV1bJ2onXSxcbiAgICAgICAgbjogblNoYXJlc1tzaGFyZV1bJ24nXSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBwYXJ0aWNpcGFudHM7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIHNoYXJlcyBmb3IgYSBCSVAtMzIgc3Via2V5LlxuICAgKiBAcGFyYW0ge1BTaGFyZX0gVGhlIHVzZXIncyBwLXNoYXJlLlxuICAgKiBAcGFyYW0ge05TaGFyZVtdfSBUaGUgbi1zaGFyZXMgcmVjZWl2ZWQgZnJvbSB0aGUgb3RoZXIgcGFydGljaXBhbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybnMge1N1YmtleVNoYXJlfSBSZXR1cm5zIHRoZSBwcml2YXRlIHgtc2hhcmUgYW5kIG4tc2hhcmVzIHRvXG4gICAqIGJlIGRpc3RyaWJ1dGVkIHRvIHBhcnRpY2lwYW50cyBhdCB0aGVpciBjb3JyZXNwb25kaW5nIGluZGV4LlxuICAgKi9cbiAga2V5RGVyaXZlKHBTaGFyZTogUFNoYXJlLCBuU2hhcmVzOiBOU2hhcmVbXSwgcGF0aDogc3RyaW5nKTogU3Via2V5U2hhcmUge1xuICAgIGNvbnN0IHlWYWx1ZXMgPSBbcFNoYXJlLCAuLi5uU2hhcmVzXS5tYXAoKHNoYXJlKSA9PiBoZXhUb0JpZ0ludChzaGFyZS55KSk7XG4gICAgY29uc3QgeSA9IHlWYWx1ZXMucmVkdWNlKChwYXJ0aWFsLCBzaGFyZSkgPT4gRWNkc2EuY3VydmUucG9pbnRBZGQocGFydGlhbCwgc2hhcmUpKTtcbiAgICBjb25zdCB1ID0gQmlnSW50KHBTaGFyZS51dSk7XG4gICAgbGV0IGNvbnRyaWJDaGFpbmNvZGUgPSBoZXhUb0JpZ0ludChwU2hhcmUuY2hhaW5jb2RlKTtcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW2NvbnRyaWJDaGFpbmNvZGUsIC4uLm5TaGFyZXMubWFwKCh7IGNoYWluY29kZSB9KSA9PiBoZXhUb0JpZ0ludChjaGFpbmNvZGUpKV07XG4gICAgY29uc3QgY2hhaW5jb2RlID0gY2hhaW5jb2Rlcy5yZWR1Y2UoKGFjYywgY2hhaW5jb2RlKSA9PiAoYWNjICsgY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2UpO1xuXG4gICAgLy8gVmVyaWZ5IHNoYXJlcy5cbiAgICBmb3IgKGNvbnN0IHNoYXJlIG9mIG5TaGFyZXMpIHtcbiAgICAgIGlmIChzaGFyZS52KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRWNkc2Euc2hhbWlyLnZlcmlmeShoZXhUb0JpZ0ludChzaGFyZS51KSwgW2hleFRvQmlnSW50KHNoYXJlLnkpLCBoZXhUb0JpZ0ludChzaGFyZS52ISldLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICBjb25zdCBQX2k6IFhTaGFyZSA9IHtcbiAgICAgIGk6IHBTaGFyZS5pLFxuICAgICAgbDogcFNoYXJlLmwsXG4gICAgICBtOiBwU2hhcmUubSxcbiAgICAgIG46IHBTaGFyZS5uLFxuICAgICAgeTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkucGssIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBjaGFpbmNvZGU6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2hhcmVzOiBTdWJrZXlTaGFyZSA9IHtcbiAgICAgIHhTaGFyZTogUF9pLFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAobGV0IGluZCA9IDA7IGluZCA8IG5TaGFyZXMubGVuZ3RoOyBpbmQrKykge1xuICAgICAgY29uc3QgUF9qID0gblNoYXJlc1tpbmRdO1xuICAgICAgc2hhcmVzLm5TaGFyZXNbUF9qLmpdID0ge1xuICAgICAgICBpOiBQX2ouaixcbiAgICAgICAgajogUF9pLmksXG4gICAgICAgIG46IFBfaS5uLFxuICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHNwbGl0X3VbUF9qLmpdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJZLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHZbMF0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjb250cmliQ2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2hhcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZXMgYSBjaGlsZCBjb21tb24ga2V5Y2hhaW4gZnJvbSBjb21tb24ga2V5Y2hhaW5cbiAgICpcbiAgICogQHBhcmFtIHtjb21tb25LZXljaGFpbn0gVGhlIGNvbW1vbiBrZXljaGFpbiBhcyBhIGhleCBzdHJpbmcuXG4gICAqIEBwYXJhbSB7cGF0aH0gVGhlIEJJUC0zMiBwYXRoIHRvIGRlcml2ZS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVyaXZlZCBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKi9cbiAgZGVyaXZlVW5oYXJkZW5lZChjb21tb25LZXljaGFpbjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChFY2RzYS5oZFRyZWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZGVyaXZlIGtleSB3aXRob3V0IEhEVHJlZSBpbXBsZW1lbnRhdGlvblwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXljaGFpbiA9IEJ1ZmZlci5mcm9tKGNvbW1vbktleWNoYWluLCAnaGV4Jyk7XG5cbiAgICBjb25zdCBkZXJpdmVkUHVibGljS2V5Y2hhaW4gPSBFY2RzYS5oZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAge1xuICAgICAgICBwazogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDAsIDMzKSksXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50RnJvbUJ1ZmZlckJFKGtleWNoYWluLnNsaWNlKDMzKSksXG4gICAgICB9LFxuICAgICAgcGF0aFxuICAgICk7XG5cbiAgICBjb25zdCBkZXJpdmVkUGsgPSBiaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWJsaWNLZXljaGFpbi5waywgMzMpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBkZXJpdmVkQ2hhaW5jb2RlID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4uY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgcmV0dXJuIGRlcml2ZWRQayArIGRlcml2ZWRDaGFpbmNvZGU7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIGdpdmVuIHJhbmdlIHByb29mIGNoYWxsZW5nZSB0byB0aGUgc2hhcmVzIHByZXZpb3VzbHkgY3JlYXRlZFxuICAgKiBieSAja2V5Q29tYmluZS4gR2VuZXJhdGVzIGEgbmV3IGNoYWxsZW5nZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7WFNoYXJlIHwgWVNoYXJlfSBzaGFyZSBQcml2YXRlIHhTaGFyZSBvciB5U2hhcmUgb2YgdGhlIHNpZ25pbmcgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSByYW5nZVByb29mQ2hhbGxlbmdlIC0gY2hhbGxlbmdlIGdlbmVyYXRlZCB2aWEgZ2VuZXJhdGVOdGlsZGVcbiAgICogQHBhcmFtIHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2VcbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBUaGUgc2hhcmUgd2l0aCBhbWVuZGVkIGNoYWxsZW5nZSB2YWx1ZXNcbiAgICovXG4gIGFwcGVuZENoYWxsZW5nZTxUPihcbiAgICBzaGFyZTogVCxcbiAgICByYW5nZVByb29mQ2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUsXG4gICAgcGFpbGxpZXJQcm9vZkNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkUGFpbGxpZXJDaGFsbGVuZ2VcbiAgKTogVCAmIEVjZHNhVHlwZXMuU2VyaWFsaXplZEVjZHNhQ2hhbGxlbmdlcyB7XG4gICAgY29uc3QgeyBudGlsZGUsIGgxLCBoMiB9ID0gcmFuZ2VQcm9vZkNoYWxsZW5nZTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc2hhcmUsXG4gICAgICBudGlsZGUsXG4gICAgICBoMSxcbiAgICAgIGgyLFxuICAgICAgcDogcGFpbGxpZXJQcm9vZkNoYWxsZW5nZS5wLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNpZ25pbmcgc2hhcmVzLlxuICAgKiBAcGFyYW0ge3hTaGFyZX0geFNoYXJlIFByaXZhdGUgeFNoYXJlIG9mIGN1cnJlbnQgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqIEBwYXJhbSB7WVNoYXJlfSB5U2hhcmUgeVNoYXJlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG90aGVyIHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcmV0dXJucyB7U2lnblNoYXJlUlR9IFJldHVybnMgdGhlIHBhcnRpY2lwYW50IHByaXZhdGUgdy1zaGFyZVxuICAgKiBhbmQgay1zaGFyZSB0byBiZSBkaXN0cmlidXRlZCB0byBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICovXG4gIGFzeW5jIHNpZ25TaGFyZSh4U2hhcmU6IFhTaGFyZVdpdGhDaGFsbGVuZ2VzLCB5U2hhcmU6IFlTaGFyZVdpdGhDaGFsbGVuZ2VzKTogUHJvbWlzZTxTaWduU2hhcmVSVD4ge1xuICAgIGNvbnN0IHBrID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoeFNoYXJlLm4pKTtcblxuICAgIGNvbnN0IGsgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCByayA9IGF3YWl0IHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvKHBrLm4pO1xuICAgIGNvbnN0IGNrID0gcGsuZW5jcnlwdChrLCByayk7XG4gICAgY29uc3QgZ2FtbWEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcblxuICAgIGNvbnN0IGQgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KEVjZHNhLmN1cnZlLnNjYWxhclN1YihCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSwgQmlnSW50KHhTaGFyZS5pKSk7XG5cbiAgICBjb25zdCB3ID0gW1xuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChCaWdJbnQoeVNoYXJlLmopLCBCaWdJbnQoeFNoYXJlLmkpKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZVsneCddKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhckludmVydChkKSxcbiAgICBdLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGVhLCBoMTogaDFhLCBoMjogaDJhIH0gPSB4U2hhcmU7XG5cbiAgICBjb25zdCB3U2hhcmU6IFdTaGFyZSA9IHtcbiAgICAgIGk6IHhTaGFyZS5pLFxuICAgICAgbDogeFNoYXJlLmwsXG4gICAgICBtOiB4U2hhcmUubSxcbiAgICAgIG46IHhTaGFyZS5uLFxuICAgICAgeTogeFNoYXJlLnksXG4gICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICBoMTogaDFhLFxuICAgICAgaDI6IGgyYSxcbiAgICAgIHA6IHhTaGFyZS5wLFxuICAgICAgazogYmlnSW50VG9CdWZmZXJCRShrLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgY2s6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRSh3LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgZ2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoZ2FtbWEsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IHsgbnRpbGRlOiBudGlsZGViLCBoMTogaDFiLCBoMjogaDJiIH0gPSB5U2hhcmU7XG4gICAgY29uc3QgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmUoXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwayxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBoZXhUb0JpZ0ludChudGlsZGViKSxcbiAgICAgICAgaDE6IGhleFRvQmlnSW50KGgxYiksXG4gICAgICAgIGgyOiBoZXhUb0JpZ0ludChoMmIpLFxuICAgICAgfSxcbiAgICAgIGNrLFxuICAgICAgayxcbiAgICAgIHJrXG4gICAgKTtcblxuICAgIC8vIGNyZWF0ZSBwYWlsbGllciBjaGFsbGVuZ2UgcHJvb2YgYmFzZWQgb24gdGhlIG90aGVyIHNpZ25lcnMgY2hhbGxlbmdlXG4gICAgLy8gb25seSBzZW5kIHNpZ21hIGlmIHdlIGFsc28gc2VuZCBjaGFsbGVuZ2UgcFxuICAgIGNvbnN0IHNpZ21hID0gRWNkc2FQYWlsbGllclByb29mLnByb3ZlKFxuICAgICAgaGV4VG9CaWdJbnQoeFNoYXJlLm4pLFxuICAgICAgaGV4VG9CaWdJbnQoeFNoYXJlLmwpLFxuICAgICAgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogeVNoYXJlLnAhIH0pLnBcbiAgICApO1xuXG4gICAgY29uc3QgcHJvb2ZTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga1NoYXJlOiBLU2hhcmUgPSB7XG4gICAgICAvLyB0aGlzIHNoYXJlIHdpbGwgYmUgc2VudCB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHN3YXAgdGhlIGkgYW5kIGogdmFsdWVzIGhlcmVcbiAgICAgIC8vIHNvIHRoYXQgdGhleSBrbm93IGl0J3MgdGhlaXIga1NoYXJlLCBwcm9kdWNlZCBieSB1c1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2lnbWE6IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoeyBzaWdtYTogc2lnbWEgfSkuc2lnbWEsXG4gICAgICBwcm9vZjogcHJvb2ZTaGFyZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdTaGFyZSxcbiAgICAgIGtTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDEuMiBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQSBjb21wbGV0ZWQgc2lnblNoYXJlIGluaXRpYWxseSAoaW5wdXQgdG8gdGhpcyBmbiksIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMShzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDEpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkS1NoYXJlID0gc2hhcmVzLmtTaGFyZTtcbiAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgbnRpbGRlOiByZWNlaXZlZEtTaGFyZS5udGlsZGUsXG4gICAgICBoMTogcmVjZWl2ZWRLU2hhcmUuaDEsXG4gICAgICBoMjogcmVjZWl2ZWRLU2hhcmUuaDIsXG4gICAgICBwOiByZWNlaXZlZEtTaGFyZS5wLFxuICAgIH07XG4gICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnQgPSBzaWduU2hhcmUud1NoYXJlO1xuXG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gcmVjZWl2ZWRLU2hhcmUuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRLU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIG90aGVyIHBhcnRpY2lwYW50cyBwYWlsbGllciBwdWJsaWMga2V5XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLm4pO1xuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMik7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMik7XG5cbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuayk7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVQYXJ0aWNpcGFudC5wIH0pO1xuICAgIC8vIHRoZSBvdGhlciBzaWduaW5nIHBhcnRpZXMgcHJvb2YgdG8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogcmVjZWl2ZWRLU2hhcmUuc2lnbWEsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIShhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YudmVyaWZ5KG4sIHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZS5wLCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2Yuc2lnbWEpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBiZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNiID0gcGthLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IG51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGthLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgIGgxOiBoMWEsXG4gICAgICAgIGgyOiBoMmEsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IG5Ub0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUubjtcbiAgICBjb25zdCBudGlsZGVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBoMlRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGtUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUuaztcbiAgICBjb25zdCBwcm9vZlRvQmVTZW50ID0gc2lnblNoYXJlLmtTaGFyZS5wcm9vZjtcbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkS1NoYXJlLmosIHJlY2VpdmVkS1NoYXJlLmldO1xuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIG50aWxkZTogbnRpbGRlVG9CZVNlbnQsXG4gICAgICAgIGgxOiBoMVRvQmVTZW50LFxuICAgICAgICBoMjogaDJUb0JlU2VudCxcbiAgICAgICAgbjogblRvQmVTZW50LFxuICAgICAgICBrOiBrVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgcHJvb2Y6IHByb29mVG9CZVNlbnQsXG4gICAgICAgIGdhbW1hUHJvb2Y6IGdhbW1hUHJvb2ZUb0JlU2VudCxcbiAgICAgICAgd1Byb29mOiB3UHJvb2ZUb0JlU2VudCxcbiAgICAgICAgLy8gcHJvdmlkZSB0aGUgc2hhcmUgcGFydGljaXBhbnRzIHByb29mXG4gICAgICAgIC8vIHRvIHRoZSBwYWlsbGllciBjaGFsbGVuZ2UgaW4gdGhlIHJlY2VpdmVkS1NoYXJlIGZyb20gdGhlIG90aGVyIHNpZ25lclxuICAgICAgICBzaWdtYTogc2lnblNoYXJlLmtTaGFyZS5zaWdtYSxcbiAgICAgIH0sXG4gICAgICBiU2hhcmU6IHtcbiAgICAgICAgLi4uc2hhcmVQYXJ0aWNpcGFudCxcbiAgICAgICAgYmV0YSxcbiAgICAgICAgbnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlclxuICAgKiBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4xIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBCIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAxLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEEuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDIoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAyKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEFTaGFyZSA9IHNoYXJlcy5hU2hhcmU7XG4gICAgaWYgKCFyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAvLyBjdXJyZW50IHBhcnRpY2lwYW50IHB1YmxpYyBrZXlcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm4pKTtcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDEpO1xuICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDIpO1xuICAgIGNvbnN0IGNrID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5jayk7XG5cbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2UoeyBwOiBzaGFyZXMud1NoYXJlLnAgfSk7XG4gICAgY29uc3QgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHtcbiAgICAgIHNpZ21hOiBzaGFyZXMuYVNoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmICghRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIHBhaWxsaWVyIHByb29mJyk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm0pLCBwa2EpO1xuXG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuYWxwaGEpKSksXG4gICAgICAzMlxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpKSksIC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYiA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMik7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmspO1xuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGtiLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBnU2hhcmVCZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY2IgPSBwa2IuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgIGNvbnN0IGFscGhhID0gcGtiLmFkZGl0aW9uKHBrYi5tdWx0aXBseShrLCBnKSwgY2IpO1xuICAgIGNvbnN0IGFscGhhVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGFscGhhLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgbGV0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGFscGhhLFxuICAgICAgZyxcbiAgICAgIGJldGEwLFxuICAgICAgcmIsXG4gICAgICBneFxuICAgICk7XG4gICAgY29uc3QgZ2FtbWFQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICBjb25zdCBudTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlTnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUudyk7XG4gICAgY29uc3Qgcm4gPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY24gPSBwa2IuZW5jcnlwdChudTAsIHJuKTtcbiAgICBjb25zdCBtdSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICBjb25zdCBtdVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2IsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgaDE6IGgxYixcbiAgICAgICAgaDI6IGgyYixcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgaGV4VG9CaWdJbnQobXVUb0JlU2VudCksXG4gICAgICB3LFxuICAgICAgbnUwLFxuICAgICAgcm4sXG4gICAgICB3eFxuICAgICk7XG4gICAgY29uc3Qgd1Byb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEFTaGFyZS5qLCByZWNlaXZlZEFTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXVTaGFyZToge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgICAgYWxwaGE6IGFscGhhVG9CZVNlbnQsXG4gICAgICAgIG11OiBtdVRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICB9LFxuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy53U2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLndTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMud1NoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy53U2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLndTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLndTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IGdTaGFyZUJldGEsXG4gICAgICAgIG51OiBnU2hhcmVOdSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAyLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25Db252ZXJ0U3RlcDIsIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMyhzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDMpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkTXVTaGFyZSA9IHNoYXJlcy5tdVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIGdhbW1hUHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgaWYgKCFyZWNlaXZlZE11U2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUuY2spO1xuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLngpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11KSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm0pLCBwa2EpO1xuICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpKTtcbiAgICBjb25zdCBnU2hhcmVBbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICBjb25zdCBnU2hhcmVNdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRNdVNoYXJlLmosIHJlY2VpdmVkTXVTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy5iU2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLmJTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMuYlNoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy5iU2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLmJTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLmJTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IHNoYXJlcy5iU2hhcmUuYmV0YSxcbiAgICAgICAgbnU6IHNoYXJlcy5iU2hhcmUubnUsXG4gICAgICB9LFxuICAgICAgc2lnbkluZGV4OiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBvbmUgb2YgW3NpZ25Db252ZXJ0U3RlcDEsIHNpZ25Db252ZXJ0U3RlcDIsIHNpZ25Db252ZXJ0U3RlcDNdIGluc3RlYWRcbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnQoc2hhcmVzOiBTaWduQ29udmVydCk6IFByb21pc2U8U2lnbkNvbnZlcnRSVD4ge1xuICAgIGxldCBzaGFyZVBhcnRpY2lwYW50OiBQYXJ0aWFsPEJTaGFyZT4gfCBQYXJ0aWFsPEdTaGFyZT4sIHNoYXJlVG9CZVNlbnQ6IFBhcnRpYWw8QVNoYXJlPiB8IE1VU2hhcmU7XG4gICAgbGV0IGlzR2FtbWFTaGFyZSA9IGZhbHNlO1xuICAgIGxldCBrU2hhcmU6IFBhcnRpYWw8S1NoYXJlPiA9IHt9O1xuICAgIGlmIChzaGFyZXMueFNoYXJlICYmIHNoYXJlcy55U2hhcmUgJiYgc2hhcmVzLmtTaGFyZSkge1xuICAgICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAgIC4uLnNoYXJlcy55U2hhcmUsXG4gICAgICAgIG50aWxkZTogc2hhcmVzLmtTaGFyZS5udGlsZGUsXG4gICAgICAgIGgxOiBzaGFyZXMua1NoYXJlLmgxLFxuICAgICAgICBoMjogc2hhcmVzLmtTaGFyZS5oMixcbiAgICAgICAgcDogc2hhcmVzLmtTaGFyZS5wLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICAgIGtTaGFyZSA9IHNpZ25TaGFyZS5rU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0geyAuLi5zaGFyZXMua1NoYXJlIH0gYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHsgLi4uc2lnblNoYXJlLndTaGFyZSB9IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICB9IGVsc2UgaWYgKChzaGFyZXMuYlNoYXJlICYmIHNoYXJlcy5tdVNoYXJlKSB8fCAoc2hhcmVzLmFTaGFyZSAmJiBzaGFyZXMud1NoYXJlKSkge1xuICAgICAgaXNHYW1tYVNoYXJlID0gdHJ1ZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSBzaGFyZXMuYVNoYXJlID8gKHsgLi4uc2hhcmVzLmFTaGFyZSB9IGFzIE1VU2hhcmUpIDogKHsgLi4uc2hhcmVzLm11U2hhcmUgfSBhcyBNVVNoYXJlKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSBzaGFyZXMud1NoYXJlID8gKHsgLi4uc2hhcmVzLndTaGFyZSB9IGFzIFBhcnRpYWw8R1NoYXJlPikgOiAoeyAuLi5zaGFyZXMuYlNoYXJlIH0gYXMgR1NoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZyBmb3IgU2lnbiBDb252ZXJ0Jyk7XG4gICAgfVxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHNoYXJlVG9CZVNlbnQuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmFscGhhKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LndQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm4pKTtcbiAgICAgIGxldCBudGlsZGVhLCBoMWEsIGgyYSwgY2s7XG4gICAgICBpZiAoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKSB7XG4gICAgICAgIG50aWxkZWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgICBoMWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICAgIGgyYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgyKTtcbiAgICAgICAgY2sgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5jayk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZm9yIHdQcm9vZicpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubCBhcyBzdHJpbmcpLFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5tIGFzIHN0cmluZyksXG4gICAgICAgIHBrYVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGdTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmU7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpKTtcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UoYWxwaGEpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobXUpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8R1NoYXJlPjtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gbXVTaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8TVVTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubDtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5tO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmFscGhhO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm11O1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5rKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQucHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgcHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDEpO1xuICAgICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgY29uc3QgbnRpbGRlYiA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGFscGhhLFxuICAgICAgICBnLFxuICAgICAgICBiZXRhMCxcbiAgICAgICAgcmIsXG4gICAgICAgIGd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihhU2hhcmVUb0JlU2VudCwge1xuICAgICAgICBnYW1tYVByb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudC5udSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSBzaWduaW5nXG4gICAqIEByZXR1cm5zIHtTU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBTU2hhcmUge1xuICAgIGNvbnN0IG0gPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShNKS5kaWdlc3QoKSA6IE07XG5cbiAgICBjb25zdCBkZWx0YSA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChoZXhUb0JpZ0ludChvU2hhcmUuZGVsdGEpLCBoZXhUb0JpZ0ludChkU2hhcmUuZGVsdGEpKTtcblxuICAgIGNvbnN0IFIgPSBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KFxuICAgICAgRWNkc2EuY3VydmUucG9pbnRBZGQoaGV4VG9CaWdJbnQob1NoYXJlLkdhbW1hKSwgaGV4VG9CaWdJbnQoZFNoYXJlLkdhbW1hKSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZGVsdGEpXG4gICAgKTtcbiAgICBjb25zdCBwb2ludFIgPSBzZWNwLlBvaW50LmZyb21IZXgoYmlnSW50VG9CdWZmZXJCRShSLCAzMikpO1xuICAgIGNvbnN0IHIgPSBwb2ludFIueDtcblxuICAgIGNvbnN0IHMgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJNdWx0KGJpZ0ludEZyb21VOEFCRShtKSwgaGV4VG9CaWdJbnQob1NoYXJlLmspKSxcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQociwgaGV4VG9CaWdJbnQob1NoYXJlLm9taWNyb24pKVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGk6IG9TaGFyZS5pLFxuICAgICAgeTogb1NoYXJlLnksXG4gICAgICBSOiBwb2ludFIudG9IZXgodHJ1ZSksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3QgZnVsbCBzaWduYXR1cmUgYnkgY29tYmluaW5nIFNpZ24gU2hhcmVzXG4gICAqIEBwYXJhbSB7U1NoYXJlW119IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbmF0dXJlfVxuICAgKi9cbiAgY29uc3RydWN0U2lnbmF0dXJlKHNoYXJlczogU1NoYXJlW10pOiBTaWduYXR1cmUge1xuICAgIC8vIEV2ZXJ5IFIgbXVzdCBtYXRjaC5cbiAgICBjb25zdCBSID0gc2hhcmVzWzBdWydSJ107XG4gICAgY29uc3QgaXNSTWF0Y2hpbmcgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gc2hhcmVbJ1InXSA9PT0gUikucmVkdWNlKChhLCBiKSA9PiBhICYmIGIpO1xuICAgIGlmICghaXNSTWF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUiB2YWx1ZSBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgYWxsIHNoYXJlcycpO1xuICAgIH1cblxuICAgIGxldCBzID0gc2hhcmVzLm1hcCgoc2hhcmUpID0+IGhleFRvQmlnSW50KHNoYXJlWydzJ10pKS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyQWRkKTtcbiAgICBjb25zdCByZWNpZCA9IChSLnNsaWNlKDAsIDIpID09PSAnMDMnID8gMSA6IDApIF4gKHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gMSA6IDApO1xuXG4gICAgLy8gTm9ybWFsaXplIHMuXG4gICAgcyA9IHMgPiBFY2RzYS5jdXJ2ZS5vcmRlcigpIC8gQmlnSW50KDIpID8gRWNkc2EuY3VydmUub3JkZXIoKSAtIHMgOiBzO1xuICAgIHJldHVybiB7XG4gICAgICB5OiBzaGFyZXNbMF1bJ3knXSxcbiAgICAgIHI6IFIuc2xpY2UoMiksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICByZWNpZDogcmVjaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgZWNkc2Egc2lnbmF0dXJlc1xuICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1NpZ25hdHVyZSB9IHNpZ25hdHVyZVxuICAgKiBAcGFyYW0ge0hhc2h9IGhhc2ggaGFzaGluZyBhbGdvcml0aG0gaW1wbGVtZW50aW5nIE5vZGVgcyBzdGFuZGFyZCBjcnlwdG8gaGFzaCBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXNoIGlmIHRydWUsIHdlIGhhc2ggdGhlIHByb3ZpZGVkIGJ1ZmZlciBiZWZvcmUgdmVyaWZ5aW5nXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHNpZ25hdHVyZSBpcyB2YWxpZDsgRmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2ZXJpZnkobWVzc2FnZTogQnVmZmVyLCBzaWduYXR1cmU6IFNpZ25hdHVyZSwgaGFzaD86IEhhc2gsIHNob3VsZEhhc2ggPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWVzc2FnZVRvVmVyaWZ5ID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCkgOiBtZXNzYWdlO1xuICAgIHJldHVybiBFY2RzYS5jdXJ2ZS52ZXJpZnkoXG4gICAgICBtZXNzYWdlVG9WZXJpZnksXG4gICAgICBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgQnVmZmVyLmZyb20oW3NpZ25hdHVyZVsncmVjaWQnXV0pLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsnciddKSwgMzIpLFxuICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKGhleFRvQmlnSW50KHNpZ25hdHVyZVsncyddKSwgMzIpLFxuICAgICAgXSksXG4gICAgICBoZXhUb0JpZ0ludChzaWduYXR1cmVbJ3knXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBoZXggc3RyaW5ncyB0byBiaWdpbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNkay1saWItbXBjIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUgaW5zdGVhZFxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5EZXNlcmlhbGl6ZWROdGlsZGUge1xuICAgIHJldHVybiBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIGNoYWxsZW5nZSBhbmQgaXQncyBwcm9vZnMgZnJvbSBiaWcgaW50IHRvIGhleCBzdHJpbmdzLlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqIEBwYXJhbSBjaGFsbGVuZ2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSk6IEVjZHNhVHlwZXMuU2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuc2VyaWFsaXplTnRpbGRlKGNoYWxsZW5nZSk7XG4gIH1cbn1cbiJdfQ==
1257
+ Ecdsa.shamir = new sdk_lib_mpc_1.Shamir(Ecdsa.curve);
1258
+ exports.default = Ecdsa;
1259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNkc2EuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvbXBjL3Rzcy9lY2RzYS9lY2RzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdFQUFrRDtBQUNsRCx1RUFBeUQ7QUFDekQsdURBQTREO0FBQzVELG1DQUF1RDtBQUN2RCxtREFBNkM7QUFDN0MscUNBQXlHO0FBQ3pHLHlDQUE4QztBQUM5Qyx5REFlaUM7QUF1Q2pDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixzRkFBc0Y7QUFDdEYsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRXhCOztHQUVHO0FBQ0gsTUFBcUIsS0FBSztJQUl4Qjs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQWEsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQUUsSUFBYSxFQUFFLElBQUksR0FBRyxLQUFLO1FBQzdGLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3BGLE1BQU0seUJBQXlCLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFRCxJQUFJLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQzdCLGtFQUFrRTtZQUNsRSxtQkFBbUIsR0FBRyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDLENB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TSxFQUFFLEdBQUcsTUFBTSxJQUFBLHFDQUF1QixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXpDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RyxNQUFNLENBQUMsR0FBRztZQUNSLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFBLHlCQUFXLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztRQUVyRCxNQUFNLE1BQU0sR0FBVztZQUNyQixDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDWCxDQUFDLEVBQUUs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NUMsWUFBTSxHQUFXLElBQUksb0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7a0JBSDdCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYWlsbGllckJpZ2ludCBmcm9tICdwYWlsbGllci1iaWdpbnQnO1xuaW1wb3J0ICogYXMgYmlnaW50Q3J5cHRvVXRpbHMgZnJvbSAnYmlnaW50LWNyeXB0by11dGlscyc7XG5pbXBvcnQgeyBzZWNwMjU2azEgYXMgc2VjcCB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxJztcbmltcG9ydCB7IGNyZWF0ZUhhc2gsIEhhc2gsIHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYmlnSW50RnJvbUJ1ZmZlckJFLCBiaWdJbnRGcm9tVThBQkUsIGJpZ0ludFRvQnVmZmVyQkUsIGdldFBhaWxsaWVyUHVibGljS2V5IH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgeyBTZWNwMjU2azFDdXJ2ZSB9IGZyb20gJy4uLy4uL2N1cnZlcyc7XG5pbXBvcnQge1xuICBFY2RzYVBhaWxsaWVyUHJvb2YsXG4gIEVjZHNhUmFuZ2VQcm9vZixcbiAgRWNkc2FUeXBlcyxcbiAgRWNkc2Faa1ZQcm9vZixcbiAgSGFzaENvbW1pdG1lbnQsXG4gIFNjaG5vcnIsXG4gIHJhbmRvbVBvc2l0aXZlQ29QcmltZVRvLFxuICBoZXhUb0JpZ0ludCxcbiAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgSERUcmVlLFxuICBTZWNwMjU2azFCaXAzMkhkVHJlZSxcbiAgY2hhaW5jb2RlQmFzZSxcbiAgU2hhbWlyLFxuICBTY2hub3JyUHJvb2YsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7XG4gIEFTaGFyZSxcbiAgQlNoYXJlLFxuICBEU2hhcmUsXG4gIEdTaGFyZSxcbiAgS2V5Q29tYmluZWQsXG4gIEtleVNoYXJlLFxuICBLU2hhcmUsXG4gIE1VU2hhcmUsXG4gIE5TaGFyZSxcbiAgT1NoYXJlLFxuICBQU2hhcmUsXG4gIFB1YmxpY1VUU2hhcmUsXG4gIFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSxcbiAgU2lnbmF0dXJlLFxuICBTaWduQ29tYmluZSxcbiAgU2lnbkNvbWJpbmVSVCxcbiAgU2lnbkNvbnZlcnQsXG4gIFNpZ25Db252ZXJ0UlQsXG4gIFNpZ25Db252ZXJ0U3RlcDEsXG4gIFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZSxcbiAgU2lnbkNvbnZlcnRTdGVwMixcbiAgU2lnbkNvbnZlcnRTdGVwMlJlc3BvbnNlLFxuICBTaWduQ29udmVydFN0ZXAzLFxuICBTaWduQ29udmVydFN0ZXAzUmVzcG9uc2UsXG4gIFNpZ25TaGFyZVJULFxuICBTU2hhcmUsXG4gIFN1YmtleVNoYXJlLFxuICBVVFNoYXJlLFxuICBWQVNoYXJlV2l0aFByb29mcyxcbiAgVkFTaGFyZSxcbiAgV1NoYXJlLFxuICBYU2hhcmUsXG4gIFhTaGFyZVdpdGhDaGFsbGVuZ2VzLFxuICBZU2hhcmVXaXRoQ2hhbGxlbmdlcyxcbiAgUHVibGljVkFTaGFyZVdpdGhQcm9vZnMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG4vLyBTaXplIG9mIGFscGhhIGFuZCBtdSBzaGFyZXMgaW4gYnl0ZXMgZXhwZWN0ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm90b2NvbFxuY29uc3QgQUxQSEFNVVNJWkUgPSA3Njg7XG5cbi8qKlxuICogRUNEU0EgVFNTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRpbmcgMjpuIFRocmVzaG9sZFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFY2RzYSB7XG4gIHN0YXRpYyBjdXJ2ZTogU2VjcDI1NmsxQ3VydmUgPSBuZXcgU2VjcDI1NmsxQ3VydmUoKTtcbiAgc3RhdGljIGhkVHJlZTogSERUcmVlID0gbmV3IFNlY3AyNTZrMUJpcDMySGRUcmVlKCk7XG4gIHN0YXRpYyBzaGFtaXI6IFNoYW1pciA9IG5ldyBTaGFtaXIoRWNkc2EuY3VydmUpO1xuICAvKipcbiAgICogR2VuZXJhdGUgc2hhcmVzIGZvciBwYXJ0aWNpcGFudCBhdCBpbmRleCBhbmQgc3BsaXQga2V5cyBgKHRocmVzaG9sZCxudW1TaGFyZXMpYCB3YXlzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggcGFydGljaXBhbnQgaW5kZXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCBTaWduaW5nIHRocmVzaG9sZFxuICAgKiBAcGFyYW0ge251bWJlcn0gbnVtU2hhcmVzICBOdW1iZXIgb2Ygc2hhcmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzZWVkIG9wdGlvbmFsIDY0IGJ5dGUgc2VlZCB0byB1c2UgZm9yIGtleSBnZW5lcmF0aW9uXG4gICAqIEBwYXJhbSBzeW5jIG9wdGlvbmFsIHN5bmMgZmxhZywgaWYgdHJ1ZSB0aGVuIGEgc3luY2hyb25vdXMgdmVyc2lvbiBvZiBQYWlsbGllciBrZXkgZ2VuZXJhdGlvbiBpcyB1c2VkIHRoYXQgZG9lcyBub3Qgc3Bhd24gV29ya2VyIHRocmVhZHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEtleVNoYXJlPn0gUmV0dXJucyB0aGUgcHJpdmF0ZSBwLXNoYXJlXG4gICAqIGFuZCBuLXNoYXJlcyB0byBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGFzeW5jIGtleVNoYXJlKGluZGV4OiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyLCBudW1TaGFyZXM6IG51bWJlciwgc2VlZD86IEJ1ZmZlciwgc3luYyA9IGZhbHNlKTogUHJvbWlzZTxLZXlTaGFyZT4ge1xuICAgIGlmICghKGluZGV4ID4gMCAmJiBpbmRleCA8PSBudW1TaGFyZXMgJiYgdGhyZXNob2xkIDw9IG51bVNoYXJlcyAmJiB0aHJlc2hvbGQgPT09IDIpKSB7XG4gICAgICB0aHJvdyAnSW52YWxpZCBLZXlTaGFyZSBDb25maWcnO1xuICAgIH1cblxuICAgIGlmIChzZWVkICYmIHNlZWQubGVuZ3RoIDwgNjQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VlZCBtdXN0IGhhdmUgYSBsZW5ndGggb2YgYXQgbGVhc3QgNjQgYnl0ZXMnKTtcbiAgICB9XG5cbiAgICBsZXQgc2VlZFdpdGhWYWxpZExlbmd0aCA9IHNlZWQ7XG4gICAgaWYgKHNlZWQgJiYgc2VlZC5sZW5ndGggPiA2NCkge1xuICAgICAgLy8gaWYgc2VlZCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIDY0IGJ5dGVzLCBoYXNoIHNlZWQgdG8gNjQgYnl0ZXMuXG4gICAgICBzZWVkV2l0aFZhbGlkTGVuZ3RoID0gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNlZWQpLmRpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIGFkZGl0aXZlbHkgaG9tb21vcnBoaWMgZW5jcnlwdGlvbiBrZXkuXG4gICAgbGV0IHBhaWxsaWVyS2V5UGFpcjogcGFpbGxpZXJCaWdpbnQuS2V5UGFpcjtcbiAgICBpZiAoIXN5bmMpIHtcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IGF3YWl0IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5cyhtaW5Nb2R1bHVzQml0TGVuZ3RoLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcbiAgICAgIHBhaWxsaWVyS2V5UGFpciA9IHBhaWxsaWVyQmlnaW50LmdlbmVyYXRlUmFuZG9tS2V5c1N5bmMobWluTW9kdWx1c0JpdExlbmd0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHVibGljS2V5LCBwcml2YXRlS2V5IH0gPSBwYWlsbGllcktleVBhaXI7XG4gICAgLy8gQWNjZXB0IGEgNjQgYnl0ZSBzZWVkIGFuZCBjcmVhdGUgYW4gZXh0ZW5kZWQgcHJpdmF0ZSBrZXkgZnJvbSB0aGF0IHNlZWRcbiAgICBjb25zdCBzZWNyZXRLZXkgPSBzZWVkV2l0aFZhbGlkTGVuZ3RoICYmIGJpcDMyLmZyb21TZWVkKHNlZWRXaXRoVmFsaWRMZW5ndGgpO1xuICAgIGNvbnN0IHUgPVxuICAgICAgKHNlY3JldEtleSAmJiBzZWNyZXRLZXkucHJpdmF0ZUtleSAmJiBiaWdJbnRGcm9tVThBQkUobmV3IFVpbnQ4QXJyYXkoc2VjcmV0S2V5LnByaXZhdGVLZXkpKSkgPz9cbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhclJhbmRvbSgpO1xuICAgIGNvbnN0IHkgPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHUpO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IChzZWNyZXRLZXkgJiYgc2VjcmV0S2V5LmNoYWluQ29kZSkgPz8gcmFuZG9tQnl0ZXMoMzIpO1xuICAgIC8vIENvbXB1dGUgc2VjcmV0IHNoYXJlcyBvZiB0aGUgcHJpdmF0ZSBrZXlcbiAgICBjb25zdCB7IHNoYXJlczogdVNoYXJlcywgdiB9ID0gRWNkc2Euc2hhbWlyLnNwbGl0KHUsIHRocmVzaG9sZCwgbnVtU2hhcmVzKTtcbiAgICBjb25zdCBjdXJyZW50UGFydGljaXBhbnQ6IFBTaGFyZSA9IHtcbiAgICAgIGk6IGluZGV4LFxuICAgICAgdDogdGhyZXNob2xkLFxuICAgICAgYzogbnVtU2hhcmVzLFxuICAgICAgbDogYmlnSW50VG9CdWZmZXJCRShwcml2YXRlS2V5LmxhbWJkYSwgMTkyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBiaWdJbnRUb0J1ZmZlckJFKHByaXZhdGVLZXkubXUsIDE5MikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgbjogYmlnSW50VG9CdWZmZXJCRShwdWJsaWNLZXkubiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHVTaGFyZXNbaW5kZXhdLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdXU6IHUudG9TdHJpbmcoKSxcbiAgICAgIGNoYWluY29kZTogY2hhaW5jb2RlLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICAgIGNvbnN0IGtleVNoYXJlOiBLZXlTaGFyZSA9IHtcbiAgICAgIHBTaGFyZTogY3VycmVudFBhcnRpY2lwYW50LFxuICAgICAgblNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gdVNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IHBhcnNlSW50KHNoYXJlLCAxMCk7XG4gICAgICBpZiAocGFydGljaXBhbnRJbmRleCAhPT0gaW5kZXgpIHtcbiAgICAgICAga2V5U2hhcmUublNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgICBpOiBwYXJ0aWNpcGFudEluZGV4LFxuICAgICAgICAgIGo6IGN1cnJlbnRQYXJ0aWNpcGFudFsnaSddLFxuICAgICAgICAgIG46IHB1YmxpY0tleS5uLnRvU3RyaW5nKDE2KSxcbiAgICAgICAgICB5OiBiaWdJbnRUb0J1ZmZlckJFKHksIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRSh2WzBdLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUodVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBjaGFpbmNvZGU6IGNoYWluY29kZS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0gYXMgTlNoYXJlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5U2hhcmU7XG4gIH1cblxuICAvKipcbiAgICogQ29tYmluZSBkYXRhIHNoYXJlZCBkdXJpbmcgdGhlIGtleSBnZW5lcmF0aW9uIHByb3RvY29sLlxuICAgKiBAcGFyYW0ge0tleVNoYXJlfSBwYXJ0aWNpcGFudFNoYXJlcyBwcml2YXRlIHAtc2hhcmUgYW5kXG4gICAqIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHJldHVybnMge0tleUNvbWJpbmVkfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHgtc2hhcmVcbiAgICogYW5kIHktc2hhcmVzIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNpZ25pbmcgc2hhcmVzLlxuICAgKi9cbiAga2V5Q29tYmluZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10pOiBLZXlDb21iaW5lZCB7XG4gICAgY29uc3QgYWxsU2hhcmVzID0gW3BTaGFyZSwgLi4ublNoYXJlc107XG4gICAgLy8gQ29tcHV0ZSB0aGUgcHVibGljIGtleS5cbiAgICBjb25zdCB5ID0gYWxsU2hhcmVzLm1hcCgocGFydGljaXBhbnQpID0+IGhleFRvQmlnSW50KHBhcnRpY2lwYW50Wyd5J10pKS5yZWR1Y2UoRWNkc2EuY3VydmUucG9pbnRBZGQpO1xuICAgIC8vIEFkZCBzZWNyZXQgc2hhcmVzXG4gICAgY29uc3QgeCA9IGFsbFNoYXJlcy5tYXAoKHBhcnRpY2lwYW50KSA9PiBoZXhUb0JpZ0ludChwYXJ0aWNpcGFudFsndSddKSkucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBWZXJpZnkgc2hhcmVzLlxuICAgIGZvciAoY29uc3Qgc2hhcmUgb2YgblNoYXJlcykge1xuICAgICAgaWYgKHNoYXJlLnYpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBFY2RzYS5zaGFtaXIudmVyaWZ5KGhleFRvQmlnSW50KHNoYXJlLnUpLCBbaGV4VG9CaWdJbnQoc2hhcmUueSksIGhleFRvQmlnSW50KHNoYXJlLnYpXSwgcFNoYXJlLmkpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZnJvbSBwYXJ0aWNpcGFudCAke3NoYXJlLmp9LiBWZXJpZmljYXRpb24gZXJyb3I6ICR7ZXJyfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgU2Nobm9yciBwcm9vZiBvZiBrbm93bGVkZ2Ugb2YgdGhlIGRpc2NyZXRlIGxvZyBvZiBYID0geEcuXG4gICAgY29uc3QgWCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoeCk7XG5cbiAgICBjb25zdCBwcm9vZkNvbnRleHQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoYmlnSW50VG9CdWZmZXJCRSh5LCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSkuZGlnZXN0KCk7XG5cbiAgICBjb25zdCBzY2hub3JyUHJvb2ZYID0gU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YoWCwgeCwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG5cbiAgICAvLyBDaGFpbmNvZGUgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBrZXkgZGVyaXZhdGlvbiBmb3IgZWNkc2FcbiAgICBjb25zdCBjaGFpbmNvZGVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKCh7IGNoYWluY29kZSB9KSA9PiBiaWdJbnRGcm9tQnVmZmVyQkUoQnVmZmVyLmZyb20oY2hhaW5jb2RlLCAnaGV4JykpKTtcbiAgICBjb25zdCBjaGFpbmNvZGUgPSBjaGFpbmNvZGVzLnJlZHVjZShcbiAgICAgIChhY2MsIGNoYWluY29kZSkgPT5cbiAgICAgICAgKGFjYyArIGNoYWluY29kZSkgJSBCaWdJbnQoJzB4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJykgLy8gMl4yNTZcbiAgICApO1xuXG4gICAgY29uc3QgcGFydGljaXBhbnRzOiBLZXlDb21iaW5lZCA9IHtcbiAgICAgIHhTaGFyZToge1xuICAgICAgICBpOiBwU2hhcmUuaSxcbiAgICAgICAgbDogcFNoYXJlLmwsXG4gICAgICAgIG06IHBTaGFyZS5tLFxuICAgICAgICBuOiBwU2hhcmUubixcbiAgICAgICAgeTogYmlnSW50VG9CdWZmZXJCRSh5LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKHgsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHNjaG5vcnJQcm9vZlg6IHNjaG5vcnJQcm9vZlgsXG4gICAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShjaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgeVNoYXJlczoge30sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgc2hhcmUgaW4gblNoYXJlcykge1xuICAgICAgY29uc3QgcGFydGljaXBhbnRJbmRleCA9IG5TaGFyZXNbc2hhcmVdWydqJ107XG4gICAgICBwYXJ0aWNpcGFudHMueVNoYXJlc1twYXJ0aWNpcGFudEluZGV4XSA9IHtcbiAgICAgICAgaTogcFNoYXJlLmksXG4gICAgICAgIGo6IG5TaGFyZXNbc2hhcmVdWydqJ10sXG4gICAgICAgIG46IG5TaGFyZXNbc2hhcmVdWyduJ10sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gcGFydGljaXBhbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBzaGFyZXMgZm9yIGEgQklQLTMyIHN1YmtleS5cbiAgICogQHBhcmFtIHtQU2hhcmV9IFRoZSB1c2VyJ3MgcC1zaGFyZS5cbiAgICogQHBhcmFtIHtOU2hhcmVbXX0gVGhlIG4tc2hhcmVzIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm5zIHtTdWJrZXlTaGFyZX0gUmV0dXJucyB0aGUgcHJpdmF0ZSB4LXNoYXJlIGFuZCBuLXNoYXJlcyB0b1xuICAgKiBiZSBkaXN0cmlidXRlZCB0byBwYXJ0aWNpcGFudHMgYXQgdGhlaXIgY29ycmVzcG9uZGluZyBpbmRleC5cbiAgICovXG4gIGtleURlcml2ZShwU2hhcmU6IFBTaGFyZSwgblNoYXJlczogTlNoYXJlW10sIHBhdGg6IHN0cmluZyk6IFN1YmtleVNoYXJlIHtcbiAgICBjb25zdCB5VmFsdWVzID0gW3BTaGFyZSwgLi4ublNoYXJlc10ubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmUueSkpO1xuICAgIGNvbnN0IHkgPSB5VmFsdWVzLnJlZHVjZSgocGFydGlhbCwgc2hhcmUpID0+IEVjZHNhLmN1cnZlLnBvaW50QWRkKHBhcnRpYWwsIHNoYXJlKSk7XG4gICAgY29uc3QgdSA9IEJpZ0ludChwU2hhcmUudXUpO1xuICAgIGxldCBjb250cmliQ2hhaW5jb2RlID0gaGV4VG9CaWdJbnQocFNoYXJlLmNoYWluY29kZSk7XG4gICAgY29uc3QgY2hhaW5jb2RlcyA9IFtjb250cmliQ2hhaW5jb2RlLCAuLi5uU2hhcmVzLm1hcCgoeyBjaGFpbmNvZGUgfSkgPT4gaGV4VG9CaWdJbnQoY2hhaW5jb2RlKSldO1xuICAgIGNvbnN0IGNoYWluY29kZSA9IGNoYWluY29kZXMucmVkdWNlKChhY2MsIGNoYWluY29kZSkgPT4gKGFjYyArIGNoYWluY29kZSkgJSBjaGFpbmNvZGVCYXNlKTtcblxuICAgIC8vIFZlcmlmeSBzaGFyZXMuXG4gICAgZm9yIChjb25zdCBzaGFyZSBvZiBuU2hhcmVzKSB7XG4gICAgICBpZiAoc2hhcmUudikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEVjZHNhLnNoYW1pci52ZXJpZnkoaGV4VG9CaWdJbnQoc2hhcmUudSksIFtoZXhUb0JpZ0ludChzaGFyZS55KSwgaGV4VG9CaWdJbnQoc2hhcmUudildLCBwU2hhcmUuaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHZlcmlmeSBzaGFyZSBmcm9tIHBhcnRpY2lwYW50ICR7c2hhcmUuan0uIFZlcmlmaWNhdGlvbiBlcnJvcjogJHtlcnJ9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc3Via2V5LlxuICAgIGNvbnN0IHN1YmtleSA9IEVjZHNhLmhkVHJlZS5wcml2YXRlRGVyaXZlKHsgcGs6IHksIHNrOiB1LCBjaGFpbmNvZGUgfSwgcGF0aCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHB1YmxpYyBrZXkgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNvbnRyaWJZID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChzdWJrZXkuc2spO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBjaGFpbmNvZGUgY29udHJpYnV0aW9uLlxuICAgIGNvbnN0IGNoYWluY29kZURlbHRhID0gKGNoYWluY29kZUJhc2UgKyBzdWJrZXkuY2hhaW5jb2RlIC0gY2hhaW5jb2RlKSAlIGNoYWluY29kZUJhc2U7XG4gICAgY29udHJpYkNoYWluY29kZSA9IChjb250cmliQ2hhaW5jb2RlICsgY2hhaW5jb2RlRGVsdGEpICUgY2hhaW5jb2RlQmFzZTtcblxuICAgIC8vIENhbGN1bGF0ZSBuZXcgdSB2YWx1ZXMuXG4gICAgY29uc3QgeyBzaGFyZXM6IHNwbGl0X3UsIHYgfSA9IEVjZHNhLnNoYW1pci5zcGxpdChzdWJrZXkuc2ssIHBTaGFyZS50IHx8IDIsIHBTaGFyZS5jIHx8IDMpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyBzaWduaW5nIGtleS5cbiAgICBjb25zdCB4ID0gW3NwbGl0X3VbcFNoYXJlLmldLCAuLi5uU2hhcmVzLm1hcCgoeyB1IH0pID0+IGhleFRvQmlnSW50KHUpKV0ucmVkdWNlKEVjZHNhLmN1cnZlLnNjYWxhckFkZCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBTY2hub3JyIHByb29mIG9mIGtub3dsZWRnZSBvZiB0aGUgZGlzY3JldGUgbG9nIG9mIFggPSB4Ry5cbiAgICBjb25zdCBYID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh4KTtcblxuICAgIGNvbnN0IHByb29mQ29udGV4dCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKHN1YmtleS5waywgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuXG4gICAgY29uc3Qgc2Nobm9yclByb29mWCA9IFNjaG5vcnIuY3JlYXRlU2Nobm9yclByb29mKFgsIHgsIEVjZHNhLmN1cnZlLCBwcm9vZkNvbnRleHQpO1xuXG4gICAgY29uc3QgUF9pOiBYU2hhcmUgPSB7XG4gICAgICBpOiBwU2hhcmUuaSxcbiAgICAgIGw6IHBTaGFyZS5sLFxuICAgICAgbTogcFNoYXJlLm0sXG4gICAgICBuOiBwU2hhcmUubixcbiAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoc3Via2V5LnBrLCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh4LCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2Nobm9yclByb29mWDogc2Nobm9yclByb29mWCxcbiAgICAgIGNoYWluY29kZTogYmlnSW50VG9CdWZmZXJCRShzdWJrZXkuY2hhaW5jb2RlLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCBzaGFyZXM6IFN1YmtleVNoYXJlID0ge1xuICAgICAgeFNoYXJlOiBQX2ksXG4gICAgICBuU2hhcmVzOiB7fSxcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgblNoYXJlcy5sZW5ndGg7IGluZCsrKSB7XG4gICAgICBjb25zdCBQX2ogPSBuU2hhcmVzW2luZF07XG4gICAgICBzaGFyZXMublNoYXJlc1tQX2oual0gPSB7XG4gICAgICAgIGk6IFBfai5qLFxuICAgICAgICBqOiBQX2kuaSxcbiAgICAgICAgbjogUF9pLm4sXG4gICAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUoc3BsaXRfdVtQX2oual0sIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHk6IGJpZ0ludFRvQnVmZmVyQkUoY29udHJpYlksIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUodlswXSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgY2hhaW5jb2RlOiBiaWdJbnRUb0J1ZmZlckJFKGNvbnRyaWJDaGFpbmNvZGUsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaGFyZXM7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IFNjaG5vcnIgcHJvb2Ygb2Yga25vd2xlZGdlIG9mIHRoZSBkaXNjcmV0ZSBsb2cgb2YgWF9pID0geF9pICogRy5cbiAgICogQHBhcmFtIFkgVGhlIGNvbWJpbmVkIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBWU1NzIFRoZSBWU1Mgc2hhcmVzIHJlY2VpdmVkIGZyb20gYWxsIHBhcnRpY2lwYW50cy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpIG9mIFhfaS5cbiAgICogQHBhcmFtIHByb29mIFRoZSBzY2hub3JyIHByb29mLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGl0J3MgYSB2YWxpZCBwcm9vZiB3aXRoIHJlZ2FyZHMgdG8gWSBhbmQgVlNTcy5cbiAgICovXG4gIHZlcmlmeVNjaG5vcnJQcm9vZlgoWTogYmlnaW50LCBWU1NzOiBiaWdpbnRbXVtdLCBpbmRleDogbnVtYmVyLCBwcm9vZjogU2Nobm9yclByb29mKTogYm9vbGVhbiB7XG4gICAgaWYgKGluZGV4IDwgMSB8fCBpbmRleCA+IFZTU3MubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdmFsdWUgc3VwcGxpZWQgZm9yIGluZGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIFhfaSBmcm9tIHB1YmxpYyBpbmZvcm1hdGlvbi5cbiAgICBsZXQgWF9pID0gWTtcbiAgICBWU1NzLmZvckVhY2goKFZTUykgPT4ge1xuICAgICAgVlNTLmZvckVhY2goKHYpID0+IHtcbiAgICAgICAgWF9pID0gRWNkc2EuY3VydmUucG9pbnRBZGQoWF9pLCBFY2RzYS5jdXJ2ZS5wb2ludE11bHRpcGx5KHYsIEJpZ0ludChpbmRleCkpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGJpZ0ludFRvQnVmZmVyQkUoWSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcykpLmRpZ2VzdCgpO1xuICAgIHJldHVybiBTY2hub3JyLnZlcmlmeVNjaG5vcnJQcm9vZihYX2ksIHByb29mLCBFY2RzYS5jdXJ2ZSwgcHJvb2ZDb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmVzIGEgY2hpbGQgY29tbW9uIGtleWNoYWluIGZyb20gY29tbW9uIGtleWNoYWluXG4gICAqXG4gICAqIEBwYXJhbSB7Y29tbW9uS2V5Y2hhaW59IFRoZSBjb21tb24ga2V5Y2hhaW4gYXMgYSBoZXggc3RyaW5nLlxuICAgKiBAcGFyYW0ge3BhdGh9IFRoZSBCSVAtMzIgcGF0aCB0byBkZXJpdmUuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlcml2ZWQgY29tbW9uIGtleWNoYWluIGFzIGEgaGV4IHN0cmluZy5cbiAgICovXG4gIGRlcml2ZVVuaGFyZGVuZWQoY29tbW9uS2V5Y2hhaW46IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoRWNkc2EuaGRUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGRlcml2ZSBrZXkgd2l0aG91dCBIRFRyZWUgaW1wbGVtZW50YXRpb25cIik7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5Y2hhaW4gPSBCdWZmZXIuZnJvbShjb21tb25LZXljaGFpbiwgJ2hleCcpO1xuXG4gICAgY29uc3QgZGVyaXZlZFB1YmxpY0tleWNoYWluID0gRWNkc2EuaGRUcmVlLnB1YmxpY0Rlcml2ZShcbiAgICAgIHtcbiAgICAgICAgcGs6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgwLCAzMykpLFxuICAgICAgICBjaGFpbmNvZGU6IGJpZ0ludEZyb21CdWZmZXJCRShrZXljaGFpbi5zbGljZSgzMykpLFxuICAgICAgfSxcbiAgICAgIHBhdGhcbiAgICApO1xuXG4gICAgY29uc3QgZGVyaXZlZFBrID0gYmlnSW50VG9CdWZmZXJCRShkZXJpdmVkUHVibGljS2V5Y2hhaW4ucGssIDMzKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZGVyaXZlZENoYWluY29kZSA9IGJpZ0ludFRvQnVmZmVyQkUoZGVyaXZlZFB1YmxpY0tleWNoYWluLmNoYWluY29kZSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIHJldHVybiBkZXJpdmVkUGsgKyBkZXJpdmVkQ2hhaW5jb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBnaXZlbiByYW5nZSBwcm9vZiBjaGFsbGVuZ2UgdG8gdGhlIHNoYXJlcyBwcmV2aW91c2x5IGNyZWF0ZWRcbiAgICogYnkgI2tleUNvbWJpbmUuIEdlbmVyYXRlcyBhIG5ldyBjaGFsbGVuZ2UgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge1hTaGFyZSB8IFlTaGFyZX0gc2hhcmUgUHJpdmF0ZSB4U2hhcmUgb3IgeVNoYXJlIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gcmFuZ2VQcm9vZkNoYWxsZW5nZSAtIGNoYWxsZW5nZSBnZW5lcmF0ZWQgdmlhIGdlbmVyYXRlTnRpbGRlXG4gICAqIEBwYXJhbSBwYWlsbGllclByb29mQ2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIHtLZXlDb21iaW5lZH0gVGhlIHNoYXJlIHdpdGggYW1lbmRlZCBjaGFsbGVuZ2UgdmFsdWVzXG4gICAqL1xuICBhcHBlbmRDaGFsbGVuZ2U8VD4oXG4gICAgc2hhcmU6IFQsXG4gICAgcmFuZ2VQcm9vZkNoYWxsZW5nZTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlLFxuICAgIHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2U6IEVjZHNhVHlwZXMuU2VyaWFsaXplZFBhaWxsaWVyQ2hhbGxlbmdlXG4gICk6IFQgJiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWRFY2RzYUNoYWxsZW5nZXMge1xuICAgIGNvbnN0IHsgbnRpbGRlLCBoMSwgaDIgfSA9IHJhbmdlUHJvb2ZDaGFsbGVuZ2U7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlLFxuICAgICAgbnRpbGRlLFxuICAgICAgaDEsXG4gICAgICBoMixcbiAgICAgIHA6IHBhaWxsaWVyUHJvb2ZDaGFsbGVuZ2UucCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzaWduaW5nIHNoYXJlcy5cbiAgICogQHBhcmFtIHt4U2hhcmV9IHhTaGFyZSBQcml2YXRlIHhTaGFyZSBvZiBjdXJyZW50IHBhcnRpY2lwYW50IHNpZ25lclxuICAgKiBAcGFyYW0ge1lTaGFyZX0geVNoYXJlIHlTaGFyZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdGhlciBwYXJ0aWNpcGFudCBzaWduZXJcbiAgICogQHJldHVybnMge1NpZ25TaGFyZVJUfSBSZXR1cm5zIHRoZSBwYXJ0aWNpcGFudCBwcml2YXRlIHctc2hhcmVcbiAgICogYW5kIGstc2hhcmUgdG8gYmUgZGlzdHJpYnV0ZWQgdG8gb3RoZXIgcGFydGljaXBhbnQgc2lnbmVyXG4gICAqL1xuICBhc3luYyBzaWduU2hhcmUoeFNoYXJlOiBYU2hhcmVXaXRoQ2hhbGxlbmdlcywgeVNoYXJlOiBZU2hhcmVXaXRoQ2hhbGxlbmdlcyk6IFByb21pc2U8U2lnblNoYXJlUlQ+IHtcbiAgICBjb25zdCBwayA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KHhTaGFyZS5uKSk7XG5cbiAgICBjb25zdCBrID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG4gICAgY29uc3QgcmsgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhway5uKTtcbiAgICBjb25zdCBjayA9IHBrLmVuY3J5cHQoaywgcmspO1xuICAgIGNvbnN0IGdhbW1hID0gRWNkc2EuY3VydmUuc2NhbGFyUmFuZG9tKCk7XG5cbiAgICBjb25zdCBkID0gRWNkc2EuY3VydmUuc2NhbGFyTXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJTdWIoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksIEJpZ0ludCh4U2hhcmUuaSkpO1xuXG4gICAgY29uc3QgdyA9IFtcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoQmlnSW50KHlTaGFyZS5qKSwgQmlnSW50KHhTaGFyZS5pKSksXG4gICAgICBoZXhUb0JpZ0ludCh4U2hhcmVbJ3gnXSksXG4gICAgICBFY2RzYS5jdXJ2ZS5zY2FsYXJJbnZlcnQoZCksXG4gICAgXS5yZWR1Y2UoRWNkc2EuY3VydmUuc2NhbGFyTXVsdCk7XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYSwgaDE6IGgxYSwgaDI6IGgyYSB9ID0geFNoYXJlO1xuXG4gICAgY29uc3Qgd1NoYXJlOiBXU2hhcmUgPSB7XG4gICAgICBpOiB4U2hhcmUuaSxcbiAgICAgIGw6IHhTaGFyZS5sLFxuICAgICAgbTogeFNoYXJlLm0sXG4gICAgICBuOiB4U2hhcmUubixcbiAgICAgIHk6IHhTaGFyZS55LFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGNrOiBiaWdJbnRUb0J1ZmZlckJFKGNrLCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUodywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIGdhbW1hOiBiaWdJbnRUb0J1ZmZlckJFKGdhbW1hLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBjb25zdCB7IG50aWxkZTogbnRpbGRlYiwgaDE6IGgxYiwgaDI6IGgyYiB9ID0geVNoYXJlO1xuICAgIGNvbnN0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGssXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogaGV4VG9CaWdJbnQobnRpbGRlYiksXG4gICAgICAgIGgxOiBoZXhUb0JpZ0ludChoMWIpLFxuICAgICAgICBoMjogaGV4VG9CaWdJbnQoaDJiKSxcbiAgICAgIH0sXG4gICAgICBjayxcbiAgICAgIGssXG4gICAgICBya1xuICAgICk7XG5cbiAgICAvLyBjcmVhdGUgcGFpbGxpZXIgY2hhbGxlbmdlIHByb29mIGJhc2VkIG9uIHRoZSBvdGhlciBzaWduZXJzIGNoYWxsZW5nZVxuICAgIC8vIG9ubHkgc2VuZCBzaWdtYSBpZiB3ZSBhbHNvIHNlbmQgY2hhbGxlbmdlIHBcbiAgICBjb25zdCBzaWdtYSA9IEVjZHNhUGFpbGxpZXJQcm9vZi5wcm92ZShcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5uKSxcbiAgICAgIGhleFRvQmlnSW50KHhTaGFyZS5sKSxcbiAgICAgIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZSh7IHA6IHlTaGFyZS5wIH0pLnBcbiAgICApO1xuXG4gICAgY29uc3QgcHJvb2ZTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3Qga1NoYXJlOiBLU2hhcmUgPSB7XG4gICAgICAvLyB0aGlzIHNoYXJlIHdpbGwgYmUgc2VudCB0byB0aGUgb3RoZXIgcGFydGljaXBhbnQsXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIHN3YXAgdGhlIGkgYW5kIGogdmFsdWVzIGhlcmVcbiAgICAgIC8vIHNvIHRoYXQgdGhleSBrbm93IGl0J3MgdGhlaXIga1NoYXJlLCBwcm9kdWNlZCBieSB1c1xuICAgICAgaTogeVNoYXJlLmosXG4gICAgICBqOiB4U2hhcmUuaSxcbiAgICAgIG46IHBrLm4udG9TdHJpbmcoMTYpLFxuICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgaDE6IGgxYSxcbiAgICAgIGgyOiBoMmEsXG4gICAgICBwOiB4U2hhcmUucCxcbiAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoY2ssIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgc2lnbWE6IEVjZHNhVHlwZXMuc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZnMoeyBzaWdtYTogc2lnbWEgfSkuc2lnbWEsXG4gICAgICBwcm9vZjogcHJvb2ZTaGFyZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdTaGFyZSxcbiAgICAgIGtTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBDb25uZWN0aW9uIDEuMiBpbiBodHRwczovL2x1Y2lkLmFwcC9sdWNpZGNoYXJ0LzcwNjE3ODViLWJjNWMtNDAwMi1iNTQ2LTNmNGEzNjEyZmM2Mi9lZGl0P3BhZ2U9SUFWbXZZTzRGdktjI1xuICAgKiBJZiBzaWduZXIgQSBjb21wbGV0ZWQgc2lnblNoYXJlIGluaXRpYWxseSAoaW5wdXQgdG8gdGhpcyBmbiksIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMShzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDEpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDFSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkS1NoYXJlID0gc2hhcmVzLmtTaGFyZTtcbiAgICBjb25zdCB4U2hhcmUgPSBzaGFyZXMueFNoYXJlOyAvLyBjdXJyZW50UGFydGljaXBhbnQgc2VjcmV0IHhTaGFyZVxuICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAuLi5zaGFyZXMueVNoYXJlLFxuICAgICAgbnRpbGRlOiByZWNlaXZlZEtTaGFyZS5udGlsZGUsXG4gICAgICBoMTogcmVjZWl2ZWRLU2hhcmUuaDEsXG4gICAgICBoMjogcmVjZWl2ZWRLU2hhcmUuaDIsXG4gICAgICBwOiByZWNlaXZlZEtTaGFyZS5wLFxuICAgIH07XG4gICAgY29uc3Qgc2lnblNoYXJlID0gYXdhaXQgdGhpcy5zaWduU2hhcmUoeFNoYXJlLCB5U2hhcmUpO1xuICAgIGNvbnN0IHNoYXJlUGFydGljaXBhbnQgPSBzaWduU2hhcmUud1NoYXJlO1xuXG4gICAgaWYgKHNoYXJlUGFydGljaXBhbnQuaSAhPT0gcmVjZWl2ZWRLU2hhcmUuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRLU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gdGhlIG90aGVyIHBhcnRpY2lwYW50cyBwYWlsbGllciBwdWJsaWMga2V5XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLm4pO1xuICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIC8vIHRoZSBvdGhlciBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5oMik7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudCdzIHJhbmdlIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgY29uc3QgaDFiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgY29uc3QgaDJiID0gaGV4VG9CaWdJbnQoc2hhcmVQYXJ0aWNpcGFudC5oMik7XG5cbiAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQocmVjZWl2ZWRLU2hhcmUuayk7XG5cbiAgICAvLyB0aGUgY3VycmVudCBwYXJ0aWNpcGFudHMgcGFpbGxpZXIgcHJvb2YgY2hhbGxlbmdlXG4gICAgY29uc3Qgc2hhcmVQYXJ0aWNpcGFudFBhaWxsaWVyQ2hhbGxlbmdlID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlKHsgcDogc2hhcmVQYXJ0aWNpcGFudC5wIH0pO1xuICAgIC8vIHRoZSBvdGhlciBzaWduaW5nIHBhcnRpZXMgcHJvb2YgdG8gdGhlIGN1cnJlbnQgcGFydGljaXBhbnRzIHBhaWxsaWVyIHByb29mIGNoYWxsZW5nZVxuICAgIGNvbnN0IHJlY2VpdmVkUGFpbGxpZXJDaGFsbGVuZ2VQcm9vZiA9IEVjZHNhVHlwZXMuZGVzZXJpYWxpemVQYWlsbGllckNoYWxsZW5nZVByb29mcyh7XG4gICAgICBzaWdtYTogcmVjZWl2ZWRLU2hhcmUuc2lnbWEsXG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgIShhd2FpdCBFY2RzYVBhaWxsaWVyUHJvb2YudmVyaWZ5KG4sIHNoYXJlUGFydGljaXBhbnRQYWlsbGllckNoYWxsZW5nZS5wLCByZWNlaXZlZFBhaWxsaWVyQ2hhbGxlbmdlUHJvb2Yuc2lnbWEpKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwYWlsbGllciBwcm9vZicpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGViLFxuICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgaDI6IGgyYixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEtTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkS1NoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBiZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZyA9IGhleFRvQmlnSW50KHNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgIGNvbnN0IHJiID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNiID0gcGthLmVuY3J5cHQoYmV0YTAsIHJiKTtcbiAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICBjb25zdCBhbHBoYVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgQUxQSEFNVVNJWkUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3QgZ3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KGcpO1xuICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgIHBrYSxcbiAgICAgIHtcbiAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICBoMTogaDFhLFxuICAgICAgICBoMjogaDJhLFxuICAgICAgfSxcbiAgICAgIGssXG4gICAgICBhbHBoYSxcbiAgICAgIGcsXG4gICAgICBiZXRhMCxcbiAgICAgIHJiLFxuICAgICAgZ3hcbiAgICApO1xuICAgIGNvbnN0IGdhbW1hUHJvb2ZUb0JlU2VudDogUmFuZ2VQcm9vZldpdGhDaGVja1NoYXJlID0ge1xuICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MSwgMjI0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB4OiBiaWdJbnRUb0J1ZmZlckJFKGd4LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG4gICAgLy8gTXRBICRrX2osIHdfaSQuXG4gICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgIGNvbnN0IG51ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG51MCkpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChzaGFyZVBhcnRpY2lwYW50LncpO1xuICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgIGNvbnN0IGNuID0gcGthLmVuY3J5cHQobnUwLCBybik7XG4gICAgY29uc3QgbXUgPSBwa2EuYWRkaXRpb24ocGthLm11bHRpcGx5KGssIHcpLCBjbik7XG4gICAgY29uc3QgbXVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIEFMUEhBTVVTSVpFKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gUHJvdmUgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgY29uc3Qgd3ggPSBFY2RzYS5jdXJ2ZS5iYXNlUG9pbnRNdWx0KHcpO1xuICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGthLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgIGgxOiBoMWEsXG4gICAgICAgIGgyOiBoMmEsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGhleFRvQmlnSW50KG11VG9CZVNlbnQpLFxuICAgICAgdyxcbiAgICAgIG51MCxcbiAgICAgIHJuLFxuICAgICAgd3hcbiAgICApO1xuICAgIGNvbnN0IHdQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUod3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcblxuICAgIGNvbnN0IG5Ub0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUubjtcbiAgICBjb25zdCBudGlsZGVUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUobnRpbGRlYiwgMzg0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgaDFUb0JlU2VudCA9IGJpZ0ludFRvQnVmZmVyQkUoaDFiLCAzODQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBoMlRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShoMmIsIDM4NCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IGtUb0JlU2VudCA9IHNpZ25TaGFyZS5rU2hhcmUuaztcbiAgICBjb25zdCBwcm9vZlRvQmVTZW50ID0gc2lnblNoYXJlLmtTaGFyZS5wcm9vZjtcbiAgICBjb25zdCBbaVRvQmVTZW50LCBqVG9CZVNlbnRdID0gW3JlY2VpdmVkS1NoYXJlLmosIHJlY2VpdmVkS1NoYXJlLmldO1xuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHtcbiAgICAgICAgaTogaVRvQmVTZW50LFxuICAgICAgICBqOiBqVG9CZVNlbnQsXG4gICAgICAgIG50aWxkZTogbnRpbGRlVG9CZVNlbnQsXG4gICAgICAgIGgxOiBoMVRvQmVTZW50LFxuICAgICAgICBoMjogaDJUb0JlU2VudCxcbiAgICAgICAgbjogblRvQmVTZW50LFxuICAgICAgICBrOiBrVG9CZVNlbnQsXG4gICAgICAgIGFscGhhOiBhbHBoYVRvQmVTZW50LFxuICAgICAgICBtdTogbXVUb0JlU2VudCxcbiAgICAgICAgcHJvb2Y6IHByb29mVG9CZVNlbnQsXG4gICAgICAgIGdhbW1hUHJvb2Y6IGdhbW1hUHJvb2ZUb0JlU2VudCxcbiAgICAgICAgd1Byb29mOiB3UHJvb2ZUb0JlU2VudCxcbiAgICAgICAgLy8gcHJvdmlkZSB0aGUgc2hhcmUgcGFydGljaXBhbnRzIHByb29mXG4gICAgICAgIC8vIHRvIHRoZSBwYWlsbGllciBjaGFsbGVuZ2UgaW4gdGhlIHJlY2VpdmVkS1NoYXJlIGZyb20gdGhlIG90aGVyIHNpZ25lclxuICAgICAgICBzaWdtYTogc2lnblNoYXJlLmtTaGFyZS5zaWdtYSxcbiAgICAgIH0sXG4gICAgICBiU2hhcmU6IHtcbiAgICAgICAgLi4uc2hhcmVQYXJ0aWNpcGFudCxcbiAgICAgICAgYmV0YSxcbiAgICAgICAgbnUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBtdWx0aXBsaWNpdGl2ZS10by1hZGRpdGl2ZSAoTXRBKSBzaGFyZSBjb252ZXJzaW9uIHdpdGggYW5vdGhlclxuICAgKiBzaWduZXIuXG4gICAqIENvbm5lY3Rpb24gMi4xIGluIGh0dHBzOi8vbHVjaWQuYXBwL2x1Y2lkY2hhcnQvNzA2MTc4NWItYmM1Yy00MDAyLWI1NDYtM2Y0YTM2MTJmYzYyL2VkaXQ/cGFnZT1JQVZtdllPNEZ2S2MjXG4gICAqIElmIHNpZ25lciBCIGNvbXBsZXRlZCBzaWduQ29udmVydFN0ZXAxLCB0aGVuIHRoaXMgc3RlcCBpcyBjb21wbGV0ZWQgYnkgc2lnbmVyIEEuXG4gICAqIEBwYXJhbSB7U2lnbkNvbnZlcnR9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbnZlcnRSVH1cbiAgICovXG4gIGFzeW5jIHNpZ25Db252ZXJ0U3RlcDIoc2hhcmVzOiBTaWduQ29udmVydFN0ZXAyKTogUHJvbWlzZTxTaWduQ29udmVydFN0ZXAyUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZWNlaXZlZEFTaGFyZSA9IHNoYXJlcy5hU2hhcmU7XG4gICAgaWYgKCFyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLm4pOyAvLyBQYWlsbGllciBwdWIgZnJvbSBvdGhlciBzaWduZXJcbiAgICAvLyBjdXJyZW50IHBhcnRpY2lwYW50IHB1YmxpYyBrZXlcbiAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm4pKTtcbiAgICBjb25zdCBudGlsZGVhID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDEpO1xuICAgIGNvbnN0IGgyYSA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUuaDIpO1xuICAgIGNvbnN0IGNrID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5jayk7XG5cbiAgICBjb25zdCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UgPSBFY2RzYVR5cGVzLmRlc2VyaWFsaXplUGFpbGxpZXJDaGFsbGVuZ2UoeyBwOiBzaGFyZXMud1NoYXJlLnAgfSk7XG4gICAgY29uc3QgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mID0gRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZVBhaWxsaWVyQ2hhbGxlbmdlUHJvb2ZzKHtcbiAgICAgIHNpZ21hOiBzaGFyZXMuYVNoYXJlLnNpZ21hLFxuICAgIH0pO1xuICAgIGlmICghRWNkc2FQYWlsbGllclByb29mLnZlcmlmeShuLCBzaGFyZVBhcnRpY2lwYW50UGFpbGxpZXJDaGFsbGVuZ2UucCwgcmVjZWl2ZWRQYWlsbGllckNoYWxsZW5nZVByb29mLnNpZ21hKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIHBhaWxsaWVyIHByb29mJyk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5ICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnopLFxuICAgICAgICAgIHpwcm06IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnYpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi50MiksXG4gICAgICAgICAgdTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmFscGhhKSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuZ2FtbWFQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgfVxuICAgIC8vIFZlcmlmeSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBpZiAoXG4gICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB6OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnpwcm0pLFxuICAgICAgICAgIHQ6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi50KSxcbiAgICAgICAgICB2OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi5zKSxcbiAgICAgICAgICBzMTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnMyKSxcbiAgICAgICAgICB0MTogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQxKSxcbiAgICAgICAgICB0MjogaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS53UHJvb2YudSksXG4gICAgICAgIH0sXG4gICAgICAgIGNrLFxuICAgICAgICBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5tdSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMud1NoYXJlLm0pLCBwa2EpO1xuXG4gICAgY29uc3QgZ1NoYXJlQWxwaGEgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUuYWxwaGEpKSksXG4gICAgICAzMlxuICAgICkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgY29uc3QgZ1NoYXJlTXUgPSBiaWdJbnRUb0J1ZmZlckJFKFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRBU2hhcmUubXUpKSksIC8vIHJlY2hlY2sgZW5jcnlwdGVkIG51bWJlclxuICAgICAgMzJcbiAgICApLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGlmICghcmVjZWl2ZWRBU2hhcmUucHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIHByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IHBrYiA9IGdldFBhaWxsaWVyUHVibGljS2V5KG4pO1xuICAgIGNvbnN0IG50aWxkZWIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5udGlsZGUpO1xuICAgIGNvbnN0IGgxYiA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5oMik7XG4gICAgY29uc3QgayA9IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLmspO1xuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGtiLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnopLFxuICAgICAgICAgIHU6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnUpLFxuICAgICAgICAgIHc6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLncpLFxuICAgICAgICAgIHM6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZEFTaGFyZS5wcm9vZi5zMSksXG4gICAgICAgICAgczI6IGhleFRvQmlnSW50KHJlY2VpdmVkQVNoYXJlLnByb29mLnMyKSxcbiAgICAgICAgfSxcbiAgICAgICAga1xuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgQSBzaGFyZSBwcm9vZicpO1xuICAgIH1cbiAgICAvLyBNdEEgJGtfaiwgXFxnYW1tYV9pJC5cbiAgICBjb25zdCBiZXRhMCA9IGJpZ2ludENyeXB0b1V0aWxzLnJhbmRCZXR3ZWVuKEVjZHNhLmN1cnZlLm9yZGVyKCkgKiogXzVuKTtcbiAgICBjb25zdCBnU2hhcmVCZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoc2hhcmVzLndTaGFyZS5nYW1tYSk7XG4gICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY2IgPSBwa2IuZW5jcnlwdChiZXRhMCwgcmIpO1xuICAgIGNvbnN0IGFscGhhID0gcGtiLmFkZGl0aW9uKHBrYi5tdWx0aXBseShrLCBnKSwgY2IpO1xuICAgIGNvbnN0IGFscGhhVG9CZVNlbnQgPSBiaWdJbnRUb0J1ZmZlckJFKGFscGhhLCBBTFBIQU1VU0laRSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCBneCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZyk7XG4gICAgbGV0IHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgRWNkc2EuY3VydmUsXG4gICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgcGtiLFxuICAgICAge1xuICAgICAgICBudGlsZGU6IG50aWxkZWIsXG4gICAgICAgIGgxOiBoMWIsXG4gICAgICAgIGgyOiBoMmIsXG4gICAgICB9LFxuICAgICAgayxcbiAgICAgIGFscGhhLFxuICAgICAgZyxcbiAgICAgIGJldGEwLFxuICAgICAgcmIsXG4gICAgICBneFxuICAgICk7XG4gICAgY29uc3QgZ2FtbWFQcm9vZlRvQmVTZW50OiBSYW5nZVByb29mV2l0aENoZWNrU2hhcmUgPSB7XG4gICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgenBybTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56cHJtLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdzogYmlnSW50VG9CdWZmZXJCRShwcm9vZi53LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHU6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgICAvLyBNdEEgJGtfaiwgd19pJC5cbiAgICBjb25zdCBudTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgY29uc3QgZ1NoYXJlTnUgPSBiaWdJbnRUb0J1ZmZlckJFKEVjZHNhLmN1cnZlLnNjYWxhck5lZ2F0ZShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobnUwKSksIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KHNoYXJlcy53U2hhcmUudyk7XG4gICAgY29uc3Qgcm4gPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Iubik7XG4gICAgY29uc3QgY24gPSBwa2IuZW5jcnlwdChudTAsIHJuKTtcbiAgICBjb25zdCBtdSA9IHBrYi5hZGRpdGlvbihwa2IubXVsdGlwbHkoaywgdyksIGNuKTtcbiAgICBjb25zdCBtdVRvQmVTZW50ID0gYmlnSW50VG9CdWZmZXJCRShtdSwgQUxQSEFNVVNJWkUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICBjb25zdCB3eCA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQodyk7XG4gICAgcHJvb2YgPSBhd2FpdCBFY2RzYVJhbmdlUHJvb2YucHJvdmVXaXRoQ2hlY2soXG4gICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICBwa2IsXG4gICAgICB7XG4gICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgaDE6IGgxYixcbiAgICAgICAgaDI6IGgyYixcbiAgICAgIH0sXG4gICAgICBrLFxuICAgICAgaGV4VG9CaWdJbnQobXVUb0JlU2VudCksXG4gICAgICB3LFxuICAgICAgbnUwLFxuICAgICAgcm4sXG4gICAgICB3eFxuICAgICk7XG4gICAgY29uc3Qgd1Byb29mVG9CZVNlbnQ6IFJhbmdlUHJvb2ZXaXRoQ2hlY2tTaGFyZSA9IHtcbiAgICAgIHo6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YueiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHY6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudiwgNzY4KS50b1N0cmluZygnaGV4JyksXG4gICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHMxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnMxLCA5NikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdDI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuXG4gICAgY29uc3QgW2lUb0JlU2VudCwgalRvQmVTZW50XSA9IFtyZWNlaXZlZEFTaGFyZS5qLCByZWNlaXZlZEFTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgbXVTaGFyZToge1xuICAgICAgICBpOiBpVG9CZVNlbnQsXG4gICAgICAgIGo6IGpUb0JlU2VudCxcbiAgICAgICAgYWxwaGE6IGFscGhhVG9CZVNlbnQsXG4gICAgICAgIG11OiBtdVRvQmVTZW50LFxuICAgICAgICBnYW1tYVByb29mOiBnYW1tYVByb29mVG9CZVNlbnQsXG4gICAgICAgIHdQcm9vZjogd1Byb29mVG9CZVNlbnQsXG4gICAgICB9LFxuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy53U2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLndTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMud1NoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy53U2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLndTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLndTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IGdTaGFyZUJldGEsXG4gICAgICAgIG51OiBnU2hhcmVOdSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIG11bHRpcGxpY2l0aXZlLXRvLWFkZGl0aXZlIChNdEEpIHNoYXJlIGNvbnZlcnNpb24gd2l0aCBhbm90aGVyIHNpZ25lci5cbiAgICogQ29ubmVjdGlvbiAyLjIgaW4gaHR0cHM6Ly9sdWNpZC5hcHAvbHVjaWRjaGFydC83MDYxNzg1Yi1iYzVjLTQwMDItYjU0Ni0zZjRhMzYxMmZjNjIvZWRpdD9wYWdlPUlBVm12WU80RnZLYyNcbiAgICogSWYgc2lnbmVyIEEgY29tcGxldGVkIHNpZ25Db252ZXJ0U3RlcDIsIHRoZW4gdGhpcyBzdGVwIGlzIGNvbXBsZXRlZCBieSBzaWduZXIgQi5cbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnRTdGVwMyhzaGFyZXM6IFNpZ25Db252ZXJ0U3RlcDMpOiBQcm9taXNlPFNpZ25Db252ZXJ0U3RlcDNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlY2VpdmVkTXVTaGFyZSA9IHNoYXJlcy5tdVNoYXJlO1xuICAgIGlmICghcmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBtaXNzaW5nIGdhbW1hUHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgaWYgKCFyZWNlaXZlZE11U2hhcmUud1Byb29mKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICB9XG4gICAgY29uc3QgcGthID0gZ2V0UGFpbGxpZXJQdWJsaWNLZXkoaGV4VG9CaWdJbnQoc2hhcmVzLmJTaGFyZS5uKSk7XG4gICAgY29uc3QgbnRpbGRlYSA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUubnRpbGRlKTtcbiAgICBjb25zdCBoMWEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgxKTtcbiAgICBjb25zdCBoMmEgPSBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmgyKTtcbiAgICBjb25zdCBjayA9IGhleFRvQmlnSW50KHNoYXJlcy5iU2hhcmUuY2spO1xuICAgIC8vIFZlcmlmeSAkXFxnYW1tYV9pIFxcaW4gWl97Tl4yfSQuXG4gICAgaWYgKFxuICAgICAgIUVjZHNhUmFuZ2VQcm9vZi52ZXJpZnlXaXRoQ2hlY2soXG4gICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICBwa2EsXG4gICAgICAgIHtcbiAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgaDE6IGgxYSxcbiAgICAgICAgICBoMjogaDJhLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgejogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuenBybSksXG4gICAgICAgICAgdDogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudCksXG4gICAgICAgICAgdjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YudyksXG4gICAgICAgICAgczogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YucyksXG4gICAgICAgICAgczE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLmdhbW1hUHJvb2YuczIpLFxuICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi50MSksXG4gICAgICAgICAgdDI6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuZ2FtbWFQcm9vZi51KSxcbiAgICAgICAgfSxcbiAgICAgICAgY2ssXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5hbHBoYSksXG4gICAgICAgIGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS5nYW1tYVByb29mLngpXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2lnbmluZyBzaGFyZSBmb3IgZ2FtbWEgcHJvb2YnKTtcbiAgICB9XG4gICAgLy8gVmVyaWZ5ICRcXHdfaSBcXGluIFpfe05eMn0kLlxuICAgIGlmIChcbiAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHo6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YueiksXG4gICAgICAgICAgenBybTogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi56cHJtKSxcbiAgICAgICAgICB0OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQpLFxuICAgICAgICAgIHY6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudiksXG4gICAgICAgICAgdzogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi53KSxcbiAgICAgICAgICBzOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMpLFxuICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnMxKSxcbiAgICAgICAgICBzMjogaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi5zMiksXG4gICAgICAgICAgdDE6IGhleFRvQmlnSW50KHJlY2VpdmVkTXVTaGFyZS53UHJvb2YudDEpLFxuICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnQyKSxcbiAgICAgICAgICB1OiBoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUud1Byb29mLnUpLFxuICAgICAgICB9LFxuICAgICAgICBjayxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11KSxcbiAgICAgICAgaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLndQcm9vZi54KVxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNoYXJlIGZvciB3UHJvb2YnKTtcbiAgICB9XG4gICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLmwpLCBoZXhUb0JpZ0ludChzaGFyZXMuYlNoYXJlLm0pLCBwa2EpO1xuICAgIGNvbnN0IGFscGhhID0gc2suZGVjcnlwdChoZXhUb0JpZ0ludChyZWNlaXZlZE11U2hhcmUuYWxwaGEpKTtcbiAgICBjb25zdCBnU2hhcmVBbHBoYSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGFscGhhKSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBtdSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQocmVjZWl2ZWRNdVNoYXJlLm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICBjb25zdCBnU2hhcmVNdSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKG11KSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IFtpVG9CZVNlbnQsIGpUb0JlU2VudF0gPSBbcmVjZWl2ZWRNdVNoYXJlLmosIHJlY2VpdmVkTXVTaGFyZS5pXTtcbiAgICByZXR1cm4ge1xuICAgICAgZ1NoYXJlOiB7XG4gICAgICAgIGk6IHNoYXJlcy5iU2hhcmUuaSxcbiAgICAgICAgbjogc2hhcmVzLmJTaGFyZS5uLFxuICAgICAgICB5OiBzaGFyZXMuYlNoYXJlLnksXG4gICAgICAgIGs6IHNoYXJlcy5iU2hhcmUuayxcbiAgICAgICAgdzogc2hhcmVzLmJTaGFyZS53LFxuICAgICAgICBnYW1tYTogc2hhcmVzLmJTaGFyZS5nYW1tYSxcbiAgICAgICAgYWxwaGE6IGdTaGFyZUFscGhhLFxuICAgICAgICBtdTogZ1NoYXJlTXUsXG4gICAgICAgIGJldGE6IHNoYXJlcy5iU2hhcmUuYmV0YSxcbiAgICAgICAgbnU6IHNoYXJlcy5iU2hhcmUubnUsXG4gICAgICB9LFxuICAgICAgc2lnbkluZGV4OiB7XG4gICAgICAgIGk6IGlUb0JlU2VudCxcbiAgICAgICAgajogalRvQmVTZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbXVsdGlwbGljaXRpdmUtdG8tYWRkaXRpdmUgKE10QSkgc2hhcmUgY29udmVyc2lvbiB3aXRoIGFub3RoZXIgc2lnbmVyLlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBvbmUgb2YgW3NpZ25Db252ZXJ0U3RlcDEsIHNpZ25Db252ZXJ0U3RlcDIsIHNpZ25Db252ZXJ0U3RlcDNdIGluc3RlYWRcbiAgICogQHBhcmFtIHtTaWduQ29udmVydH0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduQ29udmVydFJUfVxuICAgKi9cbiAgYXN5bmMgc2lnbkNvbnZlcnQoc2hhcmVzOiBTaWduQ29udmVydCk6IFByb21pc2U8U2lnbkNvbnZlcnRSVD4ge1xuICAgIGxldCBzaGFyZVBhcnRpY2lwYW50OiBQYXJ0aWFsPEJTaGFyZT4gfCBQYXJ0aWFsPEdTaGFyZT4sIHNoYXJlVG9CZVNlbnQ6IFBhcnRpYWw8QVNoYXJlPiB8IE1VU2hhcmU7XG4gICAgbGV0IGlzR2FtbWFTaGFyZSA9IGZhbHNlO1xuICAgIGxldCBrU2hhcmU6IFBhcnRpYWw8S1NoYXJlPiA9IHt9O1xuICAgIGlmIChzaGFyZXMueFNoYXJlICYmIHNoYXJlcy55U2hhcmUgJiYgc2hhcmVzLmtTaGFyZSkge1xuICAgICAgY29uc3QgeFNoYXJlID0gc2hhcmVzLnhTaGFyZTsgLy8gY3VycmVudFBhcnRpY2lwYW50IHNlY3JldCB4U2hhcmVcbiAgICAgIGNvbnN0IHlTaGFyZTogWVNoYXJlV2l0aENoYWxsZW5nZXMgPSB7XG4gICAgICAgIC4uLnNoYXJlcy55U2hhcmUsXG4gICAgICAgIG50aWxkZTogc2hhcmVzLmtTaGFyZS5udGlsZGUsXG4gICAgICAgIGgxOiBzaGFyZXMua1NoYXJlLmgxLFxuICAgICAgICBoMjogc2hhcmVzLmtTaGFyZS5oMixcbiAgICAgICAgcDogc2hhcmVzLmtTaGFyZS5wLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHNpZ25TaGFyZSA9IGF3YWl0IHRoaXMuc2lnblNoYXJlKHhTaGFyZSwgeVNoYXJlKTtcbiAgICAgIGtTaGFyZSA9IHNpZ25TaGFyZS5rU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0geyAuLi5zaGFyZXMua1NoYXJlIH0gYXMgUGFydGlhbDxBU2hhcmU+O1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudCA9IHsgLi4uc2lnblNoYXJlLndTaGFyZSB9IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICB9IGVsc2UgaWYgKChzaGFyZXMuYlNoYXJlICYmIHNoYXJlcy5tdVNoYXJlKSB8fCAoc2hhcmVzLmFTaGFyZSAmJiBzaGFyZXMud1NoYXJlKSkge1xuICAgICAgaXNHYW1tYVNoYXJlID0gdHJ1ZTtcbiAgICAgIHNoYXJlVG9CZVNlbnQgPSBzaGFyZXMuYVNoYXJlID8gKHsgLi4uc2hhcmVzLmFTaGFyZSB9IGFzIE1VU2hhcmUpIDogKHsgLi4uc2hhcmVzLm11U2hhcmUgfSBhcyBNVVNoYXJlKTtcbiAgICAgIHNoYXJlUGFydGljaXBhbnQgPSBzaGFyZXMud1NoYXJlID8gKHsgLi4uc2hhcmVzLndTaGFyZSB9IGFzIFBhcnRpYWw8R1NoYXJlPikgOiAoeyAuLi5zaGFyZXMuYlNoYXJlIH0gYXMgR1NoYXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbmZpZyBmb3IgU2lnbiBDb252ZXJ0Jyk7XG4gICAgfVxuICAgIGlmIChzaGFyZVBhcnRpY2lwYW50LmkgIT09IHNoYXJlVG9CZVNlbnQuaSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaGFyZXMgZnJvbSBzYW1lIHBhcnRpY2lwYW50Jyk7XG4gICAgfVxuICAgIGlmICgoc2hhcmVUb0JlU2VudCBhcyBBU2hhcmUpLmFscGhhKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyBnYW1tYVByb29mIG9uIGFTaGFyZVRvQmVTZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIWFTaGFyZVRvQmVTZW50LndQcm9vZikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWlzc2luZyB3UHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBrYSA9IGdldFBhaWxsaWVyUHVibGljS2V5KGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm4pKTtcbiAgICAgIGxldCBudGlsZGVhLCBoMWEsIGgyYSwgY2s7XG4gICAgICBpZiAoYlNoYXJlUGFydGljaXBhbnQubnRpbGRlKSB7XG4gICAgICAgIG50aWxkZWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5udGlsZGUpO1xuICAgICAgICBoMWEgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICAgIGgyYSA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50LmgyKTtcbiAgICAgICAgY2sgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5jayk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcZ2FtbWFfaSBcXGluIFpfe05eMn0kLlxuICAgICAgaWYgKFxuICAgICAgICAhRWNkc2FSYW5nZVByb29mLnZlcmlmeVdpdGhDaGVjayhcbiAgICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgICBtaW5Nb2R1bHVzQml0TGVuZ3RoLFxuICAgICAgICAgIHBrYSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBudGlsZGU6IG50aWxkZWEsXG4gICAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHo6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YueiksXG4gICAgICAgICAgICB6cHJtOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi50KSxcbiAgICAgICAgICAgIHY6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudiksXG4gICAgICAgICAgICB3OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi5zKSxcbiAgICAgICAgICAgIHMxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMxKSxcbiAgICAgICAgICAgIHMyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQxKSxcbiAgICAgICAgICAgIHQyOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5nYW1tYVByb29mLnQyKSxcbiAgICAgICAgICAgIHU6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LmdhbW1hUHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5hbHBoYSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuZ2FtbWFQcm9vZi54KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb3VsZCBub3QgdmVyaWZ5IHNpZ25pbmcgc2hhcmUgZm9yIGdhbW1hIHByb29mJyk7XG4gICAgICB9XG4gICAgICAvLyBWZXJpZnkgJFxcd19pIFxcaW4gWl97Tl4yfSQuXG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5V2l0aENoZWNrKFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgICBoMjogaDJhLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnopLFxuICAgICAgICAgICAgenBybTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnpwcm0pLFxuICAgICAgICAgICAgdDogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnQpLFxuICAgICAgICAgICAgdjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnYpLFxuICAgICAgICAgICAgdzogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMpLFxuICAgICAgICAgICAgczE6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi5zMSksXG4gICAgICAgICAgICBzMjogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLnMyKSxcbiAgICAgICAgICAgIHQxOiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudDEpLFxuICAgICAgICAgICAgdDI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LndQcm9vZi50MiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC53UHJvb2YudSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjayxcbiAgICAgICAgICBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5tdSksXG4gICAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQud1Byb29mLngpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCB2ZXJpZnkgc2hhcmUgZm9yIHdQcm9vZicpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2sgPSBuZXcgcGFpbGxpZXJCaWdpbnQuUHJpdmF0ZUtleShcbiAgICAgICAgaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQubCBhcyBzdHJpbmcpLFxuICAgICAgICBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5tIGFzIHN0cmluZyksXG4gICAgICAgIHBrYVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGdTaGFyZVBhcnRpY2lwYW50ID0gc2hhcmVQYXJ0aWNpcGFudCBhcyBHU2hhcmU7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBjb25zdCBhbHBoYSA9IHNrLmRlY3J5cHQoaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuYWxwaGEpKTtcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UoYWxwaGEpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgbXUgPSBzay5kZWNyeXB0KGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50Lm11IGFzIHN0cmluZykpOyAvLyByZWNoZWNrIGVuY3J5cHRlZCBudW1iZXJcbiAgICAgIGdTaGFyZVBhcnRpY2lwYW50Lm11ID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJSZWR1Y2UobXUpLCAzMikudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8R1NoYXJlPjtcbiAgICAgIGNvbnN0IHBhcnRpYWxTaGFyZVRvQmVTZW50ID0gbXVTaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8TVVTaGFyZT47XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQubDtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5tO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmFscGhhO1xuICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm11O1xuICAgIH1cbiAgICBpZiAoKHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlKS5rKSB7XG4gICAgICBjb25zdCBiU2hhcmVQYXJ0aWNpcGFudCA9IHNoYXJlUGFydGljaXBhbnQgYXMgQlNoYXJlO1xuICAgICAgY29uc3QgYVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIEFTaGFyZTtcbiAgICAgIGlmICghYVNoYXJlVG9CZVNlbnQucHJvb2YpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1pc3NpbmcgcHJvb2Ygb24gYVNoYXJlVG9CZVNlbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG4gPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5uKTsgLy8gUGFpbGxpZXIgcHViIGZyb20gb3RoZXIgc2lnbmVyXG4gICAgICBjb25zdCBwa2EgPSBnZXRQYWlsbGllclB1YmxpY0tleShuKTtcbiAgICAgIGNvbnN0IG50aWxkZWEgPSBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5udGlsZGUpO1xuICAgICAgY29uc3QgaDFhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDEpO1xuICAgICAgY29uc3QgaDJhID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuaDIpO1xuICAgICAgY29uc3QgbnRpbGRlYiA9IGhleFRvQmlnSW50KGJTaGFyZVBhcnRpY2lwYW50Lm50aWxkZSk7XG4gICAgICBjb25zdCBoMWIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMSk7XG4gICAgICBjb25zdCBoMmIgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC5oMik7XG4gICAgICBjb25zdCBrID0gaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQuayk7XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVJhbmdlUHJvb2YudmVyaWZ5KFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgICAgcGthLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG50aWxkZTogbnRpbGRlYixcbiAgICAgICAgICAgIGgxOiBoMWIsXG4gICAgICAgICAgICBoMjogaDJiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgejogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YueiksXG4gICAgICAgICAgICB1OiBoZXhUb0JpZ0ludChhU2hhcmVUb0JlU2VudC5wcm9vZi51KSxcbiAgICAgICAgICAgIHc6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLncpLFxuICAgICAgICAgICAgczogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YucyksXG4gICAgICAgICAgICBzMTogaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQucHJvb2YuczEpLFxuICAgICAgICAgICAgczI6IGhleFRvQmlnSW50KGFTaGFyZVRvQmVTZW50LnByb29mLnMyKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IHZlcmlmeSBzaWduaW5nIEEgc2hhcmUgcHJvb2YnKTtcbiAgICAgIH1cbiAgICAgIC8vIE10QSAka19qLCBcXGdhbW1hX2kkLlxuICAgICAgY29uc3QgYmV0YTAgPSBiaWdpbnRDcnlwdG9VdGlscy5yYW5kQmV0d2VlbihFY2RzYS5jdXJ2ZS5vcmRlcigpICoqIF81bik7XG4gICAgICBiU2hhcmVQYXJ0aWNpcGFudC5iZXRhID0gYmlnSW50VG9CdWZmZXJCRShFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoRWNkc2EuY3VydmUuc2NhbGFyUmVkdWNlKGJldGEwKSksIDMyKS50b1N0cmluZyhcbiAgICAgICAgJ2hleCdcbiAgICAgICk7XG4gICAgICBjb25zdCBnID0gaGV4VG9CaWdJbnQoYlNoYXJlUGFydGljaXBhbnQuZ2FtbWEpO1xuICAgICAgY29uc3QgcmIgPSBhd2FpdCByYW5kb21Qb3NpdGl2ZUNvUHJpbWVUbyhwa2Eubik7XG4gICAgICBjb25zdCBjYiA9IHBrYS5lbmNyeXB0KGJldGEwLCByYik7XG4gICAgICBjb25zdCBhbHBoYSA9IHBrYS5hZGRpdGlvbihwa2EubXVsdGlwbHkoaywgZyksIGNiKTtcbiAgICAgIGFTaGFyZVRvQmVTZW50LmFscGhhID0gYmlnSW50VG9CdWZmZXJCRShhbHBoYSwgMzIpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFByb3ZlICRcXGdhbW1hX2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IGd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChnKTtcbiAgICAgIGxldCBwcm9vZiA9IGF3YWl0IEVjZHNhUmFuZ2VQcm9vZi5wcm92ZVdpdGhDaGVjayhcbiAgICAgICAgRWNkc2EuY3VydmUsXG4gICAgICAgIG1pbk1vZHVsdXNCaXRMZW5ndGgsXG4gICAgICAgIHBrYSxcbiAgICAgICAge1xuICAgICAgICAgIG50aWxkZTogbnRpbGRlYSxcbiAgICAgICAgICBoMTogaDFhLFxuICAgICAgICAgIGgyOiBoMmEsXG4gICAgICAgIH0sXG4gICAgICAgIGssXG4gICAgICAgIGFscGhhLFxuICAgICAgICBnLFxuICAgICAgICBiZXRhMCxcbiAgICAgICAgcmIsXG4gICAgICAgIGd4XG4gICAgICApO1xuICAgICAgT2JqZWN0LmFzc2lnbihhU2hhcmVUb0JlU2VudCwge1xuICAgICAgICBnYW1tYVByb29mOiB7XG4gICAgICAgICAgejogYmlnSW50VG9CdWZmZXJCRShwcm9vZi56LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB6cHJtOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnpwcm0sIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQ6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudCwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi52LCA3NjgpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB3OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLncsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YucywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczEsIDk2KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczI6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuczIsIDQ4MCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQxOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQxLCAyMjQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB0MjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50MiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi51LCAzMykudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHg6IGJpZ0ludFRvQnVmZmVyQkUoZ3gsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIE10QSAka19qLCB3X2kkLlxuICAgICAgY29uc3QgbnUwID0gYmlnaW50Q3J5cHRvVXRpbHMucmFuZEJldHdlZW4oRWNkc2EuY3VydmUub3JkZXIoKSAqKiBfNW4pO1xuICAgICAgc2hhcmVQYXJ0aWNpcGFudC5udSA9IGJpZ0ludFRvQnVmZmVyQkUoRWNkc2EuY3VydmUuc2NhbGFyTmVnYXRlKEVjZHNhLmN1cnZlLnNjYWxhclJlZHVjZShudTApKSwgMzIpLnRvU3RyaW5nKFxuICAgICAgICAnaGV4J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHcgPSBoZXhUb0JpZ0ludChiU2hhcmVQYXJ0aWNpcGFudC53KTtcbiAgICAgIGNvbnN0IHJuID0gYXdhaXQgcmFuZG9tUG9zaXRpdmVDb1ByaW1lVG8ocGthLm4pO1xuICAgICAgY29uc3QgY24gPSBwa2EuZW5jcnlwdChudTAsIHJuKTtcbiAgICAgIGNvbnN0IG11ID0gcGthLmFkZGl0aW9uKHBrYS5tdWx0aXBseShrLCB3KSwgY24pO1xuICAgICAgc2hhcmVUb0JlU2VudC5tdSA9IGJpZ0ludFRvQnVmZmVyQkUobXUsIDMyKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAvLyBQcm92ZSAkXFx3X2kgXFxpbiBaX3tOXjJ9JC5cbiAgICAgIGNvbnN0IHd4ID0gRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdCh3KTtcbiAgICAgIHByb29mID0gYXdhaXQgRWNkc2FSYW5nZVByb29mLnByb3ZlV2l0aENoZWNrKFxuICAgICAgICBFY2RzYS5jdXJ2ZSxcbiAgICAgICAgbWluTW9kdWx1c0JpdExlbmd0aCxcbiAgICAgICAgcGthLFxuICAgICAgICB7XG4gICAgICAgICAgbnRpbGRlOiBudGlsZGVhLFxuICAgICAgICAgIGgxOiBoMWEsXG4gICAgICAgICAgaDI6IGgyYSxcbiAgICAgICAgfSxcbiAgICAgICAgayxcbiAgICAgICAgaGV4VG9CaWdJbnQoYVNoYXJlVG9CZVNlbnQubXUpLFxuICAgICAgICB3LFxuICAgICAgICBudTAsXG4gICAgICAgIHJuLFxuICAgICAgICB3eFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oc2hhcmVUb0JlU2VudCwge1xuICAgICAgICB3UHJvb2Y6IHtcbiAgICAgICAgICB6OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnosIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHpwcm06IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YuenBybSwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDogYmlnSW50VG9CdWZmZXJCRShwcm9vZi50LCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB2OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnYsIDc2OCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHc6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudywgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgczogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMTogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMSwgOTYpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBzMjogYmlnSW50VG9CdWZmZXJCRShwcm9vZi5zMiwgNDgwKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgdDE6IGJpZ0ludFRvQnVmZmVyQkUocHJvb2YudDEsIDIyNCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIHQyOiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnQyLCA0ODApLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICB1OiBiaWdJbnRUb0J1ZmZlckJFKHByb29mLnUsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgeDogYmlnSW50VG9CdWZmZXJCRSh3eCwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgaWYgKChzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSkuYWxwaGEpIHtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgICAgY29uc3QgcGFydGlhbFNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIFBhcnRpYWw8QVNoYXJlPjtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50Lm50aWxkZTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVBhcnRpY2lwYW50LmgxO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5jaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50Lm47XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5udGlsZGU7XG4gICAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVUb0JlU2VudC5oMTtcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LmgyO1xuICAgICAgICBkZWxldGUgcGFydGlhbFNoYXJlVG9CZVNlbnQuaztcbiAgICAgICAgZGVsZXRlIHBhcnRpYWxTaGFyZVRvQmVTZW50LnByb29mO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzaGFyZVRvQmVTZW50LCB7XG4gICAgICAgICAgbjoga1NoYXJlLm4sXG4gICAgICAgICAgbnRpbGRlOiBiaWdJbnRUb0J1ZmZlckJFKG50aWxkZWIsIDM4NCkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgIGgxOiBiaWdJbnRUb0J1ZmZlckJFKGgxYiwgMzg0KS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgaDI6IGJpZ0ludFRvQnVmZmVyQkUoaDJiLCAzODQpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgICBrOiBrU2hhcmUuayxcbiAgICAgICAgICBwcm9vZjoga1NoYXJlLnByb29mLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCEoJ2FscGhhJyBpbiBzaGFyZVRvQmVTZW50KSAmJiAhKCdrJyBpbiBzaGFyZVRvQmVTZW50KSkge1xuICAgICAgY29uc3QgcGFydGlhbFNoYXJlUGFydGljaXBhbnQgPSBzaGFyZVBhcnRpY2lwYW50IGFzIFBhcnRpYWw8QlNoYXJlPjtcbiAgICAgIGRlbGV0ZSBwYXJ0aWFsU2hhcmVQYXJ0aWNpcGFudC5udGlsZGU7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDE7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuaDI7XG4gICAgICBkZWxldGUgcGFydGlhbFNoYXJlUGFydGljaXBhbnQuY2s7XG4gICAgICBjb25zdCBtdVNoYXJlVG9CZVNlbnQgPSBzaGFyZVRvQmVTZW50IGFzIE1VU2hhcmU7XG4gICAgICBzaGFyZVRvQmVTZW50ID0ge1xuICAgICAgICBpOiBtdVNoYXJlVG9CZVNlbnQuaSxcbiAgICAgICAgajogbXVTaGFyZVRvQmVTZW50LmosXG4gICAgICB9IGFzIE1VU2hhcmU7XG4gICAgfVxuICAgIFtzaGFyZVRvQmVTZW50LmksIHNoYXJlVG9CZVNlbnQual0gPSBbc2hhcmVUb0JlU2VudC5qLCBzaGFyZVRvQmVTZW50LmldO1xuICAgIGlmIChpc0dhbW1hU2hhcmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG11U2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgTVVTaGFyZSxcbiAgICAgICAgZ1NoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEdTaGFyZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhU2hhcmU6IHNoYXJlVG9CZVNlbnQgYXMgQVNoYXJlLFxuICAgICAgYlNoYXJlOiBzaGFyZVBhcnRpY2lwYW50IGFzIEJTaGFyZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbWJpbmUgZ2FtbWEgc2hhcmVzIHRvIGdldCB0aGUgcHJpdmF0ZSBvbWljcm9uIC8gZGVsdGEgc2hhcmVzXG4gICAqIEBwYXJhbSB7U2lnbkNvbWJpbmV9IHNoYXJlc1xuICAgKiBAcmV0dXJucyB7U2lnbkNvbWJpbmVSVH1cbiAgICovXG4gIHNpZ25Db21iaW5lKHNoYXJlczogU2lnbkNvbWJpbmUpOiBTaWduQ29tYmluZVJUIHtcbiAgICBjb25zdCBnU2hhcmUgPSBzaGFyZXMuZ1NoYXJlO1xuICAgIGNvbnN0IFMgPSBzaGFyZXMuc2lnbkluZGV4O1xuICAgIGNvbnN0IGdhbW1hID0gaGV4VG9CaWdJbnQoZ1NoYXJlLmdhbW1hKTtcbiAgICBjb25zdCBhbHBoYSA9IGhleFRvQmlnSW50KGdTaGFyZS5hbHBoYSk7XG4gICAgY29uc3QgYmV0YSA9IGhleFRvQmlnSW50KGdTaGFyZS5iZXRhKTtcbiAgICBjb25zdCBtdSA9IGhleFRvQmlnSW50KGdTaGFyZS5tdSk7XG4gICAgY29uc3QgbnUgPSBoZXhUb0JpZ0ludChnU2hhcmUubnUpO1xuICAgIGNvbnN0IGsgPSBoZXhUb0JpZ0ludChnU2hhcmUuayk7XG4gICAgY29uc3QgdyA9IGhleFRvQmlnSW50KGdTaGFyZS53KTtcblxuICAgIGNvbnN0IGRlbHRhID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgZ2FtbWEpLCBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoYWxwaGEsIGJldGEpKTtcbiAgICBjb25zdCBvbWljcm9uID0gRWNkc2EuY3VydmUuc2NhbGFyQWRkKEVjZHNhLmN1cnZlLnNjYWxhck11bHQoaywgdyksIEVjZHNhLmN1cnZlLnNjYWxhckFkZChtdSwgbnUpKTtcbiAgICBjb25zdCBHYW1tYSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQoZ2FtbWEpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9TaGFyZToge1xuICAgICAgICBpOiBnU2hhcmUuaSxcbiAgICAgICAgeTogZ1NoYXJlLnksXG4gICAgICAgIGs6IGJpZ0ludFRvQnVmZmVyQkUoaywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgb21pY3JvbjogYmlnSW50VG9CdWZmZXJCRShvbWljcm9uLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBkZWx0YTogYmlnSW50VG9CdWZmZXJCRShkZWx0YSwgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgR2FtbWE6IGJpZ0ludFRvQnVmZmVyQkUoR2FtbWEsIDMzKS50b1N0cmluZygnaGV4JyksXG4gICAgICB9LFxuICAgICAgZFNoYXJlOiB7XG4gICAgICAgIGk6IFMuaSxcbiAgICAgICAgajogZ1NoYXJlLmksXG4gICAgICAgIGRlbHRhOiBiaWdJbnRUb0J1ZmZlckJFKGRlbHRhLCAzMikudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICBHYW1tYTogYmlnSW50VG9CdWZmZXJCRShHYW1tYSwgMzMpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IE0gTWVzc2FnZSB0byBiZSBzaWduZWRcbiAgICogQHBhcmFtIHtPU2hhcmV9IG9TaGFyZSBwcml2YXRlIG9taWNyb24gc2hhcmUgb2YgY3VycmVudCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge0RTaGFyZX0gZFNoYXJlIGRlbHRhIHNoYXJlIHJlY2VpdmVkIGZyb20gdGhlIG90aGVyIHBhcnRpY2lwYW50XG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0gc2hvdWxkSGFzaCBpZiB0cnVlLCB3ZSBoYXNoIHRoZSBwcm92aWRlZCBidWZmZXIgYmVmb3JlIHNpZ25pbmdcbiAgICogQHJldHVybnMge1ZBU2hhcmV9XG4gICAqL1xuICBzaWduKE06IEJ1ZmZlciwgb1NoYXJlOiBPU2hhcmUsIGRTaGFyZTogRFNoYXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBWQVNoYXJlIHtcbiAgICBjb25zdCBtID0gc2hvdWxkSGFzaCA/IChoYXNoIHx8IGNyZWF0ZUhhc2goJ3NoYTI1NicpKS51cGRhdGUoTSkuZGlnZXN0KCkgOiBNO1xuXG4gICAgY29uc3QgZGVsdGEgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQoaGV4VG9CaWdJbnQob1NoYXJlLmRlbHRhKSwgaGV4VG9CaWdJbnQoZFNoYXJlLmRlbHRhKSk7XG5cbiAgICBjb25zdCBSID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShcbiAgICAgIEVjZHNhLmN1cnZlLnBvaW50QWRkKGhleFRvQmlnSW50KG9TaGFyZS5HYW1tYSksIGhleFRvQmlnSW50KGRTaGFyZS5HYW1tYSkpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFySW52ZXJ0KGRlbHRhKVxuICAgICk7XG4gICAgY29uc3QgcG9pbnRSID0gc2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleChiaWdJbnRUb0J1ZmZlckJFKFIsIDMyKSk7XG4gICAgY29uc3QgciA9IHBvaW50Ui54O1xuXG4gICAgY29uc3QgcyA9IEVjZHNhLmN1cnZlLnNjYWxhckFkZChcbiAgICAgIEVjZHNhLmN1cnZlLnNjYWxhck11bHQoYmlnSW50RnJvbVU4QUJFKG0pLCBoZXhUb0JpZ0ludChvU2hhcmUuaykpLFxuICAgICAgRWNkc2EuY3VydmUuc2NhbGFyTXVsdChyLCBoZXhUb0JpZ0ludChvU2hhcmUub21pY3JvbikpXG4gICAgKTtcblxuICAgIGNvbnN0IGwgPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCByaG8gPSBFY2RzYS5jdXJ2ZS5zY2FsYXJSYW5kb20oKTtcbiAgICBjb25zdCBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShSLCBzKSwgRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChsKSk7XG4gICAgY29uc3QgQSA9IEVjZHNhLmN1cnZlLmJhc2VQb2ludE11bHQocmhvKTtcblxuICAgIGNvbnN0IGNvbURlY29tX1ZfQSA9IEhhc2hDb21taXRtZW50LmNyZWF0ZUNvbW1pdG1lbnQoXG4gICAgICBCdWZmZXIuY29uY2F0KFtiaWdJbnRUb0J1ZmZlckJFKFYsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpLCBiaWdJbnRUb0J1ZmZlckJFKEEsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpXSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGk6IG9TaGFyZS5pLFxuICAgICAgeTogb1NoYXJlLnksXG4gICAgICBSOiBwb2ludFIudG9IZXgodHJ1ZSksXG4gICAgICBzOiBiaWdJbnRUb0J1ZmZlckJFKHMsIDMyKS50b1N0cmluZygnaGV4JyksXG4gICAgICBtOiBtLFxuICAgICAgbDogbCxcbiAgICAgIHJobzogcmhvLFxuICAgICAgVjogVixcbiAgICAgIEE6IEEsXG4gICAgICBjb21EZWNvbVZBOiBjb21EZWNvbV9WX0EsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBwcm9vZnMgb2YgVl9pIGFuZCBBX2kgdmFsdWVzLlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gTSBNZXNzYWdlIHRvIGNvbW1pdCB0byBhcyBwYXJ0IG9mIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9vZi5cbiAgICogICAgVGhpcyBkb2Vzbid0IG5lZWQgdG8gYmUgdGhlIHNhbWUgbWVzc2FnZSB0aGF0IHdhcyBzaWduZWQgaW4gdGhlIHNpZ24gZnVuY3Rpb24gYWJvdmUuXG4gICAqICAgIEJ1dCBpdCBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIGFsbCBwYXJ0aWNpcGFudHMgZm9yIHRoZSBwdXJwb3NlIG9mIHByb3ZpZGluZyBwcm9vZiBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1ZBU2hhcmV9IHZhU2hhcmUgVGhlIFZBU2hhcmUgdG8gcHJvdmUuXG4gICAqIEByZXR1cm5zIHtWQVNoYXJlV2l0aFByb29mc31cbiAgICovXG4gIGdlbmVyYXRlVkFQcm9vZnMoTTogQnVmZmVyLCB2YVNoYXJlOiBWQVNoYXJlKTogVkFTaGFyZVdpdGhQcm9vZnMge1xuICAgIGNvbnN0IHMgPSBoZXhUb0JpZ0ludCh2YVNoYXJlLnMpO1xuICAgIGNvbnN0IFIgPSBiaWdJbnRGcm9tVThBQkUoc2VjcC5Qcm9qZWN0aXZlUG9pbnQuZnJvbUhleCh2YVNoYXJlLlIpLnRvUmF3Qnl0ZXModHJ1ZSkpO1xuXG4gICAgY29uc3QgcHJvb2ZDb250ZXh0ID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKE0pLnVwZGF0ZShiaWdJbnRUb0J1ZmZlckJFKFIsIEVjZHNhLmN1cnZlLnBvaW50Qnl0ZXMpKS5kaWdlc3QoKTtcblxuICAgIGNvbnN0IHprVlByb29mID0gRWNkc2Faa1ZQcm9vZi5jcmVhdGVaa1ZQcm9vZih2YVNoYXJlLlYsIHMsIHZhU2hhcmUubCwgUiwgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG4gICAgY29uc3Qgc2Nobm9yclByb29mID0gU2Nobm9yci5jcmVhdGVTY2hub3JyUHJvb2YodmFTaGFyZS5BLCB2YVNoYXJlLnJobywgRWNkc2EuY3VydmUsIHByb29mQ29udGV4dCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFTaGFyZSxcbiAgICAgIHByb29mQ29udGV4dDogcHJvb2ZDb250ZXh0LFxuICAgICAgemtWUHJvb2ZWOiB6a1ZQcm9vZixcbiAgICAgIHNjaG5vcnJQcm9vZkE6IHNjaG5vcnJQcm9vZixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBWX2kgYW5kIEFfaSB2YWx1ZXMgb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50cyBkdXJpbmcgc2lnbmluZyBwaGFzZSA1IHN0ZXBzIDVBIGFuZCA1Qi5cbiAgICogQHBhcmFtIHtWQVNoYXJlV2l0aFByb29mc30gdmFTaGFyZSBWX2ksIEFfaSBpbmZvIGluY2x1ZGluZyBTU2hhcmUgdmFsdWVzIG9mIHRoZSBjdXJyZW5jdCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge1B1YmxpY1ZBU2hhcmVXaXRoUHJvb2ZzW119IHB1YmxpY1ZBU2hhcmVzIHB1YmxpYyBWX2ksIEFfaSBpbmZvIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHNcbiAgICogQHJldHVybnMge1VUU2hhcmV9IFVfaSwgVF9pIGluZm8gb2YgdGhlIGN1cnJlbnQgcGFydGljaXBhbnQgaWYgYWxsIHZlcmlmaWNhdGlvbnMgcGFzc1xuICAgKi9cbiAgdmVyaWZ5VkFTaGFyZXModmFTaGFyZTogVkFTaGFyZVdpdGhQcm9vZnMsIHB1YmxpY1ZBU2hhcmVzOiBQdWJsaWNWQVNoYXJlV2l0aFByb29mc1tdKTogVVRTaGFyZSB7XG4gICAgcHVibGljVkFTaGFyZXMuZm9yRWFjaCgocHVibGljVkFTaGFyZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhSGFzaENvbW1pdG1lbnQudmVyaWZ5Q29tbWl0bWVudChwdWJsaWNWQVNoYXJlLmNvbURlY29tVkEuY29tbWl0bWVudCwge1xuICAgICAgICAgIHNlY3JldDogQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1ZBU2hhcmUuViwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1ZBU2hhcmUuQSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgYmxpbmRpbmdGYWN0b3I6IHB1YmxpY1ZBU2hhcmUuY29tRGVjb21WQS5kZWNvbW1pdG1lbnQuYmxpbmRpbmdGYWN0b3IsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IGNvbW1pdG1lbnQgb2YgVl9pIGFuZCBBX2knKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIVNjaG5vcnIudmVyaWZ5U2Nobm9yclByb29mKHB1YmxpY1ZBU2hhcmUuQSwgcHVibGljVkFTaGFyZS5zY2hub3JyUHJvb2ZBLCBFY2RzYS5jdXJ2ZSwgdmFTaGFyZS5wcm9vZkNvbnRleHQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IFNjaG5vcnIgcHJvb2Ygb2YgQV9pJyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICFFY2RzYVprVlByb29mLnZlcmlmeVprVlByb29mKFxuICAgICAgICAgIHB1YmxpY1ZBU2hhcmUuVixcbiAgICAgICAgICBwdWJsaWNWQVNoYXJlLnprVlByb29mVixcbiAgICAgICAgICBoZXhUb0JpZ0ludCh2YVNoYXJlLlIpLFxuICAgICAgICAgIEVjZHNhLmN1cnZlLFxuICAgICAgICAgIHZhU2hhcmUucHJvb2ZDb250ZXh0XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCB2ZXJpZnkgWksgcHJvb2Ygb2YgVl9pJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB5ID0gaGV4VG9CaWdJbnQodmFTaGFyZS55KTtcbiAgICAvLyByIGlzIFIncyB4IGNvb3JkaW5hdGUuICBSIGlzIGluIGNvbXByZXNzZWQgZm9ybSwgc28gd2UgbmVlZCB0byBzbGljZSBvZmYgdGhlIGZpcnN0IGJ5dGUuXG4gICAgY29uc3QgciA9IGhleFRvQmlnSW50KHZhU2hhcmUuUi5zbGljZSgyKSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYWdncmVnYXRpb24gb2YgYWxsIFZfaSBhbmQgQV9pLlxuICAgIGxldCBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoXG4gICAgICBFY2RzYS5jdXJ2ZS5wb2ludEFkZChcbiAgICAgICAgRWNkc2EuY3VydmUuYmFzZVBvaW50TXVsdChFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUoYmlnSW50RnJvbVU4QUJFKHZhU2hhcmUubSkpKSxcbiAgICAgICAgRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseSh5LCBFY2RzYS5jdXJ2ZS5zY2FsYXJOZWdhdGUocikpXG4gICAgICApLFxuICAgICAgdmFTaGFyZS5WXG4gICAgKTtcbiAgICBsZXQgQSA9IHZhU2hhcmUuQTtcbiAgICBwdWJsaWNWQVNoYXJlcy5mb3JFYWNoKChwdWJsaWNWQVNoYXJlKSA9PiB7XG4gICAgICBWID0gRWNkc2EuY3VydmUucG9pbnRBZGQoViwgcHVibGljVkFTaGFyZS5WKTtcbiAgICAgIEEgPSBFY2RzYS5jdXJ2ZS5wb2ludEFkZChBLCBwdWJsaWNWQVNoYXJlLkEpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIFVfaSA9IHJob19pICogViBhbmQgVF9pID0gbF9pICogQS5cbiAgICBjb25zdCBVID0gRWNkc2EuY3VydmUucG9pbnRNdWx0aXBseShWLCB2YVNoYXJlLnJobyk7XG4gICAgY29uc3QgVCA9IEVjZHNhLmN1cnZlLnBvaW50TXVsdGlwbHkoQSwgdmFTaGFyZS5sKTtcbiAgICBjb25zdCBjb21EZWNvbV9VX1QgPSBIYXNoQ29tbWl0bWVudC5jcmVhdGVDb21taXRtZW50KFxuICAgICAgQnVmZmVyLmNvbmNhdChbYmlnSW50VG9CdWZmZXJCRShVLCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKSwgYmlnSW50VG9CdWZmZXJCRShULCBFY2RzYS5jdXJ2ZS5wb2ludEJ5dGVzKV0pXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi52YVNoYXJlLFxuICAgICAgVSxcbiAgICAgIFQsXG4gICAgICBjb21EZWNvbVVUOiBjb21EZWNvbV9VX1QsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgVV9pIGFuZCBWX2kgdmFsdWVzIG9mIGFsbCBvdGhlciBwYXJ0aWNpcGFudHMgZHVyaW5nIHNpZ25pbmcgcGhhc2UgNSBzdGVwcyA1QyBhbmQgNUQuXG4gICAqIEBwYXJhbSB7VVRTaGFyZX0gdXRTaGFyZSBVX2ksIFRfaSBpbmZvIGluY2x1ZGluZyBTU2hhcmUgdmFsdWVzIG9mIHRoZSBjdXJyZW5jdCBwYXJ0aWNpcGFudFxuICAgKiBAcGFyYW0ge1B1YmxpY1VUU2hhcmVbXX0gcHVibGljVVRTaGFyZXMgcHVibGljIFVfaSwgVF9pIGluZm8gb2YgYWxsIG90aGVyIHBhcnRpY2lwYW50c1xuICAgKiBAcmV0dXJucyB7U1NoYXJlfSBTU2hhcmUgb2YgdGhlIGN1cnJlbnQgcGFydGljaXBhbnQgaWYgYWxsIHZlcmlmaWNhdGlvbnMgcGFzc1xuICAgKi9cbiAgdmVyaWZ5VVRTaGFyZXModXRTaGFyZTogVVRTaGFyZSwgcHVibGljVVRTaGFyZXM6IFB1YmxpY1VUU2hhcmVbXSk6IFNTaGFyZSB7XG4gICAgbGV0IHNpZ21hVSA9IHV0U2hhcmUuVTtcbiAgICBsZXQgc2lnbWFUID0gdXRTaGFyZS5UO1xuXG4gICAgcHVibGljVVRTaGFyZXMuZm9yRWFjaCgocHVibGljVVRTaGFyZSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICAhSGFzaENvbW1pdG1lbnQudmVyaWZ5Q29tbWl0bWVudChwdWJsaWNVVFNoYXJlLmNvbURlY29tVVQuY29tbWl0bWVudCwge1xuICAgICAgICAgIHNlY3JldDogQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1VUU2hhcmUuVSwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgICBiaWdJbnRUb0J1ZmZlckJFKHB1YmxpY1VUU2hhcmUuVCwgRWNkc2EuY3VydmUucG9pbnRCeXRlcyksXG4gICAgICAgICAgXSksXG4gICAgICAgICAgYmxpbmRpbmdGYWN0b3I6IHB1YmxpY1VUU2hhcmUuY29tRGVjb21VVC5kZWNvbW1pdG1lbnQuYmxpbmRpbmdGYWN0b3IsXG4gICAgICAgIH0pXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgdmVyaWZ5IGNvbW1pdG1lbnQgb2YgVV9pIGFuZCBUX2knKTtcbiAgICAgIH1cblxuICAgICAgc2lnbWFVID0gRWNkc2EuY3VydmUucG9pbnRBZGQoc2lnbWFVLCBwdWJsaWNVVFNoYXJlLlUpO1xuICAgICAgc2lnbWFUID0gRWNkc2EuY3VydmUucG9pbnRBZGQoc2lnbWFULCBwdWJsaWNVVFNoYXJlLlQpO1xuICAgIH0pO1xuXG4gICAgaWYgKHNpZ21hVSAhPT0gc2lnbWFUKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1bSBvZiBhbGwgVV9pIGRvZXMgbm90IG1hdGNoIHN1bSBvZiBhbGwgVF9pJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4udXRTaGFyZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBmdWxsIHNpZ25hdHVyZSBieSBjb21iaW5pbmcgU2lnbiBTaGFyZXNcbiAgICogQHBhcmFtIHtTU2hhcmVbXX0gc2hhcmVzXG4gICAqIEByZXR1cm5zIHtTaWduYXR1cmV9XG4gICAqL1xuICBjb25zdHJ1Y3RTaWduYXR1cmUoc2hhcmVzOiBTU2hhcmVbXSk6IFNpZ25hdHVyZSB7XG4gICAgLy8gRXZlcnkgUiBtdXN0IG1hdGNoLlxuICAgIGNvbnN0IFIgPSBzaGFyZXNbMF1bJ1InXTtcbiAgICBjb25zdCBpc1JNYXRjaGluZyA9IHNoYXJlcy5tYXAoKHNoYXJlKSA9PiBzaGFyZVsnUiddID09PSBSKS5yZWR1Y2UoKGEsIGIpID0+IGEgJiYgYik7XG4gICAgaWYgKCFpc1JNYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSIHZhbHVlIHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBhbGwgc2hhcmVzJyk7XG4gICAgfVxuXG4gICAgbGV0IHMgPSBzaGFyZXMubWFwKChzaGFyZSkgPT4gaGV4VG9CaWdJbnQoc2hhcmVbJ3MnXSkpLnJlZHVjZShFY2RzYS5jdXJ2ZS5zY2FsYXJBZGQpO1xuICAgIGNvbnN0IHJlY2lkID0gKFIuc2xpY2UoMCwgMikgPT09ICcwMycgPyAxIDogMCkgXiAocyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyAxIDogMCk7XG5cbiAgICAvLyBOb3JtYWxpemUgcy5cbiAgICBzID0gcyA+IEVjZHNhLmN1cnZlLm9yZGVyKCkgLyBCaWdJbnQoMikgPyBFY2RzYS5jdXJ2ZS5vcmRlcigpIC0gcyA6IHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IHNoYXJlc1swXVsneSddLFxuICAgICAgcjogUi5zbGljZSgyKSxcbiAgICAgIHM6IGJpZ0ludFRvQnVmZmVyQkUocywgMzIpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHJlY2lkOiByZWNpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBlY2RzYSBzaWduYXR1cmVzXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U2lnbmF0dXJlIH0gc2lnbmF0dXJlXG4gICAqIEBwYXJhbSB7SGFzaH0gaGFzaCBoYXNoaW5nIGFsZ29yaXRobSBpbXBsZW1lbnRpbmcgTm9kZWBzIHN0YW5kYXJkIGNyeXB0byBoYXNoIGludGVyZmFjZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhc2ggaWYgdHJ1ZSwgd2UgaGFzaCB0aGUgcHJvdmlkZWQgYnVmZmVyIGJlZm9yZSB2ZXJpZnlpbmdcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgc2lnbmF0dXJlIGlzIHZhbGlkOyBGYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZlcmlmeShtZXNzYWdlOiBCdWZmZXIsIHNpZ25hdHVyZTogU2lnbmF0dXJlLCBoYXNoPzogSGFzaCwgc2hvdWxkSGFzaCA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBtZXNzYWdlVG9WZXJpZnkgPSBzaG91bGRIYXNoID8gKGhhc2ggfHwgY3JlYXRlSGFzaCgnc2hhMjU2JykpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKSA6IG1lc3NhZ2U7XG4gICAgcmV0dXJuIEVjZHNhLmN1cnZlLnZlcmlmeShcbiAgICAgIG1lc3NhZ2VUb1ZlcmlmeSxcbiAgICAgIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBCdWZmZXIuZnJvbShbc2lnbmF0dXJlWydyZWNpZCddXSksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydyJ10pLCAzMiksXG4gICAgICAgIGJpZ0ludFRvQnVmZmVyQkUoaGV4VG9CaWdJbnQoc2lnbmF0dXJlWydzJ10pLCAzMiksXG4gICAgICBdKSxcbiAgICAgIGhleFRvQmlnSW50KHNpZ25hdHVyZVsneSddKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGhleCBzdHJpbmdzIHRvIGJpZ2ludFxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2RrLWxpYi1tcGMgRWNkc2FUeXBlcy5kZXNlcmlhbGl6ZU50aWxkZSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlOiBFY2RzYVR5cGVzLlNlcmlhbGl6ZWROdGlsZGUpOiBFY2RzYVR5cGVzLkRlc2VyaWFsaXplZE50aWxkZSB7XG4gICAgcmV0dXJuIEVjZHNhVHlwZXMuZGVzZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgY2hhbGxlbmdlIGFuZCBpdCdzIHByb29mcyBmcm9tIGJpZyBpbnQgdG8gaGV4IHN0cmluZ3MuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZGstbGliLW1wYyBFY2RzYVR5cGVzLmRlc2VyaWFsaXplTnRpbGRlIGluc3RlYWRcbiAgICogQHBhcmFtIGNoYWxsZW5nZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZU50aWxkZShjaGFsbGVuZ2U6IEVjZHNhVHlwZXMuRGVzZXJpYWxpemVkTnRpbGRlKTogRWNkc2FUeXBlcy5TZXJpYWxpemVkTnRpbGRlIHtcbiAgICByZXR1cm4gRWNkc2FUeXBlcy5zZXJpYWxpemVOdGlsZGUoY2hhbGxlbmdlKTtcbiAgfVxufVxuIl19