@bitgo-beta/sdk-coin-sol 7.6.4-beta.73 → 7.6.4-beta.730

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 (532) hide show
  1. package/dist/cjs/src/bigint-buffer-guard.d.ts.map +1 -0
  2. package/dist/cjs/src/bigint-buffer-guard.js +29 -0
  3. package/dist/cjs/src/index.d.ts.map +1 -0
  4. package/dist/{src → cjs/src}/index.js +1 -1
  5. package/dist/{src → cjs/src}/lib/ataInitializationBuilder.d.ts +12 -1
  6. package/dist/cjs/src/lib/ataInitializationBuilder.d.ts.map +1 -0
  7. package/dist/cjs/src/lib/ataInitializationBuilder.js +231 -0
  8. package/dist/cjs/src/lib/closeAtaBuilder.d.ts +55 -0
  9. package/dist/cjs/src/lib/closeAtaBuilder.d.ts.map +1 -0
  10. package/dist/cjs/src/lib/closeAtaBuilder.js +162 -0
  11. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts +128 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +311 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +96 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +276 -0
  17. package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
  18. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  23. package/dist/cjs/src/lib/iface.d.ts +526 -0
  24. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/iface.js +7 -0
  26. package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
  27. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/index.js +106 -0
  29. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  30. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/instructionParamsFactory.js +1280 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  34. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  35. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/keyPair.js +112 -0
  37. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
  59. package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
  60. package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/serialization/index.js +27 -0
  62. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  63. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  65. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  66. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  68. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  69. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  71. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  73. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  75. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  77. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  79. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  80. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  81. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  83. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  84. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  85. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  86. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  87. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  88. package/dist/cjs/src/lib/tokenExtensions.js +109 -0
  89. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  90. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  91. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  92. package/dist/{src → cjs/src}/lib/transaction.d.ts +34 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +704 -0
  95. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
  96. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  97. package/dist/cjs/src/lib/transactionBuilder.js +462 -0
  98. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
  99. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
  101. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  102. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  103. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  104. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  105. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  106. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +665 -0
  109. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +21 -0
  110. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  111. package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +28 -0
  112. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
  113. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
  114. package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
  115. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
  116. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
  117. package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
  118. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  119. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  120. package/dist/cjs/src/register.d.ts +5 -0
  121. package/dist/cjs/src/register.d.ts.map +1 -0
  122. package/dist/cjs/src/register.js +29 -0
  123. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  124. package/dist/cjs/src/sol.d.ts.map +1 -0
  125. package/dist/cjs/src/sol.js +1697 -0
  126. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  127. package/dist/cjs/src/solToken.d.ts.map +1 -0
  128. package/dist/cjs/src/solToken.js +79 -0
  129. package/dist/cjs/src/tsol.d.ts.map +1 -0
  130. package/dist/cjs/src/tsol.js +24 -0
  131. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  132. package/dist/cjs/test/fixtures/sol.js +1433 -0
  133. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  134. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  135. package/dist/cjs/test/resources/sol.js +320 -0
  136. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  137. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  139. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  141. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  143. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  144. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  145. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  146. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  147. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  148. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  150. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  151. package/dist/cjs/test/unit/keyPair.js +177 -0
  152. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  153. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  154. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  155. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  156. package/dist/cjs/test/unit/register.d.ts +2 -0
  157. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/register.js +65 -0
  159. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  160. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  162. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  163. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  165. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  166. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  167. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  168. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  169. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  171. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  172. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  174. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  175. package/dist/cjs/test/unit/sol.js +5364 -0
  176. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  177. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  178. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  179. package/dist/cjs/test/unit/solToken.js +37 -0
  180. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  181. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  182. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  183. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  184. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  186. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  187. package/dist/cjs/test/unit/transaction.js +1129 -0
  188. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  189. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  190. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  192. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  193. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  194. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  195. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  196. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  198. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  199. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  201. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  204. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  207. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  208. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  209. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  210. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  211. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  213. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  214. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  215. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  216. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  217. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  218. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  219. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  220. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  221. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  222. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  223. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  224. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  225. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  226. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  227. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  228. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  230. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  231. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  232. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  233. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  234. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  235. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  236. package/dist/cjs/test/unit/utils.js +628 -0
  237. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  239. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  240. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  241. package/dist/esm/index.d.ts +7 -0
  242. package/dist/esm/index.js +7 -0
  243. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  244. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  245. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  246. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  247. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  248. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  249. package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
  250. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  251. package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
  252. package/dist/esm/lib/constants.d.ts +234 -0
  253. package/dist/esm/lib/constants.d.ts.map +1 -0
  254. package/dist/esm/lib/constants.js +273 -0
  255. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  256. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  257. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  258. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  259. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  260. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  261. package/dist/esm/lib/iface.d.ts +526 -0
  262. package/dist/esm/lib/iface.d.ts.map +1 -0
  263. package/dist/esm/lib/iface.js +3 -0
  264. package/dist/esm/lib/index.d.ts +31 -0
  265. package/dist/esm/lib/index.d.ts.map +1 -0
  266. package/dist/esm/lib/index.js +31 -0
  267. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  268. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  269. package/dist/esm/lib/instructionParamsFactory.js +1272 -0
  270. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  271. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  272. package/dist/esm/lib/keyPair.d.ts +32 -0
  273. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  274. package/dist/esm/lib/keyPair.js +75 -0
  275. package/dist/esm/lib/messages/index.d.ts +2 -0
  276. package/dist/esm/lib/messages/index.js +2 -0
  277. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  278. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  279. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  280. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  281. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  282. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  283. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  284. package/dist/esm/lib/scaledUiAmount.js +108 -0
  285. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  286. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  287. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  288. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  289. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  290. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  291. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  292. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  293. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  294. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  295. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  296. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  297. package/dist/esm/lib/serialization/index.d.ts +5 -0
  298. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/index.js +5 -0
  300. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  301. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  303. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  304. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  306. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  307. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  308. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  309. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  310. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  311. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  312. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  313. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  314. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  315. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  316. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  317. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  318. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  319. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  320. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  321. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  322. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  323. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  324. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  325. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  326. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  327. package/dist/esm/lib/token2022Resolve.js +194 -0
  328. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  329. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  330. package/dist/esm/lib/tokenExtensions.js +103 -0
  331. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  332. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  333. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  334. package/dist/esm/lib/transaction.d.ts +136 -0
  335. package/dist/esm/lib/transaction.d.ts.map +1 -0
  336. package/dist/esm/lib/transaction.js +697 -0
  337. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  338. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  339. package/dist/esm/lib/transactionBuilder.js +455 -0
  340. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  341. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  342. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  343. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  344. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  345. package/dist/esm/lib/transferBuilder.js +74 -0
  346. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  347. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  348. package/dist/esm/lib/transferBuilderV2.js +245 -0
  349. package/dist/esm/lib/utils.d.ts +205 -0
  350. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  351. package/dist/esm/lib/utils.js +627 -0
  352. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +21 -0
  353. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  354. package/dist/esm/lib/v1CustomInstructionBuilder.js +24 -0
  355. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  356. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  357. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  358. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  359. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  360. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  361. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  362. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  363. package/dist/esm/register.d.ts +5 -0
  364. package/dist/esm/register.d.ts.map +1 -0
  365. package/dist/esm/register.js +24 -0
  366. package/dist/esm/sol.d.ts +351 -0
  367. package/dist/esm/sol.d.ts.map +1 -0
  368. package/dist/esm/sol.js +1656 -0
  369. package/dist/esm/solToken.d.ts +44 -0
  370. package/dist/esm/solToken.d.ts.map +1 -0
  371. package/dist/esm/solToken.js +75 -0
  372. package/dist/esm/tsol.d.ts +11 -0
  373. package/dist/esm/tsol.js +20 -0
  374. package/package.json +37 -17
  375. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  376. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  377. package/dist/src/config/token2022StaticConfig.js +0 -50
  378. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  379. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  380. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  381. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  382. package/dist/src/lib/closeAtaBuilder.js +0 -69
  383. package/dist/src/lib/constants.d.ts.map +0 -1
  384. package/dist/src/lib/constants.js +0 -171
  385. package/dist/src/lib/customInstructionBuilder.js +0 -289
  386. package/dist/src/lib/iface.d.ts +0 -244
  387. package/dist/src/lib/iface.d.ts.map +0 -1
  388. package/dist/src/lib/iface.js +0 -7
  389. package/dist/src/lib/index.d.ts.map +0 -1
  390. package/dist/src/lib/index.js +0 -77
  391. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  392. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  393. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  394. package/dist/src/lib/keyPair.d.ts.map +0 -1
  395. package/dist/src/lib/keyPair.js +0 -63
  396. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  397. package/dist/src/lib/solInstructionFactory.js +0 -572
  398. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  399. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  400. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  401. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  402. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  403. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  404. package/dist/src/lib/token2022Config.d.ts +0 -44
  405. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  406. package/dist/src/lib/token2022Config.js +0 -27
  407. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  408. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  409. package/dist/src/lib/transaction.d.ts.map +0 -1
  410. package/dist/src/lib/transaction.js +0 -595
  411. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  412. package/dist/src/lib/transactionBuilder.js +0 -380
  413. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  414. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  415. package/dist/src/lib/transferBuilder.js +0 -70
  416. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  417. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  418. package/dist/src/lib/transferBuilderV2.js +0 -210
  419. package/dist/src/lib/utils.js +0 -589
  420. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  421. package/dist/src/register.d.ts +0 -3
  422. package/dist/src/register.d.ts.map +0 -1
  423. package/dist/src/register.js +0 -15
  424. package/dist/src/sol.d.ts.map +0 -1
  425. package/dist/src/sol.js +0 -1324
  426. package/dist/src/solToken.d.ts.map +0 -1
  427. package/dist/src/solToken.js +0 -69
  428. package/dist/src/tsol.js +0 -24
  429. package/dist/test/fixtures/sol.js +0 -1433
  430. package/dist/test/resources/sol.d.ts.map +0 -1
  431. package/dist/test/resources/sol.js +0 -320
  432. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  433. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  434. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  435. package/dist/test/unit/getBuilderFactory.js +0 -10
  436. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  437. package/dist/test/unit/instructionParamsFactory.js +0 -412
  438. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  439. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  440. package/dist/test/unit/keyPair.js +0 -177
  441. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  442. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  443. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  444. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  445. package/dist/test/unit/sol.js +0 -3180
  446. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  447. package/dist/test/unit/solInstructionFactory.js +0 -454
  448. package/dist/test/unit/solToken.d.ts.map +0 -1
  449. package/dist/test/unit/solToken.js +0 -31
  450. package/dist/test/unit/transaction.d.ts.map +0 -1
  451. package/dist/test/unit/transaction.js +0 -983
  452. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  453. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  454. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  455. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  456. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  457. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  458. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  459. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  460. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  461. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  462. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  463. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  464. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  465. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  466. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  467. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  468. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  469. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  470. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  471. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  472. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  473. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  474. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  475. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  476. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  477. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  478. package/dist/test/unit/utils.js +0 -517
  479. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  480. package/dist/test/unit/versionedTransaction.js +0 -207
  481. package/dist/tsconfig.tsbuildinfo +0 -1
  482. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  483. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  484. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  485. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  486. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  487. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  488. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  489. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  490. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  491. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  492. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  493. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  494. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  496. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  497. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  498. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  499. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  500. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  501. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  502. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  503. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  504. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  505. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  506. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  507. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  523. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  524. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  525. /package/dist/{src → esm}/index.d.ts.map +0 -0
  526. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  527. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  528. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  529. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  530. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  531. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  532. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,697 @@
