@bitgo-beta/sdk-coin-sol 7.6.4-beta.71 → 7.6.4-beta.710

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 (496) 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 +89 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +269 -0
  17. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  18. package/dist/cjs/src/lib/customInstructionBuilder.js +289 -0
  19. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  22. package/dist/cjs/src/lib/iface.d.ts +526 -0
  23. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  24. package/dist/cjs/src/lib/iface.js +7 -0
  25. package/dist/{src → cjs/src}/lib/index.d.ts +5 -0
  26. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/index.js +93 -0
  28. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  29. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  30. package/dist/cjs/src/lib/instructionParamsFactory.js +1220 -0
  31. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  33. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  34. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/keyPair.js +112 -0
  36. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  37. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  38. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  40. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  43. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  46. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  55. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +30 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +205 -0
  58. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  59. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  61. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  62. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  63. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  64. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  65. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  66. package/dist/cjs/src/lib/solInstructionFactory.js +1094 -0
  67. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  68. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  69. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  71. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  73. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  75. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  77. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  79. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  80. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  81. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  82. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  83. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  84. package/dist/cjs/src/lib/tokenExtensions.js +105 -0
  85. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  86. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  87. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  88. package/dist/{src → cjs/src}/lib/transaction.d.ts +22 -0
  89. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  90. package/dist/cjs/src/lib/transaction.js +661 -0
  91. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +9 -1
  92. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  93. package/dist/cjs/src/lib/transactionBuilder.js +388 -0
  94. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +14 -0
  95. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  96. package/dist/cjs/src/lib/transactionBuilderFactory.js +222 -0
  97. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  98. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  99. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  100. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  101. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  102. package/dist/{src → cjs/src}/lib/utils.d.ts +5 -0
  103. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  104. package/dist/cjs/src/lib/utils.js +657 -0
  105. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  106. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  107. package/dist/cjs/src/register.d.ts +5 -0
  108. package/dist/cjs/src/register.d.ts.map +1 -0
  109. package/dist/cjs/src/register.js +29 -0
  110. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  111. package/dist/cjs/src/sol.d.ts.map +1 -0
  112. package/dist/cjs/src/sol.js +1670 -0
  113. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  114. package/dist/cjs/src/solToken.d.ts.map +1 -0
  115. package/dist/cjs/src/solToken.js +79 -0
  116. package/dist/cjs/src/tsol.d.ts.map +1 -0
  117. package/dist/cjs/src/tsol.js +24 -0
  118. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  119. package/dist/cjs/test/fixtures/sol.js +1433 -0
  120. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  121. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  122. package/dist/cjs/test/resources/sol.js +320 -0
  123. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  124. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  125. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  126. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  127. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  128. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  129. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  130. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  131. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  132. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  133. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  134. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  135. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  136. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  137. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  138. package/dist/cjs/test/unit/keyPair.js +177 -0
  139. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  140. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  141. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  142. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  143. package/dist/cjs/test/unit/register.d.ts +2 -0
  144. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/register.js +65 -0
  146. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  147. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  148. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  149. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  150. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  151. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  152. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  153. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  154. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  155. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  156. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  157. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  158. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  159. package/dist/cjs/test/unit/sol.js +5038 -0
  160. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  162. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  163. package/dist/cjs/test/unit/solToken.js +37 -0
  164. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  165. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  166. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  167. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  168. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  169. package/dist/cjs/test/unit/tokenExtensions.js +58 -0
  170. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  171. package/dist/cjs/test/unit/transaction.js +1108 -0
  172. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  174. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  175. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  176. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  177. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  178. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  179. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  180. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  181. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +909 -0
  182. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  183. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  184. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +144 -0
  185. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  186. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  187. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  188. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  189. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  190. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  192. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  193. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  194. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  195. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  196. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  198. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  199. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  200. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  201. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  202. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  204. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  205. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  206. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  207. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  208. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  210. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  211. package/dist/cjs/test/unit/utils.js +628 -0
  212. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  213. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  214. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  215. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  216. package/dist/esm/index.d.ts +7 -0
  217. package/dist/esm/index.js +7 -0
  218. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  219. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  220. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  221. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  222. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  223. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  224. package/dist/esm/lib/confidentialTransferBuilder.d.ts +128 -0
  225. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  226. package/dist/esm/lib/confidentialTransferBuilder.js +304 -0
  227. package/dist/esm/lib/constants.d.ts +227 -0
  228. package/dist/esm/lib/constants.d.ts.map +1 -0
  229. package/dist/esm/lib/constants.js +266 -0
  230. package/dist/esm/lib/customInstructionBuilder.d.ts +72 -0
  231. package/dist/esm/lib/customInstructionBuilder.js +282 -0
  232. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  233. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  234. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  235. package/dist/esm/lib/iface.d.ts +526 -0
  236. package/dist/esm/lib/iface.d.ts.map +1 -0
  237. package/dist/esm/lib/iface.js +3 -0
  238. package/dist/esm/lib/index.d.ts +27 -0
  239. package/dist/esm/lib/index.d.ts.map +1 -0
  240. package/dist/esm/lib/index.js +27 -0
  241. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  242. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  243. package/dist/esm/lib/instructionParamsFactory.js +1212 -0
  244. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  245. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  246. package/dist/esm/lib/keyPair.d.ts +32 -0
  247. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  248. package/dist/esm/lib/keyPair.js +75 -0
  249. package/dist/esm/lib/messages/index.d.ts +2 -0
  250. package/dist/esm/lib/messages/index.js +2 -0
  251. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  252. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  253. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  254. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  255. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  256. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  257. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  258. package/dist/esm/lib/scaledUiAmount.js +108 -0
  259. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  260. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  261. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  262. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  263. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  264. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  265. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  266. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  267. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  268. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +30 -0
  269. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  270. package/dist/esm/lib/serialization/compileTransactionMessage.js +202 -0
  271. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  272. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  273. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  274. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  275. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  276. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  277. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  278. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  279. package/dist/esm/lib/solInstructionFactory.js +1088 -0
  280. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  281. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  282. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  283. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  284. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  285. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  286. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  287. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  288. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  289. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  290. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  291. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  292. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  293. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  294. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  295. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  296. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  297. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  298. package/dist/esm/lib/token2022Resolve.js +194 -0
  299. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  300. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  301. package/dist/esm/lib/tokenExtensions.js +99 -0
  302. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  303. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  304. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  305. package/dist/esm/lib/transaction.d.ts +125 -0
  306. package/dist/esm/lib/transaction.d.ts.map +1 -0
  307. package/dist/esm/lib/transaction.js +654 -0
  308. package/dist/esm/lib/transactionBuilder.d.ts +136 -0
  309. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  310. package/dist/esm/lib/transactionBuilder.js +381 -0
  311. package/dist/esm/lib/transactionBuilderFactory.d.ts +129 -0
  312. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  313. package/dist/esm/lib/transactionBuilderFactory.js +218 -0
  314. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  315. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  316. package/dist/esm/lib/transferBuilder.js +74 -0
  317. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  318. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  319. package/dist/esm/lib/transferBuilderV2.js +245 -0
  320. package/dist/esm/lib/utils.d.ts +205 -0
  321. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  322. package/dist/esm/lib/utils.js +619 -0
  323. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  324. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  325. package/dist/esm/register.d.ts +5 -0
  326. package/dist/esm/register.d.ts.map +1 -0
  327. package/dist/esm/register.js +24 -0
  328. package/dist/esm/sol.d.ts +351 -0
  329. package/dist/esm/sol.d.ts.map +1 -0
  330. package/dist/esm/sol.js +1629 -0
  331. package/dist/esm/solToken.d.ts +44 -0
  332. package/dist/esm/solToken.d.ts.map +1 -0
  333. package/dist/esm/solToken.js +75 -0
  334. package/dist/esm/tsol.d.ts +11 -0
  335. package/dist/esm/tsol.js +20 -0
  336. package/package.json +36 -16
  337. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  338. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  339. package/dist/src/config/token2022StaticConfig.js +0 -50
  340. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  341. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  342. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  343. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  344. package/dist/src/lib/closeAtaBuilder.js +0 -69
  345. package/dist/src/lib/constants.d.ts.map +0 -1
  346. package/dist/src/lib/constants.js +0 -171
  347. package/dist/src/lib/customInstructionBuilder.js +0 -289
  348. package/dist/src/lib/iface.d.ts +0 -244
  349. package/dist/src/lib/iface.d.ts.map +0 -1
  350. package/dist/src/lib/iface.js +0 -7
  351. package/dist/src/lib/index.d.ts.map +0 -1
  352. package/dist/src/lib/index.js +0 -77
  353. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  354. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  355. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  356. package/dist/src/lib/keyPair.d.ts.map +0 -1
  357. package/dist/src/lib/keyPair.js +0 -63
  358. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  359. package/dist/src/lib/solInstructionFactory.js +0 -572
  360. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  361. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  362. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  363. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  364. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  365. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  366. package/dist/src/lib/token2022Config.d.ts +0 -44
  367. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  368. package/dist/src/lib/token2022Config.js +0 -27
  369. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  370. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  371. package/dist/src/lib/transaction.d.ts.map +0 -1
  372. package/dist/src/lib/transaction.js +0 -595
  373. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  374. package/dist/src/lib/transactionBuilder.js +0 -380
  375. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  376. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  377. package/dist/src/lib/transferBuilder.js +0 -70
  378. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  379. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  380. package/dist/src/lib/transferBuilderV2.js +0 -210
  381. package/dist/src/lib/utils.js +0 -589
  382. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  383. package/dist/src/register.d.ts +0 -3
  384. package/dist/src/register.d.ts.map +0 -1
  385. package/dist/src/register.js +0 -15
  386. package/dist/src/sol.d.ts.map +0 -1
  387. package/dist/src/sol.js +0 -1324
  388. package/dist/src/solToken.d.ts.map +0 -1
  389. package/dist/src/solToken.js +0 -69
  390. package/dist/src/tsol.js +0 -24
  391. package/dist/test/fixtures/sol.js +0 -1433
  392. package/dist/test/resources/sol.d.ts.map +0 -1
  393. package/dist/test/resources/sol.js +0 -320
  394. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  395. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  396. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  397. package/dist/test/unit/getBuilderFactory.js +0 -10
  398. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  399. package/dist/test/unit/instructionParamsFactory.js +0 -412
  400. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  401. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  402. package/dist/test/unit/keyPair.js +0 -177
  403. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  404. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  405. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  406. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  407. package/dist/test/unit/sol.js +0 -3180
  408. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  409. package/dist/test/unit/solInstructionFactory.js +0 -454
  410. package/dist/test/unit/solToken.d.ts.map +0 -1
  411. package/dist/test/unit/solToken.js +0 -31
  412. package/dist/test/unit/transaction.d.ts.map +0 -1
  413. package/dist/test/unit/transaction.js +0 -983
  414. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  415. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  416. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  417. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  418. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  419. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  420. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  421. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  422. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  423. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  424. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  425. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  426. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  427. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  428. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  429. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  430. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  431. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  432. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  433. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  434. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  435. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  436. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  437. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  438. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  439. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  440. package/dist/test/unit/utils.js +0 -517
  441. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  442. package/dist/test/unit/versionedTransaction.js +0 -207
  443. package/dist/tsconfig.tsbuildinfo +0 -1
  444. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  445. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  446. /package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +0 -0
  447. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  448. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  449. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  450. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  451. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  452. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  453. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  454. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  455. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  456. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  457. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  458. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  459. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  460. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  461. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  462. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  463. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  464. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  465. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  466. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  467. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  468. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  469. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  470. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  471. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  472. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  473. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  474. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  475. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  476. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  477. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  478. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  479. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  480. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  481. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  482. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  483. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  484. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  485. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  486. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  487. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  488. /package/dist/{src → esm}/index.d.ts.map +0 -0
  489. /package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +0 -0
  490. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  491. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  492. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  493. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  494. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  495. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  496. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,1212 @@