1
+ import { BaseTransaction, InvalidTransactionError, ParseTransactionError, SigningError, TransactionType, } from '@bitgo-beta/sdk-core';
2
+ import { PublicKey, Transaction as SolTransaction, SystemInstruction, } from '@solana/web3.js';
3
+ import BigNumber from 'bignumber.js';
4
+ import base58 from 'bs58';
5
+ import { explainSolTransaction } from '.';
6
+ import { InstructionBuilderTypes, UNAVAILABLE_TEXT, validInstructionData, ValidInstructionTypesEnum, } from './constants';
7
+ import { instructionParamsFactory } from './instructionParamsFactory';
8
+ import { getInstructionType, getTransactionType, isValidRawTransaction, requiresAllSignatures, validateRawMsgInstruction, } from './utils';
9
+ import { SolStakingTypeEnum } from '@bitgo/public-types';
10
+ export class Transaction extends BaseTransaction {
11
+ constructor(_coinConfig) {
12
+ super(_coinConfig);
13
+ this._instructionsData = [];
14
+ this._useTokenAddressTokenName = false;
15
+ }
16
+ get solTransaction() {
17
+ return this._solTransaction;
18
+ }
19
+ set solTransaction(tx) {
20
+ this._solTransaction = tx;
21
+ }
22
+ get numberOfRequiredSignatures() {
23
+ return this._solTransaction.compileMessage().header.numRequiredSignatures;
24
+ }
25
+ get numberOfATACreationInstructions() {
26
+ return this._solTransaction.instructions.filter((instruction) => getInstructionType(instruction) === ValidInstructionTypesEnum.InitializeAssociatedTokenAccount).length;
27
+ }
28
+ /** @inheritDoc */
29
+ get signablePayload() {
30
+ if (this._v1MessageBytes) {
31
+ return Buffer.from(this._v1MessageBytes);
32
+ }
33
+ if (this._versionedTransaction) {
34
+ return Buffer.from(this._versionedTransaction.message.serialize());
35
+ }
36
+ return this._solTransaction.serializeMessage();
37
+ }
38
+ /** @inheritDoc **/
39
+ get id() {
40
+ // Solana transaction ID === first signature: https://docs.solana.com/terminology#transaction-id
41
+ if (this._v1TransactionBytes) {
42
+ // v1 wire format: messageBytes followed by 64-byte signatures; the first signature is the tx id
43
+ const numRequired = this._v1TransactionBytes[1];
44
+ const sigStart = this._v1TransactionBytes.length - numRequired * 64;
45
+ if (numRequired > 0 && sigStart >= 0) {
46
+ const sig = this._v1TransactionBytes.slice(sigStart, sigStart + 64);
47
+ if (sig.some((byte) => byte !== 0)) {
48
+ return base58.encode(sig);
49
+ }
50
+ }
51
+ }
52
+ if (this._versionedTransaction) {
53
+ const sig = this._versionedTransaction.signatures?.[0];
54
+ // Check if signature exists and is not a placeholder signature (all zeros)
55
+ if (sig && sig.some((byte) => byte !== 0)) {
56
+ return base58.encode(sig);
57
+ }
58
+ }
59
+ if (this._solTransaction.signature) {
60
+ return base58.encode(this._solTransaction.signature);
61
+ }
62
+ return UNAVAILABLE_TEXT;
63
+ }
64
+ get lamportsPerSignature() {
65
+ return this._lamportsPerSignature;
66
+ }
67
+ set lamportsPerSignature(lamportsPerSignature) {
68
+ this._lamportsPerSignature = lamportsPerSignature;
69
+ }
70
+ get tokenAccountRentExemptAmount() {
71
+ return this._tokenAccountRentExemptAmount;
72
+ }
73
+ set tokenAccountRentExemptAmount(tokenAccountRentExemptAmount) {
74
+ this._tokenAccountRentExemptAmount = tokenAccountRentExemptAmount;
75
+ }
76
+ /** @inheritDoc */
77
+ get signature() {
78
+ const signatures = [];
79
+ if (this._v1TransactionBytes) {
80
+ // v1 wire format: messageBytes followed by 64-byte signatures; filter out
81
+ // zero-filled placeholder slots (unsigned signers)
82
+ const numRequired = this._v1TransactionBytes[1];
83
+ const sigStart = this._v1TransactionBytes.length - numRequired * 64;
84
+ for (let i = 0; i < numRequired; i++) {
85
+ const sig = this._v1TransactionBytes.slice(sigStart + i * 64, sigStart + (i + 1) * 64);
86
+ if (sig.some((b) => b !== 0)) {
87
+ signatures.push(base58.encode(sig));
88
+ }
89
+ }
90
+ return signatures;
91
+ }
92
+ if (this._versionedTransaction) {
93
+ // Handle VersionedTransaction signatures
94
+ for (const sig of this._versionedTransaction.signatures) {
95
+ // Filters out placeholder signatures
96
+ if (sig && sig.some((b) => b !== 0)) {
97
+ signatures.push(base58.encode(sig));
98
+ }
99
+ }
100
+ }
101
+ else {
102
+ // Handle legacy transaction signatures
103
+ for (const solSignature of this._solTransaction.signatures) {
104
+ if (solSignature.signature) {
105
+ signatures.push(base58.encode(solSignature.signature));
106
+ }
107
+ }
108
+ }
109
+ return signatures;
110
+ }
111
+ /**
112
+ * Set the transaction type.
113
+ *
114
+ * @param {TransactionType} transactionType The transaction type to be set.
115
+ */
116
+ setTransactionType(transactionType) {
117
+ this._type = transactionType;
118
+ }
119
+ /**
120
+ * Set the instructionData.
121
+ *
122
+ * @param {InstructionParams[]} instructionData The instruction data to be set.
123
+ */
124
+ setInstructionsData(instructionData) {
125
+ this._instructionsData = instructionData;
126
+ }
127
+ get useTokenAddressTokenName() {
128
+ return this._useTokenAddressTokenName;
129
+ }
130
+ setUseTokenAddressTokenName(value) {
131
+ this._useTokenAddressTokenName = value;
132
+ }
133
+ /**
134
+ * Check if this transaction is a VersionedTransaction
135
+ * @returns {boolean} True if this is a VersionedTransaction
136
+ */
137
+ isVersionedTransaction() {
138
+ return !!this._versionedTransaction || !!this._versionedTransactionData || !!this._v1TransactionBytes;
139
+ }
140
+ /**
141
+ * Get the serialized v1 wire transaction bytes (message + signatures), if this transaction is v1
142
+ * @returns {Uint8Array | undefined} The v1 wire bytes or undefined
143
+ */
144
+ get v1TransactionBytes() {
145
+ return this._v1TransactionBytes;
146
+ }
147
+ /**
148
+ * Set the serialized v1 wire transaction bytes (message + signatures)
149
+ * @param {Uint8Array | undefined} bytes The v1 wire bytes to store, or undefined to clear
150
+ */
151
+ set v1TransactionBytes(bytes) {
152
+ this._v1TransactionBytes = bytes;
153
+ }
154
+ /**
155
+ * Get the serialized v1 message bytes (without signatures), if this transaction is v1
156
+ * @returns {Uint8Array | undefined} The v1 message bytes or undefined
157
+ */
158
+ get v1MessageBytes() {
159
+ return this._v1MessageBytes;
160
+ }
161
+ /**
162
+ * Set the serialized v1 message bytes (without signatures)
163
+ * @param {Uint8Array | undefined} bytes The v1 message bytes to store, or undefined to clear
164
+ */
165
+ set v1MessageBytes(bytes) {
166
+ this._v1MessageBytes = bytes;
167
+ }
168
+ /**
169
+ * Get the original VersionedTransaction if this transaction was parsed from one
170
+ * @returns {VersionedTransaction | undefined} The VersionedTransaction or undefined
171
+ */
172
+ get versionedTransaction() {
173
+ return this._versionedTransaction;
174
+ }
175
+ /**
176
+ * Set a built VersionedTransaction
177
+ * @param {VersionedTransaction} versionedTx The VersionedTransaction to set
178
+ */
179
+ set versionedTransaction(versionedTx) {
180
+ this._versionedTransaction = versionedTx;
181
+ }
182
+ /**
183
+ * Get the stored VersionedTransactionData
184
+ * @returns {VersionedTransactionData | undefined} The stored data or undefined
185
+ */
186
+ getVersionedTransactionData() {
187
+ return this._versionedTransactionData;
188
+ }
189
+ /**
190
+ * Set the VersionedTransactionData for this transaction
191
+ * @param {VersionedTransactionData | undefined} data The versioned transaction data to store, or undefined to clear
192
+ */
193
+ setVersionedTransactionData(data) {
194
+ this._versionedTransactionData = data;
195
+ }
196
+ /**
197
+ * Add a signature produced by the fee payer of this transaction.
198
+ *
199
+ * The fee payer is account 0 of the transaction message, so its signature belongs in slot 0.
200
+ * Use this for signatures produced by the enterprise fee address key (HSM single-sig) of a
201
+ * sponsored transaction.
202
+ *
203
+ * @param {BasePublicKey} publicKey The public key of the fee payer; must be account 0 of the message
204
+ * @param {Buffer} signature The signature of the transaction payload
205
+ */
206
+ addFeePayerSignature(publicKey, signature) {
207
+ if (this._versionedTransaction) {
208
+ const account0 = this._versionedTransaction.message.staticAccountKeys[0]?.toBase58();
209
+ if (publicKey.pub !== account0) {
210
+ throw new SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
211
+ }
212
+ this._versionedTransaction.addSignature(new PublicKey(publicKey.pub), signature);
213
+ return;
214
+ }
215
+ if (this._solTransaction) {
216
+ // For legacy transactions @solana/web3.js places the fee payer first in the message
217
+ const feePayer = this._solTransaction.feePayer?.toBase58();
218
+ if (publicKey.pub !== feePayer) {
219
+ throw new SigningError(`Fee payer signature must come from account 0 of the message, got: ${publicKey.pub}`);
220
+ }
221
+ this._solTransaction.addSignature(new PublicKey(publicKey.pub), signature);
222
+ return;
223
+ }
224
+ throw new SigningError('Fee payer signature requires a built transaction');
225
+ }
226
+ /** @inheritdoc */
227
+ canSign() {
228
+ return true;
229
+ }
230
+ /**
231
+ * Signs transaction.
232
+ *
233
+ * @param {KeyPair} keyPair Signer keys.
234
+ */
235
+ async sign(keyPair) {
236
+ // Convert to array and build signers list
237
+ const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
238
+ const signers = [];
239
+ for (const kp of keyPairs) {
240
+ const keys = kp.getKeys(true);
241
+ if (!keys.prv) {
242
+ throw new SigningError('Missing private key');
243
+ }
244
+ signers.push({ publicKey: new PublicKey(keys.pub), secretKey: keys.prv });
245
+ }
246
+ if (this._versionedTransaction) {
247
+ if (!this._versionedTransaction.message.recentBlockhash) {
248
+ throw new SigningError('Nonce is required before signing');
249
+ }
250
+ this._versionedTransaction.sign(signers);
251
+ return;
252
+ }
253
+ if (!this._solTransaction || !this._solTransaction.recentBlockhash) {
254
+ throw new SigningError('Nonce is required before signing');
255
+ }
256
+ if (!this._solTransaction || !this._solTransaction.feePayer) {
257
+ throw new SigningError('feePayer is required before signing');
258
+ }
259
+ this._solTransaction.partialSign(...signers);
260
+ }
261
+ /** @inheritdoc */
262
+ toBroadcastFormat() {
263
+ if (this._v1TransactionBytes) {
264
+ // v1 wire format is message-first with signatures appended (no length prefix)
265
+ return Buffer.from(this._v1TransactionBytes).toString('base64');
266
+ }
267
+ if (this._versionedTransaction) {
268
+ // VersionedTransaction.serialize() doesn't need requireAllSignatures parameter
269
+ // It automatically handles whatever signatures are present
270
+ return Buffer.from(this._versionedTransaction.serialize()).toString('base64');
271
+ }
272
+ if (!this._solTransaction) {
273
+ throw new ParseTransactionError('Empty transaction');
274
+ }
275
+ // The signatures can have null signatures (which means they are required but yet unsigned)
276
+ // In order to be able to serializer the txs, we have to change the requireAllSignatures based
277
+ // on if the TX is fully signed or not
278
+ const requireAllSignatures = requiresAllSignatures(this._solTransaction.signatures);
279
+ // Based on the recomendation encoding found here https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction
280
+ // We use base64 encoding
281
+ return this._solTransaction.serialize({ requireAllSignatures }).toString('base64');
282
+ }
283
+ /**
284
+ * Sets this transaction payload
285
+ *
286
+ * @param rawTransaction
287
+ */
288
+ fromRawTransaction(rawTransaction) {
289
+ try {
290
+ isValidRawTransaction(rawTransaction);
291
+ this._solTransaction = SolTransaction.from(Buffer.from(rawTransaction, 'base64'));
292
+ if (this._solTransaction.signature && this._solTransaction.signature !== null) {
293
+ this._id = base58.encode(this._solTransaction.signature);
294
+ }
295
+ const transactionType = getTransactionType(this._solTransaction);
296
+ switch (transactionType) {
297
+ case TransactionType.WalletInitialization:
298
+ this.setTransactionType(TransactionType.WalletInitialization);
299
+ break;
300
+ case TransactionType.Send:
301
+ this.setTransactionType(TransactionType.Send);
302
+ break;
303
+ case TransactionType.StakingActivate:
304
+ this.setTransactionType(TransactionType.StakingActivate);
305
+ break;
306
+ case TransactionType.StakingDeactivate:
307
+ this.setTransactionType(TransactionType.StakingDeactivate);
308
+ break;
309
+ case TransactionType.StakingWithdraw:
310
+ this.setTransactionType(TransactionType.StakingWithdraw);
311
+ break;
312
+ case TransactionType.AssociatedTokenAccountInitialization:
313
+ this.setTransactionType(TransactionType.AssociatedTokenAccountInitialization);
314
+ break;
315
+ case TransactionType.CloseAssociatedTokenAccount:
316
+ this.setTransactionType(TransactionType.CloseAssociatedTokenAccount);
317
+ break;
318
+ case TransactionType.StakingAuthorize:
319
+ this.setTransactionType(TransactionType.StakingAuthorize);
320
+ break;
321
+ case TransactionType.StakingAuthorizeRaw:
322
+ this.setTransactionType(TransactionType.StakingAuthorizeRaw);
323
+ break;
324
+ case TransactionType.StakingDelegate:
325
+ this.setTransactionType(TransactionType.StakingDelegate);
326
+ break;
327
+ case TransactionType.CustomTx:
328
+ this.setTransactionType(TransactionType.CustomTx);
329
+ break;
330
+ case TransactionType.ConfidentialTransfer:
331
+ this.setTransactionType(TransactionType.ConfidentialTransfer);
332
+ break;
333
+ }
334
+ if (transactionType !== TransactionType.StakingAuthorizeRaw) {
335
+ this.loadInputsAndOutputs();
336
+ }
337
+ }
338
+ catch (e) {
339
+ throw e;
340
+ }
341
+ }
342
+ /** @inheritdoc */
343
+ toJson() {
344
+ if (!this._solTransaction) {
345
+ throw new ParseTransactionError('Empty transaction');
346
+ }
347
+ let durableNonce;
348
+ if (this._solTransaction.nonceInfo) {
349
+ const nonceInstruction = SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
350
+ durableNonce = {
351
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
352
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
353
+ };
354
+ }
355
+ const instructionData = instructionParamsFactory(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
356
+ if (this._type) {
357
+ if (!durableNonce &&
358
+ instructionData.length > 1 &&
359
+ instructionData[0].type === InstructionBuilderTypes.NonceAdvance) {
360
+ durableNonce = instructionData[0].params;
361
+ }
362
+ }
363
+ const result = {
364
+ id: this._solTransaction.signature ? this.id : undefined,
365
+ feePayer: this._solTransaction.feePayer?.toString(),
366
+ lamportsPerSignature: this.lamportsPerSignature,
367
+ nonce: this.getNonce(),
368
+ durableNonce: durableNonce,
369
+ numSignatures: this.signature.length,
370
+ instructionsData: instructionData,
371
+ };
372
+ return result;
373
+ }
374
+ /**
375
+ * Get the nonce from the Solana Transaction
376
+ * Throws if not set
377
+ */
378
+ getNonce() {
379
+ if (this._solTransaction.recentBlockhash) {
380
+ return this._solTransaction.recentBlockhash;
381
+ }
382
+ else if (this._solTransaction.nonceInfo) {
383
+ return this._solTransaction.nonceInfo.nonce;
384
+ }
385
+ else {
386
+ throw new InvalidTransactionError('Nonce is not set');
387
+ }
388
+ }
389
+ /**
390
+ * Load the input and output data on this transaction.
391
+ */
392
+ loadInputsAndOutputs() {
393
+ if (!this._solTransaction || this._solTransaction.instructions?.length === 0) {
394
+ return;
395
+ }
396
+ const outputs = [];
397
+ const inputs = [];
398
+ const instructionParams = instructionParamsFactory(this.type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
399
+ for (const instruction of instructionParams) {
400
+ switch (instruction.type) {
401
+ case InstructionBuilderTypes.CreateNonceAccount:
402
+ inputs.push({
403
+ address: instruction.params.fromAddress,
404
+ value: instruction.params.amount,
405
+ coin: this._coinConfig.name,
406
+ });
407
+ break;
408
+ case InstructionBuilderTypes.Transfer:
409
+ inputs.push({
410
+ address: instruction.params.fromAddress,
411
+ value: instruction.params.amount,
412
+ coin: this._coinConfig.name,
413
+ });
414
+ outputs.push({
415
+ address: instruction.params.toAddress,
416
+ value: instruction.params.amount,
417
+ coin: this._coinConfig.name,
418
+ });
419
+ break;
420
+ case InstructionBuilderTypes.TokenTransfer:
421
+ inputs.push({
422
+ address: instruction.params.fromAddress,
423
+ value: instruction.params.amount,
424
+ coin: instruction.params.tokenName,
425
+ });
426
+ outputs.push({
427
+ address: instruction.params.toAddress,
428
+ value: instruction.params.amount,
429
+ coin: instruction.params.tokenName,
430
+ });
431
+ break;
432
+ case InstructionBuilderTypes.StakingActivate:
433
+ inputs.push({
434
+ address: instruction.params.fromAddress,
435
+ value: instruction.params.amount,
436
+ coin: this._coinConfig.name,
437
+ });
438
+ if (instruction.params.stakingType !== SolStakingTypeEnum.JITO) {
439
+ outputs.push({
440
+ address: instruction.params.stakingAddress,
441
+ value: instruction.params.amount,
442
+ coin: this._coinConfig.name,
443
+ });
444
+ }
445
+ break;
446
+ case InstructionBuilderTypes.StakingDeactivate:
447
+ if (instruction.params.amount &&
448
+ instruction.params.unstakingAddress &&
449
+ instruction.params.stakingType !== SolStakingTypeEnum.JITO) {
450
+ inputs.push({
451
+ address: instruction.params.stakingAddress,
452
+ value: instruction.params.amount,
453
+ coin: this._coinConfig.name,
454
+ });
455
+ outputs.push({
456
+ address: instruction.params.unstakingAddress,
457
+ value: instruction.params.amount,
458
+ coin: this._coinConfig.name,
459
+ });
460
+ }
461
+ break;
462
+ case InstructionBuilderTypes.StakingWithdraw:
463
+ inputs.push({
464
+ address: instruction.params.stakingAddress,
465
+ value: instruction.params.amount,
466
+ coin: this._coinConfig.name,
467
+ });
468
+ outputs.push({
469
+ address: instruction.params.fromAddress,
470
+ value: instruction.params.amount,
471
+ coin: this._coinConfig.name,
472
+ });
473
+ break;
474
+ case InstructionBuilderTypes.CreateAssociatedTokenAccount:
475
+ break;
476
+ case InstructionBuilderTypes.CloseAssociatedTokenAccount:
477
+ break;
478
+ case InstructionBuilderTypes.StakingAuthorize:
479
+ break;
480
+ case InstructionBuilderTypes.StakingDelegate:
481
+ break;
482
+ case InstructionBuilderTypes.SetComputeUnitLimit:
483
+ break;
484
+ case InstructionBuilderTypes.SetPriorityFee:
485
+ break;
486
+ case InstructionBuilderTypes.CustomInstruction:
487
+ break;
488
+ }
489
+ }
490
+ this._outputs = outputs;
491
+ this._inputs = inputs;
492
+ }
493
+ /** @inheritDoc */
494
+ explainTransaction() {
495
+ // Testnet uses WASM-based parsing (no @solana/web3.js dependency).
496
+ // This validates the WASM path against production traffic before
497
+ // replacing the legacy implementation for all networks.
498
+ if (this._coinConfig.name === 'tsol') {
499
+ // explainTransaction should work on unsigned/partially-signed transactions
500
+ // (e.g., during parseTransaction round-trips where null signatures become
501
+ // zero-filled buffers). Use serialize without signature validation since
502
+ // we only need to read the transaction, not broadcast it.
503
+ const txBase64 = Buffer.from(this._solTransaction.serialize({ verifySignatures: false, requireAllSignatures: false })).toString('base64');
504
+ return explainSolTransaction({
505
+ txBase64,
506
+ feeInfo: this._lamportsPerSignature ? { fee: this._lamportsPerSignature.toString() } : undefined,
507
+ tokenAccountRentExemptAmount: this._tokenAccountRentExemptAmount,
508
+ coinName: this._coinConfig.name,
509
+ });
510
+ }
511
+ if (validateRawMsgInstruction(this._solTransaction.instructions)) {
512
+ return this.explainRawMsgAuthorizeTransaction();
513
+ }
514
+ const decodedInstructions = instructionParamsFactory(this._type, this._solTransaction.instructions, this._coinConfig.name, this._instructionsData, this._useTokenAddressTokenName);
515
+ let memo = undefined;
516
+ let durableNonce = undefined;
517
+ let outputAmount = new BigNumber(0);
518
+ const outputs = [];
519
+ // Create a separate array for token enablements
520
+ const tokenEnablements = [];
521
+ for (const instruction of decodedInstructions) {
522
+ switch (instruction.type) {
523
+ case InstructionBuilderTypes.NonceAdvance:
524
+ durableNonce = instruction.params;
525
+ break;
526
+ case InstructionBuilderTypes.Memo:
527
+ memo = instruction.params.memo;
528
+ break;
529
+ case InstructionBuilderTypes.Transfer:
530
+ const transferInstruction = instruction;
531
+ outputs.push({
532
+ address: transferInstruction.params.toAddress,
533
+ amount: transferInstruction.params.amount,
534
+ });
535
+ outputAmount = outputAmount.plus(transferInstruction.params.amount);
536
+ break;
537
+ case InstructionBuilderTypes.TokenTransfer:
538
+ const tokenTransferInstruction = instruction;
539
+ outputs.push({
540
+ address: tokenTransferInstruction.params.toAddress,
541
+ amount: tokenTransferInstruction.params.amount,
542
+ tokenName: tokenTransferInstruction.params.tokenName,
543
+ });
544
+ break;
545
+ case InstructionBuilderTypes.CreateNonceAccount:
546
+ const createInstruction = instruction;
547
+ outputs.push({
548
+ address: createInstruction.params.nonceAddress,
549
+ amount: createInstruction.params.amount,
550
+ });
551
+ outputAmount = outputAmount.plus(createInstruction.params.amount);
552
+ break;
553
+ case InstructionBuilderTypes.StakingActivate:
554
+ const stakingActivateInstruction = instruction;
555
+ outputs.push({
556
+ address: stakingActivateInstruction.params.stakingAddress,
557
+ amount: stakingActivateInstruction.params.amount,
558
+ });
559
+ outputAmount = outputAmount.plus(stakingActivateInstruction.params.amount);
560
+ break;
561
+ case InstructionBuilderTypes.StakingWithdraw:
562
+ const stakingWithdrawInstruction = instruction;
563
+ outputs.push({
564
+ address: stakingWithdrawInstruction.params.fromAddress,
565
+ amount: stakingWithdrawInstruction.params.amount,
566
+ });
567
+ outputAmount = outputAmount.plus(stakingWithdrawInstruction.params.amount);
568
+ break;
569
+ case InstructionBuilderTypes.CreateAssociatedTokenAccount:
570
+ // Process token enablement instructions and collect them in the tokenEnablements array
571
+ const ataInit = instruction;
572
+ tokenEnablements.push({
573
+ address: ataInit.params.ataAddress,
574
+ tokenName: ataInit.params.tokenName,
575
+ tokenAddress: ataInit.params.mintAddress,
576
+ });
577
+ break;
578
+ case InstructionBuilderTypes.CustomInstruction:
579
+ // Custom instructions are arbitrary and cannot be explained
580
+ break;
581
+ default:
582
+ continue;
583
+ }
584
+ // After deserializing a transaction, durable nonce details are populated in the nonceInfo field
585
+ if (!durableNonce && this._solTransaction.nonceInfo) {
586
+ const nonceAdvanceInstruction = SystemInstruction.decodeNonceAdvance(this._solTransaction.nonceInfo.nonceInstruction);
587
+ durableNonce = {
588
+ authWalletAddress: nonceAdvanceInstruction.authorizedPubkey.toString(),
589
+ walletNonceAddress: nonceAdvanceInstruction.noncePubkey.toString(),
590
+ };
591
+ }
592
+ }
593
+ return this.getExplainedTransaction(outputAmount, outputs, memo, durableNonce, tokenEnablements);
594
+ }
595
+ calculateFee() {
596
+ if (this.lamportsPerSignature || this.tokenAccountRentExemptAmount) {
597
+ const signatureFees = this.lamportsPerSignature
598
+ ? new BigNumber(this.lamportsPerSignature).multipliedBy(this.numberOfRequiredSignatures).toFixed(0)
599
+ : 0;
600
+ const rentFees = this.tokenAccountRentExemptAmount
601
+ ? new BigNumber(this.tokenAccountRentExemptAmount).multipliedBy(this.numberOfATACreationInstructions).toFixed(0)
602
+ : 0;
603
+ return new BigNumber(signatureFees).plus(rentFees).toFixed(0);
604
+ }
605
+ return UNAVAILABLE_TEXT;
606
+ }
607
+ getExplainedTransaction(outputAmount, outputs, memo = undefined, durableNonce = undefined, tokenEnablements = []) {
608
+ const feeString = this.calculateFee();
609
+ // Create displayOrder with tokenEnablements always included
610
+ const displayOrder = [
611
+ 'id',
612
+ 'type',
613
+ 'blockhash',
614
+ 'durableNonce',
615
+ 'outputAmount',
616
+ 'changeAmount',
617
+ 'outputs',
618
+ 'changeOutputs',
619
+ 'tokenEnablements',
620
+ 'fee',
621
+ 'memo',
622
+ ];
623
+ // Create the base explanation object with tokenEnablements always included
624
+ const explanation = {
625
+ displayOrder,
626
+ id: this.id,
627
+ type: TransactionType[this.type].toString(),
628
+ changeOutputs: [],
629
+ changeAmount: '0',
630
+ outputAmount: outputAmount.toFixed(0),
631
+ outputs: outputs,
632
+ fee: {
633
+ fee: feeString,
634
+ feeRate: this.lamportsPerSignature,
635
+ },
636
+ memo: memo,
637
+ blockhash: this.getNonce(),
638
+ durableNonce: durableNonce,
639
+ tokenEnablements: tokenEnablements,
640
+ };
641
+ return explanation;
642
+ }
643
+ explainRawMsgAuthorizeTransaction() {
644
+ const { instructions } = this._solTransaction;
645
+ const nonceInstruction = SystemInstruction.decodeNonceAdvance(instructions[0]);
646
+ const durableNonce = {
647
+ walletNonceAddress: nonceInstruction.noncePubkey.toString(),
648
+ authWalletAddress: nonceInstruction.authorizedPubkey.toString(),
649
+ };
650
+ const data = instructions[1].data.toString('hex');
651
+ const stakingAuthorizeParams = data === validInstructionData
652
+ ? {
653
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
654
+ oldWithdrawAddress: instructions[1].keys[2].pubkey.toString(),
655
+ newWithdrawAddress: instructions[1].keys[3].pubkey.toString(),
656
+ custodianAddress: instructions[1].keys[4].pubkey.toString(),
657
+ }
658
+ : {
659
+ stakingAddress: instructions[1].keys[0].pubkey.toString(),
660
+ oldWithdrawAddress: '',
661
+ newWithdrawAddress: '',
662
+ oldStakingAuthorityAddress: instructions[1].keys[2].pubkey.toString(),
663
+ newStakingAuthorityAddress: instructions[1].keys[3].pubkey.toString(),
664
+ };
665
+ const feeString = this.calculateFee();
666
+ return {
667
+ displayOrder: [
668
+ 'id',
669
+ 'type',
670
+ 'blockhash',
671
+ 'durableNonce',
672
+ 'outputAmount',
673
+ 'changeAmount',
674
+ 'outputs',
675
+ 'changeOutputs',
676
+ 'tokenEnablements',
677
+ 'fee',
678
+ 'memo',
679
+ ],
680
+ id: this.id,
681
+ type: TransactionType[this.type].toString(),
682
+ changeOutputs: [],
683
+ changeAmount: '0',
684
+ outputAmount: 0,
685
+ outputs: [],
686
+ fee: {
687
+ fee: feeString,
688
+ feeRate: this.lamportsPerSignature,
689
+ },
690
+ blockhash: this.getNonce(),
691
+ durableNonce: durableNonce,
692
+ stakingAuthorize: stakingAuthorizeParams,
693
+ tokenEnablements: [], // Always include tokenEnablements as an empty array for consistency
694
+ };
695
+ }
696
+ }
697
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxlQUFlLEVBRWYsdUJBQXVCLEVBRXZCLHFCQUFxQixFQUNyQixZQUFZLEVBRVosZUFBZSxHQUNoQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFFTCxTQUFTLEVBRVQsV0FBVyxJQUFJLGNBQWMsRUFDN0IsaUJBQWlCLEdBRWxCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQ3JDLE9BQU8sTUFBTSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUscUJBQXFCLEVBQVcsTUFBTSxHQUFHLENBQUM7QUFDbkQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLHlCQUF5QixHQUMxQixNQUFNLGFBQWEsQ0FBQztBQWlCckIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQix5QkFBeUIsR0FDMUIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFekQsTUFBTSxPQUFPLFdBQVksU0FBUSxlQUFlO0lBWTlDLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBUlgsc0JBQWlCLEdBQXdCLEVBQUUsQ0FBQztRQUM5Qyw4QkFBeUIsR0FBRyxLQUFLLENBQUM7SUFRMUMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksY0FBYyxDQUFDLEVBQWtCO1FBQ25DLElB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RSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3JFLDBCQUEwQixFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTthQUN0RSxDQUFDO1FBQ1IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RDLE9BQU87WUFDTCxZQUFZLEVBQUU7Z0JBQ1osSUFBSTtnQkFDSixNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsY0FBYztnQkFDZCxjQUFjO2dCQUNkLGNBQWM7Z0JBQ2QsU0FBUztnQkFDVCxlQUFlO2dCQUNmLGtCQUFrQjtnQkFDbEIsS0FBSztnQkFDTCxNQUFNO2FBQ1A7WUFDRCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDM0MsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEdBQUc7WUFDakIsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsRUFBRTtZQUNYLEdBQUcsRUFBRTtnQkFDSCxHQUFHLEVBQUUsU0FBUztnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjthQUNuQztZQUNELFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzFCLFlBQVksRUFBRSxZQUFZO1lBQzFCLGdCQUFnQixFQUFFLHNCQUFzQjtZQUN4QyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsb0VBQW9FO1NBQzNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQdWJsaWNLZXkgYXMgQmFzZVB1YmxpY0tleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIElUb2tlbkVuYWJsZW1lbnQsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCbG9ja2hhc2gsXG4gIFB1YmxpY0tleSxcbiAgU2lnbmVyLFxuICBUcmFuc2FjdGlvbiBhcyBTb2xUcmFuc2FjdGlvbixcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCB7IGV4cGxhaW5Tb2xUcmFuc2FjdGlvbiwgS2V5UGFpciB9IGZyb20gJy4nO1xuaW1wb3J0IHtcbiAgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMsXG4gIFVOQVZBSUxBQkxFX1RFWFQsXG4gIHZhbGlkSW5zdHJ1Y3Rpb25EYXRhLFxuICBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBBdGFJbml0LFxuICBEdXJhYmxlTm9uY2VQYXJhbXMsXG4gIEluc3RydWN0aW9uUGFyYW1zLFxuICBNZW1vLFxuICBOb25jZSxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplUGFyYW1zLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zZmVyLFxuICBUeERhdGEsXG4gIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSxcbiAgV2FsbGV0SW5pdCxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkgfSBmcm9tICcuL2luc3RydWN0aW9uUGFyYW1zRmFjdG9yeSc7XG5pbXBvcnQge1xuICBnZXRJbnN0cnVjdGlvblR5cGUsXG4gIGdldFRyYW5zYWN0aW9uVHlwZSxcbiAgaXNWYWxpZFJhd1RyYW5zYWN0aW9uLFxuICByZXF1aXJlc0FsbFNpZ25hdHVyZXMsXG4gIHZhbGlkYXRlUmF3TXNnSW5zdHJ1Y3Rpb24sXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfc29sVHJhbnNhY3Rpb246IFNvbFRyYW5zYWN0aW9uO1xuICBwcml2YXRlIF9sYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwcm90ZWN0ZWQgX2luc3RydWN0aW9uc0RhdGE6IEluc3RydWN0aW9uUGFyYW1zW10gPSBbXTtcbiAgcHJpdmF0ZSBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZlcnNpb25lZFRyYW5zYWN0aW9uOiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3YxVHJhbnNhY3Rpb25CeXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdjFNZXNzYWdlQnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHNvbFRyYW5zYWN0aW9uKCk6IFNvbFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgc29sVHJhbnNhY3Rpb24odHg6IFNvbFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmNvbXBpbGVNZXNzYWdlKCkuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLmZpbHRlcihcbiAgICAgIChpbnN0cnVjdGlvbikgPT4gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSA9PT0gVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5Jbml0aWFsaXplQXNzb2NpYXRlZFRva2VuQWNjb3VudFxuICAgICkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fdjFNZXNzYWdlQnl0ZXMpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92MU1lc3NhZ2VCeXRlcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2Uuc2VyaWFsaXplKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplTWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICAvLyBTb2xhbmEgdHJhbnNhY3Rpb24gSUQgPT09IGZpcnN0IHNpZ25hdHVyZTogaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjdHJhbnNhY3Rpb24taWRcbiAgICBpZiAodGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzKSB7XG4gICAgICAvLyB2MSB3aXJlIGZvcm1hdDogbWVzc2FnZUJ5dGVzIGZvbGxvd2VkIGJ5IDY0LWJ5dGUgc2lnbmF0dXJlczsgdGhlIGZpcnN0IHNpZ25hdHVyZSBpcyB0aGUgdHggaWRcbiAgICAgIGNvbnN0IG51bVJlcXVpcmVkID0gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzWzFdO1xuICAgICAgY29uc3Qgc2lnU3RhcnQgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMubGVuZ3RoIC0gbnVtUmVxdWlyZWQgKiA2NDtcbiAgICAgIGlmIChudW1SZXF1aXJlZCA+IDAgJiYgc2lnU3RhcnQgPj0gMCkge1xuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMuc2xpY2Uoc2lnU3RhcnQsIHNpZ1N0YXJ0ICsgNjQpO1xuICAgICAgICBpZiAoc2lnLnNvbWUoKGJ5dGUpID0+IGJ5dGUgIT09IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGJhc2U1OC5lbmNvZGUoc2lnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbikge1xuICAgICAgY29uc3Qgc2lnID0gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlcz8uWzBdO1xuICAgICAgLy8gQ2hlY2sgaWYgc2lnbmF0dXJlIGV4aXN0cyBhbmQgaXMgbm90IGEgcGxhY2Vob2xkZXIgc2lnbmF0dXJlIChhbGwgemVyb3MpXG4gICAgICBpZiAoc2lnICYmIHNpZy5zb21lKChieXRlKSA9PiBieXRlICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gYmFzZTU4LmVuY29kZShzaWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBnZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBzZXQgbGFtcG9ydHNQZXJTaWduYXR1cmUobGFtcG9ydHNQZXJTaWduYXR1cmU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID0gbGFtcG9ydHNQZXJTaWduYXR1cmU7XG4gIH1cblxuICBnZXQgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50O1xuICB9XG5cbiAgc2V0IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQodG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCA9IHRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMpIHtcbiAgICAgIC8vIHYxIHdpcmUgZm9ybWF0OiBtZXNzYWdlQnl0ZXMgZm9sbG93ZWQgYnkgNjQtYnl0ZSBzaWduYXR1cmVzOyBmaWx0ZXIgb3V0XG4gICAgICAvLyB6ZXJvLWZpbGxlZCBwbGFjZWhvbGRlciBzbG90cyAodW5zaWduZWQgc2lnbmVycylcbiAgICAgIGNvbnN0IG51bVJlcXVpcmVkID0gdGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzWzFdO1xuICAgICAgY29uc3Qgc2lnU3RhcnQgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMubGVuZ3RoIC0gbnVtUmVxdWlyZWQgKiA2NDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUmVxdWlyZWQ7IGkrKykge1xuICAgICAgICBjb25zdCBzaWcgPSB0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMuc2xpY2Uoc2lnU3RhcnQgKyBpICogNjQsIHNpZ1N0YXJ0ICsgKGkgKyAxKSAqIDY0KTtcbiAgICAgICAgaWYgKHNpZy5zb21lKChiKSA9PiBiICE9PSAwKSkge1xuICAgICAgICAgIHNpZ25hdHVyZXMucHVzaChiYXNlNTguZW5jb2RlKHNpZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIEhhbmRsZSBWZXJzaW9uZWRUcmFuc2FjdGlvbiBzaWduYXR1cmVzXG4gICAgICBmb3IgKGNvbnN0IHNpZyBvZiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbi5zaWduYXR1cmVzKSB7XG4gICAgICAgIC8vIEZpbHRlcnMgb3V0IHBsYWNlaG9sZGVyIHNpZ25hdHVyZXNcbiAgICAgICAgaWYgKHNpZyAmJiBzaWcuc29tZSgoYikgPT4gYiAhPT0gMCkpIHtcbiAgICAgICAgICBzaWduYXR1cmVzLnB1c2goYmFzZTU4LmVuY29kZShzaWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBIYW5kbGUgbGVnYWN5IHRyYW5zYWN0aW9uIHNpZ25hdHVyZXNcbiAgICAgIGZvciAoY29uc3Qgc29sU2lnbmF0dXJlIG9mIHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZXMpIHtcbiAgICAgICAgaWYgKHNvbFNpZ25hdHVyZS5zaWduYXR1cmUpIHtcbiAgICAgICAgICBzaWduYXR1cmVzLnB1c2goYmFzZTU4LmVuY29kZShzb2xTaWduYXR1cmUuc2lnbmF0dXJlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmF0dXJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGluc3RydWN0aW9uRGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbkRhdGEgVGhlIGluc3RydWN0aW9uIGRhdGEgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0SW5zdHJ1Y3Rpb25zRGF0YShpbnN0cnVjdGlvbkRhdGE6IEluc3RydWN0aW9uUGFyYW1zW10pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0cnVjdGlvbnNEYXRhID0gaW5zdHJ1Y3Rpb25EYXRhO1xuICB9XG5cbiAgZ2V0IHVzZVRva2VuQWRkcmVzc1Rva2VuTmFtZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lO1xuICB9XG5cbiAgc2V0VXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyBhIFZlcnNpb25lZFRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoaXMgaXMgYSBWZXJzaW9uZWRUcmFuc2FjdGlvblxuICAgKi9cbiAgaXNWZXJzaW9uZWRUcmFuc2FjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbiB8fCAhIXRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSB8fCAhIXRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNlcmlhbGl6ZWQgdjEgd2lyZSB0cmFuc2FjdGlvbiBieXRlcyAobWVzc2FnZSArIHNpZ25hdHVyZXMpLCBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHYxXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBUaGUgdjEgd2lyZSBieXRlcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldCB2MVRyYW5zYWN0aW9uQnl0ZXMoKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHNlcmlhbGl6ZWQgdjEgd2lyZSB0cmFuc2FjdGlvbiBieXRlcyAobWVzc2FnZSArIHNpZ25hdHVyZXMpXG4gICAqIEBwYXJhbSB7VWludDhBcnJheSB8IHVuZGVmaW5lZH0gYnl0ZXMgVGhlIHYxIHdpcmUgYnl0ZXMgdG8gc3RvcmUsIG9yIHVuZGVmaW5lZCB0byBjbGVhclxuICAgKi9cbiAgc2V0IHYxVHJhbnNhY3Rpb25CeXRlcyhieXRlczogVWludDhBcnJheSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3YxVHJhbnNhY3Rpb25CeXRlcyA9IGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VyaWFsaXplZCB2MSBtZXNzYWdlIGJ5dGVzICh3aXRob3V0IHNpZ25hdHVyZXMpLCBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHYxXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBUaGUgdjEgbWVzc2FnZSBieXRlcyBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldCB2MU1lc3NhZ2VCeXRlcygpOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdjFNZXNzYWdlQnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZXJpYWxpemVkIHYxIG1lc3NhZ2UgYnl0ZXMgKHdpdGhvdXQgc2lnbmF0dXJlcylcbiAgICogQHBhcmFtIHtVaW50OEFycmF5IHwgdW5kZWZpbmVkfSBieXRlcyBUaGUgdjEgbWVzc2FnZSBieXRlcyB0byBzdG9yZSwgb3IgdW5kZWZpbmVkIHRvIGNsZWFyXG4gICAqL1xuICBzZXQgdjFNZXNzYWdlQnl0ZXMoYnl0ZXM6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl92MU1lc3NhZ2VCeXRlcyA9IGJ5dGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3JpZ2luYWwgVmVyc2lvbmVkVHJhbnNhY3Rpb24gaWYgdGhpcyB0cmFuc2FjdGlvbiB3YXMgcGFyc2VkIGZyb20gb25lXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZH0gVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKCk6IFZlcnNpb25lZFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgYnVpbHQgVmVyc2lvbmVkVHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbn0gdmVyc2lvbmVkVHggVGhlIFZlcnNpb25lZFRyYW5zYWN0aW9uIHRvIHNldFxuICAgKi9cbiAgc2V0IHZlcnNpb25lZFRyYW5zYWN0aW9uKHZlcnNpb25lZFR4OiBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uID0gdmVyc2lvbmVkVHg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdG9yZWQgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhXG4gICAqIEByZXR1cm5zIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IFRoZSBzdG9yZWQgZGF0YSBvciB1bmRlZmluZWRcbiAgICovXG4gIGdldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSgpOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgZm9yIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWR9IGRhdGEgVGhlIHZlcnNpb25lZCB0cmFuc2FjdGlvbiBkYXRhIHRvIHN0b3JlLCBvciB1bmRlZmluZWQgdG8gY2xlYXJcbiAgICovXG4gIHNldFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShkYXRhOiBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEgPSBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpZ25hdHVyZSBwcm9kdWNlZCBieSB0aGUgZmVlIHBheWVyIG9mIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZSBmZWUgcGF5ZXIgaXMgYWNjb3VudCAwIG9mIHRoZSB0cmFuc2FjdGlvbiBtZXNzYWdlLCBzbyBpdHMgc2lnbmF0dXJlIGJlbG9uZ3MgaW4gc2xvdCAwLlxuICAgKiBVc2UgdGhpcyBmb3Igc2lnbmF0dXJlcyBwcm9kdWNlZCBieSB0aGUgZW50ZXJwcmlzZSBmZWUgYWRkcmVzcyBrZXkgKEhTTSBzaW5nbGUtc2lnKSBvZiBhXG4gICAqIHNwb25zb3JlZCB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtCYXNlUHVibGljS2V5fSBwdWJsaWNLZXkgVGhlIHB1YmxpYyBrZXkgb2YgdGhlIGZlZSBwYXllcjsgbXVzdCBiZSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNpZ25hdHVyZSBUaGUgc2lnbmF0dXJlIG9mIHRoZSB0cmFuc2FjdGlvbiBwYXlsb2FkXG4gICAqL1xuICBhZGRGZWVQYXllclNpZ25hdHVyZShwdWJsaWNLZXk6IEJhc2VQdWJsaWNLZXksIHNpZ25hdHVyZTogQnVmZmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICBjb25zdCBhY2NvdW50MCA9IHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLm1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXNbMF0/LnRvQmFzZTU4KCk7XG4gICAgICBpZiAocHVibGljS2V5LnB1YiAhPT0gYWNjb3VudDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgRmVlIHBheWVyIHNpZ25hdHVyZSBtdXN0IGNvbWUgZnJvbSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2UsIGdvdDogJHtwdWJsaWNLZXkucHVifWApO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKG5ldyBQdWJsaWNLZXkocHVibGljS2V5LnB1YiksIHNpZ25hdHVyZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICAvLyBGb3IgbGVnYWN5IHRyYW5zYWN0aW9ucyBAc29sYW5hL3dlYjMuanMgcGxhY2VzIHRoZSBmZWUgcGF5ZXIgZmlyc3QgaW4gdGhlIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGZlZVBheWVyID0gdGhpcy5fc29sVHJhbnNhY3Rpb24uZmVlUGF5ZXI/LnRvQmFzZTU4KCk7XG4gICAgICBpZiAocHVibGljS2V5LnB1YiAhPT0gZmVlUGF5ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcihgRmVlIHBheWVyIHNpZ25hdHVyZSBtdXN0IGNvbWUgZnJvbSBhY2NvdW50IDAgb2YgdGhlIG1lc3NhZ2UsIGdvdDogJHtwdWJsaWNLZXkucHVifWApO1xuICAgICAgfVxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uYWRkU2lnbmF0dXJlKG5ldyBQdWJsaWNLZXkocHVibGljS2V5LnB1YiksIHNpZ25hdHVyZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignRmVlIHBheWVyIHNpZ25hdHVyZSByZXF1aXJlcyBhIGJ1aWx0IHRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyfSBrZXlQYWlyIFNpZ25lciBrZXlzLlxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyW10gfCBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ29udmVydCB0byBhcnJheSBhbmQgYnVpbGQgc2lnbmVycyBsaXN0XG4gICAgY29uc3Qga2V5UGFpcnMgPSBrZXlQYWlyIGluc3RhbmNlb2YgQXJyYXkgPyBrZXlQYWlyIDogW2tleVBhaXJdO1xuICAgIGNvbnN0IHNpZ25lcnM6IFNpZ25lcltdID0gW107XG4gICAgZm9yIChjb25zdCBrcCBvZiBrZXlQYWlycykge1xuICAgICAgY29uc3Qga2V5cyA9IGtwLmdldEtleXModHJ1ZSk7XG4gICAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICAgIH1cbiAgICAgIHNpZ25lcnMucHVzaCh7IHB1YmxpY0tleTogbmV3IFB1YmxpY0tleShrZXlzLnB1YiksIHNlY3JldEtleToga2V5cy5wcnYgYXMgVWludDhBcnJheSB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmICghdGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24ubWVzc2FnZS5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTm9uY2UgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZlcnNpb25lZFRyYW5zYWN0aW9uLnNpZ24oc2lnbmVycyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbiB8fCAhdGhpcy5fc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdOb25jZSBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uIHx8ICF0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignZmVlUGF5ZXIgaXMgcmVxdWlyZWQgYmVmb3JlIHNpZ25pbmcnKTtcbiAgICB9XG4gICAgdGhpcy5fc29sVHJhbnNhY3Rpb24ucGFydGlhbFNpZ24oLi4uc2lnbmVycyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdjFUcmFuc2FjdGlvbkJ5dGVzKSB7XG4gICAgICAvLyB2MSB3aXJlIGZvcm1hdCBpcyBtZXNzYWdlLWZpcnN0IHdpdGggc2lnbmF0dXJlcyBhcHBlbmRlZCAobm8gbGVuZ3RoIHByZWZpeClcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbSh0aGlzLl92MVRyYW5zYWN0aW9uQnl0ZXMpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgIC8vIFZlcnNpb25lZFRyYW5zYWN0aW9uLnNlcmlhbGl6ZSgpIGRvZXNuJ3QgbmVlZCByZXF1aXJlQWxsU2lnbmF0dXJlcyBwYXJhbWV0ZXJcbiAgICAgIC8vIEl0IGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB3aGF0ZXZlciBzaWduYXR1cmVzIGFyZSBwcmVzZW50XG4gICAgICByZXR1cm4gQnVmZmVyLmZyb20odGhpcy5fdmVyc2lvbmVkVHJhbnNhY3Rpb24uc2VyaWFsaXplKCkpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3NvbFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICAvLyBUaGUgc2lnbmF0dXJlcyBjYW4gaGF2ZSBudWxsIHNpZ25hdHVyZXMgKHdoaWNoIG1lYW5zIHRoZXkgYXJlIHJlcXVpcmVkIGJ1dCB5ZXQgdW5zaWduZWQpXG4gICAgLy8gSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZXJpYWxpemVyIHRoZSB0eHMsIHdlIGhhdmUgdG8gY2hhbmdlIHRoZSByZXF1aXJlQWxsU2lnbmF0dXJlcyBiYXNlZFxuICAgIC8vIG9uIGlmIHRoZSBUWCBpcyBmdWxseSBzaWduZWQgb3Igbm90XG4gICAgY29uc3QgcmVxdWlyZUFsbFNpZ25hdHVyZXMgPSByZXF1aXJlc0FsbFNpZ25hdHVyZXModGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcyk7XG4gICAgLy8gQmFzZWQgb24gdGhlIHJlY29tZW5kYXRpb24gZW5jb2RpbmcgZm91bmQgaGVyZSBodHRwczovL2RvY3Muc29sYW5hLmNvbS9kZXZlbG9waW5nL2NsaWVudHMvanNvbnJwYy1hcGkjc2VuZHRyYW5zYWN0aW9uXG4gICAgLy8gV2UgdXNlIGJhc2U2NCBlbmNvZGluZ1xuICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zZXJpYWxpemUoeyByZXF1aXJlQWxsU2lnbmF0dXJlcyB9KS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICpcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24gPSBTb2xUcmFuc2FjdGlvbi5mcm9tKEJ1ZmZlci5mcm9tKHJhd1RyYW5zYWN0aW9uLCAnYmFzZTY0JykpO1xuICAgICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSAmJiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5zaWduYXR1cmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5faWQgPSBiYXNlNTguZW5jb2RlKHRoaXMuX3NvbFRyYW5zYWN0aW9uLnNpZ25hdHVyZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBnZXRUcmFuc2FjdGlvblR5cGUodGhpcy5fc29sVHJhbnNhY3Rpb24pO1xuICAgICAgc3dpdGNoICh0cmFuc2FjdGlvblR5cGUpIHtcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLldhbGxldEluaXRpYWxpemF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWFjdGl2YXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Bc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb246XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuQ2xvc2VBc3NvY2lhdGVkVG9rZW5BY2NvdW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXc6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemVSYXcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdEZWxlZ2F0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4OlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5Db25maWRlbnRpYWxUcmFuc2Zlcik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNhY3Rpb25UeXBlICE9PSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdykge1xuICAgICAgICB0aGlzLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9zb2xUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mbykge1xuICAgICAgY29uc3Qgbm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZSh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2VJbnN0cnVjdGlvbik7XG4gICAgICBkdXJhYmxlTm9uY2UgPSB7XG4gICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBpbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkoXG4gICAgICB0aGlzLl90eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG4gICAgaWYgKHRoaXMuX3R5cGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgIWR1cmFibGVOb25jZSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGEubGVuZ3RoID4gMSAmJlxuICAgICAgICBpbnN0cnVjdGlvbkRhdGFbMF0udHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlXG4gICAgICApIHtcbiAgICAgICAgZHVyYWJsZU5vbmNlID0gaW5zdHJ1Y3Rpb25EYXRhWzBdLnBhcmFtcztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBUeERhdGEgPSB7XG4gICAgICBpZDogdGhpcy5fc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlID8gdGhpcy5pZCA6IHVuZGVmaW5lZCxcbiAgICAgIGZlZVBheWVyOiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5mZWVQYXllcj8udG9TdHJpbmcoKSxcbiAgICAgIGxhbXBvcnRzUGVyU2lnbmF0dXJlOiB0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlLFxuICAgICAgbm9uY2U6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgbnVtU2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUubGVuZ3RoLFxuICAgICAgaW5zdHJ1Y3Rpb25zRGF0YTogaW5zdHJ1Y3Rpb25EYXRhLFxuICAgIH07XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5vbmNlIGZyb20gdGhlIFNvbGFuYSBUcmFuc2FjdGlvblxuICAgKiBUaHJvd3MgaWYgbm90IHNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb25jZSgpOiBCbG9ja2hhc2gge1xuICAgIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5yZWNlbnRCbG9ja2hhc2g7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8pIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2xUcmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTm9uY2UgaXMgbm90IHNldCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgb24gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGxvYWRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc29sVHJhbnNhY3Rpb24gfHwgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zPy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGluc3RydWN0aW9uUGFyYW1zID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy50eXBlLFxuICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLFxuICAgICAgdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgdGhpcy5faW5zdHJ1Y3Rpb25zRGF0YSxcbiAgICAgIHRoaXMuX3VzZVRva2VuQWRkcmVzc1Rva2VuTmFtZVxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9uUGFyYW1zKSB7XG4gICAgICBzd2l0Y2ggKGluc3RydWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyOlxuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogaW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nVHlwZSAhPT0gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE8pIHtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy5zdGFraW5nQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50ICYmXG4gICAgICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMudW5zdGFraW5nQWRkcmVzcyAmJlxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdUeXBlICE9PSBTb2xTdGFraW5nVHlwZUVudW0uSklUT1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICAgIHZhbHVlOiBpbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGluc3RydWN0aW9uLnBhcmFtcy51bnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBpbnN0cnVjdGlvbi5wYXJhbXMuc3Rha2luZ0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogaW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IGluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0F1dGhvcml6ZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU2V0Q29tcHV0ZVVuaXRMaW1pdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbjpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBUZXN0bmV0IHVzZXMgV0FTTS1iYXNlZCBwYXJzaW5nIChubyBAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSkuXG4gICAgLy8gVGhpcyB2YWxpZGF0ZXMgdGhlIFdBU00gcGF0aCBhZ2FpbnN0IHByb2R1Y3Rpb24gdHJhZmZpYyBiZWZvcmVcbiAgICAvLyByZXBsYWNpbmcgdGhlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIG5ldHdvcmtzLlxuICAgIGlmICh0aGlzLl9jb2luQ29uZmlnLm5hbWUgPT09ICd0c29sJykge1xuICAgICAgLy8gZXhwbGFpblRyYW5zYWN0aW9uIHNob3VsZCB3b3JrIG9uIHVuc2lnbmVkL3BhcnRpYWxseS1zaWduZWQgdHJhbnNhY3Rpb25zXG4gICAgICAvLyAoZS5nLiwgZHVyaW5nIHBhcnNlVHJhbnNhY3Rpb24gcm91bmQtdHJpcHMgd2hlcmUgbnVsbCBzaWduYXR1cmVzIGJlY29tZVxuICAgICAgLy8gemVyby1maWxsZWQgYnVmZmVycykuIFVzZSBzZXJpYWxpemUgd2l0aG91dCBzaWduYXR1cmUgdmFsaWRhdGlvbiBzaW5jZVxuICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIHJlYWQgdGhlIHRyYW5zYWN0aW9uLCBub3QgYnJvYWRjYXN0IGl0LlxuICAgICAgY29uc3QgdHhCYXNlNjQgPSBCdWZmZXIuZnJvbShcbiAgICAgICAgdGhpcy5fc29sVHJhbnNhY3Rpb24uc2VyaWFsaXplKHsgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsIHJlcXVpcmVBbGxTaWduYXR1cmVzOiBmYWxzZSB9KVxuICAgICAgKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICByZXR1cm4gZXhwbGFpblNvbFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhCYXNlNjQsXG4gICAgICAgIGZlZUluZm86IHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlID8geyBmZWU6IHRoaXMuX2xhbXBvcnRzUGVyU2lnbmF0dXJlLnRvU3RyaW5nKCkgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudDogdGhpcy5fdG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCxcbiAgICAgICAgY29pbk5hbWU6IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh2YWxpZGF0ZVJhd01zZ0luc3RydWN0aW9uKHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucykpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5SYXdNc2dBdXRob3JpemVUcmFuc2FjdGlvbigpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICAgICAgdGhpcy5fdHlwZSxcbiAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucyxcbiAgICAgIHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIHRoaXMuX2luc3RydWN0aW9uc0RhdGEsXG4gICAgICB0aGlzLl91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWVcbiAgICApO1xuXG4gICAgbGV0IG1lbW86IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgZHVyYWJsZU5vbmNlOiBEdXJhYmxlTm9uY2VQYXJhbXMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICBsZXQgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW107XG4gICAgLy8gQ3JlYXRlIGEgc2VwYXJhdGUgYXJyYXkgZm9yIHRva2VuIGVuYWJsZW1lbnRzXG4gICAgY29uc3QgdG9rZW5FbmFibGVtZW50czogSVRva2VuRW5hYmxlbWVudFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGRlY29kZWRJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHN3aXRjaCAoaW5zdHJ1Y3Rpb24udHlwZSkge1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZTpcbiAgICAgICAgICBkdXJhYmxlTm9uY2UgPSAoaW5zdHJ1Y3Rpb24gYXMgTm9uY2UpLnBhcmFtcztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vOlxuICAgICAgICAgIG1lbW8gPSAoaW5zdHJ1Y3Rpb24gYXMgTWVtbykucGFyYW1zLm1lbW87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFRyYW5zZmVyO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiB0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLmFtb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyh0cmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXI6XG4gICAgICAgICAgY29uc3QgdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24gYXMgVG9rZW5UcmFuc2ZlcjtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogdG9rZW5UcmFuc2Zlckluc3RydWN0aW9uLnBhcmFtcy50b0FkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHRva2VuVHJhbnNmZXJJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlblRyYW5zZmVySW5zdHJ1Y3Rpb24ucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQ6XG4gICAgICAgICAgY29uc3QgY3JlYXRlSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbiBhcyBXYWxsZXRJbml0O1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMubm9uY2VBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBjcmVhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKGNyZWF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZTpcbiAgICAgICAgICBjb25zdCBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdBY3RpdmF0ZTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb24ucGFyYW1zLnN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdBY3RpdmF0ZUluc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgICBjb25zdCBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uIGFzIFN0YWtpbmdXaXRoZHJhdztcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogc3Rha2luZ1dpdGhkcmF3SW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBzdGFraW5nV2l0aGRyYXdJbnN0cnVjdGlvbi5wYXJhbXMuYW1vdW50LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudC5wbHVzKHN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9uLnBhcmFtcy5hbW91bnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgICAgLy8gUHJvY2VzcyB0b2tlbiBlbmFibGVtZW50IGluc3RydWN0aW9ucyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0b2tlbkVuYWJsZW1lbnRzIGFycmF5XG4gICAgICAgICAgY29uc3QgYXRhSW5pdCA9IGluc3RydWN0aW9uIGFzIEF0YUluaXQ7XG4gICAgICAgICAgdG9rZW5FbmFibGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGF0YUluaXQucGFyYW1zLmF0YUFkZHJlc3MsXG4gICAgICAgICAgICB0b2tlbk5hbWU6IGF0YUluaXQucGFyYW1zLnRva2VuTmFtZSxcbiAgICAgICAgICAgIHRva2VuQWRkcmVzczogYXRhSW5pdC5wYXJhbXMubWludEFkZHJlc3MsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb246XG4gICAgICAgICAgLy8gQ3VzdG9tIGluc3RydWN0aW9ucyBhcmUgYXJiaXRyYXJ5IGFuZCBjYW5ub3QgYmUgZXhwbGFpbmVkXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIGRlc2VyaWFsaXppbmcgYSB0cmFuc2FjdGlvbiwgZHVyYWJsZSBub25jZSBkZXRhaWxzIGFyZSBwb3B1bGF0ZWQgaW4gdGhlIG5vbmNlSW5mbyBmaWVsZFxuICAgICAgaWYgKCFkdXJhYmxlTm9uY2UgJiYgdGhpcy5fc29sVHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICAgIGNvbnN0IG5vbmNlQWR2YW5jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKFxuICAgICAgICAgIHRoaXMuX3NvbFRyYW5zYWN0aW9uLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGR1cmFibGVOb25jZSA9IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogbm9uY2VBZHZhbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRFeHBsYWluZWRUcmFuc2FjdGlvbihvdXRwdXRBbW91bnQsIG91dHB1dHMsIG1lbW8sIGR1cmFibGVOb25jZSwgdG9rZW5FbmFibGVtZW50cyk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUZlZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmxhbXBvcnRzUGVyU2lnbmF0dXJlIHx8IHRoaXMudG9rZW5BY2NvdW50UmVudEV4ZW1wdEFtb3VudCkge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlRmVlcyA9IHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmVcbiAgICAgICAgPyBuZXcgQmlnTnVtYmVyKHRoaXMubGFtcG9ydHNQZXJTaWduYXR1cmUpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mUmVxdWlyZWRTaWduYXR1cmVzKS50b0ZpeGVkKDApXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHJlbnRGZWVzID0gdGhpcy50b2tlbkFjY291bnRSZW50RXhlbXB0QW1vdW50XG4gICAgICAgID8gbmV3IEJpZ051bWJlcih0aGlzLnRva2VuQWNjb3VudFJlbnRFeGVtcHRBbW91bnQpLm11bHRpcGxpZWRCeSh0aGlzLm51bWJlck9mQVRBQ3JlYXRpb25JbnN0cnVjdGlvbnMpLnRvRml4ZWQoMClcbiAgICAgICAgOiAwO1xuICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoc2lnbmF0dXJlRmVlcykucGx1cyhyZW50RmVlcykudG9GaXhlZCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIFVOQVZBSUxBQkxFX1RFWFQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RXhwbGFpbmVkVHJhbnNhY3Rpb24oXG4gICAgb3V0cHV0QW1vdW50OiBCaWdOdW1iZXIsXG4gICAgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSxcbiAgICBtZW1vOiB1bmRlZmluZWQgfCBzdHJpbmcgPSB1bmRlZmluZWQsXG4gICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQgfCBEdXJhYmxlTm9uY2VQYXJhbXMgPSB1bmRlZmluZWQsXG4gICAgdG9rZW5FbmFibGVtZW50czogSVRva2VuRW5hYmxlbWVudFtdID0gW11cbiAgKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgZmVlU3RyaW5nID0gdGhpcy5jYWxjdWxhdGVGZWUoKTtcblxuICAgIC8vIENyZWF0ZSBkaXNwbGF5T3JkZXIgd2l0aCB0b2tlbkVuYWJsZW1lbnRzIGFsd2F5cyBpbmNsdWRlZFxuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICdpZCcsXG4gICAgICAndHlwZScsXG4gICAgICAnYmxvY2toYXNoJyxcbiAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICdmZWUnLFxuICAgICAgJ21lbW8nLFxuICAgIF07XG5cbiAgICAvLyBDcmVhdGUgdGhlIGJhc2UgZXhwbGFuYXRpb24gb2JqZWN0IHdpdGggdG9rZW5FbmFibGVtZW50cyBhbHdheXMgaW5jbHVkZWRcbiAgICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IG91dHB1dEFtb3VudC50b0ZpeGVkKDApLFxuICAgICAgb3V0cHV0czogb3V0cHV0cyxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgICAgYmxvY2toYXNoOiB0aGlzLmdldE5vbmNlKCksXG4gICAgICBkdXJhYmxlTm9uY2U6IGR1cmFibGVOb25jZSxcbiAgICAgIHRva2VuRW5hYmxlbWVudHM6IHRva2VuRW5hYmxlbWVudHMsXG4gICAgfTtcblxuICAgIHJldHVybiBleHBsYW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgZXhwbGFpblJhd01zZ0F1dGhvcml6ZVRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHsgaW5zdHJ1Y3Rpb25zIH0gPSB0aGlzLl9zb2xUcmFuc2FjdGlvbjtcbiAgICBjb25zdCBub25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uc1swXSk7XG4gICAgY29uc3QgZHVyYWJsZU5vbmNlID0ge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBub25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBhdXRoV2FsbGV0QWRkcmVzczogbm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgfTtcbiAgICBjb25zdCBkYXRhID0gaW5zdHJ1Y3Rpb25zWzFdLmRhdGEudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHN0YWtpbmdBdXRob3JpemVQYXJhbXM6IFN0YWtpbmdBdXRob3JpemVQYXJhbXMgPVxuICAgICAgZGF0YSA9PT0gdmFsaWRJbnN0cnVjdGlvbkRhdGFcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGluc3RydWN0aW9uc1sxXS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5zdHJ1Y3Rpb25zWzFdLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRXaXRoZHJhd0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgbmV3V2l0aGRyYXdBZGRyZXNzOiAnJyxcbiAgICAgICAgICAgIG9sZFN0YWtpbmdBdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1syXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1N0YWtpbmdBdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbnNbMV0ua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9O1xuICAgIGNvbnN0IGZlZVN0cmluZyA9IHRoaXMuY2FsY3VsYXRlRmVlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAnaWQnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAnZmVlJyxcbiAgICAgICAgJ21lbW8nLFxuICAgICAgXSxcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlW3RoaXMudHlwZV0udG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IGZlZVN0cmluZyxcbiAgICAgICAgZmVlUmF0ZTogdGhpcy5sYW1wb3J0c1BlclNpZ25hdHVyZSxcbiAgICAgIH0sXG4gICAgICBibG9ja2hhc2g6IHRoaXMuZ2V0Tm9uY2UoKSxcbiAgICAgIGR1cmFibGVOb25jZTogZHVyYWJsZU5vbmNlLFxuICAgICAgc3Rha2luZ0F1dGhvcml6ZTogc3Rha2luZ0F1dGhvcml6ZVBhcmFtcyxcbiAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLCAvLyBBbHdheXMgaW5jbHVkZSB0b2tlbkVuYWJsZW1lbnRzIGFzIGFuIGVtcHR5IGFycmF5IGZvciBjb25zaXN0ZW5jeVxuICAgIH07XG4gIH1cbn1cbiJdfQ==