1
+ import { decodeTransferCheckedInstruction, decodeTransferCheckedWithFeeInstruction, decodeBurnInstruction, decodeMintToInstruction, TOKEN_2022_PROGRAM_ID, decodeApproveInstruction, TokenInstruction, TransferFeeInstruction, } from '@solana/spl-token';
2
+ import { StakeInstruction, StakeProgram, SystemInstruction, ComputeBudgetInstruction, } from '@solana/web3.js';
3
+ import { SolStakingTypeEnum } from '@bitgo/public-types';
4
+ import { NotSupported, TransactionType } from '@bitgo-beta/sdk-core';
5
+ import { coins, SolCoin } from '@bitgo-beta/statics';
6
+ import assert from 'assert';
7
+ import { InstructionBuilderTypes, ValidInstructionTypesEnum, walletInitInstructionIndexes } from './constants';
8
+ import { getInstructionType } from './utils';
9
+ import { decodeDepositSol, decodeWithdrawStake } from './jitoStakePoolOperations';
10
+ /**
11
+ * Construct instructions params from Solana instructions
12
+ *
13
+ * @param {TransactionType} type - the transaction type
14
+ * @param {TransactionInstruction[]} instructions - solana instructions
15
+ * @returns {InstructionParams[]} An array containing instruction params
16
+ */
17
+ export function instructionParamsFactory(type, instructions, coinName, instructionMetadata, _useTokenAddressTokenName) {
18
+ switch (type) {
19
+ case TransactionType.WalletInitialization:
20
+ return parseWalletInitInstructions(instructions);
21
+ case TransactionType.Send:
22
+ return parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
23
+ case TransactionType.StakingActivate:
24
+ return parseStakingActivateInstructions(instructions);
25
+ case TransactionType.StakingDeactivate:
26
+ return parseStakingDeactivateInstructions(instructions, coinName);
27
+ case TransactionType.StakingWithdraw:
28
+ return parseStakingWithdrawInstructions(instructions);
29
+ case TransactionType.AssociatedTokenAccountInitialization:
30
+ return parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName);
31
+ case TransactionType.CloseAssociatedTokenAccount:
32
+ return parseAtaCloseInstructions(instructions);
33
+ case TransactionType.StakingAuthorize:
34
+ return parseStakingAuthorizeInstructions(instructions);
35
+ case TransactionType.StakingAuthorizeRaw:
36
+ return parseStakingAuthorizeRawInstructions(instructions);
37
+ case TransactionType.StakingDelegate:
38
+ return parseStakingDelegateInstructions(instructions);
39
+ case TransactionType.CustomTx:
40
+ return parseCustomInstructions(instructions, instructionMetadata);
41
+ case TransactionType.ConfidentialTransfer:
42
+ return parseConfidentialTransferInstructions(instructions, instructionMetadata);
43
+ default:
44
+ throw new NotSupported('Invalid transaction, transaction type not supported: ' + type);
45
+ }
46
+ }
47
+ /**
48
+ * Parses Solana instructions to Wallet initialization tx instructions params
49
+ *
50
+ * @param {TransactionInstruction[]} instructions - containing create and initialize nonce solana instructions
51
+ * @returns {InstructionParams[]} An array containing instruction params for Wallet initialization tx
52
+ */
53
+ function parseWalletInitInstructions(instructions) {
54
+ const instructionData = [];
55
+ const createInstruction = SystemInstruction.decodeCreateAccount(instructions[walletInitInstructionIndexes.Create]);
56
+ const nonceInitInstruction = SystemInstruction.decodeNonceInitialize(instructions[walletInitInstructionIndexes.InitializeNonceAccount]);
57
+ const walletInit = {
58
+ type: InstructionBuilderTypes.CreateNonceAccount,
59
+ params: {
60
+ fromAddress: createInstruction.fromPubkey.toString(),
61
+ nonceAddress: nonceInitInstruction.noncePubkey.toString(),
62
+ authAddress: nonceInitInstruction.authorizedPubkey.toString(),
63
+ amount: createInstruction.lamports.toString(),
64
+ },
65
+ };
66
+ instructionData.push(walletInit);
67
+ const memo = getMemo(instructions, walletInitInstructionIndexes);
68
+ if (memo) {
69
+ instructionData.push(memo);
70
+ }
71
+ return instructionData;
72
+ }
73
+ /**
74
+ * Parses Solana instructions to Send tx instructions params
75
+ * Only supports Memo, Transfer and Advance Nonce Solana instructions
76
+ *
77
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
78
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
79
+ */
80
+ function parseSendInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
81
+ const instructionData = [];
82
+ for (const instruction of instructions) {
83
+ const type = getInstructionType(instruction);
84
+ switch (type) {
85
+ case ValidInstructionTypesEnum.Memo:
86
+ const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
87
+ instructionData.push(memo);
88
+ break;
89
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
90
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
91
+ const nonce = {
92
+ type: InstructionBuilderTypes.NonceAdvance,
93
+ params: {
94
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
95
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
96
+ },
97
+ };
98
+ instructionData.push(nonce);
99
+ break;
100
+ case ValidInstructionTypesEnum.Transfer:
101
+ const transferInstruction = SystemInstruction.decodeTransfer(instruction);
102
+ const transfer = {
103
+ type: InstructionBuilderTypes.Transfer,
104
+ params: {
105
+ fromAddress: transferInstruction.fromPubkey.toString(),
106
+ toAddress: transferInstruction.toPubkey.toString(),
107
+ amount: transferInstruction.lamports.toString(),
108
+ },
109
+ };
110
+ instructionData.push(transfer);
111
+ break;
112
+ case ValidInstructionTypesEnum.TokenTransfer:
113
+ const isToken2022Transfer = instruction.programId.toString() === TOKEN_2022_PROGRAM_ID.toString();
114
+ const isTransferWithFee = isToken2022Transfer &&
115
+ instruction.data.length >= 2 &&
116
+ instruction.data[0] === TokenInstruction.TransferFeeExtension &&
117
+ instruction.data[1] === TransferFeeInstruction.TransferCheckedWithFee;
118
+ let ttKeys;
119
+ let ttAmount;
120
+ let ttDecimals;
121
+ let ttFee;
122
+ if (isTransferWithFee) {
123
+ const decoded = decodeTransferCheckedWithFeeInstruction(instruction, TOKEN_2022_PROGRAM_ID);
124
+ // WithFee exposes `authority` where TransferChecked exposes `owner`; normalize to owner.
125
+ ttKeys = {
126
+ source: decoded.keys.source,
127
+ mint: decoded.keys.mint,
128
+ destination: decoded.keys.destination,
129
+ owner: decoded.keys.authority,
130
+ };
131
+ ttAmount = decoded.data.amount;
132
+ ttDecimals = decoded.data.decimals;
133
+ ttFee = decoded.data.fee.toString();
134
+ }
135
+ else {
136
+ const decoded = decodeTransferCheckedInstruction(instruction, isToken2022Transfer ? TOKEN_2022_PROGRAM_ID : undefined);
137
+ ttKeys = decoded.keys;
138
+ ttAmount = decoded.data.amount;
139
+ ttDecimals = decoded.data.decimals;
140
+ }
141
+ const tokenAddress = ttKeys.mint.pubkey.toString();
142
+ const tokenName = findTokenName(tokenAddress, instructionMetadata, _useTokenAddressTokenName);
143
+ let programIDForTokenTransfer;
144
+ if (instruction.programId) {
145
+ programIDForTokenTransfer = instruction.programId.toString();
146
+ }
147
+ const transferHookAccounts = findTransferHookAccounts(ttKeys.owner.pubkey.toString(), ttKeys.destination.pubkey.toString(), tokenAddress, instructionMetadata);
148
+ const tokenTransfer = {
149
+ type: InstructionBuilderTypes.TokenTransfer,
150
+ params: {
151
+ fromAddress: ttKeys.owner.pubkey.toString(),
152
+ toAddress: ttKeys.destination.pubkey.toString(),
153
+ amount: ttAmount.toString(),
154
+ tokenName,
155
+ sourceAddress: ttKeys.source.pubkey.toString(),
156
+ tokenAddress: tokenAddress,
157
+ programId: programIDForTokenTransfer,
158
+ decimalPlaces: ttDecimals,
159
+ ...(ttFee !== undefined ? { fee: ttFee } : {}),
160
+ ...(transferHookAccounts ? { transferHookAccounts } : {}),
161
+ },
162
+ };
163
+ instructionData.push(tokenTransfer);
164
+ break;
165
+ case ValidInstructionTypesEnum.Approve:
166
+ const programId = instruction.programId.equals(TOKEN_2022_PROGRAM_ID) ? TOKEN_2022_PROGRAM_ID : undefined;
167
+ const approveInstruction = decodeApproveInstruction(instruction, programId);
168
+ const approve = {
169
+ type: InstructionBuilderTypes.Approve,
170
+ params: {
171
+ accountAddress: approveInstruction.keys.account.toString(),
172
+ delegateAddress: approveInstruction.keys.delegate.toString(),
173
+ ownerAddress: approveInstruction.keys.owner.toString(),
174
+ amount: approveInstruction.data.amount.toString(),
175
+ programId: programId && programId.toString(),
176
+ },
177
+ };
178
+ instructionData.push(approve);
179
+ break;
180
+ case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
181
+ const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
182
+ const mintTokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
183
+ let programID;
184
+ if (instruction.programId) {
185
+ programID = instruction.programId.toString();
186
+ }
187
+ const ataInit = {
188
+ type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
189
+ params: {
190
+ mintAddress,
191
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
192
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
193
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
194
+ tokenName: mintTokenName,
195
+ programId: programID,
196
+ },
197
+ };
198
+ instructionData.push(ataInit);
199
+ break;
200
+ case ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
201
+ const accountAddress = instruction.keys[closeAtaInstructionKeysIndexes.AccountAddress].pubkey.toString();
202
+ const destinationAddress = instruction.keys[closeAtaInstructionKeysIndexes.DestinationAddress].pubkey.toString();
203
+ const authorityAddress = instruction.keys[closeAtaInstructionKeysIndexes.AuthorityAddress].pubkey.toString();
204
+ const ataClose = {
205
+ type: InstructionBuilderTypes.CloseAssociatedTokenAccount,
206
+ params: {
207
+ accountAddress,
208
+ destinationAddress,
209
+ authorityAddress,
210
+ ...(instruction.programId.equals(TOKEN_2022_PROGRAM_ID)
211
+ ? { programId: instruction.programId.toString() }
212
+ : {}),
213
+ },
214
+ };
215
+ instructionData.push(ataClose);
216
+ break;
217
+ case ValidInstructionTypesEnum.SetComputeUnitLimit:
218
+ const setComputeUnitLimitParams = ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction);
219
+ const setComputeUnitLimit = {
220
+ type: InstructionBuilderTypes.SetComputeUnitLimit,
221
+ params: {
222
+ units: setComputeUnitLimitParams.units,
223
+ },
224
+ };
225
+ instructionData.push(setComputeUnitLimit);
226
+ break;
227
+ case ValidInstructionTypesEnum.SetPriorityFee:
228
+ const setComputeUnitPriceParams = ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction);
229
+ const setPriorityFee = {
230
+ type: InstructionBuilderTypes.SetPriorityFee,
231
+ params: {
232
+ fee: setComputeUnitPriceParams.microLamports,
233
+ },
234
+ };
235
+ instructionData.push(setPriorityFee);
236
+ break;
237
+ case ValidInstructionTypesEnum.MintTo:
238
+ let mintToInstruction;
239
+ if (instruction.programId.toString() !== TOKEN_2022_PROGRAM_ID.toString()) {
240
+ mintToInstruction = decodeMintToInstruction(instruction);
241
+ }
242
+ else {
243
+ mintToInstruction = decodeMintToInstruction(instruction, TOKEN_2022_PROGRAM_ID);
244
+ }
245
+ const mintAddressForMint = mintToInstruction.keys.mint.pubkey.toString();
246
+ const tokenNameForMint = findTokenName(mintAddressForMint, instructionMetadata, _useTokenAddressTokenName);
247
+ let programIDForMint;
248
+ if (instruction.programId) {
249
+ programIDForMint = instruction.programId.toString();
250
+ }
251
+ const mintTo = {
252
+ type: InstructionBuilderTypes.MintTo,
253
+ params: {
254
+ mintAddress: mintAddressForMint,
255
+ destinationAddress: mintToInstruction.keys.destination.pubkey.toString(),
256
+ authorityAddress: mintToInstruction.keys.authority.pubkey.toString(),
257
+ amount: mintToInstruction.data.amount.toString(),
258
+ tokenName: tokenNameForMint,
259
+ decimalPlaces: undefined,
260
+ programId: programIDForMint,
261
+ },
262
+ };
263
+ instructionData.push(mintTo);
264
+ break;
265
+ case ValidInstructionTypesEnum.Burn:
266
+ let burnInstruction;
267
+ if (instruction.programId.toString() !== TOKEN_2022_PROGRAM_ID.toString()) {
268
+ burnInstruction = decodeBurnInstruction(instruction);
269
+ }
270
+ else {
271
+ burnInstruction = decodeBurnInstruction(instruction, TOKEN_2022_PROGRAM_ID);
272
+ }
273
+ const mintAddressForBurn = burnInstruction.keys.mint.pubkey.toString();
274
+ const tokenNameForBurn = findTokenName(mintAddressForBurn, instructionMetadata, _useTokenAddressTokenName);
275
+ let programIDForBurn;
276
+ if (instruction.programId) {
277
+ programIDForBurn = instruction.programId.toString();
278
+ }
279
+ const burn = {
280
+ type: InstructionBuilderTypes.Burn,
281
+ params: {
282
+ mintAddress: mintAddressForBurn,
283
+ accountAddress: burnInstruction.keys.account.pubkey.toString(),
284
+ authorityAddress: burnInstruction.keys.owner.pubkey.toString(),
285
+ amount: burnInstruction.data.amount.toString(),
286
+ tokenName: tokenNameForBurn,
287
+ decimalPlaces: undefined,
288
+ programId: programIDForBurn,
289
+ },
290
+ };
291
+ instructionData.push(burn);
292
+ break;
293
+ case ValidInstructionTypesEnum.PermissionlessThawIdempotent:
294
+ // Account order matches the fixed layout emitted by solInstructionFactory:
295
+ // [authority, mint, tokenAccount, flagAccount, tokenAccountOwner, mintConfig,
296
+ // tokenProgram, systemProgram, gatingProgram, ...extraAccounts].
297
+ const thawExtraAccounts = instruction.keys.slice(9).map((key) => ({
298
+ pubkey: key.pubkey.toString(),
299
+ isSigner: key.isSigner,
300
+ isWritable: key.isWritable,
301
+ }));
302
+ const permissionlessThaw = {
303
+ type: InstructionBuilderTypes.PermissionlessThawIdempotent,
304
+ params: {
305
+ authority: instruction.keys[0].pubkey.toString(),
306
+ mint: instruction.keys[1].pubkey.toString(),
307
+ tokenAccount: instruction.keys[2].pubkey.toString(),
308
+ flagAccount: instruction.keys[3].pubkey.toString(),
309
+ tokenAccountOwner: instruction.keys[4].pubkey.toString(),
310
+ mintConfig: instruction.keys[5].pubkey.toString(),
311
+ tokenProgram: instruction.keys[6].pubkey.toString(),
312
+ systemProgram: instruction.keys[7].pubkey.toString(),
313
+ gatingProgram: instruction.keys[8].pubkey.toString(),
314
+ extraAccounts: thawExtraAccounts,
315
+ },
316
+ };
317
+ instructionData.push(permissionlessThaw);
318
+ break;
319
+ default:
320
+ throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
321
+ }
322
+ }
323
+ return instructionData;
324
+ }
325
+ function isJitoStakingInstructions(si) {
326
+ return si.depositSol !== undefined;
327
+ }
328
+ function isMarinadeStakingInstructions(si) {
329
+ return si.create !== undefined && si.initialize !== undefined && si.delegate === undefined;
330
+ }
331
+ function isNativeStakingInstructions(si) {
332
+ return si.create !== undefined && si.initialize !== undefined && si.delegate !== undefined;
333
+ }
334
+ function getStakingTypeFromStakingInstructions(si) {
335
+ const isJito = isJitoStakingInstructions(si);
336
+ const isMarinade = isMarinadeStakingInstructions(si);
337
+ const isNative = isNativeStakingInstructions(si);
338
+ assert([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
339
+ if (isJito)
340
+ return SolStakingTypeEnum.JITO;
341
+ if (isMarinade)
342
+ return SolStakingTypeEnum.MARINADE;
343
+ if (isNative)
344
+ return SolStakingTypeEnum.NATIVE;
345
+ assert(false, 'No StakingType found');
346
+ }
347
+ /**
348
+ * Parses Solana instructions to create staking tx and delegate tx instructions params
349
+ * Only supports Nonce, StakingActivate and Memo Solana instructions
350
+ *
351
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
352
+ * @returns {InstructionParams[]} An array containing instruction params for staking activate tx
353
+ */
354
+ function parseStakingActivateInstructions(instructions) {
355
+ const instructionData = [];
356
+ const stakingInstructions = {};
357
+ for (const instruction of instructions) {
358
+ const type = getInstructionType(instruction);
359
+ switch (type) {
360
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
361
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
362
+ const nonce = {
363
+ type: InstructionBuilderTypes.NonceAdvance,
364
+ params: {
365
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
366
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
367
+ },
368
+ };
369
+ instructionData.push(nonce);
370
+ break;
371
+ case ValidInstructionTypesEnum.Memo:
372
+ const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
373
+ instructionData.push(memo);
374
+ break;
375
+ case ValidInstructionTypesEnum.Create:
376
+ stakingInstructions.create = SystemInstruction.decodeCreateAccount(instruction);
377
+ break;
378
+ case ValidInstructionTypesEnum.StakingInitialize:
379
+ stakingInstructions.initialize = StakeInstruction.decodeInitialize(instruction);
380
+ break;
381
+ case ValidInstructionTypesEnum.StakingDelegate:
382
+ stakingInstructions.delegate = StakeInstruction.decodeDelegate(instruction);
383
+ break;
384
+ case ValidInstructionTypesEnum.DepositSol:
385
+ stakingInstructions.depositSol = decodeDepositSol(instruction);
386
+ break;
387
+ case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
388
+ stakingInstructions.hasAtaInit = true;
389
+ instructionData.push({
390
+ type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
391
+ params: {
392
+ mintAddress: instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString(),
393
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
394
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
395
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
396
+ tokenName: findTokenName(instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString()),
397
+ },
398
+ });
399
+ break;
400
+ }
401
+ }
402
+ validateStakingInstructions(stakingInstructions);
403
+ const stakingType = getStakingTypeFromStakingInstructions(stakingInstructions);
404
+ let stakingActivate;
405
+ switch (stakingType) {
406
+ case SolStakingTypeEnum.JITO: {
407
+ assert(isJitoStakingInstructions(stakingInstructions));
408
+ const { depositSol, hasAtaInit } = stakingInstructions;
409
+ stakingActivate = {
410
+ type: InstructionBuilderTypes.StakingActivate,
411
+ params: {
412
+ stakingType,
413
+ fromAddress: depositSol.fundingAccount.toString(),
414
+ stakingAddress: depositSol.stakePool.toString(),
415
+ amount: depositSol.lamports.toString(),
416
+ validator: depositSol.stakePool.toString(),
417
+ extraParams: {
418
+ stakePoolData: {
419
+ managerFeeAccount: depositSol.managerFeeAccount.toString(),
420
+ poolMint: depositSol.poolMint.toString(),
421
+ reserveStake: depositSol.reserveStake.toString(),
422
+ },
423
+ createAssociatedTokenAccount: !!hasAtaInit,
424
+ },
425
+ },
426
+ };
427
+ break;
428
+ }
429
+ case SolStakingTypeEnum.MARINADE: {
430
+ assert(isMarinadeStakingInstructions(stakingInstructions));
431
+ const { create, initialize } = stakingInstructions;
432
+ stakingActivate = {
433
+ type: InstructionBuilderTypes.StakingActivate,
434
+ params: {
435
+ stakingType,
436
+ fromAddress: create.fromPubkey.toString(),
437
+ stakingAddress: initialize.stakePubkey.toString(),
438
+ amount: create.lamports.toString(),
439
+ validator: initialize.authorized.staker.toString(),
440
+ },
441
+ };
442
+ break;
443
+ }
444
+ case SolStakingTypeEnum.NATIVE: {
445
+ assert(isNativeStakingInstructions(stakingInstructions));
446
+ const { create, initialize, delegate } = stakingInstructions;
447
+ stakingActivate = {
448
+ type: InstructionBuilderTypes.StakingActivate,
449
+ params: {
450
+ stakingType,
451
+ fromAddress: create.fromPubkey.toString(),
452
+ stakingAddress: initialize.stakePubkey.toString(),
453
+ amount: create.lamports.toString(),
454
+ validator: delegate.votePubkey.toString(),
455
+ },
456
+ };
457
+ break;
458
+ }
459
+ default: {
460
+ const unreachable = stakingType;
461
+ throw new Error(`Unknown staking type ${unreachable}`);
462
+ }
463
+ }
464
+ instructionData.push(stakingActivate);
465
+ return instructionData;
466
+ }
467
+ /**
468
+ * Parses Solana instructions to create delegate tx
469
+ * Only supports Nonce, StakingDelegate
470
+ *
471
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
472
+ * @returns {InstructionParams[]} An array containing instruction params for staking delegate tx
473
+ */
474
+ function parseStakingDelegateInstructions(instructions) {
475
+ const instructionData = [];
476
+ for (const instruction of instructions) {
477
+ const type = getInstructionType(instruction);
478
+ switch (type) {
479
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
480
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
481
+ const nonce = {
482
+ type: InstructionBuilderTypes.NonceAdvance,
483
+ params: {
484
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
485
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
486
+ },
487
+ };
488
+ instructionData.push(nonce);
489
+ break;
490
+ case ValidInstructionTypesEnum.StakingDelegate:
491
+ const stakingDelegateParams = StakeInstruction.decodeDelegate(instruction);
492
+ const stakingDelegate = {
493
+ type: InstructionBuilderTypes.StakingDelegate,
494
+ params: {
495
+ fromAddress: stakingDelegateParams.authorizedPubkey.toString() || '',
496
+ stakingAddress: stakingDelegateParams.stakePubkey.toString() || '',
497
+ validator: stakingDelegateParams.votePubkey.toString() || '',
498
+ },
499
+ };
500
+ instructionData.push(stakingDelegate);
501
+ break;
502
+ }
503
+ }
504
+ return instructionData;
505
+ }
506
+ function validateStakingInstructions(stakingInstructions) {
507
+ if (stakingInstructions.delegate === undefined && stakingInstructions.depositSol !== undefined) {
508
+ return;
509
+ }
510
+ if (!stakingInstructions.create) {
511
+ throw new NotSupported('Invalid staking activate transaction, missing create stake account instruction');
512
+ }
513
+ if (!stakingInstructions.delegate && !stakingInstructions.initialize) {
514
+ throw new NotSupported('Invalid staking activate transaction, missing initialize stake account/delegate instruction');
515
+ }
516
+ }
517
+ function isJitoUnstakingInstructions(ui) {
518
+ return ui.withdrawStake !== undefined && ui.deactivate !== undefined;
519
+ }
520
+ function isMarinadeUnstakingInstructions(ui) {
521
+ return ui.transfer !== undefined && ui.deactivate === undefined;
522
+ }
523
+ function isNativeUnstakingInstructions(ui) {
524
+ return ui.withdrawStake === undefined && ui.deactivate !== undefined;
525
+ }
526
+ function getStakingTypeFromUnstakingInstructions(ui) {
527
+ const isJito = isJitoUnstakingInstructions(ui);
528
+ const isMarinade = isMarinadeUnstakingInstructions(ui);
529
+ const isNative = isNativeUnstakingInstructions(ui);
530
+ assert([isJito, isMarinade, isNative].filter((x) => x).length === 1, 'StakingType is ambiguous');
531
+ if (isJito)
532
+ return SolStakingTypeEnum.JITO;
533
+ if (isMarinade)
534
+ return SolStakingTypeEnum.MARINADE;
535
+ if (isNative)
536
+ return SolStakingTypeEnum.NATIVE;
537
+ assert(false, 'No StakingType found');
538
+ }
539
+ /**
540
+ * Parses Solana instructions to create deactivate stake tx instructions params. Supports full stake
541
+ * account deactivation and partial stake account deactivation.
542
+ *
543
+ * When partially deactivating a stake account this method expects the following instructions: Allocate,
544
+ * to allocate a new staking account, Assign, to assign the newly created staking account to the
545
+ * Stake Program, Split, to split the current stake account, and StakingDeactivate to deactivate the
546
+ * newly created stake account.
547
+ *
548
+ * Supports Nonce, StakingDeactivate, Memo, Allocate, Assign, and Split Solana instructions.
549
+ *
550
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
551
+ * @returns {InstructionParams[]} An array containing instruction params for staking deactivate tx
552
+ */
553
+ function parseStakingDeactivateInstructions(instructions, coinName) {
554
+ const instructionData = [];
555
+ const unstakingInstructions = [];
556
+ for (const instruction of instructions) {
557
+ const type = getInstructionType(instruction);
558
+ switch (type) {
559
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
560
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
561
+ const nonce = {
562
+ type: InstructionBuilderTypes.NonceAdvance,
563
+ params: {
564
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
565
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
566
+ },
567
+ };
568
+ instructionData.push(nonce);
569
+ break;
570
+ case ValidInstructionTypesEnum.Memo:
571
+ const memo = {
572
+ type: InstructionBuilderTypes.Memo,
573
+ params: { memo: instruction.data.toString() },
574
+ };
575
+ instructionData.push(memo);
576
+ break;
577
+ case ValidInstructionTypesEnum.Allocate:
578
+ if (unstakingInstructions.length > 0 &&
579
+ unstakingInstructions[unstakingInstructions.length - 1].allocate === undefined) {
580
+ unstakingInstructions[unstakingInstructions.length - 1].allocate =
581
+ SystemInstruction.decodeAllocate(instruction);
582
+ }
583
+ else {
584
+ unstakingInstructions.push({
585
+ allocate: SystemInstruction.decodeAllocate(instruction),
586
+ });
587
+ }
588
+ break;
589
+ case ValidInstructionTypesEnum.Assign:
590
+ if (unstakingInstructions.length > 0 &&
591
+ unstakingInstructions[unstakingInstructions.length - 1].assign === undefined) {
592
+ unstakingInstructions[unstakingInstructions.length - 1].assign = SystemInstruction.decodeAssign(instruction);
593
+ }
594
+ else {
595
+ unstakingInstructions.push({
596
+ assign: SystemInstruction.decodeAssign(instruction),
597
+ });
598
+ }
599
+ break;
600
+ case ValidInstructionTypesEnum.Split:
601
+ if (unstakingInstructions.length > 0 &&
602
+ unstakingInstructions[unstakingInstructions.length - 1].split === undefined) {
603
+ unstakingInstructions[unstakingInstructions.length - 1].split = StakeInstruction.decodeSplit(instruction);
604
+ }
605
+ else {
606
+ unstakingInstructions.push({
607
+ split: StakeInstruction.decodeSplit(instruction),
608
+ });
609
+ }
610
+ break;
611
+ case ValidInstructionTypesEnum.StakingDeactivate:
612
+ if (unstakingInstructions.length > 0 &&
613
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate === undefined) {
614
+ unstakingInstructions[unstakingInstructions.length - 1].deactivate =
615
+ StakeInstruction.decodeDeactivate(instruction);
616
+ }
617
+ else {
618
+ unstakingInstructions.push({
619
+ deactivate: StakeInstruction.decodeDeactivate(instruction),
620
+ });
621
+ }
622
+ break;
623
+ case ValidInstructionTypesEnum.Transfer:
624
+ if (unstakingInstructions.length > 0 &&
625
+ unstakingInstructions[unstakingInstructions.length - 1].transfer === undefined) {
626
+ unstakingInstructions[unstakingInstructions.length - 1].transfer =
627
+ SystemInstruction.decodeTransfer(instruction);
628
+ }
629
+ else {
630
+ unstakingInstructions.push({
631
+ transfer: SystemInstruction.decodeTransfer(instruction),
632
+ });
633
+ }
634
+ break;
635
+ case ValidInstructionTypesEnum.WithdrawStake:
636
+ if (unstakingInstructions.length > 0 &&
637
+ unstakingInstructions[unstakingInstructions.length - 1].withdrawStake === undefined) {
638
+ unstakingInstructions[unstakingInstructions.length - 1].withdrawStake = decodeWithdrawStake(instruction);
639
+ }
640
+ else {
641
+ unstakingInstructions.push({
642
+ withdrawStake: decodeWithdrawStake(instruction),
643
+ });
644
+ }
645
+ break;
646
+ }
647
+ }
648
+ for (const unstakingInstruction of unstakingInstructions) {
649
+ validateUnstakingInstructions(unstakingInstruction);
650
+ const stakingType = getStakingTypeFromUnstakingInstructions(unstakingInstruction);
651
+ let stakingDeactivate;
652
+ switch (stakingType) {
653
+ case SolStakingTypeEnum.JITO: {
654
+ assert(isJitoUnstakingInstructions(unstakingInstruction));
655
+ const { withdrawStake } = unstakingInstruction;
656
+ stakingDeactivate = {
657
+ type: InstructionBuilderTypes.StakingDeactivate,
658
+ params: {
659
+ stakingType,
660
+ fromAddress: withdrawStake.destinationStakeAuthority.toString(),
661
+ stakingAddress: withdrawStake.stakePool.toString(),
662
+ amount: withdrawStake.poolTokens.toString(),
663
+ unstakingAddress: withdrawStake.destinationStake.toString(),
664
+ extraParams: {
665
+ stakePoolData: {
666
+ managerFeeAccount: withdrawStake.managerFeeAccount.toString(),
667
+ poolMint: withdrawStake.poolMint.toString(),
668
+ validatorListAccount: withdrawStake.validatorList.toString(),
669
+ },
670
+ validatorAddress: withdrawStake.validatorStake.toString(),
671
+ transferAuthorityAddress: withdrawStake.sourceTransferAuthority.toString(),
672
+ },
673
+ },
674
+ };
675
+ break;
676
+ }
677
+ case SolStakingTypeEnum.MARINADE: {
678
+ assert(isMarinadeUnstakingInstructions(unstakingInstruction));
679
+ const { transfer } = unstakingInstruction;
680
+ stakingDeactivate = {
681
+ type: InstructionBuilderTypes.StakingDeactivate,
682
+ params: {
683
+ stakingType,
684
+ fromAddress: '',
685
+ stakingAddress: '',
686
+ recipients: [
687
+ {
688
+ address: transfer.toPubkey.toString() || '',
689
+ amount: transfer.lamports.toString() || '',
690
+ },
691
+ ],
692
+ },
693
+ };
694
+ break;
695
+ }
696
+ case SolStakingTypeEnum.NATIVE: {
697
+ assert(isNativeUnstakingInstructions(unstakingInstruction));
698
+ const { deactivate, split } = unstakingInstruction;
699
+ stakingDeactivate = {
700
+ type: InstructionBuilderTypes.StakingDeactivate,
701
+ params: {
702
+ stakingType,
703
+ fromAddress: deactivate.authorizedPubkey.toString() || '',
704
+ stakingAddress: split?.stakePubkey.toString() || deactivate.stakePubkey.toString(),
705
+ amount: split?.lamports.toString(),
706
+ unstakingAddress: split?.splitStakePubkey.toString(),
707
+ },
708
+ };
709
+ break;
710
+ }
711
+ default: {
712
+ const unreachable = stakingType;
713
+ throw new Error(`Unknown staking type ${unreachable}`);
714
+ }
715
+ }
716
+ instructionData.push(stakingDeactivate);
717
+ }
718
+ return instructionData;
719
+ }
720
+ function validateUnstakingInstructions(unstakingInstructions) {
721
+ // Cases where exactly one field should be present
722
+ const unstakingInstructionsKeys = [
723
+ 'allocate',
724
+ 'assign',
725
+ 'split',
726
+ 'deactivate',
727
+ 'transfer',
728
+ ];
729
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'transfer'))) {
730
+ return;
731
+ }
732
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'withdrawStake'))) {
733
+ return;
734
+ }
735
+ if (unstakingInstructionsKeys.every((k) => !!unstakingInstructions[k] === (k === 'deactivate'))) {
736
+ return;
737
+ }
738
+ // Cases where deactivate field must be present with another field
739
+ if (!unstakingInstructions.deactivate) {
740
+ throw new NotSupported('Invalid deactivate stake transaction, missing deactivate stake account instruction');
741
+ }
742
+ // This is a stake pool instruction, not a partial unstake
743
+ if (unstakingInstructions.withdrawStake) {
744
+ return;
745
+ }
746
+ if (!unstakingInstructions.allocate) {
747
+ throw new NotSupported('Invalid partial deactivate stake transaction, missing allocate unstake account instruction');
748
+ }
749
+ else if (!unstakingInstructions.assign) {
750
+ throw new NotSupported('Invalid partial deactivate stake transaction, missing assign unstake account instruction');
751
+ }
752
+ else if (!unstakingInstructions.split) {
753
+ throw new NotSupported('Invalid partial deactivate stake transaction, missing split stake account instruction');
754
+ }
755
+ else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.assign.accountPubkey.toString()) {
756
+ throw new NotSupported('Invalid partial deactivate stake transaction, must allocate and assign the same public key');
757
+ }
758
+ else if (unstakingInstructions.allocate.space !== StakeProgram.space) {
759
+ throw new NotSupported(`Invalid partial deactivate stake transaction, unstaking account must allocate ${StakeProgram.space} bytes`);
760
+ }
761
+ else if (unstakingInstructions.assign.programId.toString() !== StakeProgram.programId.toString()) {
762
+ throw new NotSupported('Invalid partial deactivate stake transaction, the unstake account must be assigned to the Stake Program');
763
+ }
764
+ else if (unstakingInstructions.allocate.accountPubkey.toString() !== unstakingInstructions.split.splitStakePubkey.toString()) {
765
+ throw new NotSupported('Invalid partial deactivate stake transaction, must allocate the unstaking account');
766
+ }
767
+ else if (unstakingInstructions.split.stakePubkey.toString() === unstakingInstructions.split.splitStakePubkey.toString()) {
768
+ throw new NotSupported('Invalid partial deactivate stake transaction, the unstaking account must be different from the Stake Account');
769
+ }
770
+ else if (!unstakingInstructions.transfer) {
771
+ throw new NotSupported('Invalid partial deactivate stake transaction, missing funding of unstake address instruction');
772
+ }
773
+ }
774
+ /**
775
+ * Parses Solana instructions to create staking withdraw tx instructions params
776
+ * Only supports Nonce, StakingWithdraw, and Memo Solana instructions
777
+ *
778
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
779
+ * @returns {InstructionParams[]} An array containing instruction params for staking withdraw tx
780
+ */
781
+ function parseStakingWithdrawInstructions(instructions) {
782
+ const instructionData = [];
783
+ for (const instruction of instructions) {
784
+ const type = getInstructionType(instruction);
785
+ switch (type) {
786
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
787
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
788
+ const nonce = {
789
+ type: InstructionBuilderTypes.NonceAdvance,
790
+ params: {
791
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
792
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
793
+ },
794
+ };
795
+ instructionData.push(nonce);
796
+ break;
797
+ case ValidInstructionTypesEnum.Memo:
798
+ const memo = {
799
+ type: InstructionBuilderTypes.Memo,
800
+ params: { memo: instruction.data.toString() },
801
+ };
802
+ instructionData.push(memo);
803
+ break;
804
+ case ValidInstructionTypesEnum.StakingWithdraw:
805
+ const withdrawInstruction = StakeInstruction.decodeWithdraw(instruction);
806
+ const stakingWithdraw = {
807
+ type: InstructionBuilderTypes.StakingWithdraw,
808
+ params: {
809
+ fromAddress: withdrawInstruction.authorizedPubkey.toString(),
810
+ stakingAddress: withdrawInstruction.stakePubkey.toString(),
811
+ amount: withdrawInstruction.lamports.toString(),
812
+ },
813
+ };
814
+ instructionData.push(stakingWithdraw);
815
+ break;
816
+ }
817
+ }
818
+ return instructionData;
819
+ }
820
+ /**
821
+ * Get the memo object from instructions if it exists
822
+ *
823
+ * @param {TransactionInstruction[]} instructions - the array of supported Solana instructions to be parsed
824
+ * @param {Record<string, number>} instructionIndexes - the instructions indexes of the current transaction
825
+ * @returns {Memo | undefined} - memo object or undefined
826
+ */
827
+ function getMemo(instructions, instructionIndexes) {
828
+ const instructionsLength = Object.keys(instructionIndexes).length;
829
+ if (instructions.length === instructionsLength && instructions[instructionIndexes.Memo]) {
830
+ return {
831
+ type: InstructionBuilderTypes.Memo,
832
+ params: { memo: instructions[instructionIndexes.Memo].data.toString() },
833
+ };
834
+ }
835
+ }
836
+ const ataInitInstructionKeysIndexes = {
837
+ PayerAddress: 0,
838
+ ATAAddress: 1,
839
+ OwnerAddress: 2,
840
+ MintAddress: 3,
841
+ };
842
+ const closeAtaInstructionKeysIndexes = {
843
+ AccountAddress: 0,
844
+ DestinationAddress: 1,
845
+ AuthorityAddress: 2,
846
+ };
847
+ /**
848
+ * Parses Solana instructions to initialize associated token account tx instructions params
849
+ *
850
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
851
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
852
+ */
853
+ function parseAtaInitInstructions(instructions, instructionMetadata, _useTokenAddressTokenName) {
854
+ const instructionData = [];
855
+ let memo;
856
+ for (const instruction of instructions) {
857
+ const type = getInstructionType(instruction);
858
+ switch (type) {
859
+ case ValidInstructionTypesEnum.Memo:
860
+ memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
861
+ break;
862
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
863
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
864
+ const nonce = {
865
+ type: InstructionBuilderTypes.NonceAdvance,
866
+ params: {
867
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
868
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
869
+ },
870
+ };
871
+ instructionData.push(nonce);
872
+ break;
873
+ case ValidInstructionTypesEnum.InitializeAssociatedTokenAccount:
874
+ const mintAddress = instruction.keys[ataInitInstructionKeysIndexes.MintAddress].pubkey.toString();
875
+ const tokenName = findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName);
876
+ let programID;
877
+ if (instruction.programId) {
878
+ programID = instruction.programId.toString();
879
+ }
880
+ const ataInit = {
881
+ type: InstructionBuilderTypes.CreateAssociatedTokenAccount,
882
+ params: {
883
+ mintAddress,
884
+ ataAddress: instruction.keys[ataInitInstructionKeysIndexes.ATAAddress].pubkey.toString(),
885
+ ownerAddress: instruction.keys[ataInitInstructionKeysIndexes.OwnerAddress].pubkey.toString(),
886
+ payerAddress: instruction.keys[ataInitInstructionKeysIndexes.PayerAddress].pubkey.toString(),
887
+ tokenName,
888
+ programId: programID,
889
+ },
890
+ };
891
+ instructionData.push(ataInit);
892
+ break;
893
+ case ValidInstructionTypesEnum.PermissionlessThawIdempotent:
894
+ const thawExtraAccounts = instruction.keys.slice(9).map((key) => ({
895
+ pubkey: key.pubkey.toString(),
896
+ isSigner: key.isSigner,
897
+ isWritable: key.isWritable,
898
+ }));
899
+ const permissionlessThaw = {
900
+ type: InstructionBuilderTypes.PermissionlessThawIdempotent,
901
+ params: {
902
+ authority: instruction.keys[0].pubkey.toString(),
903
+ mint: instruction.keys[1].pubkey.toString(),
904
+ tokenAccount: instruction.keys[2].pubkey.toString(),
905
+ flagAccount: instruction.keys[3].pubkey.toString(),
906
+ tokenAccountOwner: instruction.keys[4].pubkey.toString(),
907
+ mintConfig: instruction.keys[5].pubkey.toString(),
908
+ tokenProgram: instruction.keys[6].pubkey.toString(),
909
+ systemProgram: instruction.keys[7].pubkey.toString(),
910
+ gatingProgram: instruction.keys[8].pubkey.toString(),
911
+ extraAccounts: thawExtraAccounts,
912
+ },
913
+ };
914
+ instructionData.push(permissionlessThaw);
915
+ break;
916
+ case ValidInstructionTypesEnum.DepositSol:
917
+ // AtaInit is a part of spl-stake-pool's depositSol process
918
+ break;
919
+ default:
920
+ throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
921
+ }
922
+ }
923
+ if (memo) {
924
+ instructionData.push(memo);
925
+ }
926
+ return instructionData;
927
+ }
928
+ const ataCloseInstructionKeysIndexes = {
929
+ AccountAddress: 0,
930
+ DestinationAddress: 1,
931
+ AuthorityAddress: 2,
932
+ };
933
+ const ataRecoverNestedInstructionKeysIndexes = {
934
+ NestedAccountAddress: 0,
935
+ NestedMintAddress: 1,
936
+ DestinationAccountAddress: 2,
937
+ OwnerAccountAddress: 3,
938
+ OwnerMintAddress: 4,
939
+ WalletAddress: 5,
940
+ };
941
+ /**
942
+ * Parses Solana instructions to close associated token account tx instructions params
943
+ *
944
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
945
+ * @returns {InstructionParams[]} An array containing instruction params for Send tx
946
+ */
947
+ function parseAtaCloseInstructions(instructions) {
948
+ const instructionData = [];
949
+ for (const instruction of instructions) {
950
+ const type = getInstructionType(instruction);
951
+ switch (type) {
952
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
953
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
954
+ const nonce = {
955
+ type: InstructionBuilderTypes.NonceAdvance,
956
+ params: {
957
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
958
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
959
+ },
960
+ };
961
+ instructionData.push(nonce);
962
+ break;
963
+ case ValidInstructionTypesEnum.CloseAssociatedTokenAccount:
964
+ const ataClose = {
965
+ type: InstructionBuilderTypes.CloseAssociatedTokenAccount,
966
+ params: {
967
+ accountAddress: instruction.keys[ataCloseInstructionKeysIndexes.AccountAddress].pubkey.toString(),
968
+ destinationAddress: instruction.keys[ataCloseInstructionKeysIndexes.DestinationAddress].pubkey.toString(),
969
+ authorityAddress: instruction.keys[ataCloseInstructionKeysIndexes.AuthorityAddress].pubkey.toString(),
970
+ ...(instruction.programId.equals(TOKEN_2022_PROGRAM_ID)
971
+ ? { programId: instruction.programId.toString() }
972
+ : {}),
973
+ },
974
+ };
975
+ instructionData.push(ataClose);
976
+ break;
977
+ case ValidInstructionTypesEnum.RecoverNestedAssociatedTokenAccount:
978
+ const ataRecoverNested = {
979
+ type: InstructionBuilderTypes.RecoverNestedAssociatedTokenAccount,
980
+ params: {
981
+ nestedAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedAccountAddress].pubkey.toString(),
982
+ nestedMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.NestedMintAddress].pubkey.toString(),
983
+ destinationAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.DestinationAccountAddress].pubkey.toString(),
984
+ ownerAccountAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerAccountAddress].pubkey.toString(),
985
+ ownerMintAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.OwnerMintAddress].pubkey.toString(),
986
+ walletAddress: instruction.keys[ataRecoverNestedInstructionKeysIndexes.WalletAddress].pubkey.toString(),
987
+ },
988
+ };
989
+ instructionData.push(ataRecoverNested);
990
+ break;
991
+ default:
992
+ throw new NotSupported('Invalid transaction, instruction type not supported: ' + getInstructionType(instruction));
993
+ }
994
+ }
995
+ return instructionData;
996
+ }
997
+ /**
998
+ * Parses Solana instructions to authorized staking account params
999
+ * Only supports Nonce, Authorize instructions
1000
+ *
1001
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
1002
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
1003
+ */
1004
+ function parseStakingAuthorizeInstructions(instructions) {
1005
+ const instructionData = [];
1006
+ for (const instruction of instructions) {
1007
+ const type = getInstructionType(instruction);
1008
+ switch (type) {
1009
+ case ValidInstructionTypesEnum.AdvanceNonceAccount:
1010
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instruction);
1011
+ const nonce = {
1012
+ type: InstructionBuilderTypes.NonceAdvance,
1013
+ params: {
1014
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
1015
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
1016
+ },
1017
+ };
1018
+ instructionData.push(nonce);
1019
+ break;
1020
+ case ValidInstructionTypesEnum.Memo:
1021
+ const memo = { type: InstructionBuilderTypes.Memo, params: { memo: instruction.data.toString() } };
1022
+ instructionData.push(memo);
1023
+ break;
1024
+ case ValidInstructionTypesEnum.Authorize:
1025
+ const authorize = StakeInstruction.decodeAuthorize(instruction);
1026
+ instructionData.push({
1027
+ type: InstructionBuilderTypes.StakingAuthorize,
1028
+ params: {
1029
+ stakingAddress: authorize.stakePubkey.toString(),
1030
+ oldAuthorizeAddress: authorize.authorizedPubkey.toString(),
1031
+ newAuthorizeAddress: authorize.newAuthorizedPubkey.toString(),
1032
+ newWithdrawAddress: authorize.custodianPubkey?.toString() || '',
1033
+ },
1034
+ });
1035
+ break;
1036
+ }
1037
+ }
1038
+ return instructionData;
1039
+ }
1040
+ /**
1041
+ * Parses Solana instructions to authorized staking account params
1042
+ * Only supports Nonce, Authorize instructions
1043
+ *
1044
+ * @param {TransactionInstruction[]} instructions - an array of supported Solana instructions
1045
+ * @returns {InstructionParams[]} An array containing instruction params for staking authorize tx
1046
+ */
1047
+ function parseStakingAuthorizeRawInstructions(instructions) {
1048
+ const instructionData = [];
1049
+ assert(instructions.length === 2, 'Invalid number of instructions');
1050
+ const advanceNonceInstruction = SystemInstruction.decodeNonceAdvance(instructions[0]);
1051
+ const nonce = {
1052
+ type: InstructionBuilderTypes.NonceAdvance,
1053
+ params: {
1054
+ walletNonceAddress: advanceNonceInstruction.noncePubkey.toString(),
1055
+ authWalletAddress: advanceNonceInstruction.authorizedPubkey.toString(),
1056
+ },
1057
+ };
1058
+ instructionData.push(nonce);
1059
+ const authorize = instructions[1];
1060
+ assert(authorize.keys.length === 5, 'Invalid number of keys in authorize instruction');
1061
+ instructionData.push({
1062
+ type: InstructionBuilderTypes.StakingAuthorize,
1063
+ params: {
1064
+ stakingAddress: authorize.keys[0].pubkey.toString(),
1065
+ oldAuthorizeAddress: authorize.keys[2].pubkey.toString(),
1066
+ newAuthorizeAddress: authorize.keys[3].pubkey.toString(),
1067
+ custodianAddress: authorize.keys[4].pubkey.toString(),
1068
+ },
1069
+ });
1070
+ return instructionData;
1071
+ }
1072
+ /**
1073
+ * Returns true if the instruction type is a confidential transfer instruction
1074
+ * (Token-2022 CT extension or zk-elgamal-proof program).
1075
+ */
1076
+ function isConfidentialTransferInstruction(type) {
1077
+ switch (type) {
1078
+ case InstructionBuilderTypes.ConfigureConfidentialTransferAccount:
1079
+ case InstructionBuilderTypes.ApplyPendingBalance:
1080
+ case InstructionBuilderTypes.ConfidentialDeposit:
1081
+ case InstructionBuilderTypes.ConfidentialWithdraw:
1082
+ case InstructionBuilderTypes.ConfidentialTransfer:
1083
+ case InstructionBuilderTypes.VerifyPubkeyValidity:
1084
+ case InstructionBuilderTypes.VerifyEqualityProof:
1085
+ case InstructionBuilderTypes.VerifyValidityProof:
1086
+ case InstructionBuilderTypes.VerifyRangeProof:
1087
+ return true;
1088
+ default:
1089
+ return false;
1090
+ }
1091
+ }
1092
+ /**
1093
+ * Parses Solana instructions to custom instruction params
1094
+ *
1095
+ * @param {TransactionInstruction[]} instructions - containing custom solana instructions
1096
+ * @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
1097
+ * @returns {InstructionParams[]} An array containing instruction params for custom instructions
1098
+ */
1099
+ function parseCustomInstructions(instructions, instructionMetadata) {
1100
+ const instructionData = [];
1101
+ for (let i = 0; i < instructions.length; i++) {
1102
+ const instruction = instructions[i];
1103
+ // Check if we have metadata for this instruction position
1104
+ if (instructionMetadata &&
1105
+ instructionMetadata[i] &&
1106
+ instructionMetadata[i].type === InstructionBuilderTypes.CustomInstruction) {
1107
+ instructionData.push(instructionMetadata[i]);
1108
+ }
1109
+ else {
1110
+ // Convert the raw instruction to CustomInstruction format
1111
+ const customInstruction = {
1112
+ type: InstructionBuilderTypes.CustomInstruction,
1113
+ params: {
1114
+ programId: instruction.programId.toString(),
1115
+ keys: instruction.keys.map((key) => ({
1116
+ pubkey: key.pubkey.toString(),
1117
+ isSigner: key.isSigner,
1118
+ isWritable: key.isWritable,
1119
+ })),
1120
+ data: instruction.data.toString('base64'),
1121
+ },
1122
+ };
1123
+ instructionData.push(customInstruction);
1124
+ }
1125
+ }
1126
+ return instructionData;
1127
+ }
1128
+ /**
1129
+ * Parses Solana instructions to confidential transfer instruction params.
1130
+ *
1131
+ * Iterates raw instructions in order, checking metadata at each position:
1132
+ * - CT instruction metadata is preserved as-is (CT instructions cannot be
1133
+ * decoded by @solana/spl-token or @solana/web3.js).
1134
+ * - CustomInstruction metadata is preserved as-is.
1135
+ * - All other instructions fall back to CustomInstruction format with raw
1136
+ * programId/keys/data.
1137
+ *
1138
+ * This single-pass approach preserves original instruction order so that
1139
+ * round-trip reconstruction is faithful.
1140
+ *
1141
+ * @param {TransactionInstruction[]} instructions - containing CT solana instructions
1142
+ * @param {InstructionParams[]} instructionMetadata - the instruction metadata for the transaction
1143
+ * @returns {InstructionParams[]} An array containing instruction params in original order
1144
+ */
1145
+ function parseConfidentialTransferInstructions(instructions, instructionMetadata) {
1146
+ const instructionData = [];
1147
+ for (let i = 0; i < instructions.length; i++) {
1148
+ const instruction = instructions[i];
1149
+ // Check if we have metadata for this instruction position
1150
+ if (instructionMetadata && instructionMetadata[i]) {
1151
+ const metaType = instructionMetadata[i].type;
1152
+ // Preserve confidential transfer and custom instruction metadata as-is
1153
+ if (isConfidentialTransferInstruction(metaType) || metaType === InstructionBuilderTypes.CustomInstruction) {
1154
+ instructionData.push(instructionMetadata[i]);
1155
+ continue;
1156
+ }
1157
+ }
1158
+ // Convert the raw instruction to CustomInstruction format
1159
+ const customInstruction = {
1160
+ type: InstructionBuilderTypes.CustomInstruction,
1161
+ params: {
1162
+ programId: instruction.programId.toString(),
1163
+ keys: instruction.keys.map((key) => ({
1164
+ pubkey: key.pubkey.toString(),
1165
+ isSigner: key.isSigner,
1166
+ isWritable: key.isWritable,
1167
+ })),
1168
+ data: instruction.data.toString('base64'),
1169
+ },
1170
+ };
1171
+ instructionData.push(customInstruction);
1172
+ }
1173
+ return instructionData;
1174
+ }
1175
+ export function findTokenName(mintAddress, instructionMetadata, _useTokenAddressTokenName) {
1176
+ let token;
1177
+ coins.forEach((value, key) => {
1178
+ if (value instanceof SolCoin && value.tokenAddress === mintAddress) {
1179
+ token = value.name;
1180
+ }
1181
+ });
1182
+ if (!token && instructionMetadata) {
1183
+ instructionMetadata.forEach((instruction) => {
1184
+ if (instruction.type === InstructionBuilderTypes.CreateAssociatedTokenAccount &&
1185
+ instruction.params.mintAddress === mintAddress) {
1186
+ token = instruction.params.tokenName;
1187
+ }
1188
+ else if (instruction.type === InstructionBuilderTypes.TokenTransfer &&
1189
+ instruction.params.tokenAddress === mintAddress) {
1190
+ token = instruction.params.tokenName;
1191
+ }
1192
+ });
1193
+ }
1194
+ if (!token && _useTokenAddressTokenName) {
1195
+ token = mintAddress;
1196
+ }
1197
+ assert(token);
1198
+ return token;
1199
+ }
1200
+ export function findTransferHookAccounts(fromAddress, toAddress, tokenAddress, instructionMetadata) {
1201
+ let transferHookAccounts;
1202
+ instructionMetadata?.forEach((instruction) => {
1203
+ if (instruction.type === InstructionBuilderTypes.TokenTransfer &&
1204
+ instruction.params.tokenAddress === tokenAddress &&
1205
+ instruction.params.fromAddress === fromAddress &&
1206
+ instruction.params.toAddress === toAddress) {
1207
+ transferHookAccounts = instruction.params.transferHookAccounts;
1208
+ }
1209
+ });
1210
+ return transferHookAccounts;
1211
+ }
1212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbnN0cnVjdGlvblBhcmFtc0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdDQUFnQyxFQUNoQyx1Q0FBdUMsRUFFdkMscUJBQXFCLEVBRXJCLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLGdCQUFnQixFQUNoQixzQkFBc0IsR0FDdkIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBU0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixpQkFBaUIsRUFFakIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUF5Qi9HLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVsRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLElBQXFCLEVBQ3JCLFlBQXNDLEVBQ3RDLFFBQWlCLEVBQ2pCLG1CQUF5QyxFQUN6Qyx5QkFBbUM7SUFFbkMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssZUFBZSxDQUFDLG9CQUFvQjtZQUN2QyxPQUFPLDJCQUEyQixDQUFDLFlBQVksQ0FB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SUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FBQ3hDLEtBQUssR0FBRyxXQUFXLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVkLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsV0FBbUIsRUFDbkIsU0FBaUIsRUFDakIsWUFBb0IsRUFDcEIsbUJBQXlDO0lBRXpDLElBQUksb0JBQW9ELENBQUM7SUFFekQsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7UUFDM0MsSUFDRSxXQUFXLENBQUMsSUFBSSxLQUFLLHVCQUF1QixDQUFDLGFBQWE7WUFDMUQsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEtBQUssWUFBWTtZQUNoRCxXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxXQUFXO1lBQzlDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFDMUMsQ0FBQztZQUNELG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUM7UUFDakUsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxvQkFBb0IsQ0FBQztBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uLFxuICBkZWNvZGVUcmFuc2ZlckNoZWNrZWRJbnN0cnVjdGlvbixcbiAgZGVjb2RlVHJhbnNmZXJDaGVja2VkV2l0aEZlZUluc3RydWN0aW9uLFxuICBEZWNvZGVkQnVybkluc3RydWN0aW9uLFxuICBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24sXG4gIERlY29kZWRNaW50VG9JbnN0cnVjdGlvbixcbiAgZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24sXG4gIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCxcbiAgZGVjb2RlQXBwcm92ZUluc3RydWN0aW9uLFxuICBUb2tlbkluc3RydWN0aW9uLFxuICBUcmFuc2ZlckZlZUluc3RydWN0aW9uLFxufSBmcm9tICdAc29sYW5hL3NwbC10b2tlbic7XG5pbXBvcnQge1xuICBBbGxvY2F0ZVBhcmFtcyxcbiAgQXNzaWduUGFyYW1zLFxuICBDcmVhdGVBY2NvdW50UGFyYW1zLFxuICBEZWFjdGl2YXRlU3Rha2VQYXJhbXMsXG4gIERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uLFxuICBEZWxlZ2F0ZVN0YWtlUGFyYW1zLFxuICBJbml0aWFsaXplU3Rha2VQYXJhbXMsXG4gIFNwbGl0U3Rha2VQYXJhbXMsXG4gIFN0YWtlSW5zdHJ1Y3Rpb24sXG4gIFN0YWtlUHJvZ3JhbSxcbiAgU3lzdGVtSW5zdHJ1Y3Rpb24sXG4gIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sXG4gIENvbXB1dGVCdWRnZXRJbnN0cnVjdGlvbixcbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBTb2xDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bSwgd2FsbGV0SW5pdEluc3RydWN0aW9uSW5kZXhlcyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEF0YUNsb3NlLFxuICBBdGFJbml0LFxuICBBdGFSZWNvdmVyTmVzdGVkLFxuICBCdXJuLFxuICBFeHRyYUFjY291bnRNZXRhLFxuICBJbnN0cnVjdGlvblBhcmFtcyxcbiAgTWVtbyxcbiAgTWludFRvLFxuICBOb25jZSxcbiAgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCxcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICBTdGFraW5nQXV0aG9yaXplLFxuICBTdGFraW5nRGVhY3RpdmF0ZSxcbiAgU3Rha2luZ0RlbGVnYXRlLFxuICBTdGFraW5nV2l0aGRyYXcsXG4gIFRva2VuVHJhbnNmZXIsXG4gIFRyYW5zZmVyLFxuICBXYWxsZXRJbml0LFxuICBTZXRDb21wdXRlVW5pdExpbWl0LFxuICBTZXRQcmlvcml0eUZlZSxcbiAgQ3VzdG9tSW5zdHJ1Y3Rpb24sXG4gIEFwcHJvdmUsXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgZ2V0SW5zdHJ1Y3Rpb25UeXBlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBEZXBvc2l0U29sUGFyYW1zLCBXaXRoZHJhd1N0YWtlUGFyYW1zIH0gZnJvbSAnQHNvbGFuYS9zcGwtc3Rha2UtcG9vbCc7XG5pbXBvcnQgeyBkZWNvZGVEZXBvc2l0U29sLCBkZWNvZGVXaXRoZHJhd1N0YWtlIH0gZnJvbSAnLi9qaXRvU3Rha2VQb29sT3BlcmF0aW9ucyc7XG5cbi8qKlxuICogQ29uc3RydWN0IGluc3RydWN0aW9ucyBwYXJhbXMgZnJvbSBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHR5cGUgLSB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1Y3Rpb25QYXJhbXNGYWN0b3J5KFxuICB0eXBlOiBUcmFuc2FjdGlvblR5cGUsXG4gIGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLFxuICBjb2luTmFtZT86IHN0cmluZyxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBJbnN0cnVjdGlvblBhcmFtc1tdIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb246XG4gICAgICByZXR1cm4gcGFyc2VXYWxsZXRJbml0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU2VuZDpcbiAgICAgIHJldHVybiBwYXJzZVNlbmRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQWN0aXZhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdEZWFjdGl2YXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgY29pbk5hbWUpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbjpcbiAgICAgIHJldHVybiBwYXJzZUF0YUluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICByZXR1cm4gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdBdXRob3JpemU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nQXV0aG9yaXplSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0F1dGhvcml6ZVJhdzpcbiAgICAgIHJldHVybiBwYXJzZVN0YWtpbmdBdXRob3JpemVSYXdJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICByZXR1cm4gcGFyc2VTdGFraW5nRGVsZWdhdGVJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zKTtcbiAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5DdXN0b21UeDpcbiAgICAgIHJldHVybiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnMsIGluc3RydWN0aW9uTWV0YWRhdGEpO1xuICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkNvbmZpZGVudGlhbFRyYW5zZmVyOlxuICAgICAgcmV0dXJuIHBhcnNlQ29uZmlkZW50aWFsVHJhbnNmZXJJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBpbnN0cnVjdGlvbk1ldGFkYXRhKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBXYWxsZXQgaW5pdGlhbGl6YXRpb24gdHggaW5zdHJ1Y3Rpb25zIHBhcmFtc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBub25jZSBzb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFdhbGxldCBpbml0aWFsaXphdGlvbiB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVdhbGxldEluaXRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10pOiBBcnJheTxXYWxsZXRJbml0IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PFdhbGxldEluaXQgfCBNZW1vPiA9IFtdO1xuICBjb25zdCBjcmVhdGVJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUNyZWF0ZUFjY291bnQoaW5zdHJ1Y3Rpb25zW3dhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMuQ3JlYXRlXSk7XG4gIGNvbnN0IG5vbmNlSW5pdEluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VJbml0aWFsaXplKFxuICAgIGluc3RydWN0aW9uc1t3YWxsZXRJbml0SW5zdHJ1Y3Rpb25JbmRleGVzLkluaXRpYWxpemVOb25jZUFjY291bnRdXG4gICk7XG5cbiAgY29uc3Qgd2FsbGV0SW5pdDogV2FsbGV0SW5pdCA9IHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVOb25jZUFjY291bnQsXG4gICAgcGFyYW1zOiB7XG4gICAgICBmcm9tQWRkcmVzczogY3JlYXRlSW5zdHJ1Y3Rpb24uZnJvbVB1YmtleS50b1N0cmluZygpLFxuICAgICAgbm9uY2VBZGRyZXNzOiBub25jZUluaXRJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aEFkZHJlc3M6IG5vbmNlSW5pdEluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGFtb3VudDogY3JlYXRlSW5zdHJ1Y3Rpb24ubGFtcG9ydHMudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaCh3YWxsZXRJbml0KTtcblxuICBjb25zdCBtZW1vID0gZ2V0TWVtbyhpbnN0cnVjdGlvbnMsIHdhbGxldEluaXRJbnN0cnVjdGlvbkluZGV4ZXMpO1xuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBTZW5kIHR4IGluc3RydWN0aW9ucyBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTWVtbywgVHJhbnNmZXIgYW5kIEFkdmFuY2UgTm9uY2UgU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBTZW5kIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU2VuZEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogQXJyYXk8XG4gIHwgTm9uY2VcbiAgfCBNZW1vXG4gIHwgVHJhbnNmZXJcbiAgfCBUb2tlblRyYW5zZmVyXG4gIHwgQXRhSW5pdFxuICB8IEF0YUNsb3NlXG4gIHwgU2V0Q29tcHV0ZVVuaXRMaW1pdFxuICB8IFNldFByaW9yaXR5RmVlXG4gIHwgTWludFRvXG4gIHwgQnVyblxuICB8IEFwcHJvdmVcbiAgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50XG4+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxcbiAgICB8IE5vbmNlXG4gICAgfCBNZW1vXG4gICAgfCBUcmFuc2ZlclxuICAgIHwgVG9rZW5UcmFuc2ZlclxuICAgIHwgQXRhSW5pdFxuICAgIHwgQXRhQ2xvc2VcbiAgICB8IFNldENvbXB1dGVVbml0TGltaXRcbiAgICB8IFNldFByaW9yaXR5RmVlXG4gICAgfCBNaW50VG9cbiAgICB8IEJ1cm5cbiAgICB8IEFwcHJvdmVcbiAgICB8IFBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnRcbiAgPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlVHJhbnNmZXIoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcjogVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVHJhbnNmZXIsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogdHJhbnNmZXJJbnN0cnVjdGlvbi5mcm9tUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHRyYW5zZmVySW5zdHJ1Y3Rpb24udG9QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHJhbnNmZXJJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRyYW5zZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uVG9rZW5UcmFuc2ZlcjpcbiAgICAgICAgY29uc3QgaXNUb2tlbjIwMjJUcmFuc2ZlciA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpID09PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgaXNUcmFuc2ZlcldpdGhGZWUgPVxuICAgICAgICAgIGlzVG9rZW4yMDIyVHJhbnNmZXIgJiZcbiAgICAgICAgICBpbnN0cnVjdGlvbi5kYXRhLmxlbmd0aCA+PSAyICYmXG4gICAgICAgICAgaW5zdHJ1Y3Rpb24uZGF0YVswXSA9PT0gVG9rZW5JbnN0cnVjdGlvbi5UcmFuc2ZlckZlZUV4dGVuc2lvbiAmJlxuICAgICAgICAgIGluc3RydWN0aW9uLmRhdGFbMV0gPT09IFRyYW5zZmVyRmVlSW5zdHJ1Y3Rpb24uVHJhbnNmZXJDaGVja2VkV2l0aEZlZTtcbiAgICAgICAgbGV0IHR0S2V5czogRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgIGxldCB0dEFtb3VudDogYmlnaW50O1xuICAgICAgICBsZXQgdHREZWNpbWFsczogbnVtYmVyO1xuICAgICAgICBsZXQgdHRGZWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGlzVHJhbnNmZXJXaXRoRmVlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZFdpdGhGZWVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgVE9LRU5fMjAyMl9QUk9HUkFNX0lEKTtcbiAgICAgICAgICAvLyBXaXRoRmVlIGV4cG9zZXMgYGF1dGhvcml0eWAgd2hlcmUgVHJhbnNmZXJDaGVja2VkIGV4cG9zZXMgYG93bmVyYDsgbm9ybWFsaXplIHRvIG93bmVyLlxuICAgICAgICAgIHR0S2V5cyA9IHtcbiAgICAgICAgICAgIHNvdXJjZTogZGVjb2RlZC5rZXlzLnNvdXJjZSxcbiAgICAgICAgICAgIG1pbnQ6IGRlY29kZWQua2V5cy5taW50LFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRlY29kZWQua2V5cy5kZXN0aW5hdGlvbixcbiAgICAgICAgICAgIG93bmVyOiBkZWNvZGVkLmtleXMuYXV0aG9yaXR5LFxuICAgICAgICAgIH0gYXMgRGVjb2RlZFRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uWydrZXlzJ107XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgICAgdHRGZWUgPSBkZWNvZGVkLmRhdGEuZmVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVRyYW5zZmVyQ2hlY2tlZEluc3RydWN0aW9uKFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICBpc1Rva2VuMjAyMlRyYW5zZmVyID8gVE9LRU5fMjAyMl9QUk9HUkFNX0lEIDogdW5kZWZpbmVkXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0dEtleXMgPSBkZWNvZGVkLmtleXM7XG4gICAgICAgICAgdHRBbW91bnQgPSBkZWNvZGVkLmRhdGEuYW1vdW50O1xuICAgICAgICAgIHR0RGVjaW1hbHMgPSBkZWNvZGVkLmRhdGEuZGVjaW1hbHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9rZW5BZGRyZXNzID0gdHRLZXlzLm1pbnQucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUodG9rZW5BZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvclRva2VuVHJhbnNmZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvclRva2VuVHJhbnNmZXIgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmFuc2Zlckhvb2tBY2NvdW50cyA9IGZpbmRUcmFuc2Zlckhvb2tBY2NvdW50cyhcbiAgICAgICAgICB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgdHRLZXlzLmRlc3RpbmF0aW9uLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHRva2VuVHJhbnNmZXI6IFRva2VuVHJhbnNmZXIgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB0dEtleXMub3duZXIucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b0FkZHJlc3M6IHR0S2V5cy5kZXN0aW5hdGlvbi5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogdHRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZUFkZHJlc3M6IHR0S2V5cy5zb3VyY2UucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yVG9rZW5UcmFuc2ZlcixcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHR0RGVjaW1hbHMsXG4gICAgICAgICAgICAuLi4odHRGZWUgIT09IHVuZGVmaW5lZCA/IHsgZmVlOiB0dEZlZSB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHRyYW5zZmVySG9va0FjY291bnRzID8geyB0cmFuc2Zlckhvb2tBY2NvdW50cyB9IDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHRva2VuVHJhbnNmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BcHByb3ZlOlxuICAgICAgICBjb25zdCBwcm9ncmFtSWQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQuZXF1YWxzKFRPS0VOXzIwMjJfUFJPR1JBTV9JRCkgPyBUT0tFTl8yMDIyX1BST0dSQU1fSUQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGFwcHJvdmVJbnN0cnVjdGlvbiA9IGRlY29kZUFwcHJvdmVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgcHJvZ3JhbUlkKTtcbiAgICAgICAgY29uc3QgYXBwcm92ZTogQXBwcm92ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5BcHByb3ZlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGFwcHJvdmVJbnN0cnVjdGlvbi5rZXlzLmFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGRlbGVnYXRlQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMuZGVsZWdhdGUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogYXBwcm92ZUluc3RydWN0aW9uLmtleXMub3duZXIudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogYXBwcm92ZUluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JZCAmJiBwcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhcHByb3ZlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1pbnRUb2tlbk5hbWUgPSBmaW5kVG9rZW5OYW1lKG1pbnRBZGRyZXNzLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JRDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlEID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiBtaW50VG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWNjb3VudEFkZHJlc3MgPSBpbnN0cnVjdGlvbi5rZXlzW2Nsb3NlQXRhSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQWRkcmVzcyA9XG4gICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1tjbG9zZUF0YUluc3RydWN0aW9uS2V5c0luZGV4ZXMuRGVzdGluYXRpb25BZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgYXV0aG9yaXR5QWRkcmVzcyA9IGluc3RydWN0aW9uLmtleXNbY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzLkF1dGhvcml0eUFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpO1xuXG4gICAgICAgIGNvbnN0IGF0YUNsb3NlOiBBdGFDbG9zZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DbG9zZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhY2NvdW50QWRkcmVzcyxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQWRkcmVzcyxcbiAgICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgICAuLi4oaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLmVxdWFscyhUT0tFTl8yMDIyX1BST0dSQU1fSUQpXG4gICAgICAgICAgICAgID8geyBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhQ2xvc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TZXRDb21wdXRlVW5pdExpbWl0OlxuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdExpbWl0UGFyYW1zID0gQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLmRlY29kZVNldENvbXB1dGVVbml0TGltaXQoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzZXRDb21wdXRlVW5pdExpbWl0OiBTZXRDb21wdXRlVW5pdExpbWl0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlNldENvbXB1dGVVbml0TGltaXQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB1bml0czogc2V0Q29tcHV0ZVVuaXRMaW1pdFBhcmFtcy51bml0cyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzZXRDb21wdXRlVW5pdExpbWl0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU2V0UHJpb3JpdHlGZWU6XG4gICAgICAgIGNvbnN0IHNldENvbXB1dGVVbml0UHJpY2VQYXJhbXMgPSBDb21wdXRlQnVkZ2V0SW5zdHJ1Y3Rpb24uZGVjb2RlU2V0Q29tcHV0ZVVuaXRQcmljZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IHNldFByaW9yaXR5RmVlOiBTZXRQcmlvcml0eUZlZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TZXRQcmlvcml0eUZlZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZlZTogc2V0Q29tcHV0ZVVuaXRQcmljZVBhcmFtcy5taWNyb0xhbXBvcnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHNldFByaW9yaXR5RmVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWludFRvOlxuICAgICAgICBsZXQgbWludFRvSW5zdHJ1Y3Rpb246IERlY29kZWRNaW50VG9JbnN0cnVjdGlvbjtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBUT0tFTl8yMDIyX1BST0dSQU1fSUQudG9TdHJpbmcoKSkge1xuICAgICAgICAgIG1pbnRUb0luc3RydWN0aW9uID0gZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1pbnRUb0luc3RydWN0aW9uID0gZGVjb2RlTWludFRvSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludEFkZHJlc3NGb3JNaW50ID0gbWludFRvSW5zdHJ1Y3Rpb24ua2V5cy5taW50LnB1YmtleS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCB0b2tlbk5hbWVGb3JNaW50ID0gZmluZFRva2VuTmFtZShtaW50QWRkcmVzc0Zvck1pbnQsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlERm9yTWludDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSB7XG4gICAgICAgICAgcHJvZ3JhbUlERm9yTWludCA9IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1pbnRUbzogTWludFRvID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1pbnRUbyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIG1pbnRBZGRyZXNzOiBtaW50QWRkcmVzc0Zvck1pbnQsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IG1pbnRUb0luc3RydWN0aW9uLmtleXMuZGVzdGluYXRpb24ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBtaW50VG9JbnN0cnVjdGlvbi5rZXlzLmF1dGhvcml0eS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogbWludFRvSW5zdHJ1Y3Rpb24uZGF0YS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW5OYW1lRm9yTWludCxcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHByb2dyYW1JZDogcHJvZ3JhbUlERm9yTWludCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtaW50VG8pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5CdXJuOlxuICAgICAgICBsZXQgYnVybkluc3RydWN0aW9uOiBEZWNvZGVkQnVybkluc3RydWN0aW9uO1xuICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgIT09IFRPS0VOXzIwMjJfUFJPR1JBTV9JRC50b1N0cmluZygpKSB7XG4gICAgICAgICAgYnVybkluc3RydWN0aW9uID0gZGVjb2RlQnVybkluc3RydWN0aW9uKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidXJuSW5zdHJ1Y3Rpb24gPSBkZWNvZGVCdXJuSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIFRPS0VOXzIwMjJfUFJPR1JBTV9JRCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWludEFkZHJlc3NGb3JCdXJuID0gYnVybkluc3RydWN0aW9uLmtleXMubWludC5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgdG9rZW5OYW1lRm9yQnVybiA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3NGb3JCdXJuLCBpbnN0cnVjdGlvbk1ldGFkYXRhLCBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKTtcbiAgICAgICAgbGV0IHByb2dyYW1JREZvckJ1cm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGluc3RydWN0aW9uLnByb2dyYW1JZCkge1xuICAgICAgICAgIHByb2dyYW1JREZvckJ1cm4gPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidXJuOiBCdXJuID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkJ1cm4sXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzczogbWludEFkZHJlc3NGb3JCdXJuLFxuICAgICAgICAgICAgYWNjb3VudEFkZHJlc3M6IGJ1cm5JbnN0cnVjdGlvbi5rZXlzLmFjY291bnQucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBidXJuSW5zdHJ1Y3Rpb24ua2V5cy5vd25lci5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogYnVybkluc3RydWN0aW9uLmRhdGEuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IHRva2VuTmFtZUZvckJ1cm4sXG4gICAgICAgICAgICBkZWNpbWFsUGxhY2VzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBwcm9ncmFtSWQ6IHByb2dyYW1JREZvckJ1cm4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYnVybik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQ6XG4gICAgICAgIC8vIEFjY291bnQgb3JkZXIgbWF0Y2hlcyB0aGUgZml4ZWQgbGF5b3V0IGVtaXR0ZWQgYnkgc29sSW5zdHJ1Y3Rpb25GYWN0b3J5OlxuICAgICAgICAvLyBbYXV0aG9yaXR5LCBtaW50LCB0b2tlbkFjY291bnQsIGZsYWdBY2NvdW50LCB0b2tlbkFjY291bnRPd25lciwgbWludENvbmZpZyxcbiAgICAgICAgLy8gIHRva2VuUHJvZ3JhbSwgc3lzdGVtUHJvZ3JhbSwgZ2F0aW5nUHJvZ3JhbSwgLi4uZXh0cmFBY2NvdW50c10uXG4gICAgICAgIGNvbnN0IHRoYXdFeHRyYUFjY291bnRzOiBFeHRyYUFjY291bnRNZXRhW10gPSBpbnN0cnVjdGlvbi5rZXlzLnNsaWNlKDkpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbmxlc3NUaGF3OiBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZmxhZ0FjY291bnQ6IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnRPd25lcjogaW5zdHJ1Y3Rpb24ua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnRDb25maWc6IGluc3RydWN0aW9uLmtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlblByb2dyYW06IGluc3RydWN0aW9uLmtleXNbNl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzddLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZ2F0aW5nUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s4XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGV4dHJhQWNjb3VudHM6IHRoYXdFeHRyYUFjY291bnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBlcm1pc3Npb25sZXNzVGhhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG50eXBlIFN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7XG4gIGRlcG9zaXRTb2w/OiBEZXBvc2l0U29sUGFyYW1zO1xuICBjcmVhdGU/OiBDcmVhdGVBY2NvdW50UGFyYW1zO1xuICBpbml0aWFsaXplPzogSW5pdGlhbGl6ZVN0YWtlUGFyYW1zO1xuICBkZWxlZ2F0ZT86IERlbGVnYXRlU3Rha2VQYXJhbXM7XG4gIGhhc0F0YUluaXQ/OiBib29sZWFuO1xufTtcblxudHlwZSBKaXRvU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGRlcG9zaXRTb2w6IE5vbk51bGxhYmxlPFN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlcG9zaXRTb2wnXT47XG59O1xuXG5mdW5jdGlvbiBpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogc2kgaXMgSml0b1N0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuZGVwb3NpdFNvbCAhPT0gdW5kZWZpbmVkO1xufVxuXG50eXBlIE1hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGNyZWF0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snY3JlYXRlJ10+O1xuICBpbml0aWFsaXplOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydpbml0aWFsaXplJ10+O1xufTtcblxuZnVuY3Rpb24gaXNNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBNYXJpbmFkZVN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gc2kuY3JlYXRlICE9PSB1bmRlZmluZWQgJiYgc2kuaW5pdGlhbGl6ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmRlbGVnYXRlID09PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTmF0aXZlU3Rha2luZ0luc3RydWN0aW9ucyA9IFN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIGNyZWF0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snY3JlYXRlJ10+O1xuICBpbml0aWFsaXplOiBOb25OdWxsYWJsZTxTdGFraW5nSW5zdHJ1Y3Rpb25zWydpbml0aWFsaXplJ10+O1xuICBkZWxlZ2F0ZTogTm9uTnVsbGFibGU8U3Rha2luZ0luc3RydWN0aW9uc1snZGVsZWdhdGUnXT47XG59O1xuXG5mdW5jdGlvbiBpc05hdGl2ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc2k6IFN0YWtpbmdJbnN0cnVjdGlvbnMpOiBzaSBpcyBOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHNpLmNyZWF0ZSAhPT0gdW5kZWZpbmVkICYmIHNpLmluaXRpYWxpemUgIT09IHVuZGVmaW5lZCAmJiBzaS5kZWxlZ2F0ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRTdGFraW5nVHlwZUZyb21TdGFraW5nSW5zdHJ1Y3Rpb25zKHNpOiBTdGFraW5nSW5zdHJ1Y3Rpb25zKTogU29sU3Rha2luZ1R5cGVFbnVtIHtcbiAgY29uc3QgaXNKaXRvID0gaXNKaXRvU3Rha2luZ0luc3RydWN0aW9ucyhzaSk7XG4gIGNvbnN0IGlzTWFyaW5hZGUgPSBpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzaSk7XG4gIGNvbnN0IGlzTmF0aXZlID0gaXNOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zKHNpKTtcbiAgYXNzZXJ0KFtpc0ppdG8sIGlzTWFyaW5hZGUsIGlzTmF0aXZlXS5maWx0ZXIoKHgpID0+IHgpLmxlbmd0aCA9PT0gMSwgJ1N0YWtpbmdUeXBlIGlzIGFtYmlndW91cycpO1xuICBpZiAoaXNKaXRvKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE87XG4gIGlmIChpc01hcmluYWRlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFO1xuICBpZiAoaXNOYXRpdmUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFO1xuICBhc3NlcnQoZmFsc2UsICdObyBTdGFraW5nVHlwZSBmb3VuZCcpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nIHR4IGFuZCBkZWxlZ2F0ZSB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nQWN0aXZhdGUgYW5kIE1lbW8gU29sYW5hIGluc3RydWN0aW9uc1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGFjdGl2YXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0FjdGl2YXRlSW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXVxuKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQWN0aXZhdGUgfCBNZW1vIHwgQXRhSW5pdD4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0FjdGl2YXRlIHwgTWVtbyB8IEF0YUluaXQ+ID0gW107XG4gIGNvbnN0IHN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7fSBhcyBTdGFraW5nSW5zdHJ1Y3Rpb25zO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5DcmVhdGU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuY3JlYXRlID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0luaXRpYWxpemU6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaW5pdGlhbGl6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uU3Rha2luZ0RlbGVnYXRlOlxuICAgICAgICBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlbGVnYXRlID0gU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uRGVwb3NpdFNvbDpcbiAgICAgICAgc3Rha2luZ0luc3RydWN0aW9ucy5kZXBvc2l0U29sID0gZGVjb2RlRGVwb3NpdFNvbChpbnN0cnVjdGlvbik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIHN0YWtpbmdJbnN0cnVjdGlvbnMuaGFzQXRhSW5pdCA9IHRydWU7XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbWludEFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXRhQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BVEFBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5Pd25lckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgcGF5ZXJBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUluaXRJbnN0cnVjdGlvbktleXNJbmRleGVzLlBheWVyQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbk5hbWU6IGZpbmRUb2tlbk5hbWUoaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCkpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVN0YWtpbmdJbnN0cnVjdGlvbnMoc3Rha2luZ0luc3RydWN0aW9ucyk7XG4gIGNvbnN0IHN0YWtpbmdUeXBlID0gZ2V0U3Rha2luZ1R5cGVGcm9tU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKTtcblxuICBsZXQgc3Rha2luZ0FjdGl2YXRlOiBTdGFraW5nQWN0aXZhdGUgfCB1bmRlZmluZWQ7XG5cbiAgc3dpdGNoIChzdGFraW5nVHlwZSkge1xuICAgIGNhc2UgU29sU3Rha2luZ1R5cGVFbnVtLkpJVE86IHtcbiAgICAgIGFzc2VydChpc0ppdG9TdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgZGVwb3NpdFNvbCwgaGFzQXRhSW5pdCB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogZGVwb3NpdFNvbC5mdW5kaW5nQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBkZXBvc2l0U29sLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogZGVwb3NpdFNvbC5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIHZhbGlkYXRvcjogZGVwb3NpdFNvbC5zdGFrZVBvb2wudG9TdHJpbmcoKSxcbiAgICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgICAgc3Rha2VQb29sRGF0YToge1xuICAgICAgICAgICAgICBtYW5hZ2VyRmVlQWNjb3VudDogZGVwb3NpdFNvbC5tYW5hZ2VyRmVlQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgICBwb29sTWludDogZGVwb3NpdFNvbC5wb29sTWludC50b1N0cmluZygpLFxuICAgICAgICAgICAgICByZXNlcnZlU3Rha2U6IGRlcG9zaXRTb2wucmVzZXJ2ZVN0YWtlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDogISFoYXNBdGFJbml0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTUFSSU5BREU6IHtcbiAgICAgIGFzc2VydChpc01hcmluYWRlU3Rha2luZ0luc3RydWN0aW9ucyhzdGFraW5nSW5zdHJ1Y3Rpb25zKSk7XG4gICAgICBjb25zdCB7IGNyZWF0ZSwgaW5pdGlhbGl6ZSB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogY3JlYXRlLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5pdGlhbGl6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogY3JlYXRlLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBpbml0aWFsaXplLmF1dGhvcml6ZWQuc3Rha2VyLnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFOiB7XG4gICAgICBhc3NlcnQoaXNOYXRpdmVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnMpKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlLCBpbml0aWFsaXplLCBkZWxlZ2F0ZSB9ID0gc3Rha2luZ0luc3RydWN0aW9ucztcbiAgICAgIHN0YWtpbmdBY3RpdmF0ZSA9IHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0FjdGl2YXRlLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICBmcm9tQWRkcmVzczogY3JlYXRlLmZyb21QdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICBzdGFraW5nQWRkcmVzczogaW5pdGlhbGl6ZS5zdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGFtb3VudDogY3JlYXRlLmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgdmFsaWRhdG9yOiBkZWxlZ2F0ZS52b3RlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgdW5yZWFjaGFibGU6IG5ldmVyID0gc3Rha2luZ1R5cGU7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3Rha2luZyB0eXBlICR7dW5yZWFjaGFibGV9YCk7XG4gICAgfVxuICB9XG5cbiAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0FjdGl2YXRlKTtcblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBjcmVhdGUgZGVsZWdhdGUgdHhcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIFN0YWtpbmdEZWxlZ2F0ZVxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlbGVnYXRlIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0RlbGVnYXRlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nRGVsZWdhdGU+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWxlZ2F0ZT4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVsZWdhdGU6XG4gICAgICAgIGNvbnN0IHN0YWtpbmdEZWxlZ2F0ZVBhcmFtcyA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVsZWdhdGUoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBzdGFraW5nRGVsZWdhdGU6IFN0YWtpbmdEZWxlZ2F0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVsZWdhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBmcm9tQWRkcmVzczogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFraW5nRGVsZWdhdGVQYXJhbXMuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgIHZhbGlkYXRvcjogc3Rha2luZ0RlbGVnYXRlUGFyYW1zLnZvdGVQdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChzdGFraW5nRGVsZWdhdGUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGFraW5nSW5zdHJ1Y3Rpb25zKHN0YWtpbmdJbnN0cnVjdGlvbnM6IFN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgaWYgKHN0YWtpbmdJbnN0cnVjdGlvbnMuZGVsZWdhdGUgPT09IHVuZGVmaW5lZCAmJiBzdGFraW5nSW5zdHJ1Y3Rpb25zLmRlcG9zaXRTb2wgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5jcmVhdGUpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgY3JlYXRlIHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfVxuXG4gIGlmICghc3Rha2luZ0luc3RydWN0aW9ucy5kZWxlZ2F0ZSAmJiAhc3Rha2luZ0luc3RydWN0aW9ucy5pbml0aWFsaXplKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICdJbnZhbGlkIHN0YWtpbmcgYWN0aXZhdGUgdHJhbnNhY3Rpb24sIG1pc3NpbmcgaW5pdGlhbGl6ZSBzdGFrZSBhY2NvdW50L2RlbGVnYXRlIGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH1cbn1cblxudHlwZSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSB7XG4gIGFsbG9jYXRlPzogQWxsb2NhdGVQYXJhbXM7XG4gIGFzc2lnbj86IEFzc2lnblBhcmFtcztcbiAgc3BsaXQ/OiBTcGxpdFN0YWtlUGFyYW1zO1xuICBkZWFjdGl2YXRlPzogRGVhY3RpdmF0ZVN0YWtlUGFyYW1zO1xuICB0cmFuc2Zlcj86IERlY29kZWRUcmFuc2Zlckluc3RydWN0aW9uO1xuICB3aXRoZHJhd1N0YWtlPzogV2l0aGRyYXdTdGFrZVBhcmFtcztcbn07XG5cbnR5cGUgSml0b1Vuc3Rha2luZ0luc3RydWN0aW9ucyA9IFVuc3Rha2luZ0luc3RydWN0aW9ucyAmIHtcbiAgd2l0aGRyYXdTdGFrZTogTm9uTnVsbGFibGU8VW5zdGFraW5nSW5zdHJ1Y3Rpb25zWyd3aXRoZHJhd1N0YWtlJ10+O1xufTtcblxuZnVuY3Rpb24gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpOiB1aSBpcyBKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMgPSBVbnN0YWtpbmdJbnN0cnVjdGlvbnMgJiB7XG4gIHRyYW5zZmVyOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3RyYW5zZmVyJ10+O1xufTtcblxuZnVuY3Rpb24gaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnMge1xuICByZXR1cm4gdWkudHJhbnNmZXIgIT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWQ7XG59XG5cbnR5cGUgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zID0gVW5zdGFraW5nSW5zdHJ1Y3Rpb25zICYge1xuICBkZWFjdGl2YXRlOiBOb25OdWxsYWJsZTxVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ2RlYWN0aXZhdGUnXT47XG4gIHNwbGl0OiBVbnN0YWtpbmdJbnN0cnVjdGlvbnNbJ3NwbGl0J107XG59O1xuXG5mdW5jdGlvbiBpc05hdGl2ZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogdWkgaXMgTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zIHtcbiAgcmV0dXJuIHVpLndpdGhkcmF3U3Rha2UgPT09IHVuZGVmaW5lZCAmJiB1aS5kZWFjdGl2YXRlICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUeXBlRnJvbVVuc3Rha2luZ0luc3RydWN0aW9ucyh1aTogVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKTogU29sU3Rha2luZ1R5cGVFbnVtIHtcbiAgY29uc3QgaXNKaXRvID0gaXNKaXRvVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgY29uc3QgaXNNYXJpbmFkZSA9IGlzTWFyaW5hZGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModWkpO1xuICBjb25zdCBpc05hdGl2ZSA9IGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVpKTtcbiAgYXNzZXJ0KFtpc0ppdG8sIGlzTWFyaW5hZGUsIGlzTmF0aXZlXS5maWx0ZXIoKHgpID0+IHgpLmxlbmd0aCA9PT0gMSwgJ1N0YWtpbmdUeXBlIGlzIGFtYmlndW91cycpO1xuICBpZiAoaXNKaXRvKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLkpJVE87XG4gIGlmIChpc01hcmluYWRlKSByZXR1cm4gU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFO1xuICBpZiAoaXNOYXRpdmUpIHJldHVybiBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFO1xuICBhc3NlcnQoZmFsc2UsICdObyBTdGFraW5nVHlwZSBmb3VuZCcpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBkZWFjdGl2YXRlIHN0YWtlIHR4IGluc3RydWN0aW9ucyBwYXJhbXMuIFN1cHBvcnRzIGZ1bGwgc3Rha2VcbiAqIGFjY291bnQgZGVhY3RpdmF0aW9uIGFuZCBwYXJ0aWFsIHN0YWtlIGFjY291bnQgZGVhY3RpdmF0aW9uLlxuICpcbiAqIFdoZW4gcGFydGlhbGx5IGRlYWN0aXZhdGluZyBhIHN0YWtlIGFjY291bnQgdGhpcyBtZXRob2QgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczogQWxsb2NhdGUsXG4gKiB0byBhbGxvY2F0ZSBhIG5ldyBzdGFraW5nIGFjY291bnQsIEFzc2lnbiwgdG8gYXNzaWduIHRoZSBuZXdseSBjcmVhdGVkIHN0YWtpbmcgYWNjb3VudCB0byB0aGVcbiAqIFN0YWtlIFByb2dyYW0sIFNwbGl0LCB0byBzcGxpdCB0aGUgY3VycmVudCBzdGFrZSBhY2NvdW50LCBhbmQgU3Rha2luZ0RlYWN0aXZhdGUgdG8gZGVhY3RpdmF0ZSB0aGVcbiAqIG5ld2x5IGNyZWF0ZWQgc3Rha2UgYWNjb3VudC5cbiAqXG4gKiBTdXBwb3J0cyBOb25jZSwgU3Rha2luZ0RlYWN0aXZhdGUsIE1lbW8sIEFsbG9jYXRlLCBBc3NpZ24sIGFuZCBTcGxpdCBTb2xhbmEgaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBhbiBhcnJheSBvZiBzdXBwb3J0ZWQgU29sYW5hIGluc3RydWN0aW9uc1xuICogQHJldHVybnMge0luc3RydWN0aW9uUGFyYW1zW119IEFuIGFycmF5IGNvbnRhaW5pbmcgaW5zdHJ1Y3Rpb24gcGFyYW1zIGZvciBzdGFraW5nIGRlYWN0aXZhdGUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVhY3RpdmF0ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGNvaW5OYW1lPzogc3RyaW5nXG4pOiBBcnJheTxOb25jZSB8IFN0YWtpbmdEZWFjdGl2YXRlIHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0RlYWN0aXZhdGUgfCBNZW1vPiA9IFtdO1xuICBjb25zdCB1bnN0YWtpbmdJbnN0cnVjdGlvbnM6IFVuc3Rha2luZ0luc3RydWN0aW9uc1tdID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uTWVtbzpcbiAgICAgICAgY29uc3QgbWVtbzogTWVtbyA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgICAgIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobWVtbyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWxsb2NhdGU6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYWxsb2NhdGUgPT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFsbG9jYXRlID1cbiAgICAgICAgICAgIFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFsbG9jYXRlKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhbGxvY2F0ZTogU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQWxsb2NhdGUoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQXNzaWduOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLmFzc2lnbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uYXNzaWduID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlQXNzaWduKGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBhc3NpZ246IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZUFzc2lnbihpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TcGxpdDpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5zcGxpdCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uc3BsaXQgPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVNwbGl0KGluc3RydWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBzcGxpdDogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVTcGxpdChpbnN0cnVjdGlvbiksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS5kZWFjdGl2YXRlID1cbiAgICAgICAgICAgIFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgZGVhY3RpdmF0ZTogU3Rha2VJbnN0cnVjdGlvbi5kZWNvZGVEZWFjdGl2YXRlKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlRyYW5zZmVyOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnNbdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdLnRyYW5zZmVyID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zW3Vuc3Rha2luZ0luc3RydWN0aW9ucy5sZW5ndGggLSAxXS50cmFuc2ZlciA9XG4gICAgICAgICAgICBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICAgICAgdHJhbnNmZXI6IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZVRyYW5zZmVyKGluc3RydWN0aW9uKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLldpdGhkcmF3U3Rha2U6XG4gICAgICAgIGlmIChcbiAgICAgICAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0ud2l0aGRyYXdTdGFrZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9uc1t1bnN0YWtpbmdJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0ud2l0aGRyYXdTdGFrZSA9IGRlY29kZVdpdGhkcmF3U3Rha2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIHdpdGhkcmF3U3Rha2U6IGRlY29kZVdpdGhkcmF3U3Rha2UoaW5zdHJ1Y3Rpb24pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb24gb2YgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zKSB7XG4gICAgdmFsaWRhdGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pO1xuICAgIGNvbnN0IHN0YWtpbmdUeXBlID0gZ2V0U3Rha2luZ1R5cGVGcm9tVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKTtcblxuICAgIGxldCBzdGFraW5nRGVhY3RpdmF0ZTogU3Rha2luZ0RlYWN0aXZhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKHN0YWtpbmdUeXBlKSB7XG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPOiB7XG4gICAgICAgIGFzc2VydChpc0ppdG9VbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb24pKTtcbiAgICAgICAgY29uc3QgeyB3aXRoZHJhd1N0YWtlIH0gPSB1bnN0YWtpbmdJbnN0cnVjdGlvbjtcbiAgICAgICAgc3Rha2luZ0RlYWN0aXZhdGUgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ0RlYWN0aXZhdGUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3aXRoZHJhd1N0YWtlLmRlc3RpbmF0aW9uU3Rha2VBdXRob3JpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLnN0YWtlUG9vbC50b1N0cmluZygpLFxuICAgICAgICAgICAgYW1vdW50OiB3aXRoZHJhd1N0YWtlLnBvb2xUb2tlbnMudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3U3Rha2UuZGVzdGluYXRpb25TdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgICAgZXh0cmFQYXJhbXM6IHtcbiAgICAgICAgICAgICAgc3Rha2VQb29sRGF0YToge1xuICAgICAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiB3aXRoZHJhd1N0YWtlLm1hbmFnZXJGZWVBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgcG9vbE1pbnQ6IHdpdGhkcmF3U3Rha2UucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JMaXN0QWNjb3VudDogd2l0aGRyYXdTdGFrZS52YWxpZGF0b3JMaXN0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHdpdGhkcmF3U3Rha2UudmFsaWRhdG9yU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgdHJhbnNmZXJBdXRob3JpdHlBZGRyZXNzOiB3aXRoZHJhd1N0YWtlLnNvdXJjZVRyYW5zZmVyQXV0aG9yaXR5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERToge1xuICAgICAgICBhc3NlcnQoaXNNYXJpbmFkZVVuc3Rha2luZ0luc3RydWN0aW9ucyh1bnN0YWtpbmdJbnN0cnVjdGlvbikpO1xuICAgICAgICBjb25zdCB7IHRyYW5zZmVyIH0gPSB1bnN0YWtpbmdJbnN0cnVjdGlvbjtcblxuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6ICcnLFxuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdHJhbnNmZXIudG9QdWJrZXkudG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRyYW5zZmVyLmxhbXBvcnRzLnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFNvbFN0YWtpbmdUeXBlRW51bS5OQVRJVkU6IHtcbiAgICAgICAgYXNzZXJ0KGlzTmF0aXZlVW5zdGFraW5nSW5zdHJ1Y3Rpb25zKHVuc3Rha2luZ0luc3RydWN0aW9uKSk7XG4gICAgICAgIGNvbnN0IHsgZGVhY3RpdmF0ZSwgc3BsaXQgfSA9IHVuc3Rha2luZ0luc3RydWN0aW9uO1xuICAgICAgICBzdGFraW5nRGVhY3RpdmF0ZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nRGVhY3RpdmF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHN0YWtpbmdUeXBlLFxuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IGRlYWN0aXZhdGUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHNwbGl0Py5zdGFrZVB1YmtleS50b1N0cmluZygpIHx8IGRlYWN0aXZhdGUuc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogc3BsaXQ/LmxhbXBvcnRzLnRvU3RyaW5nKCksXG4gICAgICAgICAgICB1bnN0YWtpbmdBZGRyZXNzOiBzcGxpdD8uc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IHVucmVhY2hhYmxlOiBuZXZlciA9IHN0YWtpbmdUeXBlO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gc3Rha2luZyB0eXBlICR7dW5yZWFjaGFibGV9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goc3Rha2luZ0RlYWN0aXZhdGUpO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVVbnN0YWtpbmdJbnN0cnVjdGlvbnModW5zdGFraW5nSW5zdHJ1Y3Rpb25zOiBVbnN0YWtpbmdJbnN0cnVjdGlvbnMpIHtcbiAgLy8gQ2FzZXMgd2hlcmUgZXhhY3RseSBvbmUgZmllbGQgc2hvdWxkIGJlIHByZXNlbnRcbiAgY29uc3QgdW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5czogKGtleW9mIFVuc3Rha2luZ0luc3RydWN0aW9ucylbXSA9IFtcbiAgICAnYWxsb2NhdGUnLFxuICAgICdhc3NpZ24nLFxuICAgICdzcGxpdCcsXG4gICAgJ2RlYWN0aXZhdGUnLFxuICAgICd0cmFuc2ZlcicsXG4gIF0gYXMgY29uc3Q7XG4gIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnNLZXlzLmV2ZXJ5KChrKSA9PiAhIXVuc3Rha2luZ0luc3RydWN0aW9uc1trXSA9PT0gKGsgPT09ICd0cmFuc2ZlcicpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5cy5ldmVyeSgoaykgPT4gISF1bnN0YWtpbmdJbnN0cnVjdGlvbnNba10gPT09IChrID09PSAnd2l0aGRyYXdTdGFrZScpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zS2V5cy5ldmVyeSgoaykgPT4gISF1bnN0YWtpbmdJbnN0cnVjdGlvbnNba10gPT09IChrID09PSAnZGVhY3RpdmF0ZScpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENhc2VzIHdoZXJlIGRlYWN0aXZhdGUgZmllbGQgbXVzdCBiZSBwcmVzZW50IHdpdGggYW5vdGhlciBmaWVsZFxuICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5kZWFjdGl2YXRlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnSW52YWxpZCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIGRlYWN0aXZhdGUgc3Rha2UgYWNjb3VudCBpbnN0cnVjdGlvbicpO1xuICB9XG5cbiAgLy8gVGhpcyBpcyBhIHN0YWtlIHBvb2wgaW5zdHJ1Y3Rpb24sIG5vdCBhIHBhcnRpYWwgdW5zdGFrZVxuICBpZiAodW5zdGFraW5nSW5zdHJ1Y3Rpb25zLndpdGhkcmF3U3Rha2UpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZSkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgYWxsb2NhdGUgdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5hc3NpZ24pIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgbWlzc2luZyBhc3NpZ24gdW5zdGFrZSBhY2NvdW50IGluc3RydWN0aW9uJyk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdCkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtaXNzaW5nIHNwbGl0IHN0YWtlIGFjY291bnQgaW5zdHJ1Y3Rpb24nKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLmFjY291bnRQdWJrZXkudG9TdHJpbmcoKVxuICApIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIGFuZCBhc3NpZ24gdGhlIHNhbWUgcHVibGljIGtleSdcbiAgICApO1xuICB9IGVsc2UgaWYgKHVuc3Rha2luZ0luc3RydWN0aW9ucy5hbGxvY2F0ZS5zcGFjZSAhPT0gU3Rha2VQcm9ncmFtLnNwYWNlKSB7XG4gICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgIGBJbnZhbGlkIHBhcnRpYWwgZGVhY3RpdmF0ZSBzdGFrZSB0cmFuc2FjdGlvbiwgdW5zdGFraW5nIGFjY291bnQgbXVzdCBhbGxvY2F0ZSAke1N0YWtlUHJvZ3JhbS5zcGFjZX0gYnl0ZXNgXG4gICAgKTtcbiAgfSBlbHNlIGlmICh1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYXNzaWduLnByb2dyYW1JZC50b1N0cmluZygpICE9PSBTdGFrZVByb2dyYW0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkpIHtcbiAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCB0aGUgdW5zdGFrZSBhY2NvdW50IG11c3QgYmUgYXNzaWduZWQgdG8gdGhlIFN0YWtlIFByb2dyYW0nXG4gICAgKTtcbiAgfSBlbHNlIGlmIChcbiAgICB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuYWxsb2NhdGUuYWNjb3VudFB1YmtleS50b1N0cmluZygpICE9PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ0ludmFsaWQgcGFydGlhbCBkZWFjdGl2YXRlIHN0YWtlIHRyYW5zYWN0aW9uLCBtdXN0IGFsbG9jYXRlIHRoZSB1bnN0YWtpbmcgYWNjb3VudCcpO1xuICB9IGVsc2UgaWYgKFxuICAgIHVuc3Rha2luZ0luc3RydWN0aW9ucy5zcGxpdC5zdGFrZVB1YmtleS50b1N0cmluZygpID09PSB1bnN0YWtpbmdJbnN0cnVjdGlvbnMuc3BsaXQuc3BsaXRTdGFrZVB1YmtleS50b1N0cmluZygpXG4gICkge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIHRoZSB1bnN0YWtpbmcgYWNjb3VudCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBTdGFrZSBBY2NvdW50J1xuICAgICk7XG4gIH0gZWxzZSBpZiAoIXVuc3Rha2luZ0luc3RydWN0aW9ucy50cmFuc2Zlcikge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoXG4gICAgICAnSW52YWxpZCBwYXJ0aWFsIGRlYWN0aXZhdGUgc3Rha2UgdHJhbnNhY3Rpb24sIG1pc3NpbmcgZnVuZGluZyBvZiB1bnN0YWtlIGFkZHJlc3MgaW5zdHJ1Y3Rpb24nXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNyZWF0ZSBzdGFraW5nICB3aXRoZHJhdyB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBTdGFraW5nV2l0aGRyYXcsIGFuZCBNZW1vIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyB3aXRoZHJhdyB0eFxuICovXG5mdW5jdGlvbiBwYXJzZVN0YWtpbmdXaXRoZHJhd0luc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PE5vbmNlIHwgU3Rha2luZ1dpdGhkcmF3IHwgTWVtbz4gPSBbXTtcbiAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5NZW1vOlxuICAgICAgICBjb25zdCBtZW1vOiBNZW1vID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sXG4gICAgICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoKSB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGNvbnN0IHdpdGhkcmF3SW5zdHJ1Y3Rpb24gPSBTdGFrZUluc3RydWN0aW9uLmRlY29kZVdpdGhkcmF3KGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3OiBTdGFraW5nV2l0aGRyYXcgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuU3Rha2luZ1dpdGhkcmF3LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IHdpdGhkcmF3SW5zdHJ1Y3Rpb24uc3Rha2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGFtb3VudDogd2l0aGRyYXdJbnN0cnVjdGlvbi5sYW1wb3J0cy50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHN0YWtpbmdXaXRoZHJhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtZW1vIG9iamVjdCBmcm9tIGluc3RydWN0aW9ucyBpZiBpdCBleGlzdHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGJlIHBhcnNlZFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fSBpbnN0cnVjdGlvbkluZGV4ZXMgLSB0aGUgaW5zdHJ1Y3Rpb25zIGluZGV4ZXMgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtNZW1vIHwgdW5kZWZpbmVkfSAtIG1lbW8gb2JqZWN0IG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiBnZXRNZW1vKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdLCBpbnN0cnVjdGlvbkluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4pOiBNZW1vIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25zTGVuZ3RoID0gT2JqZWN0LmtleXMoaW5zdHJ1Y3Rpb25JbmRleGVzKS5sZW5ndGg7XG4gIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoID09PSBpbnN0cnVjdGlvbnNMZW5ndGggJiYgaW5zdHJ1Y3Rpb25zW2luc3RydWN0aW9uSW5kZXhlcy5NZW1vXSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5NZW1vLFxuICAgICAgcGFyYW1zOiB7IG1lbW86IGluc3RydWN0aW9uc1tpbnN0cnVjdGlvbkluZGV4ZXMuTWVtb10uZGF0YS50b1N0cmluZygpIH0sXG4gICAgfTtcbiAgfVxufVxuXG5jb25zdCBhdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgUGF5ZXJBZGRyZXNzOiAwLFxuICBBVEFBZGRyZXNzOiAxLFxuICBPd25lckFkZHJlc3M6IDIsXG4gIE1pbnRBZGRyZXNzOiAzLFxufTtcblxuY29uc3QgY2xvc2VBdGFJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBBY2NvdW50QWRkcmVzczogMCxcbiAgRGVzdGluYXRpb25BZGRyZXNzOiAxLFxuICBBdXRob3JpdHlBZGRyZXNzOiAyLFxufTtcblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBpbml0aWFsaXplIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFJbml0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSxcbiAgaW5zdHJ1Y3Rpb25NZXRhZGF0YT86IEluc3RydWN0aW9uUGFyYW1zW10sXG4gIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWU/OiBib29sZWFuXG4pOiBBcnJheTxBdGFJbml0IHwgUGVybWlzc2lvbmxlc3NUaGF3SWRlbXBvdGVudCB8IE1lbW8gfCBOb25jZT4ge1xuICBjb25zdCBpbnN0cnVjdGlvbkRhdGE6IEFycmF5PEF0YUluaXQgfCBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50IHwgTWVtbyB8IE5vbmNlPiA9IFtdO1xuICBsZXQgbWVtbzogTWVtbyB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIG1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BZHZhbmNlTm9uY2VBY2NvdW50OlxuICAgICAgICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbik7XG4gICAgICAgIGNvbnN0IG5vbmNlOiBOb25jZSA9IHtcbiAgICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ob25jZUFkdmFuY2UsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLm5vbmNlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24uYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG5vbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uSW5pdGlhbGl6ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQ6XG4gICAgICAgIGNvbnN0IG1pbnRBZGRyZXNzID0gaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5NaW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHRva2VuTmFtZSA9IGZpbmRUb2tlbk5hbWUobWludEFkZHJlc3MsIGluc3RydWN0aW9uTWV0YWRhdGEsIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUpO1xuICAgICAgICBsZXQgcHJvZ3JhbUlEOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpIHtcbiAgICAgICAgICBwcm9ncmFtSUQgPSBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdGFJbml0OiBBdGFJbml0ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNyZWF0ZUFzc29jaWF0ZWRUb2tlbkFjY291bnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICAgIGF0YUFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuQVRBQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lckFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhSW5pdEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBheWVyQWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFJbml0SW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5QYXllckFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5OYW1lLFxuICAgICAgICAgICAgcHJvZ3JhbUlkOiBwcm9ncmFtSUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goYXRhSW5pdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQ6XG4gICAgICAgIGNvbnN0IHRoYXdFeHRyYUFjY291bnRzOiBFeHRyYUFjY291bnRNZXRhW10gPSBpbnN0cnVjdGlvbi5rZXlzLnNsaWNlKDkpLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbmxlc3NUaGF3OiBQZXJtaXNzaW9ubGVzc1RoYXdJZGVtcG90ZW50ID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlBlcm1pc3Npb25sZXNzVGhhd0lkZW1wb3RlbnQsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtaW50OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgdG9rZW5BY2NvdW50OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZmxhZ0FjY291bnQ6IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlbkFjY291bnRPd25lcjogaW5zdHJ1Y3Rpb24ua2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1pbnRDb25maWc6IGluc3RydWN0aW9uLmtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICB0b2tlblByb2dyYW06IGluc3RydWN0aW9uLmtleXNbNl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzeXN0ZW1Qcm9ncmFtOiBpbnN0cnVjdGlvbi5rZXlzWzddLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZ2F0aW5nUHJvZ3JhbTogaW5zdHJ1Y3Rpb24ua2V5c1s4XS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGV4dHJhQWNjb3VudHM6IHRoYXdFeHRyYUFjY291bnRzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKHBlcm1pc3Npb25sZXNzVGhhdyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkRlcG9zaXRTb2w6XG4gICAgICAgIC8vIEF0YUluaXQgaXMgYSBwYXJ0IG9mIHNwbC1zdGFrZS1wb29sJ3MgZGVwb3NpdFNvbCBwcm9jZXNzXG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZChcbiAgICAgICAgICAnSW52YWxpZCB0cmFuc2FjdGlvbiwgaW5zdHJ1Y3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiAnICsgZ2V0SW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKVxuICAgICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAobWVtbykge1xuICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKG1lbW8pO1xuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbmNvbnN0IGF0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcyA9IHtcbiAgQWNjb3VudEFkZHJlc3M6IDAsXG4gIERlc3RpbmF0aW9uQWRkcmVzczogMSxcbiAgQXV0aG9yaXR5QWRkcmVzczogMixcbn07XG5cbmNvbnN0IGF0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzID0ge1xuICBOZXN0ZWRBY2NvdW50QWRkcmVzczogMCxcbiAgTmVzdGVkTWludEFkZHJlc3M6IDEsXG4gIERlc3RpbmF0aW9uQWNjb3VudEFkZHJlc3M6IDIsXG4gIE93bmVyQWNjb3VudEFkZHJlc3M6IDMsXG4gIE93bmVyTWludEFkZHJlc3M6IDQsXG4gIFdhbGxldEFkZHJlc3M6IDUsXG59O1xuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNsb3NlIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCB0eCBpbnN0cnVjdGlvbnMgcGFyYW1zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIFNlbmQgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VBdGFDbG9zZUluc3RydWN0aW9ucyhpbnN0cnVjdGlvbnM6IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXSk6IEFycmF5PEF0YUNsb3NlIHwgQXRhUmVjb3Zlck5lc3RlZCB8IE5vbmNlPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8QXRhQ2xvc2UgfCBBdGFSZWNvdmVyTmVzdGVkIHwgTm9uY2U+ID0gW107XG4gIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb25zKSB7XG4gICAgY29uc3QgdHlwZSA9IGdldEluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFZhbGlkSW5zdHJ1Y3Rpb25UeXBlc0VudW0uQWR2YW5jZU5vbmNlQWNjb3VudDpcbiAgICAgICAgY29uc3QgYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24gPSBTeXN0ZW1JbnN0cnVjdGlvbi5kZWNvZGVOb25jZUFkdmFuY2UoaW5zdHJ1Y3Rpb24pO1xuICAgICAgICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudDpcbiAgICAgICAgY29uc3QgYXRhQ2xvc2U6IEF0YUNsb3NlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGFjY291bnRBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkFkZHJlc3M6IGluc3RydWN0aW9uLmtleXNbYXRhQ2xvc2VJbnN0cnVjdGlvbktleXNJbmRleGVzLkRlc3RpbmF0aW9uQWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzOiBpbnN0cnVjdGlvbi5rZXlzW2F0YUNsb3NlSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5BdXRob3JpdHlBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIC4uLihpbnN0cnVjdGlvbi5wcm9ncmFtSWQuZXF1YWxzKFRPS0VOXzIwMjJfUFJPR1JBTV9JRClcbiAgICAgICAgICAgICAgPyB7IHByb2dyYW1JZDogaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFDbG9zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50OlxuICAgICAgICBjb25zdCBhdGFSZWNvdmVyTmVzdGVkOiBBdGFSZWNvdmVyTmVzdGVkID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlJlY292ZXJOZXN0ZWRBc3NvY2lhdGVkVG9rZW5BY2NvdW50LFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgbmVzdGVkQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkQWNjb3VudEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmVzdGVkTWludEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuTmVzdGVkTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgZGVzdGluYXRpb25BY2NvdW50QWRkcmVzczpcbiAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5EZXN0aW5hdGlvbkFjY291bnRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG93bmVyQWNjb3VudEFkZHJlc3M6XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uLmtleXNbYXRhUmVjb3Zlck5lc3RlZEluc3RydWN0aW9uS2V5c0luZGV4ZXMuT3duZXJBY2NvdW50QWRkcmVzc10ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvd25lck1pbnRBZGRyZXNzOlxuICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5rZXlzW2F0YVJlY292ZXJOZXN0ZWRJbnN0cnVjdGlvbktleXNJbmRleGVzLk93bmVyTWludEFkZHJlc3NdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgd2FsbGV0QWRkcmVzczogaW5zdHJ1Y3Rpb24ua2V5c1thdGFSZWNvdmVyTmVzdGVkSW5zdHJ1Y3Rpb25LZXlzSW5kZXhlcy5XYWxsZXRBZGRyZXNzXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChhdGFSZWNvdmVyTmVzdGVkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKFxuICAgICAgICAgICdJbnZhbGlkIHRyYW5zYWN0aW9uLCBpbnN0cnVjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQ6ICcgKyBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pXG4gICAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0cnVjdGlvbkRhdGE7XG59XG5cbi8qKlxuICogUGFyc2VzIFNvbGFuYSBpbnN0cnVjdGlvbnMgdG8gYXV0aG9yaXplZCBzdGFraW5nIGFjY291bnQgcGFyYW1zXG4gKiBPbmx5IHN1cHBvcnRzIE5vbmNlLCBBdXRob3JpemUgaW5zdHJ1Y3Rpb25zXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkluc3RydWN0aW9uW119IGluc3RydWN0aW9ucyAtIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBTb2xhbmEgaW5zdHJ1Y3Rpb25zXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgZm9yIHN0YWtpbmcgYXV0aG9yaXplIHR4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlU3Rha2luZ0F1dGhvcml6ZUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW11cbik6IEFycmF5PE5vbmNlIHwgU3Rha2luZ0F1dGhvcml6ZSB8IE1lbW8+IHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBBcnJheTxOb25jZSB8IFN0YWtpbmdBdXRob3JpemUgfCBNZW1vPiA9IFtdO1xuICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIGluc3RydWN0aW9ucykge1xuICAgIGNvbnN0IHR5cGUgPSBnZXRJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLkFkdmFuY2VOb25jZUFjY291bnQ6XG4gICAgICAgIGNvbnN0IGFkdmFuY2VOb25jZUluc3RydWN0aW9uID0gU3lzdGVtSW5zdHJ1Y3Rpb24uZGVjb2RlTm9uY2VBZHZhbmNlKGluc3RydWN0aW9uKTtcbiAgICAgICAgY29uc3Qgbm9uY2U6IE5vbmNlID0ge1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk5vbmNlQWR2YW5jZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogYWR2YW5jZU5vbmNlSW5zdHJ1Y3Rpb24ubm9uY2VQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5hdXRob3JpemVkUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2gobm9uY2UpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBWYWxpZEluc3RydWN0aW9uVHlwZXNFbnVtLk1lbW86XG4gICAgICAgIGNvbnN0IG1lbW86IE1lbW8gPSB7IHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLk1lbW8sIHBhcmFtczogeyBtZW1vOiBpbnN0cnVjdGlvbi5kYXRhLnRvU3RyaW5nKCkgfSB9O1xuICAgICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChtZW1vKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgVmFsaWRJbnN0cnVjdGlvblR5cGVzRW51bS5BdXRob3JpemU6XG4gICAgICAgIGNvbnN0IGF1dGhvcml6ZSA9IFN0YWtlSW5zdHJ1Y3Rpb24uZGVjb2RlQXV0aG9yaXplKGluc3RydWN0aW9uKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goe1xuICAgICAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBdXRob3JpemUsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBzdGFraW5nQWRkcmVzczogYXV0aG9yaXplLnN0YWtlUHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBvbGRBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUuYXV0aG9yaXplZFB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgICAgbmV3QXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLm5ld0F1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG5ld1dpdGhkcmF3QWRkcmVzczogYXV0aG9yaXplLmN1c3RvZGlhblB1YmtleT8udG9TdHJpbmcoKSB8fCAnJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgU29sYW5hIGluc3RydWN0aW9ucyB0byBhdXRob3JpemVkIHN0YWtpbmcgYWNjb3VudCBwYXJhbXNcbiAqIE9ubHkgc3VwcG9ydHMgTm9uY2UsIEF1dGhvcml6ZSBpbnN0cnVjdGlvbnNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIFNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3Igc3Rha2luZyBhdXRob3JpemUgdHhcbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFraW5nQXV0aG9yaXplUmF3SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9uczogVHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdKTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiB7XG4gIGNvbnN0IGluc3RydWN0aW9uRGF0YTogQXJyYXk8Tm9uY2UgfCBTdGFraW5nQXV0aG9yaXplPiA9IFtdO1xuICBhc3NlcnQoaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMiwgJ0ludmFsaWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucycpO1xuICBjb25zdCBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbiA9IFN5c3RlbUluc3RydWN0aW9uLmRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbnNbMF0pO1xuICBjb25zdCBub25jZTogTm9uY2UgPSB7XG4gICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTm9uY2VBZHZhbmNlLFxuICAgIHBhcmFtczoge1xuICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiBhZHZhbmNlTm9uY2VJbnN0cnVjdGlvbi5ub25jZVB1YmtleS50b1N0cmluZygpLFxuICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IGFkdmFuY2VOb25jZUluc3RydWN0aW9uLmF1dGhvcml6ZWRQdWJrZXkudG9TdHJpbmcoKSxcbiAgICB9LFxuICB9O1xuICBpbnN0cnVjdGlvbkRhdGEucHVzaChub25jZSk7XG4gIGNvbnN0IGF1dGhvcml6ZSA9IGluc3RydWN0aW9uc1sxXTtcbiAgYXNzZXJ0KGF1dGhvcml6ZS5rZXlzLmxlbmd0aCA9PT0gNSwgJ0ludmFsaWQgbnVtYmVyIG9mIGtleXMgaW4gYXV0aG9yaXplIGluc3RydWN0aW9uJyk7XG4gIGluc3RydWN0aW9uRGF0YS5wdXNoKHtcbiAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5TdGFraW5nQXV0aG9yaXplLFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2luZ0FkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzBdLnB1YmtleS50b1N0cmluZygpLFxuICAgICAgb2xkQXV0aG9yaXplQWRkcmVzczogYXV0aG9yaXplLmtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBuZXdBdXRob3JpemVBZGRyZXNzOiBhdXRob3JpemUua2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKSxcbiAgICAgIGN1c3RvZGlhbkFkZHJlc3M6IGF1dGhvcml6ZS5rZXlzWzRdLnB1YmtleS50b1N0cmluZygpLFxuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gdHlwZSBpcyBhIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBpbnN0cnVjdGlvblxuICogKFRva2VuLTIwMjIgQ1QgZXh0ZW5zaW9uIG9yIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSkuXG4gKi9cbmZ1bmN0aW9uIGlzQ29uZmlkZW50aWFsVHJhbnNmZXJJbnN0cnVjdGlvbih0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcyk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkNvbmZpZ3VyZUNvbmZpZGVudGlhbFRyYW5zZmVyQWNjb3VudDpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkFwcGx5UGVuZGluZ0JhbGFuY2U6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxEZXBvc2l0OlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ29uZmlkZW50aWFsV2l0aGRyYXc6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Db25maWRlbnRpYWxUcmFuc2ZlcjpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVB1YmtleVZhbGlkaXR5OlxuICAgIGNhc2UgSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuVmVyaWZ5RXF1YWxpdHlQcm9vZjpcbiAgICBjYXNlIEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlZlcmlmeVZhbGlkaXR5UHJvb2Y6XG4gICAgY2FzZSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5WZXJpZnlSYW5nZVByb29mOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGN1c3RvbSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uSW5zdHJ1Y3Rpb25bXX0gaW5zdHJ1Y3Rpb25zIC0gY29udGFpbmluZyBjdXN0b20gc29sYW5hIGluc3RydWN0aW9uc1xuICogQHBhcmFtIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBpbnN0cnVjdGlvbk1ldGFkYXRhIC0gdGhlIGluc3RydWN0aW9uIG1ldGFkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAqIEByZXR1cm5zIHtJbnN0cnVjdGlvblBhcmFtc1tdfSBBbiBhcnJheSBjb250YWluaW5nIGluc3RydWN0aW9uIHBhcmFtcyBmb3IgY3VzdG9tIGluc3RydWN0aW9uc1xuICovXG5mdW5jdGlvbiBwYXJzZUN1c3RvbUluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdXG4pOiBDdXN0b21JbnN0cnVjdGlvbltdIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBDdXN0b21JbnN0cnVjdGlvbltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uc1tpXTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbWV0YWRhdGEgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gcG9zaXRpb25cbiAgICBpZiAoXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldICYmXG4gICAgICBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLkN1c3RvbUluc3RydWN0aW9uXG4gICAgKSB7XG4gICAgICBpbnN0cnVjdGlvbkRhdGEucHVzaChpbnN0cnVjdGlvbk1ldGFkYXRhW2ldIGFzIEN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udmVydCB0aGUgcmF3IGluc3RydWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uIGZvcm1hdFxuICAgICAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb246IEN1c3RvbUluc3RydWN0aW9uID0ge1xuICAgICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbixcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGluc3RydWN0aW9uRGF0YS5wdXNoKGN1c3RvbUluc3RydWN0aW9uKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdHJ1Y3Rpb25EYXRhO1xufVxuXG4vKipcbiAqIFBhcnNlcyBTb2xhbmEgaW5zdHJ1Y3Rpb25zIHRvIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gKlxuICogSXRlcmF0ZXMgcmF3IGluc3RydWN0aW9ucyBpbiBvcmRlciwgY2hlY2tpbmcgbWV0YWRhdGEgYXQgZWFjaCBwb3NpdGlvbjpcbiAqIC0gQ1QgaW5zdHJ1Y3Rpb24gbWV0YWRhdGEgaXMgcHJlc2VydmVkIGFzLWlzIChDVCBpbnN0cnVjdGlvbnMgY2Fubm90IGJlXG4gKiAgIGRlY29kZWQgYnkgQHNvbGFuYS9zcGwtdG9rZW4gb3IgQHNvbGFuYS93ZWIzLmpzKS5cbiAqIC0gQ3VzdG9tSW5zdHJ1Y3Rpb24gbWV0YWRhdGEgaXMgcHJlc2VydmVkIGFzLWlzLlxuICogLSBBbGwgb3RoZXIgaW5zdHJ1Y3Rpb25zIGZhbGwgYmFjayB0byBDdXN0b21JbnN0cnVjdGlvbiBmb3JtYXQgd2l0aCByYXdcbiAqICAgcHJvZ3JhbUlkL2tleXMvZGF0YS5cbiAqXG4gKiBUaGlzIHNpbmdsZS1wYXNzIGFwcHJvYWNoIHByZXNlcnZlcyBvcmlnaW5hbCBpbnN0cnVjdGlvbiBvcmRlciBzbyB0aGF0XG4gKiByb3VuZC10cmlwIHJlY29uc3RydWN0aW9uIGlzIGZhaXRoZnVsLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb25JbnN0cnVjdGlvbltdfSBpbnN0cnVjdGlvbnMgLSBjb250YWluaW5nIENUIHNvbGFuYSBpbnN0cnVjdGlvbnNcbiAqIEBwYXJhbSB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gaW5zdHJ1Y3Rpb25NZXRhZGF0YSAtIHRoZSBpbnN0cnVjdGlvbiBtZXRhZGF0YSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7SW5zdHJ1Y3Rpb25QYXJhbXNbXX0gQW4gYXJyYXkgY29udGFpbmluZyBpbnN0cnVjdGlvbiBwYXJhbXMgaW4gb3JpZ2luYWwgb3JkZXJcbiAqL1xuZnVuY3Rpb24gcGFyc2VDb25maWRlbnRpYWxUcmFuc2Zlckluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBUcmFuc2FjdGlvbkluc3RydWN0aW9uW10sXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdXG4pOiBJbnN0cnVjdGlvblBhcmFtc1tdIHtcbiAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhOiBJbnN0cnVjdGlvblBhcmFtc1tdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uc1tpXTtcblxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbWV0YWRhdGEgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24gcG9zaXRpb25cbiAgICBpZiAoaW5zdHJ1Y3Rpb25NZXRhZGF0YSAmJiBpbnN0cnVjdGlvbk1ldGFkYXRhW2ldKSB7XG4gICAgICBjb25zdCBtZXRhVHlwZSA9IGluc3RydWN0aW9uTWV0YWRhdGFbaV0udHlwZTtcbiAgICAgIC8vIFByZXNlcnZlIGNvbmZpZGVudGlhbCB0cmFuc2ZlciBhbmQgY3VzdG9tIGluc3RydWN0aW9uIG1ldGFkYXRhIGFzLWlzXG4gICAgICBpZiAoaXNDb25maWRlbnRpYWxUcmFuc2Zlckluc3RydWN0aW9uKG1ldGFUeXBlKSB8fCBtZXRhVHlwZSA9PT0gSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3VzdG9tSW5zdHJ1Y3Rpb24pIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goaW5zdHJ1Y3Rpb25NZXRhZGF0YVtpXSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnZlcnQgdGhlIHJhdyBpbnN0cnVjdGlvbiB0byBDdXN0b21JbnN0cnVjdGlvbiBmb3JtYXRcbiAgICBjb25zdCBjdXN0b21JbnN0cnVjdGlvbjogQ3VzdG9tSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICB0eXBlOiBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DdXN0b21JbnN0cnVjdGlvbixcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBwcm9ncmFtSWQ6IGluc3RydWN0aW9uLnByb2dyYW1JZC50b1N0cmluZygpLFxuICAgICAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgICAgIHB1YmtleToga2V5LnB1YmtleS50b1N0cmluZygpLFxuICAgICAgICAgIGlzU2lnbmVyOiBrZXkuaXNTaWduZXIsXG4gICAgICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgICAgIH0pKSxcbiAgICAgICAgZGF0YTogaW5zdHJ1Y3Rpb24uZGF0YS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICB9LFxuICAgIH07XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLnB1c2goY3VzdG9tSW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIGluc3RydWN0aW9uRGF0YTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUb2tlbk5hbWUoXG4gIG1pbnRBZGRyZXNzOiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdLFxuICBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lPzogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgbGV0IHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29pbnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNvbENvaW4gJiYgdmFsdWUudG9rZW5BZGRyZXNzID09PSBtaW50QWRkcmVzcykge1xuICAgICAgdG9rZW4gPSB2YWx1ZS5uYW1lO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCF0b2tlbiAmJiBpbnN0cnVjdGlvbk1ldGFkYXRhKSB7XG4gICAgaW5zdHJ1Y3Rpb25NZXRhZGF0YS5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5DcmVhdGVBc3NvY2lhdGVkVG9rZW5BY2NvdW50ICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5taW50QWRkcmVzcyA9PT0gbWludEFkZHJlc3NcbiAgICAgICkge1xuICAgICAgICB0b2tlbiA9IGluc3RydWN0aW9uLnBhcmFtcy50b2tlbk5hbWU7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpbnN0cnVjdGlvbi50eXBlID09PSBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcy5Ub2tlblRyYW5zZmVyICYmXG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy50b2tlbkFkZHJlc3MgPT09IG1pbnRBZGRyZXNzXG4gICAgICApIHtcbiAgICAgICAgdG9rZW4gPSBpbnN0cnVjdGlvbi5wYXJhbXMudG9rZW5OYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCF0b2tlbiAmJiBfdXNlVG9rZW5BZGRyZXNzVG9rZW5OYW1lKSB7XG4gICAgdG9rZW4gPSBtaW50QWRkcmVzcztcbiAgfVxuXG4gIGFzc2VydCh0b2tlbik7XG5cbiAgcmV0dXJuIHRva2VuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFRyYW5zZmVySG9va0FjY291bnRzKFxuICBmcm9tQWRkcmVzczogc3RyaW5nLFxuICB0b0FkZHJlc3M6IHN0cmluZyxcbiAgdG9rZW5BZGRyZXNzOiBzdHJpbmcsXG4gIGluc3RydWN0aW9uTWV0YWRhdGE/OiBJbnN0cnVjdGlvblBhcmFtc1tdXG4pOiBFeHRyYUFjY291bnRNZXRhW10gfCB1bmRlZmluZWQge1xuICBsZXQgdHJhbnNmZXJIb29rQWNjb3VudHM6IEV4dHJhQWNjb3VudE1ldGFbXSB8IHVuZGVmaW5lZDtcblxuICBpbnN0cnVjdGlvbk1ldGFkYXRhPy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGlmIChcbiAgICAgIGluc3RydWN0aW9uLnR5cGUgPT09IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlRva2VuVHJhbnNmZXIgJiZcbiAgICAgIGluc3RydWN0aW9uLnBhcmFtcy50b2tlbkFkZHJlc3MgPT09IHRva2VuQWRkcmVzcyAmJlxuICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLmZyb21BZGRyZXNzID09PSBmcm9tQWRkcmVzcyAmJlxuICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnRvQWRkcmVzcyA9PT0gdG9BZGRyZXNzXG4gICAgKSB7XG4gICAgICB0cmFuc2Zlckhvb2tBY2NvdW50cyA9IGluc3RydWN0aW9uLnBhcmFtcy50cmFuc2Zlckhvb2tBY2NvdW50cztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0cmFuc2Zlckhvb2tBY2NvdW50cztcbn1cbiJdfQ==