@bitgo-beta/sdk-coin-sol 7.6.4-beta.79 → 7.6.4-beta.790

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 (544) 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 +136 -0
  12. package/dist/cjs/src/lib/confidentialTransferBuilder.d.ts.map +1 -0
  13. package/dist/cjs/src/lib/confidentialTransferBuilder.js +375 -0
  14. package/dist/{src → cjs/src}/lib/constants.d.ts +97 -2
  15. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  16. package/dist/cjs/src/lib/constants.js +277 -0
  17. package/dist/{src → cjs/src}/lib/customInstructionBuilder.d.ts +13 -2
  18. package/dist/cjs/src/lib/customInstructionBuilder.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/customInstructionBuilder.js +392 -0
  20. package/dist/cjs/src/lib/explainTransactionWasm.d.ts +21 -0
  21. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  22. package/dist/cjs/src/lib/explainTransactionWasm.js +304 -0
  23. package/dist/cjs/src/lib/iface.d.ts +549 -0
  24. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/iface.js +7 -0
  26. package/dist/{src → cjs/src}/lib/index.d.ts +9 -0
  27. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  28. package/dist/cjs/src/lib/index.js +106 -0
  29. package/dist/{src → cjs/src}/lib/instructionParamsFactory.d.ts +3 -1
  30. package/dist/cjs/src/lib/instructionParamsFactory.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/instructionParamsFactory.js +1284 -0
  32. package/dist/cjs/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/jitoStakePoolOperations.js +200 -0
  34. package/dist/{src → cjs/src}/lib/keyPair.d.ts +6 -0
  35. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  36. package/dist/cjs/src/lib/keyPair.js +112 -0
  37. package/dist/cjs/src/lib/messages/index.d.ts.map +1 -0
  38. package/dist/{src → cjs/src}/lib/messages/index.js +1 -1
  39. package/dist/cjs/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  40. package/dist/cjs/src/lib/messages/messageBuilderFactory.js +19 -0
  41. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts +25 -0
  42. package/dist/cjs/src/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  43. package/dist/cjs/src/lib/recoverNestedAtaBuilder.js +90 -0
  44. package/dist/cjs/src/lib/scaledUiAmount.d.ts +30 -0
  45. package/dist/cjs/src/lib/scaledUiAmount.d.ts.map +1 -0
  46. package/dist/cjs/src/lib/scaledUiAmount.js +112 -0
  47. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts +21 -0
  48. package/dist/cjs/src/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  49. package/dist/cjs/src/lib/serialization/codecs/v1/config.js +34 -0
  50. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  51. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/serialization/codecs/v1/instruction.js +32 -0
  53. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts +27 -0
  54. package/dist/cjs/src/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  55. package/dist/cjs/src/lib/serialization/codecs/v1/message.js +196 -0
  56. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts +36 -0
  57. package/dist/cjs/src/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  58. package/dist/cjs/src/lib/serialization/compileTransactionMessage.js +211 -0
  59. package/dist/cjs/src/lib/serialization/index.d.ts +5 -0
  60. package/dist/cjs/src/lib/serialization/index.d.ts.map +1 -0
  61. package/dist/cjs/src/lib/serialization/index.js +27 -0
  62. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts +9 -0
  63. package/dist/cjs/src/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/serialization/parseWireTransaction.js +58 -0
  65. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts +14 -0
  66. package/dist/cjs/src/lib/serialization/wire-transaction.d.ts.map +1 -0
  67. package/dist/cjs/src/lib/serialization/wire-transaction.js +51 -0
  68. package/dist/{src → cjs/src}/lib/solInstructionFactory.d.ts +1 -1
  69. package/dist/cjs/src/lib/solInstructionFactory.d.ts.map +1 -0
  70. package/dist/cjs/src/lib/solInstructionFactory.js +1129 -0
  71. package/dist/cjs/src/lib/stakingActivateBuilder.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/stakingActivateBuilder.js +129 -0
  73. package/dist/cjs/src/lib/stakingAuthorizeBuilder.d.ts.map +1 -0
  74. package/dist/cjs/src/lib/stakingAuthorizeBuilder.js +89 -0
  75. package/dist/cjs/src/lib/stakingDeactivateBuilder.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/stakingDeactivateBuilder.js +214 -0
  77. package/dist/cjs/src/lib/stakingDelegateBuilder.d.ts.map +1 -0
  78. package/dist/cjs/src/lib/stakingDelegateBuilder.js +126 -0
  79. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  80. package/dist/cjs/src/lib/stakingRawMsgAuthorizeBuilder.js +110 -0
  81. package/dist/cjs/src/lib/stakingWithdrawBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/lib/stakingWithdrawBuilder.js +87 -0
  83. package/dist/cjs/src/lib/token2022Resolve.d.ts +106 -0
  84. package/dist/cjs/src/lib/token2022Resolve.d.ts.map +1 -0
  85. package/dist/cjs/src/lib/token2022Resolve.js +199 -0
  86. package/dist/cjs/src/lib/tokenExtensions.d.ts +26 -0
  87. package/dist/cjs/src/lib/tokenExtensions.d.ts.map +1 -0
  88. package/dist/cjs/src/lib/tokenExtensions.js +109 -0
  89. package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +27 -1
  90. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  91. package/dist/cjs/src/lib/tokenTransferBuilder.js +237 -0
  92. package/dist/{src → cjs/src}/lib/transaction.d.ts +46 -1
  93. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  94. package/dist/cjs/src/lib/transaction.js +761 -0
  95. package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +42 -1
  96. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  97. package/dist/cjs/src/lib/transactionBuilder.js +462 -0
  98. package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +37 -0
  99. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  100. package/dist/cjs/src/lib/transactionBuilderFactory.js +249 -0
  101. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  102. package/dist/cjs/src/lib/transferBuilder.js +81 -0
  103. package/dist/cjs/src/lib/transferBuilderV2.d.ts +69 -0
  104. package/dist/cjs/src/lib/transferBuilderV2.d.ts.map +1 -0
  105. package/dist/cjs/src/lib/transferBuilderV2.js +252 -0
  106. package/dist/{src → cjs/src}/lib/utils.d.ts +16 -0
  107. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  108. package/dist/cjs/src/lib/utils.js +681 -0
  109. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts +29 -0
  110. package/dist/cjs/src/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  111. package/dist/cjs/src/lib/v1CustomInstructionBuilder.js +36 -0
  112. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts +36 -0
  113. package/dist/cjs/src/lib/v1PaymentBuilder.d.ts.map +1 -0
  114. package/dist/cjs/src/lib/v1PaymentBuilder.js +70 -0
  115. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts +253 -0
  116. package/dist/cjs/src/lib/v1TransactionBuilder.d.ts.map +1 -0
  117. package/dist/cjs/src/lib/v1TransactionBuilder.js +601 -0
  118. package/dist/cjs/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  119. package/dist/cjs/src/lib/walletInitializationBuilder.js +71 -0
  120. package/dist/cjs/src/register.d.ts +5 -0
  121. package/dist/cjs/src/register.d.ts.map +1 -0
  122. package/dist/cjs/src/register.js +29 -0
  123. package/dist/{src → cjs/src}/sol.d.ts +114 -3
  124. package/dist/cjs/src/sol.d.ts.map +1 -0
  125. package/dist/cjs/src/sol.js +1707 -0
  126. package/dist/{src → cjs/src}/solToken.d.ts +7 -0
  127. package/dist/cjs/src/solToken.d.ts.map +1 -0
  128. package/dist/cjs/src/solToken.js +79 -0
  129. package/dist/cjs/src/tsol.d.ts.map +1 -0
  130. package/dist/cjs/src/tsol.js +24 -0
  131. package/dist/{test → cjs/test}/fixtures/sol.d.ts.map +1 -1
  132. package/dist/cjs/test/fixtures/sol.js +1433 -0
  133. package/dist/{test → cjs/test}/resources/sol.d.ts +29 -29
  134. package/dist/cjs/test/resources/sol.d.ts.map +1 -0
  135. package/dist/cjs/test/resources/sol.js +320 -0
  136. package/dist/cjs/test/unit/ctEnablementVerify.d.ts +2 -0
  137. package/dist/cjs/test/unit/ctEnablementVerify.d.ts.map +1 -0
  138. package/dist/cjs/test/unit/ctEnablementVerify.js +142 -0
  139. package/dist/cjs/test/unit/explainTransactionWasm.d.ts +5 -0
  140. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  141. package/dist/cjs/test/unit/explainTransactionWasm.js +66 -0
  142. package/dist/cjs/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  143. package/dist/cjs/test/unit/fixtures/solBackupKey.js +8 -0
  144. package/dist/cjs/test/unit/getBuilderFactory.d.ts.map +1 -0
  145. package/dist/cjs/test/unit/getBuilderFactory.js +10 -0
  146. package/dist/cjs/test/unit/instructionParamsFactory.d.ts.map +1 -0
  147. package/dist/cjs/test/unit/instructionParamsFactory.js +425 -0
  148. package/dist/cjs/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  149. package/dist/cjs/test/unit/instructionParamsFactory.staking.js +1059 -0
  150. package/dist/cjs/test/unit/jitoWasmVerification.d.ts +2 -0
  151. package/dist/cjs/test/unit/jitoWasmVerification.d.ts.map +1 -0
  152. package/dist/cjs/test/unit/jitoWasmVerification.js +78 -0
  153. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  154. package/dist/cjs/test/unit/keyPair.js +177 -0
  155. package/dist/cjs/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  156. package/dist/cjs/test/unit/messages/messageBuilderFactory.js +118 -0
  157. package/dist/cjs/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  158. package/dist/cjs/test/unit/messages/simpleMessageBuilder.js +194 -0
  159. package/dist/cjs/test/unit/register.d.ts +2 -0
  160. package/dist/cjs/test/unit/register.d.ts.map +1 -0
  161. package/dist/cjs/test/unit/register.js +65 -0
  162. package/dist/cjs/test/unit/scaledUiAmount.d.ts +2 -0
  163. package/dist/cjs/test/unit/scaledUiAmount.d.ts.map +1 -0
  164. package/dist/cjs/test/unit/scaledUiAmount.js +101 -0
  165. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts +2 -0
  166. package/dist/cjs/test/unit/serialization/decodeV1Message.d.ts.map +1 -0
  167. package/dist/cjs/test/unit/serialization/decodeV1Message.js +63 -0
  168. package/dist/cjs/test/unit/serialization/exportV1.d.ts +2 -0
  169. package/dist/cjs/test/unit/serialization/exportV1.d.ts.map +1 -0
  170. package/dist/cjs/test/unit/serialization/exportV1.js +21 -0
  171. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts +2 -0
  172. package/dist/cjs/test/unit/serialization/parseWireTransaction.d.ts.map +1 -0
  173. package/dist/cjs/test/unit/serialization/parseWireTransaction.js +90 -0
  174. package/dist/cjs/test/unit/serialization/transactionV1.d.ts +2 -0
  175. package/dist/cjs/test/unit/serialization/transactionV1.d.ts.map +1 -0
  176. package/dist/cjs/test/unit/serialization/transactionV1.js +136 -0
  177. package/dist/{test → cjs/test}/unit/sol.d.ts.map +1 -1
  178. package/dist/cjs/test/unit/sol.js +5364 -0
  179. package/dist/cjs/test/unit/solInstructionFactory.d.ts.map +1 -0
  180. package/dist/cjs/test/unit/solInstructionFactory.js +623 -0
  181. package/dist/cjs/test/unit/solIntentVersion.d.ts +2 -0
  182. package/dist/cjs/test/unit/solIntentVersion.d.ts.map +1 -0
  183. package/dist/cjs/test/unit/solIntentVersion.js +59 -0
  184. package/dist/cjs/test/unit/solSafeRecovery.d.ts +2 -0
  185. package/dist/cjs/test/unit/solSafeRecovery.d.ts.map +1 -0
  186. package/dist/cjs/test/unit/solSafeRecovery.js +202 -0
  187. package/dist/cjs/test/unit/solToken.d.ts.map +1 -0
  188. package/dist/cjs/test/unit/solToken.js +37 -0
  189. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  190. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  192. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  193. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  194. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  195. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  196. package/dist/cjs/test/unit/transaction.js +1129 -0
  197. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  198. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  199. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  201. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  204. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  207. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts +2 -0
  208. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.js +123 -0
  210. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  211. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +955 -0
  213. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  214. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +193 -0
  216. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  217. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  218. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +167 -0
  219. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  220. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  221. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  222. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  223. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  224. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  225. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  226. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  227. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  228. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  229. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  230. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  231. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  232. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  233. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  234. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  235. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  236. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  237. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  239. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  240. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  242. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  243. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  244. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  245. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  246. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  247. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  248. package/dist/cjs/test/unit/utils.js +663 -0
  249. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  250. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  251. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  252. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  253. package/dist/esm/index.d.ts +7 -0
  254. package/dist/esm/index.js +7 -0
  255. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  256. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  257. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  258. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  259. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  260. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  261. package/dist/esm/lib/confidentialTransferBuilder.d.ts +136 -0
  262. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  263. package/dist/esm/lib/confidentialTransferBuilder.js +368 -0
  264. package/dist/esm/lib/constants.d.ts +235 -0
  265. package/dist/esm/lib/constants.d.ts.map +1 -0
  266. package/dist/esm/lib/constants.js +274 -0
  267. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  268. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  269. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  270. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  271. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  272. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  273. package/dist/esm/lib/iface.d.ts +549 -0
  274. package/dist/esm/lib/iface.d.ts.map +1 -0
  275. package/dist/esm/lib/iface.js +3 -0
  276. package/dist/esm/lib/index.d.ts +31 -0
  277. package/dist/esm/lib/index.d.ts.map +1 -0
  278. package/dist/esm/lib/index.js +31 -0
  279. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  280. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  281. package/dist/esm/lib/instructionParamsFactory.js +1276 -0
  282. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  283. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  284. package/dist/esm/lib/keyPair.d.ts +32 -0
  285. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  286. package/dist/esm/lib/keyPair.js +75 -0
  287. package/dist/esm/lib/messages/index.d.ts +2 -0
  288. package/dist/esm/lib/messages/index.js +2 -0
  289. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  290. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  291. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  292. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  293. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  294. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  295. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  296. package/dist/esm/lib/scaledUiAmount.js +108 -0
  297. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  298. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  300. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  301. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  303. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  304. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  306. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  307. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  308. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  309. package/dist/esm/lib/serialization/index.d.ts +5 -0
  310. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  311. package/dist/esm/lib/serialization/index.js +5 -0
  312. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  313. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  314. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  315. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  316. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  317. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  318. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  319. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  320. package/dist/esm/lib/solInstructionFactory.js +1123 -0
  321. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  322. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  323. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  324. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  325. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  326. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  327. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  328. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  329. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  330. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  331. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  332. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  333. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  334. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  335. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  336. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  337. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  338. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  339. package/dist/esm/lib/token2022Resolve.js +194 -0
  340. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  341. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  342. package/dist/esm/lib/tokenExtensions.js +103 -0
  343. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  344. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  345. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  346. package/dist/esm/lib/transaction.d.ts +148 -0
  347. package/dist/esm/lib/transaction.d.ts.map +1 -0
  348. package/dist/esm/lib/transaction.js +754 -0
  349. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  350. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  351. package/dist/esm/lib/transactionBuilder.js +455 -0
  352. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  353. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  354. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  355. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  356. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  357. package/dist/esm/lib/transferBuilder.js +74 -0
  358. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  359. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  360. package/dist/esm/lib/transferBuilderV2.js +245 -0
  361. package/dist/esm/lib/utils.d.ts +216 -0
  362. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  363. package/dist/esm/lib/utils.js +642 -0
  364. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +29 -0
  365. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  366. package/dist/esm/lib/v1CustomInstructionBuilder.js +32 -0
  367. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  368. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  369. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  370. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  371. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  372. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  373. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  374. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  375. package/dist/esm/register.d.ts +5 -0
  376. package/dist/esm/register.d.ts.map +1 -0
  377. package/dist/esm/register.js +24 -0
  378. package/dist/esm/sol.d.ts +351 -0
  379. package/dist/esm/sol.d.ts.map +1 -0
  380. package/dist/esm/sol.js +1666 -0
  381. package/dist/esm/solToken.d.ts +44 -0
  382. package/dist/esm/solToken.d.ts.map +1 -0
  383. package/dist/esm/solToken.js +75 -0
  384. package/dist/esm/tsol.d.ts +11 -0
  385. package/dist/esm/tsol.js +20 -0
  386. package/package.json +37 -17
  387. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  388. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  389. package/dist/src/config/token2022StaticConfig.js +0 -50
  390. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  391. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  392. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  393. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  394. package/dist/src/lib/closeAtaBuilder.js +0 -69
  395. package/dist/src/lib/constants.d.ts.map +0 -1
  396. package/dist/src/lib/constants.js +0 -171
  397. package/dist/src/lib/customInstructionBuilder.js +0 -289
  398. package/dist/src/lib/iface.d.ts +0 -244
  399. package/dist/src/lib/iface.d.ts.map +0 -1
  400. package/dist/src/lib/iface.js +0 -7
  401. package/dist/src/lib/index.d.ts.map +0 -1
  402. package/dist/src/lib/index.js +0 -77
  403. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  404. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  405. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  406. package/dist/src/lib/keyPair.d.ts.map +0 -1
  407. package/dist/src/lib/keyPair.js +0 -63
  408. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  409. package/dist/src/lib/solInstructionFactory.js +0 -572
  410. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  411. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  412. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  413. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  414. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  415. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  416. package/dist/src/lib/token2022Config.d.ts +0 -44
  417. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  418. package/dist/src/lib/token2022Config.js +0 -27
  419. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  420. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  421. package/dist/src/lib/transaction.d.ts.map +0 -1
  422. package/dist/src/lib/transaction.js +0 -595
  423. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  424. package/dist/src/lib/transactionBuilder.js +0 -380
  425. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  426. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  427. package/dist/src/lib/transferBuilder.js +0 -70
  428. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  429. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  430. package/dist/src/lib/transferBuilderV2.js +0 -210
  431. package/dist/src/lib/utils.js +0 -589
  432. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  433. package/dist/src/register.d.ts +0 -3
  434. package/dist/src/register.d.ts.map +0 -1
  435. package/dist/src/register.js +0 -15
  436. package/dist/src/sol.d.ts.map +0 -1
  437. package/dist/src/sol.js +0 -1324
  438. package/dist/src/solToken.d.ts.map +0 -1
  439. package/dist/src/solToken.js +0 -69
  440. package/dist/src/tsol.js +0 -24
  441. package/dist/test/fixtures/sol.js +0 -1433
  442. package/dist/test/resources/sol.d.ts.map +0 -1
  443. package/dist/test/resources/sol.js +0 -320
  444. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  445. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  446. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  447. package/dist/test/unit/getBuilderFactory.js +0 -10
  448. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  449. package/dist/test/unit/instructionParamsFactory.js +0 -412
  450. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  451. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  452. package/dist/test/unit/keyPair.js +0 -177
  453. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  454. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  455. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  456. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  457. package/dist/test/unit/sol.js +0 -3180
  458. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  459. package/dist/test/unit/solInstructionFactory.js +0 -454
  460. package/dist/test/unit/solToken.d.ts.map +0 -1
  461. package/dist/test/unit/solToken.js +0 -31
  462. package/dist/test/unit/transaction.d.ts.map +0 -1
  463. package/dist/test/unit/transaction.js +0 -983
  464. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  465. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  466. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  467. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  468. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  469. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  470. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  471. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  472. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  473. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  474. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  475. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  476. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  477. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  478. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  479. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  480. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  481. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  482. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  483. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  484. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  485. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  486. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  487. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  488. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  489. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  490. package/dist/test/unit/utils.js +0 -517
  491. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  492. package/dist/test/unit/versionedTransaction.js +0 -207
  493. package/dist/tsconfig.tsbuildinfo +0 -1
  494. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  496. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  497. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  498. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  499. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  500. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  501. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  502. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  503. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  504. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  505. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  506. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  507. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  523. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  524. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  525. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  526. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  527. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  528. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  529. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  530. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  531. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  532. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  533. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  534. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  535. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  536. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  537. /package/dist/{src → esm}/index.d.ts.map +0 -0
  538. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  539. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  540. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  541. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  542. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  543. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  544. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,955 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const src_1 = require("../../../src");
40
+ const should_1 = __importDefault(require("should"));
41
+ const testData = __importStar(require("../../resources/sol"));
42
+ const getBuilderFactory_1 = require("../getBuilderFactory");
43
+ describe('Solana Confidential Transfer Builder', () => {
44
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('sol');
45
+ const account = new src_1.KeyPair(testData.associatedTokenAccounts.accounts[0]).getKeys();
46
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
47
+ // Test addresses (Token-2022 mint + ATAs)
48
+ const mintAddress = testData.associatedTokenAccountsForSol2022.mintId;
49
+ const tokenAddress = testData.associatedTokenAccountsForSol2022.accounts[0].ata;
50
+ const destinationTokenAddress = 'ENn8a2tGMS9bR5XV7smGHJvNgzkyxJmnD2eUvQxY5jSP';
51
+ const authorityAddress = account.pub;
52
+ // Valid base58 addresses for context state accounts (any valid Solana pubkey)
53
+ const eqCtxAddress = testData.associatedTokenAccounts.accounts[0].ata;
54
+ const validityCtxAddress = testData.associatedTokenAccounts.accounts[0].pub;
55
+ const rangeCtxAddress = testData.nonceAccount.pub;
56
+ // Hex test data
57
+ const zeroBytes36 = '00'.repeat(36);
58
+ const zeroBytes64 = '00'.repeat(64);
59
+ const proofDataHex = '00'.repeat(320); // typical equality proof size
60
+ const ctBuilder = () => {
61
+ const txBuilder = factory.getConfidentialTransferBuilder();
62
+ txBuilder.nonce(recentBlockHash);
63
+ txBuilder.sender(account.pub);
64
+ return txBuilder;
65
+ };
66
+ /** Access the raw Solana Transaction from the built tx */
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ const solTx = (tx) => tx.solTransaction;
69
+ describe('ConfigureAccount', () => {
70
+ it('should build a configure account instruction with the 47-byte Token-2022 layout', async () => {
71
+ const builder = ctBuilder();
72
+ builder.configureAccount({
73
+ tokenAddress,
74
+ mintAddress,
75
+ authorityAddress,
76
+ decryptableZeroBalance: zeroBytes36,
77
+ maximumPendingBalanceCreditCounter: '65536',
78
+ proofInstructionOffset: 1,
79
+ });
80
+ const tx = await builder.build();
81
+ const instructions = tx.toJson().instructionsData;
82
+ instructions.should.have.length(1);
83
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
84
+ // Verify raw instruction data
85
+ const rawInstructions = solTx(tx).instructions;
86
+ rawInstructions.should.have.length(1);
87
+ const data = rawInstructions[0].data;
88
+ // Token-2022 ConfigureAccount carries no ElGamal pubkey: the key travels in the
89
+ // VerifyPubkeyValidity proof instruction's context. Layout is
90
+ // [27][2] + decryptable_zero_balance(36) + maximum_pending_balance_credit_counter(u64) + proof_instruction_offset(i8).
91
+ data.length.should.equal(47);
92
+ data[0].should.equal(27); // ConfidentialTransferExtension
93
+ data[1].should.equal(2); // ConfigureAccount
94
+ data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // decryptable_zero_balance
95
+ data.readBigUInt64LE(38).toString().should.equal('65536'); // max pending balance credit counter
96
+ data[46].should.equal(1); // proof_instruction_offset
97
+ // Verify accounts
98
+ const keys = rawInstructions[0].keys;
99
+ keys.should.have.length(4);
100
+ keys[0].pubkey.toString().should.equal(tokenAddress);
101
+ keys[0].isWritable.should.be.true();
102
+ keys[1].pubkey.toString().should.equal(mintAddress);
103
+ keys[1].isWritable.should.be.false();
104
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111'); // instructions sysvar
105
+ keys[3].pubkey.toString().should.equal(authorityAddress);
106
+ keys[3].isSigner.should.be.true();
107
+ });
108
+ it('should use context state address when provided', async () => {
109
+ const contextStateAddress = testData.associatedTokenAccounts.accounts[0].pub;
110
+ const builder = ctBuilder();
111
+ builder.configureAccount({
112
+ tokenAddress,
113
+ mintAddress,
114
+ authorityAddress,
115
+ instructionsSysvarOrContextStateAddress: contextStateAddress,
116
+ decryptableZeroBalance: zeroBytes36,
117
+ maximumPendingBalanceCreditCounter: '65536',
118
+ proofInstructionOffset: 0,
119
+ });
120
+ const tx = await builder.build();
121
+ const keys = solTx(tx).instructions[0].keys;
122
+ keys[2].pubkey.toString().should.equal(contextStateAddress);
123
+ const data = solTx(tx).instructions[0].data;
124
+ data[46].should.equal(0); // proof_instruction_offset = 0 (context state)
125
+ });
126
+ });
127
+ describe('createAta reallocate extension list', () => {
128
+ const token2022ProgramId = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';
129
+ // Reallocate data: [29][extensionType(u16 LE), ...]. ExtensionType values follow the
130
+ // Token-2022 enum: ConfidentialTransferAccount = 5, ConfidentialTransferFeeAmount = 17.
131
+ const REALLOCATE = 29;
132
+ const CONFIDENTIAL_TRANSFER_ACCOUNT = 5;
133
+ const CONFIDENTIAL_TRANSFER_FEE_AMOUNT = 17;
134
+ it('should reallocate only ConfidentialTransferAccount for a mint without TransferFeeConfig', async () => {
135
+ const builder = ctBuilder();
136
+ builder.createAta({
137
+ mintAddress,
138
+ ataAddress: tokenAddress,
139
+ ownerAddress: authorityAddress,
140
+ payerAddress: account.pub,
141
+ tokenName: 'tsol:ray',
142
+ programId: token2022ProgramId,
143
+ });
144
+ const tx = await builder.build();
145
+ solTx(tx).instructions.should.have.length(2);
146
+ const data = solTx(tx).instructions[1].data;
147
+ data.length.should.equal(3);
148
+ data[0].should.equal(REALLOCATE);
149
+ data.readUInt16LE(1).should.equal(CONFIDENTIAL_TRANSFER_ACCOUNT);
150
+ });
151
+ it('should also reserve ConfidentialTransferFeeAmount when the mint has TransferFeeConfig', async () => {
152
+ const builder = ctBuilder();
153
+ builder.createAta({
154
+ mintAddress,
155
+ ataAddress: tokenAddress,
156
+ ownerAddress: authorityAddress,
157
+ payerAddress: account.pub,
158
+ tokenName: 'tsol:usdc',
159
+ programId: token2022ProgramId,
160
+ mintHasTransferFeeConfig: true,
161
+ });
162
+ const tx = await builder.build();
163
+ const data = solTx(tx).instructions[1].data;
164
+ data.length.should.equal(5);
165
+ data[0].should.equal(REALLOCATE);
166
+ data.readUInt16LE(1).should.equal(CONFIDENTIAL_TRANSFER_ACCOUNT);
167
+ data.readUInt16LE(3).should.equal(CONFIDENTIAL_TRANSFER_FEE_AMOUNT);
168
+ });
169
+ });
170
+ describe('ApplyPendingBalance', () => {
171
+ it('should build an apply pending balance instruction with correct 46-byte layout', async () => {
172
+ const builder = ctBuilder();
173
+ builder.applyPendingBalance({
174
+ tokenAddress,
175
+ authorityAddress,
176
+ expectedPendingBalanceCreditCounter: '3',
177
+ newDecryptableAvailableBalance: zeroBytes36,
178
+ });
179
+ const tx = await builder.build();
180
+ const instructions = tx.toJson().instructionsData;
181
+ instructions.should.have.length(1);
182
+ instructions[0].type.should.equal('ApplyPendingBalance');
183
+ const rawInstructions = solTx(tx).instructions;
184
+ rawInstructions.should.have.length(1);
185
+ const data = rawInstructions[0].data;
186
+ data.length.should.equal(46);
187
+ data[0].should.equal(27); // ConfidentialTransferExtension
188
+ data[1].should.equal(8); // ApplyPendingBalance
189
+ data.readBigUInt64LE(2).toString().should.equal('3'); // expected_pending_balance_credit_counter
190
+ data.slice(10, 46).toString('hex').should.equal(zeroBytes36); // new_decryptable_available_balance
191
+ // Verify accounts: [token(writable), authority(signer)]
192
+ const keys = rawInstructions[0].keys;
193
+ keys.should.have.length(2);
194
+ keys[0].pubkey.toString().should.equal(tokenAddress);
195
+ keys[0].isWritable.should.be.true();
196
+ keys[1].pubkey.toString().should.equal(authorityAddress);
197
+ keys[1].isSigner.should.be.true();
198
+ });
199
+ });
200
+ describe('Deposit', () => {
201
+ it('should build a deposit instruction with correct 11-byte layout', async () => {
202
+ const builder = ctBuilder();
203
+ builder.confidentialDeposit({
204
+ tokenAddress,
205
+ mintAddress,
206
+ authorityAddress,
207
+ amount: '1000000',
208
+ decimals: 6,
209
+ });
210
+ const tx = await builder.build();
211
+ const instructions = tx.toJson().instructionsData;
212
+ instructions.should.have.length(1);
213
+ instructions[0].type.should.equal('ConfidentialDeposit');
214
+ const rawInstructions = solTx(tx).instructions;
215
+ rawInstructions.should.have.length(1);
216
+ const data = rawInstructions[0].data;
217
+ data.length.should.equal(11);
218
+ data[0].should.equal(27); // ConfidentialTransferExtension
219
+ data[1].should.equal(5); // Deposit
220
+ data.readBigUInt64LE(2).toString().should.equal('1000000'); // amount
221
+ data[10].should.equal(6); // decimals
222
+ // Verify accounts: [token(writable), mint, authority(signer)]
223
+ const keys = rawInstructions[0].keys;
224
+ keys.should.have.length(3);
225
+ keys[0].pubkey.toString().should.equal(tokenAddress);
226
+ keys[0].isWritable.should.be.true();
227
+ keys[1].pubkey.toString().should.equal(mintAddress);
228
+ keys[2].pubkey.toString().should.equal(authorityAddress);
229
+ keys[2].isSigner.should.be.true();
230
+ });
231
+ });
232
+ describe('Withdraw', () => {
233
+ it('should build a withdraw instruction with correct 49-byte layout and inline proofs', async () => {
234
+ const builder = ctBuilder();
235
+ builder.confidentialWithdraw({
236
+ tokenAddress,
237
+ mintAddress,
238
+ authorityAddress,
239
+ amount: '500000',
240
+ decimals: 6,
241
+ newDecryptableAvailableBalance: zeroBytes36,
242
+ equalityProofInstructionOffset: 1,
243
+ rangeProofInstructionOffset: 2,
244
+ });
245
+ const tx = await builder.build();
246
+ const instructions = tx.toJson().instructionsData;
247
+ instructions.should.have.length(1);
248
+ instructions[0].type.should.equal('ConfidentialWithdraw');
249
+ const rawInstructions = solTx(tx).instructions;
250
+ rawInstructions.should.have.length(1);
251
+ const data = rawInstructions[0].data;
252
+ data.length.should.equal(49);
253
+ data[0].should.equal(27); // ConfidentialTransferExtension
254
+ data[1].should.equal(6); // Withdraw
255
+ data.readBigUInt64LE(2).toString().should.equal('500000'); // amount
256
+ data[10].should.equal(6); // decimals
257
+ data.slice(11, 47).toString('hex').should.equal(zeroBytes36); // new_decryptable
258
+ data[47].should.equal(1); // equality proof offset
259
+ data[48].should.equal(2); // range proof offset
260
+ // Verify accounts: [token(writable), mint, sysvar, authority(signer)]
261
+ const keys = rawInstructions[0].keys;
262
+ keys.should.have.length(4);
263
+ keys[0].pubkey.toString().should.equal(tokenAddress);
264
+ keys[0].isWritable.should.be.true();
265
+ keys[1].pubkey.toString().should.equal(mintAddress);
266
+ keys[2].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
267
+ keys[3].pubkey.toString().should.equal(authorityAddress);
268
+ keys[3].isSigner.should.be.true();
269
+ });
270
+ it('should build a withdraw instruction with context state accounts', async () => {
271
+ const builder = ctBuilder();
272
+ builder.confidentialWithdraw({
273
+ tokenAddress,
274
+ mintAddress,
275
+ authorityAddress,
276
+ equalityProofContextStateAddress: eqCtxAddress,
277
+ rangeProofContextStateAddress: rangeCtxAddress,
278
+ amount: '500000',
279
+ decimals: 6,
280
+ newDecryptableAvailableBalance: zeroBytes36,
281
+ equalityProofInstructionOffset: 0,
282
+ rangeProofInstructionOffset: 0,
283
+ });
284
+ const tx = await builder.build();
285
+ const keys = solTx(tx).instructions[0].keys;
286
+ // [token, mint, eqCtx, rgCtx, authority] — no sysvar since all proofs use context state
287
+ keys.should.have.length(5);
288
+ keys[2].pubkey.toString().should.equal(eqCtxAddress);
289
+ keys[3].pubkey.toString().should.equal(rangeCtxAddress);
290
+ keys[4].pubkey.toString().should.equal(authorityAddress);
291
+ keys[4].isSigner.should.be.true();
292
+ });
293
+ });
294
+ describe('ConfidentialTransfer', () => {
295
+ it('should build a transfer instruction with correct 169-byte layout and inline proofs', async () => {
296
+ const builder = ctBuilder();
297
+ builder.confidentialTransfer({
298
+ sourceTokenAddress: tokenAddress,
299
+ mintAddress,
300
+ destinationTokenAddress,
301
+ authorityAddress,
302
+ newSourceDecryptableAvailableBalance: zeroBytes36,
303
+ transferAmountAuditorCiphertextLo: zeroBytes64,
304
+ transferAmountAuditorCiphertextHi: zeroBytes64,
305
+ equalityProofInstructionOffset: 1,
306
+ ciphertextValidityProofInstructionOffset: 2,
307
+ rangeProofInstructionOffset: 3,
308
+ });
309
+ const tx = await builder.build();
310
+ const instructions = tx.toJson().instructionsData;
311
+ instructions.should.have.length(1);
312
+ instructions[0].type.should.equal('ConfidentialTransfer');
313
+ const rawInstructions = solTx(tx).instructions;
314
+ rawInstructions.should.have.length(1);
315
+ const data = rawInstructions[0].data;
316
+ data.length.should.equal(169);
317
+ data[0].should.equal(27); // ConfidentialTransferExtension
318
+ data[1].should.equal(7); // Transfer
319
+ data.slice(2, 38).toString('hex').should.equal(zeroBytes36); // new_source_decryptable
320
+ data.slice(38, 102).toString('hex').should.equal(zeroBytes64); // auditor_ct_lo
321
+ data.slice(102, 166).toString('hex').should.equal(zeroBytes64); // auditor_ct_hi
322
+ data[166].should.equal(1); // equality proof offset
323
+ data[167].should.equal(2); // validity proof offset
324
+ data[168].should.equal(3); // range proof offset
325
+ // Verify accounts: [source(writable), mint, dest(writable), sysvar, authority(signer)]
326
+ const keys = rawInstructions[0].keys;
327
+ keys.should.have.length(5);
328
+ keys[0].pubkey.toString().should.equal(tokenAddress);
329
+ keys[0].isWritable.should.be.true();
330
+ keys[1].pubkey.toString().should.equal(mintAddress);
331
+ keys[2].pubkey.toString().should.equal(destinationTokenAddress);
332
+ keys[2].isWritable.should.be.true();
333
+ keys[3].pubkey.toString().should.equal('Sysvar1nstructions1111111111111111111111111');
334
+ keys[4].pubkey.toString().should.equal(authorityAddress);
335
+ keys[4].isSigner.should.be.true();
336
+ });
337
+ it('should build a transfer instruction with context state accounts', async () => {
338
+ const builder = ctBuilder();
339
+ builder.confidentialTransfer({
340
+ sourceTokenAddress: tokenAddress,
341
+ mintAddress,
342
+ destinationTokenAddress,
343
+ authorityAddress,
344
+ equalityProofContextStateAddress: eqCtxAddress,
345
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
346
+ rangeProofContextStateAddress: rangeCtxAddress,
347
+ newSourceDecryptableAvailableBalance: zeroBytes36,
348
+ transferAmountAuditorCiphertextLo: zeroBytes64,
349
+ transferAmountAuditorCiphertextHi: zeroBytes64,
350
+ equalityProofInstructionOffset: 0,
351
+ ciphertextValidityProofInstructionOffset: 0,
352
+ rangeProofInstructionOffset: 0,
353
+ });
354
+ const tx = await builder.build();
355
+ const keys = solTx(tx).instructions[0].keys;
356
+ // [source, mint, dest, eqCtx, validityCtx, rangeCtx, authority] — no sysvar
357
+ keys.should.have.length(7);
358
+ keys[3].pubkey.toString().should.equal(eqCtxAddress);
359
+ keys[4].pubkey.toString().should.equal(validityCtxAddress);
360
+ keys[5].pubkey.toString().should.equal(rangeCtxAddress);
361
+ keys[6].pubkey.toString().should.equal(authorityAddress);
362
+ keys[6].isSigner.should.be.true();
363
+ });
364
+ });
365
+ describe('VerifyPubkeyValidity', () => {
366
+ it('should build a verify pubkey validity instruction with inline proof data', async () => {
367
+ const builder = ctBuilder();
368
+ builder.verifyPubkeyValidity({ proofData: proofDataHex });
369
+ const tx = await builder.build();
370
+ const rawInstructions = solTx(tx).instructions;
371
+ rawInstructions.should.have.length(1);
372
+ const data = rawInstructions[0].data;
373
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
374
+ data.length.should.equal(1 + 320); // discriminator + proof data
375
+ data.slice(1).toString('hex').should.equal(proofDataHex);
376
+ // No accounts for inline proof
377
+ rawInstructions[0].keys.should.have.length(0);
378
+ // Verify program id (canonical on-chain id)
379
+ rawInstructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
380
+ });
381
+ it('should build with context state account (fix #3)', async () => {
382
+ const builder = ctBuilder();
383
+ builder.verifyPubkeyValidity({
384
+ contextStateAccountAddress: eqCtxAddress,
385
+ contextStateAuthorityAddress: authorityAddress,
386
+ });
387
+ const tx = await builder.build();
388
+ const rawIx = solTx(tx).instructions[0];
389
+ const data = rawIx.data;
390
+ data[0].should.equal(4); // VerifyPubkeyValidity discriminator
391
+ // Context state accounts: [contextState(writable), authority]
392
+ rawIx.keys.should.have.length(2);
393
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
394
+ rawIx.keys[0].isWritable.should.be.true();
395
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
396
+ });
397
+ });
398
+ describe('VerifyEqualityProof', () => {
399
+ it('should build with inline proof data', async () => {
400
+ const builder = ctBuilder();
401
+ builder.verifyEqualityProof({ proofData: proofDataHex });
402
+ const tx = await builder.build();
403
+ const data = solTx(tx).instructions[0].data;
404
+ data[0].should.equal(3); // VerifyCiphertextCommitmentEquality discriminator
405
+ data.length.should.equal(1 + 320);
406
+ data.slice(1).toString('hex').should.equal(proofDataHex);
407
+ });
408
+ it('should build with context state offset', async () => {
409
+ const builder = ctBuilder();
410
+ builder.verifyEqualityProof({
411
+ contextStateAccountAddress: eqCtxAddress,
412
+ contextStateAuthorityAddress: authorityAddress,
413
+ offset: 0,
414
+ });
415
+ const tx = await builder.build();
416
+ const rawIx = solTx(tx).instructions[0];
417
+ const data = rawIx.data;
418
+ data[0].should.equal(3);
419
+ data.readUInt32LE(1).should.equal(0); // offset as u32
420
+ // Context state accounts: [contextState(writable), authority]
421
+ rawIx.keys.should.have.length(2);
422
+ rawIx.keys[0].pubkey.toString().should.equal(eqCtxAddress);
423
+ rawIx.keys[0].isWritable.should.be.true();
424
+ rawIx.keys[1].pubkey.toString().should.equal(authorityAddress);
425
+ });
426
+ });
427
+ describe('VerifyValidityProof', () => {
428
+ it('should build with inline proof data', async () => {
429
+ const builder = ctBuilder();
430
+ builder.verifyValidityProof({ proofData: proofDataHex });
431
+ const tx = await builder.build();
432
+ const data = solTx(tx).instructions[0].data;
433
+ data[0].should.equal(12); // VerifyBatchedGroupedCiphertext3HandlesValidity
434
+ data.length.should.equal(1 + 320);
435
+ });
436
+ });
437
+ describe('VerifyRangeProof', () => {
438
+ it('should build with inline proof data', async () => {
439
+ const builder = ctBuilder();
440
+ builder.verifyRangeProof({ proofData: '00'.repeat(1000) }); // range proof is ~1000 bytes
441
+ const tx = await builder.build();
442
+ const data = solTx(tx).instructions[0].data;
443
+ data[0].should.equal(7); // VerifyBatchedRangeProofU128
444
+ data.length.should.equal(1 + 1000);
445
+ });
446
+ });
447
+ describe('Multiple instructions (v1 tx simulation)', () => {
448
+ it('should build ApplyPendingBalance + 3 proofs + Transfer in correct order', async () => {
449
+ const builder = ctBuilder();
450
+ builder
451
+ .applyPendingBalance({
452
+ tokenAddress,
453
+ authorityAddress,
454
+ expectedPendingBalanceCreditCounter: '2',
455
+ newDecryptableAvailableBalance: zeroBytes36,
456
+ })
457
+ .verifyEqualityProof({ proofData: proofDataHex })
458
+ .verifyValidityProof({ proofData: proofDataHex })
459
+ .verifyRangeProof({ proofData: '00'.repeat(1000) })
460
+ .confidentialTransfer({
461
+ sourceTokenAddress: tokenAddress,
462
+ mintAddress,
463
+ destinationTokenAddress,
464
+ authorityAddress,
465
+ newSourceDecryptableAvailableBalance: zeroBytes36,
466
+ transferAmountAuditorCiphertextLo: zeroBytes64,
467
+ transferAmountAuditorCiphertextHi: zeroBytes64,
468
+ equalityProofInstructionOffset: 1,
469
+ ciphertextValidityProofInstructionOffset: 2,
470
+ rangeProofInstructionOffset: 3,
471
+ });
472
+ const tx = await builder.build();
473
+ const instructions = tx.toJson().instructionsData;
474
+ instructions.should.have.length(5);
475
+ instructions[0].type.should.equal('ApplyPendingBalance');
476
+ instructions[1].type.should.equal('VerifyEqualityProof');
477
+ instructions[2].type.should.equal('VerifyValidityProof');
478
+ instructions[3].type.should.equal('VerifyRangeProof');
479
+ instructions[4].type.should.equal('ConfidentialTransfer');
480
+ // Note: Cannot verify toBroadcastFormat() here because 3 proofs (320+320+1000 bytes)
481
+ // + transfer (169B) exceeds v0 tx size limit (1232B). These are v1 transactions (4132B).
482
+ // The instruction data layouts are verified individually in the tests above.
483
+ });
484
+ it('should build ConfigureAccount + VerifyPubkeyValidity', async () => {
485
+ const builder = ctBuilder();
486
+ builder
487
+ .configureAccount({
488
+ tokenAddress,
489
+ mintAddress,
490
+ authorityAddress,
491
+ decryptableZeroBalance: zeroBytes36,
492
+ maximumPendingBalanceCreditCounter: '65536',
493
+ proofInstructionOffset: 1,
494
+ })
495
+ .verifyPubkeyValidity({ proofData: proofDataHex });
496
+ const tx = await builder.build();
497
+ const instructions = tx.toJson().instructionsData;
498
+ instructions.should.have.length(2);
499
+ instructions[0].type.should.equal('ConfigureConfidentialTransferAccount');
500
+ instructions[1].type.should.equal('VerifyPubkeyValidity');
501
+ const rawTx = tx.toBroadcastFormat();
502
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
503
+ });
504
+ });
505
+ describe('Raw transaction validity', () => {
506
+ it('should produce a valid raw transaction', async () => {
507
+ const builder = ctBuilder();
508
+ builder.configureAccount({
509
+ tokenAddress,
510
+ mintAddress,
511
+ authorityAddress,
512
+ decryptableZeroBalance: zeroBytes36,
513
+ maximumPendingBalanceCreditCounter: '65536',
514
+ proofInstructionOffset: 1,
515
+ });
516
+ const tx = await builder.build();
517
+ const rawTx = tx.toBroadcastFormat();
518
+ src_1.Utils.isValidRawTransaction(rawTx).should.equal(true);
519
+ });
520
+ });
521
+ describe('Validation', () => {
522
+ it('should reject empty builder', async () => {
523
+ const builder = ctBuilder();
524
+ await builder.build().should.be.rejectedWith(/confidential transfer instruction/);
525
+ });
526
+ it('should reject missing tokenAddress on configureAccount', () => {
527
+ const builder = ctBuilder();
528
+ should_1.default.throws(() => builder.configureAccount({
529
+ tokenAddress: '',
530
+ mintAddress,
531
+ authorityAddress,
532
+ decryptableZeroBalance: zeroBytes36,
533
+ maximumPendingBalanceCreditCounter: '65536',
534
+ proofInstructionOffset: 1,
535
+ }));
536
+ });
537
+ });
538
+ // ─── Fix-specific tests ────────────────────────────────────────────────────
539
+ describe('Fix #1: signed i8 proof instruction offsets', () => {
540
+ it('should correctly encode negative offset on ConfigureAccount', async () => {
541
+ const builder = ctBuilder();
542
+ builder.configureAccount({
543
+ tokenAddress,
544
+ mintAddress,
545
+ authorityAddress,
546
+ decryptableZeroBalance: zeroBytes36,
547
+ maximumPendingBalanceCreditCounter: '65536',
548
+ proofInstructionOffset: -1, // proof is the previous instruction
549
+ });
550
+ const tx = await builder.build();
551
+ const data = solTx(tx).instructions[0].data;
552
+ data[46].should.equal(255); // -1 as i8 = 255 as u8 (two's complement)
553
+ });
554
+ it('should correctly encode negative offset on Withdraw', async () => {
555
+ const builder = ctBuilder();
556
+ builder.confidentialWithdraw({
557
+ tokenAddress,
558
+ mintAddress,
559
+ authorityAddress,
560
+ equalityProofContextStateAddress: eqCtxAddress,
561
+ rangeProofContextStateAddress: rangeCtxAddress,
562
+ amount: '100',
563
+ decimals: 6,
564
+ newDecryptableAvailableBalance: zeroBytes36,
565
+ equalityProofInstructionOffset: -1,
566
+ rangeProofInstructionOffset: -2,
567
+ });
568
+ const tx = await builder.build();
569
+ const data = solTx(tx).instructions[0].data;
570
+ data[47].should.equal(255); // -1 as i8
571
+ data[48].should.equal(254); // -2 as i8
572
+ });
573
+ it('should correctly encode negative offsets on Transfer', async () => {
574
+ const builder = ctBuilder();
575
+ builder.confidentialTransfer({
576
+ sourceTokenAddress: tokenAddress,
577
+ mintAddress,
578
+ destinationTokenAddress,
579
+ authorityAddress,
580
+ equalityProofContextStateAddress: eqCtxAddress,
581
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
582
+ rangeProofContextStateAddress: rangeCtxAddress,
583
+ newSourceDecryptableAvailableBalance: zeroBytes36,
584
+ transferAmountAuditorCiphertextLo: zeroBytes64,
585
+ transferAmountAuditorCiphertextHi: zeroBytes64,
586
+ equalityProofInstructionOffset: -3,
587
+ ciphertextValidityProofInstructionOffset: -2,
588
+ rangeProofInstructionOffset: -1,
589
+ });
590
+ const tx = await builder.build();
591
+ const data = solTx(tx).instructions[0].data;
592
+ data[166].should.equal(253); // -3 as i8
593
+ data[167].should.equal(254); // -2 as i8
594
+ data[168].should.equal(255); // -1 as i8
595
+ });
596
+ });
597
+ describe('Fix #2: instruction order preservation in parser', () => {
598
+ it('should preserve interleaved CT and custom instruction order', async () => {
599
+ const builder = ctBuilder();
600
+ builder
601
+ .applyPendingBalance({
602
+ tokenAddress,
603
+ authorityAddress,
604
+ expectedPendingBalanceCreditCounter: '1',
605
+ newDecryptableAvailableBalance: zeroBytes36,
606
+ })
607
+ .verifyEqualityProof({ proofData: proofDataHex })
608
+ .confidentialTransfer({
609
+ sourceTokenAddress: tokenAddress,
610
+ mintAddress,
611
+ destinationTokenAddress,
612
+ authorityAddress,
613
+ equalityProofContextStateAddress: eqCtxAddress,
614
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
615
+ rangeProofContextStateAddress: rangeCtxAddress,
616
+ newSourceDecryptableAvailableBalance: zeroBytes36,
617
+ transferAmountAuditorCiphertextLo: zeroBytes64,
618
+ transferAmountAuditorCiphertextHi: zeroBytes64,
619
+ equalityProofInstructionOffset: 0,
620
+ ciphertextValidityProofInstructionOffset: 0,
621
+ rangeProofInstructionOffset: 0,
622
+ });
623
+ const tx = await builder.build();
624
+ const instructions = tx.toJson().instructionsData;
625
+ // Order should be: ApplyPendingBalance, VerifyEqualityProof, ConfidentialTransfer
626
+ instructions.should.have.length(3);
627
+ instructions[0].type.should.equal('ApplyPendingBalance');
628
+ instructions[1].type.should.equal('VerifyEqualityProof');
629
+ instructions[2].type.should.equal('ConfidentialTransfer');
630
+ });
631
+ });
632
+ describe('Fix #3: VerifyPubkeyValidity context state mode', () => {
633
+ it('should not throw when only context state accounts are provided (no proofData)', async () => {
634
+ const builder = ctBuilder();
635
+ builder.verifyPubkeyValidity({
636
+ contextStateAccountAddress: eqCtxAddress,
637
+ contextStateAuthorityAddress: authorityAddress,
638
+ });
639
+ const tx = await builder.build();
640
+ const rawIx = solTx(tx).instructions[0];
641
+ // Should produce an offset-based instruction, not throw
642
+ rawIx.data[0].should.equal(4);
643
+ rawIx.keys.should.have.length(2);
644
+ });
645
+ });
646
+ describe('Fix #4: context state address required when offset == 0', () => {
647
+ it('should reject Withdraw with offset 0 but missing equality context state address', async () => {
648
+ const builder = ctBuilder();
649
+ builder.confidentialWithdraw({
650
+ tokenAddress,
651
+ mintAddress,
652
+ authorityAddress,
653
+ rangeProofContextStateAddress: rangeCtxAddress,
654
+ amount: '100',
655
+ decimals: 6,
656
+ newDecryptableAvailableBalance: zeroBytes36,
657
+ equalityProofInstructionOffset: 0, // context state mode but no address
658
+ rangeProofInstructionOffset: 0,
659
+ });
660
+ await builder.build().should.be.rejectedWith(/equalityProofContextStateAddress is required/);
661
+ });
662
+ it('should reject Transfer with offset 0 but missing range context state address', async () => {
663
+ const builder = ctBuilder();
664
+ builder.confidentialTransfer({
665
+ sourceTokenAddress: tokenAddress,
666
+ mintAddress,
667
+ destinationTokenAddress,
668
+ authorityAddress,
669
+ equalityProofContextStateAddress: eqCtxAddress,
670
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
671
+ newSourceDecryptableAvailableBalance: zeroBytes36,
672
+ transferAmountAuditorCiphertextLo: zeroBytes64,
673
+ transferAmountAuditorCiphertextHi: zeroBytes64,
674
+ equalityProofInstructionOffset: 0,
675
+ ciphertextValidityProofInstructionOffset: 0,
676
+ rangeProofInstructionOffset: 0, // context state mode but no address
677
+ });
678
+ await builder.build().should.be.rejectedWith(/rangeProofContextStateAddress is required/);
679
+ });
680
+ });
681
+ describe('Fix #5: numeric string validation', () => {
682
+ it('should reject non-numeric amount on Deposit', async () => {
683
+ const builder = ctBuilder();
684
+ builder.confidentialDeposit({
685
+ tokenAddress,
686
+ mintAddress,
687
+ authorityAddress,
688
+ amount: 'abc',
689
+ decimals: 6,
690
+ });
691
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
692
+ });
693
+ it('should reject negative amount on Deposit', async () => {
694
+ const builder = ctBuilder();
695
+ builder.confidentialDeposit({
696
+ tokenAddress,
697
+ mintAddress,
698
+ authorityAddress,
699
+ amount: '-100',
700
+ decimals: 6,
701
+ });
702
+ await builder.build().should.be.rejectedWith(/Invalid amount: expected non-negative integer string/);
703
+ });
704
+ it('should reject non-numeric counter on ApplyPendingBalance', async () => {
705
+ const builder = ctBuilder();
706
+ builder.applyPendingBalance({
707
+ tokenAddress,
708
+ authorityAddress,
709
+ expectedPendingBalanceCreditCounter: 'not-a-number',
710
+ newDecryptableAvailableBalance: zeroBytes36,
711
+ });
712
+ await builder.build().should.be.rejectedWith(/Invalid expectedPendingBalanceCreditCounter/);
713
+ });
714
+ it('should reject non-numeric counter on ConfigureAccount', async () => {
715
+ const builder = ctBuilder();
716
+ builder.configureAccount({
717
+ tokenAddress,
718
+ mintAddress,
719
+ authorityAddress,
720
+ decryptableZeroBalance: zeroBytes36,
721
+ maximumPendingBalanceCreditCounter: 'foo',
722
+ proofInstructionOffset: 1,
723
+ });
724
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter/);
725
+ });
726
+ it('should accept amount of 0 on Deposit', async () => {
727
+ const builder = ctBuilder();
728
+ builder.confidentialDeposit({
729
+ tokenAddress,
730
+ mintAddress,
731
+ authorityAddress,
732
+ amount: '0',
733
+ decimals: 6,
734
+ });
735
+ const tx = await builder.build();
736
+ const data = solTx(tx).instructions[0].data;
737
+ data.readBigUInt64LE(2).toString().should.equal('0');
738
+ });
739
+ });
740
+ describe('Fix #6: canonical ZK proof program ID', () => {
741
+ it('should use canonical zk-elgamal-proof program id', async () => {
742
+ const builder = ctBuilder();
743
+ builder.verifyEqualityProof({ proofData: proofDataHex });
744
+ const tx = await builder.build();
745
+ solTx(tx).instructions[0].programId.toString().should.equal('ZkE1Gama1Proof11111111111111111111111111111');
746
+ });
747
+ it('should allow overriding ZK proof program id', async () => {
748
+ const customProgramId = testData.associatedTokenAccounts.accounts[0].pub; // any valid pubkey
749
+ const builder = ctBuilder();
750
+ builder.zkProofProgramId(customProgramId);
751
+ builder.verifyEqualityProof({ proofData: proofDataHex });
752
+ const tx = await builder.build();
753
+ solTx(tx).instructions[0].programId.toString().should.equal(customProgramId);
754
+ });
755
+ });
756
+ describe('Fix #8: from() routing for CT transactions', () => {
757
+ it('should route CT transaction to ConfidentialTransferBuilder on from()', async () => {
758
+ // Build a CT transaction
759
+ const builder = ctBuilder();
760
+ builder.configureAccount({
761
+ tokenAddress,
762
+ mintAddress,
763
+ authorityAddress,
764
+ decryptableZeroBalance: zeroBytes36,
765
+ maximumPendingBalanceCreditCounter: '65536',
766
+ proofInstructionOffset: 1,
767
+ });
768
+ const tx = await builder.build();
769
+ const rawTx = tx.toBroadcastFormat();
770
+ // Parse it back via factory.from()
771
+ const parsedBuilder = factory.from(rawTx);
772
+ // Should be a ConfidentialTransferBuilder, not CustomInstructionBuilder
773
+ parsedBuilder.constructor.name.should.equal('ConfidentialTransferBuilder');
774
+ });
775
+ it('should route non-CT custom transaction to CustomInstructionBuilder on from()', async () => {
776
+ // Build a non-CT custom transaction
777
+ const customBuilder = factory.getCustomInstructionBuilder();
778
+ customBuilder.nonce(recentBlockHash);
779
+ customBuilder.sender(account.pub);
780
+ customBuilder.addCustomInstruction({
781
+ programId: 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',
782
+ keys: [],
783
+ data: 'hello',
784
+ });
785
+ const tx = await customBuilder.build();
786
+ const rawTx = tx.toBroadcastFormat();
787
+ // Parse it back via factory.from()
788
+ const parsedBuilder = factory.from(rawTx);
789
+ parsedBuilder.constructor.name.should.equal('CustomInstructionBuilder');
790
+ });
791
+ });
792
+ describe('Fix #9: range validation for decimals and proof offsets', () => {
793
+ it('should reject decimals > 255 on Deposit', async () => {
794
+ const builder = ctBuilder();
795
+ builder.confidentialDeposit({
796
+ tokenAddress,
797
+ mintAddress,
798
+ authorityAddress,
799
+ amount: '100',
800
+ decimals: 256,
801
+ });
802
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
803
+ });
804
+ it('should reject negative decimals on Deposit', async () => {
805
+ const builder = ctBuilder();
806
+ builder.confidentialDeposit({
807
+ tokenAddress,
808
+ mintAddress,
809
+ authorityAddress,
810
+ amount: '100',
811
+ decimals: -1,
812
+ });
813
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
814
+ });
815
+ it('should reject non-integer decimals on Deposit', async () => {
816
+ const builder = ctBuilder();
817
+ builder.confidentialDeposit({
818
+ tokenAddress,
819
+ mintAddress,
820
+ authorityAddress,
821
+ amount: '100',
822
+ decimals: 6.5,
823
+ });
824
+ await builder.build().should.be.rejectedWith(/Invalid decimals: expected u8 \(0-255\)/);
825
+ });
826
+ it('should reject proof offset > 127 on ConfigureAccount', async () => {
827
+ const builder = ctBuilder();
828
+ builder.configureAccount({
829
+ tokenAddress,
830
+ mintAddress,
831
+ authorityAddress,
832
+ decryptableZeroBalance: zeroBytes36,
833
+ maximumPendingBalanceCreditCounter: '65536',
834
+ proofInstructionOffset: 128,
835
+ });
836
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
837
+ });
838
+ it('should reject proof offset < -128 on ConfigureAccount', async () => {
839
+ const builder = ctBuilder();
840
+ builder.configureAccount({
841
+ tokenAddress,
842
+ mintAddress,
843
+ authorityAddress,
844
+ decryptableZeroBalance: zeroBytes36,
845
+ maximumPendingBalanceCreditCounter: '65536',
846
+ proofInstructionOffset: -129,
847
+ });
848
+ await builder.build().should.be.rejectedWith(/Invalid proofInstructionOffset: expected i8 \(-128 to 127\)/);
849
+ });
850
+ it('should reject equality proof offset > 127 on Withdraw', async () => {
851
+ const builder = ctBuilder();
852
+ builder.confidentialWithdraw({
853
+ tokenAddress,
854
+ mintAddress,
855
+ authorityAddress,
856
+ equalityProofContextStateAddress: eqCtxAddress,
857
+ rangeProofContextStateAddress: rangeCtxAddress,
858
+ amount: '100',
859
+ decimals: 6,
860
+ newDecryptableAvailableBalance: zeroBytes36,
861
+ equalityProofInstructionOffset: 200,
862
+ rangeProofInstructionOffset: 0,
863
+ });
864
+ await builder.build().should.be.rejectedWith(/Invalid equalityProofInstructionOffset: expected i8/);
865
+ });
866
+ it('should reject range proof offset < -128 on Withdraw', async () => {
867
+ const builder = ctBuilder();
868
+ builder.confidentialWithdraw({
869
+ tokenAddress,
870
+ mintAddress,
871
+ authorityAddress,
872
+ equalityProofContextStateAddress: eqCtxAddress,
873
+ rangeProofContextStateAddress: rangeCtxAddress,
874
+ amount: '100',
875
+ decimals: 6,
876
+ newDecryptableAvailableBalance: zeroBytes36,
877
+ equalityProofInstructionOffset: 0,
878
+ rangeProofInstructionOffset: -200,
879
+ });
880
+ await builder.build().should.be.rejectedWith(/Invalid rangeProofInstructionOffset: expected i8/);
881
+ });
882
+ it('should reject validity proof offset out of i8 range on Transfer', async () => {
883
+ const builder = ctBuilder();
884
+ builder.confidentialTransfer({
885
+ sourceTokenAddress: tokenAddress,
886
+ mintAddress,
887
+ destinationTokenAddress,
888
+ authorityAddress,
889
+ equalityProofContextStateAddress: eqCtxAddress,
890
+ ciphertextValidityProofContextStateAddress: validityCtxAddress,
891
+ rangeProofContextStateAddress: rangeCtxAddress,
892
+ newSourceDecryptableAvailableBalance: zeroBytes36,
893
+ transferAmountAuditorCiphertextLo: zeroBytes64,
894
+ transferAmountAuditorCiphertextHi: zeroBytes64,
895
+ equalityProofInstructionOffset: 0,
896
+ ciphertextValidityProofInstructionOffset: 255,
897
+ rangeProofInstructionOffset: 0,
898
+ });
899
+ await builder.build().should.be.rejectedWith(/Invalid ciphertextValidityProofInstructionOffset: expected i8/);
900
+ });
901
+ it('should accept boundary offset values (-128 and 127)', async () => {
902
+ const builder = ctBuilder();
903
+ builder.configureAccount({
904
+ tokenAddress,
905
+ mintAddress,
906
+ authorityAddress,
907
+ decryptableZeroBalance: zeroBytes36,
908
+ maximumPendingBalanceCreditCounter: '65536',
909
+ proofInstructionOffset: 127,
910
+ });
911
+ const tx = await builder.build();
912
+ const data = solTx(tx).instructions[0].data;
913
+ data[46].should.equal(127);
914
+ });
915
+ });
916
+ describe('Fix #10: u64 overflow validation', () => {
917
+ it('should reject amount exceeding u64 max on Deposit', async () => {
918
+ const builder = ctBuilder();
919
+ builder.confidentialDeposit({
920
+ tokenAddress,
921
+ mintAddress,
922
+ authorityAddress,
923
+ amount: '18446744073709551616', // 2^64
924
+ decimals: 6,
925
+ });
926
+ await builder.build().should.be.rejectedWith(/Invalid amount: value exceeds u64 max/);
927
+ });
928
+ it('should accept amount at u64 max on Deposit', async () => {
929
+ const builder = ctBuilder();
930
+ builder.confidentialDeposit({
931
+ tokenAddress,
932
+ mintAddress,
933
+ authorityAddress,
934
+ amount: '18446744073709551615', // 2^64 - 1
935
+ decimals: 6,
936
+ });
937
+ const tx = await builder.build();
938
+ const data = solTx(tx).instructions[0].data;
939
+ data.readBigUInt64LE(2).toString().should.equal('18446744073709551615');
940
+ });
941
+ it('should reject counter exceeding u64 max on ConfigureAccount', async () => {
942
+ const builder = ctBuilder();
943
+ builder.configureAccount({
944
+ tokenAddress,
945
+ mintAddress,
946
+ authorityAddress,
947
+ decryptableZeroBalance: zeroBytes36,
948
+ maximumPendingBalanceCreditCounter: '18446744073709551616', // 2^64
949
+ proofInstructionOffset: 1,
950
+ });
951
+ await builder.build().should.be.rejectedWith(/Invalid maximumPendingBalanceCreditCounter: value exceeds u64 max/);
952
+ });
953
+ });
954
+ });
955
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FBMkQ7QUFDM0Qsb0RBQTRCO0FBQzVCLDhEQUFnRDtBQUNoRCw0REFBeUQ7QUFFekQsUUFBUSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHFDQUFpQixFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUV2RSwwQ0FBMEM7SUFDMUMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQztJQUN0RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsaUNBQWlDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNoRixNQUFNLHVCQUF1QixHQUFHLDhDQUE4QyxDQUFDO0lBQy9FLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNyQyw4RUFBOEU7SUFDOUUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEUsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFN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QUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO1lBQzFELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3JFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVztZQUVyQyw4REFBOEQ7WUFDOUQsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLENBQUMsQ0FB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Z0JBQzFCLFlBQVk7Z0JBQ1osV0FBVztnQkFDWCxnQkFBZ0I7Z0JBQ2hCLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxXQUFXO2dCQUMzQyxRQUFRLEVBQUUsQ0FBQzthQUNaLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNFLE1BQU0sT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdkIsWUFBWTtnQkFDWixXQUFXO2dCQUNYLGdCQUFnQjtnQkFDaEIsc0JBQXNCLEVBQUUsV0FBVztnQkFDbkMsa0NBQWtDLEVBQUUsc0JBQXNCLEVBQUUsT0FBTztnQkFDbkUsc0JBQXNCLEVBQUUsQ0FBQzthQUMxQixDQUFDLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBQ3BILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IGdldEJ1aWxkZXJGYWN0b3J5IH0gZnJvbSAnLi4vZ2V0QnVpbGRlckZhY3RvcnknO1xuXG5kZXNjcmliZSgnU29sYW5hIENvbmZpZGVudGlhbCBUcmFuc2ZlciBCdWlsZGVyJywgKCkgPT4ge1xuICBjb25zdCBmYWN0b3J5ID0gZ2V0QnVpbGRlckZhY3RvcnkoJ3NvbCcpO1xuICBjb25zdCBhY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0pLmdldEtleXMoKTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcblxuICAvLyBUZXN0IGFkZHJlc3NlcyAoVG9rZW4tMjAyMiBtaW50ICsgQVRBcylcbiAgY29uc3QgbWludEFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50c0ZvclNvbDIwMjIubWludElkO1xuICBjb25zdCB0b2tlbkFkZHJlc3MgPSB0ZXN0RGF0YS5hc3NvY2lhdGVkVG9rZW5BY2NvdW50c0ZvclNvbDIwMjIuYWNjb3VudHNbMF0uYXRhO1xuICBjb25zdCBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyA9ICdFTm44YTJ0R01TOWJSNVhWN3NtR0hKdk5nemt5eEptbkQyZVV2UXhZNWpTUCc7XG4gIGNvbnN0IGF1dGhvcml0eUFkZHJlc3MgPSBhY2NvdW50LnB1YjtcbiAgLy8gVmFsaWQgYmFzZTU4IGFkZHJlc3NlcyBmb3IgY29udGV4dCBzdGF0ZSBhY2NvdW50cyAoYW55IHZhbGlkIFNvbGFuYSBwdWJrZXkpXG4gIGNvbnN0IGVxQ3R4QWRkcmVzcyA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLmF0YTtcbiAgY29uc3QgdmFsaWRpdHlDdHhBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICBjb25zdCByYW5nZUN0eEFkZHJlc3MgPSB0ZXN0RGF0YS5ub25jZUFjY291bnQucHViO1xuXG4gIC8vIEhleCB0ZXN0IGRhdGFcbiAgY29uc3QgemVyb0J5dGVzMzYgPSAnMDAnLnJlcGVhdCgzNik7XG4gIGNvbnN0IHplcm9CeXRlczY0ID0gJzAwJy5yZXBlYXQoNjQpO1xuICBjb25zdCBwcm9vZkRhdGFIZXggPSAnMDAnLnJlcGVhdCgzMjApOyAvLyB0eXBpY2FsIGVxdWFsaXR5IHByb29mIHNpemVcblxuICBjb25zdCBjdEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICB0eEJ1aWxkZXIuc2VuZGVyKGFjY291bnQucHViKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIC8qKiBBY2Nlc3MgdGhlIHJhdyBTb2xhbmEgVHJhbnNhY3Rpb24gZnJvbSB0aGUgYnVpbHQgdHggKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgY29uc3Qgc29sVHggPSAodHg6IGFueSk6IGFueSA9PiAodHggYXMgVHJhbnNhY3Rpb24pLnNvbFRyYW5zYWN0aW9uO1xuXG4gIGRlc2NyaWJlKCdDb25maWd1cmVBY2NvdW50JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBjb25maWd1cmUgYWNjb3VudCBpbnN0cnVjdGlvbiB3aXRoIHRoZSA0Ny1ieXRlIFRva2VuLTIwMjIgbGF5b3V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG5cbiAgICAgIC8vIFZlcmlmeSByYXcgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICAvLyBUb2tlbi0yMDIyIENvbmZpZ3VyZUFjY291bnQgY2FycmllcyBubyBFbEdhbWFsIHB1YmtleTogdGhlIGtleSB0cmF2ZWxzIGluIHRoZVxuICAgICAgLy8gVmVyaWZ5UHVia2V5VmFsaWRpdHkgcHJvb2YgaW5zdHJ1Y3Rpb24ncyBjb250ZXh0LiBMYXlvdXQgaXNcbiAgICAgIC8vIFsyN11bMl0gKyBkZWNyeXB0YWJsZV96ZXJvX2JhbGFuY2UoMzYpICsgbWF4aW11bV9wZW5kaW5nX2JhbGFuY2VfY3JlZGl0X2NvdW50ZXIodTY0KSArIHByb29mX2luc3RydWN0aW9uX29mZnNldChpOCkuXG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDcpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoMik7IC8vIENvbmZpZ3VyZUFjY291bnRcbiAgICAgIGRhdGEuc2xpY2UoMiwgMzgpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBkZWNyeXB0YWJsZV96ZXJvX2JhbGFuY2VcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDM4KS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNjU1MzYnKTsgLy8gbWF4IHBlbmRpbmcgYmFsYW5jZSBjcmVkaXQgY291bnRlclxuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBwcm9vZl9pbnN0cnVjdGlvbl9vZmZzZXRcblxuICAgICAgLy8gVmVyaWZ5IGFjY291bnRzXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMV0uaXNXcml0YWJsZS5zaG91bGQuYmUuZmFsc2UoKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7IC8vIGluc3RydWN0aW9ucyBzeXN2YXJcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1szXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgY29udGV4dCBzdGF0ZSBhZGRyZXNzIHdoZW4gcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0U3RhdGVBZGRyZXNzID0gdGVzdERhdGEuYXNzb2NpYXRlZFRva2VuQWNjb3VudHMuYWNjb3VudHNbMF0ucHViO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zU3lzdmFyT3JDb250ZXh0U3RhdGVBZGRyZXNzOiBjb250ZXh0U3RhdGVBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGtleXMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChjb250ZXh0U3RhdGVBZGRyZXNzKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ2XS5zaG91bGQuZXF1YWwoMCk7IC8vIHByb29mX2luc3RydWN0aW9uX29mZnNldCA9IDAgKGNvbnRleHQgc3RhdGUpXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjcmVhdGVBdGEgcmVhbGxvY2F0ZSBleHRlbnNpb24gbGlzdCcsICgpID0+IHtcbiAgICBjb25zdCB0b2tlbjIwMjJQcm9ncmFtSWQgPSAnVG9rZW56UWRCTmJMcVA1VkVoZGtBUzZFUEZMQzFQSG5CcUNYRXBQeHVFYic7XG4gICAgLy8gUmVhbGxvY2F0ZSBkYXRhOiBbMjldW2V4dGVuc2lvblR5cGUodTE2IExFKSwgLi4uXS4gRXh0ZW5zaW9uVHlwZSB2YWx1ZXMgZm9sbG93IHRoZVxuICAgIC8vIFRva2VuLTIwMjIgZW51bTogQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50ID0gNSwgQ29uZmlkZW50aWFsVHJhbnNmZXJGZWVBbW91bnQgPSAxNy5cbiAgICBjb25zdCBSRUFMTE9DQVRFID0gMjk7XG4gICAgY29uc3QgQ09ORklERU5USUFMX1RSQU5TRkVSX0FDQ09VTlQgPSA1O1xuICAgIGNvbnN0IENPTkZJREVOVElBTF9UUkFOU0ZFUl9GRUVfQU1PVU5UID0gMTc7XG5cbiAgICBpdCgnc2hvdWxkIHJlYWxsb2NhdGUgb25seSBDb25maWRlbnRpYWxUcmFuc2ZlckFjY291bnQgZm9yIGEgbWludCB3aXRob3V0IFRyYW5zZmVyRmVlQ29uZmlnJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jcmVhdGVBdGEoe1xuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXRhQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICBvd25lckFkZHJlc3M6IGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIHBheWVyQWRkcmVzczogYWNjb3VudC5wdWIsXG4gICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6cmF5JyxcbiAgICAgICAgcHJvZ3JhbUlkOiB0b2tlbjIwMjJQcm9ncmFtSWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzFdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMyk7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbChSRUFMTE9DQVRFKTtcbiAgICAgIGRhdGEucmVhZFVJbnQxNkxFKDEpLnNob3VsZC5lcXVhbChDT05GSURFTlRJQUxfVFJBTlNGRVJfQUNDT1VOVCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsc28gcmVzZXJ2ZSBDb25maWRlbnRpYWxUcmFuc2ZlckZlZUFtb3VudCB3aGVuIHRoZSBtaW50IGhhcyBUcmFuc2ZlckZlZUNvbmZpZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY3JlYXRlQXRhKHtcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF0YUFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgb3duZXJBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBwYXllckFkZHJlc3M6IGFjY291bnQucHViLFxuICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICBwcm9ncmFtSWQ6IHRva2VuMjAyMlByb2dyYW1JZCxcbiAgICAgICAgbWludEhhc1RyYW5zZmVyRmVlQ29uZmlnOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMV0uZGF0YTtcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCg1KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKFJFQUxMT0NBVEUpO1xuICAgICAgZGF0YS5yZWFkVUludDE2TEUoMSkuc2hvdWxkLmVxdWFsKENPTkZJREVOVElBTF9UUkFOU0ZFUl9BQ0NPVU5UKTtcbiAgICAgIGRhdGEucmVhZFVJbnQxNkxFKDMpLnNob3VsZC5lcXVhbChDT05GSURFTlRJQUxfVFJBTlNGRVJfRkVFX0FNT1VOVCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcHBseVBlbmRpbmdCYWxhbmNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYW4gYXBwbHkgcGVuZGluZyBiYWxhbmNlIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0Ni1ieXRlIGxheW91dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuYXBwbHlQZW5kaW5nQmFsYW5jZSh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXhwZWN0ZWRQZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICczJyxcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG5cbiAgICAgIGNvbnN0IHJhd0luc3RydWN0aW9ucyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnM7XG4gICAgICByYXdJbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgZGF0YSA9IHJhd0luc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDQ2KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDgpOyAvLyBBcHBseVBlbmRpbmdCYWxhbmNlXG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnMycpOyAvLyBleHBlY3RlZF9wZW5kaW5nX2JhbGFuY2VfY3JlZGl0X2NvdW50ZXJcbiAgICAgIGRhdGEuc2xpY2UoMTAsIDQ2KS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHplcm9CeXRlczM2KTsgLy8gbmV3X2RlY3J5cHRhYmxlX2F2YWlsYWJsZV9iYWxhbmNlXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1sxXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRGVwb3NpdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgZGVwb3NpdCBpbnN0cnVjdGlvbiB3aXRoIGNvcnJlY3QgMTEtYnl0ZSBsYXlvdXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsRGVwb3NpdCcpO1xuXG4gICAgICBjb25zdCByYXdJbnN0cnVjdGlvbnMgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zO1xuICAgICAgcmF3SW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxMSk7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCgyNyk7IC8vIENvbmZpZGVudGlhbFRyYW5zZmVyRXh0ZW5zaW9uXG4gICAgICBkYXRhWzFdLnNob3VsZC5lcXVhbCg1KTsgLy8gRGVwb3NpdFxuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzEwMDAwMDAnKTsgLy8gYW1vdW50XG4gICAgICBkYXRhWzEwXS5zaG91bGQuZXF1YWwoNik7IC8vIGRlY2ltYWxzXG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3Rva2VuKHdyaXRhYmxlKSwgbWludCwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgzKTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1syXS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2l0aGRyYXcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHdpdGhkcmF3IGluc3RydWN0aW9uIHdpdGggY29ycmVjdCA0OS1ieXRlIGxheW91dCBhbmQgaW5saW5lIHByb29mcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICc1MDAwMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsV2l0aGRyYXcnKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoNDkpO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMjcpOyAvLyBDb25maWRlbnRpYWxUcmFuc2ZlckV4dGVuc2lvblxuICAgICAgZGF0YVsxXS5zaG91bGQuZXF1YWwoNik7IC8vIFdpdGhkcmF3XG4gICAgICBkYXRhLnJlYWRCaWdVSW50NjRMRSgyKS50b1N0cmluZygpLnNob3VsZC5lcXVhbCgnNTAwMDAwJyk7IC8vIGFtb3VudFxuICAgICAgZGF0YVsxMF0uc2hvdWxkLmVxdWFsKDYpOyAvLyBkZWNpbWFsc1xuICAgICAgZGF0YS5zbGljZSgxMSwgNDcpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzMzYpOyAvLyBuZXdfZGVjcnlwdGFibGVcbiAgICAgIGRhdGFbNDddLnNob3VsZC5lcXVhbCgxKTsgLy8gZXF1YWxpdHkgcHJvb2Ygb2Zmc2V0XG4gICAgICBkYXRhWzQ4XS5zaG91bGQuZXF1YWwoMik7IC8vIHJhbmdlIHByb29mIG9mZnNldFxuXG4gICAgICAvLyBWZXJpZnkgYWNjb3VudHM6IFt0b2tlbih3cml0YWJsZSksIG1pbnQsIHN5c3ZhciwgYXV0aG9yaXR5KHNpZ25lcildXG4gICAgICBjb25zdCBrZXlzID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmtleXM7XG4gICAgICBrZXlzLnNob3VsZC5oYXZlLmxlbmd0aCg0KTtcbiAgICAgIGtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKG1pbnRBZGRyZXNzKTtcbiAgICAgIGtleXNbMl0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbM10uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnNTAwMDAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFt0b2tlbiwgbWludCwgZXFDdHgsIHJnQ3R4LCBhdXRob3JpdHldIOKAlCBubyBzeXN2YXIgc2luY2UgYWxsIHByb29mcyB1c2UgY29udGV4dCBzdGF0ZVxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1szXS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwocmFuZ2VDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5pc1NpZ25lci5zaG91bGQuYmUudHJ1ZSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uZmlkZW50aWFsVHJhbnNmZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGluc3RydWN0aW9uIHdpdGggY29ycmVjdCAxNjktYnl0ZSBsYXlvdXQgYW5kIGlubGluZSBwcm9vZnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dExvOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAyLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcblxuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMTY5KTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDI3KTsgLy8gQ29uZmlkZW50aWFsVHJhbnNmZXJFeHRlbnNpb25cbiAgICAgIGRhdGFbMV0uc2hvdWxkLmVxdWFsKDcpOyAvLyBUcmFuc2ZlclxuICAgICAgZGF0YS5zbGljZSgyLCAzOCkudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXMzNik7IC8vIG5ld19zb3VyY2VfZGVjcnlwdGFibGVcbiAgICAgIGRhdGEuc2xpY2UoMzgsIDEwMikudG9TdHJpbmcoJ2hleCcpLnNob3VsZC5lcXVhbCh6ZXJvQnl0ZXM2NCk7IC8vIGF1ZGl0b3JfY3RfbG9cbiAgICAgIGRhdGEuc2xpY2UoMTAyLCAxNjYpLnRvU3RyaW5nKCdoZXgnKS5zaG91bGQuZXF1YWwoemVyb0J5dGVzNjQpOyAvLyBhdWRpdG9yX2N0X2hpXG4gICAgICBkYXRhWzE2Nl0uc2hvdWxkLmVxdWFsKDEpOyAvLyBlcXVhbGl0eSBwcm9vZiBvZmZzZXRcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMik7IC8vIHZhbGlkaXR5IHByb29mIG9mZnNldFxuICAgICAgZGF0YVsxNjhdLnNob3VsZC5lcXVhbCgzKTsgLy8gcmFuZ2UgcHJvb2Ygb2Zmc2V0XG5cbiAgICAgIC8vIFZlcmlmeSBhY2NvdW50czogW3NvdXJjZSh3cml0YWJsZSksIG1pbnQsIGRlc3Qod3JpdGFibGUpLCBzeXN2YXIsIGF1dGhvcml0eShzaWduZXIpXVxuICAgICAgY29uc3Qga2V5cyA9IHJhd0luc3RydWN0aW9uc1swXS5rZXlzO1xuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNSk7XG4gICAgICBrZXlzWzBdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbCh0b2tlbkFkZHJlc3MpO1xuICAgICAga2V5c1swXS5pc1dyaXRhYmxlLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICBrZXlzWzFdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChtaW50QWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChkZXN0aW5hdGlvblRva2VuQWRkcmVzcyk7XG4gICAgICBrZXlzWzJdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIGtleXNbM10ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgICBrZXlzWzRdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNF0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB0cmFuc2ZlciBpbnN0cnVjdGlvbiB3aXRoIGNvbnRleHQgc3RhdGUgYWNjb3VudHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qga2V5cyA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ua2V5cztcbiAgICAgIC8vIFtzb3VyY2UsIG1pbnQsIGRlc3QsIGVxQ3R4LCB2YWxpZGl0eUN0eCwgcmFuZ2VDdHgsIGF1dGhvcml0eV0g4oCUIG5vIHN5c3ZhclxuICAgICAga2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoNyk7XG4gICAgICBrZXlzWzNdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChlcUN0eEFkZHJlc3MpO1xuICAgICAga2V5c1s0XS5wdWJrZXkudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwodmFsaWRpdHlDdHhBZGRyZXNzKTtcbiAgICAgIGtleXNbNV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHJhbmdlQ3R4QWRkcmVzcyk7XG4gICAgICBrZXlzWzZdLnB1YmtleS50b1N0cmluZygpLnNob3VsZC5lcXVhbChhdXRob3JpdHlBZGRyZXNzKTtcbiAgICAgIGtleXNbNl0uaXNTaWduZXIuc2hvdWxkLmJlLnRydWUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB2ZXJpZnkgcHVia2V5IHZhbGlkaXR5IGluc3RydWN0aW9uIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SW5zdHJ1Y3Rpb25zID0gc29sVHgodHgpLmluc3RydWN0aW9ucztcbiAgICAgIHJhd0luc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgICBjb25zdCBkYXRhID0gcmF3SW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzBdLnNob3VsZC5lcXVhbCg0KTsgLy8gVmVyaWZ5UHVia2V5VmFsaWRpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApOyAvLyBkaXNjcmltaW5hdG9yICsgcHJvb2YgZGF0YVxuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG5cbiAgICAgIC8vIE5vIGFjY291bnRzIGZvciBpbmxpbmUgcHJvb2ZcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcblxuICAgICAgLy8gVmVyaWZ5IHByb2dyYW0gaWQgKGNhbm9uaWNhbCBvbi1jaGFpbiBpZClcbiAgICAgIHJhd0luc3RydWN0aW9uc1swXS5wcm9ncmFtSWQudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJ1prRTFHYW1hMVByb29mMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBjb250ZXh0IHN0YXRlIGFjY291bnQgKGZpeCAjMyknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVB1YmtleVZhbGlkaXR5KHtcbiAgICAgICAgY29udGV4dFN0YXRlQWNjb3VudEFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY29udGV4dFN0YXRlQXV0aG9yaXR5QWRkcmVzczogYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd0l4ID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSByYXdJeC5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoNCk7IC8vIFZlcmlmeVB1YmtleVZhbGlkaXR5IGRpc2NyaW1pbmF0b3JcbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5RXF1YWxpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMyk7IC8vIFZlcmlmeUNpcGhlcnRleHRDb21taXRtZW50RXF1YWxpdHkgZGlzY3JpbWluYXRvclxuICAgICAgZGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDEgKyAzMjApO1xuICAgICAgZGF0YS5zbGljZSgxKS50b1N0cmluZygnaGV4Jykuc2hvdWxkLmVxdWFsKHByb29mRGF0YUhleCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggY29udGV4dCBzdGF0ZSBvZmZzZXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2Yoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCByYXdJeCA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF07XG4gICAgICBjb25zdCBkYXRhID0gcmF3SXguZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDMpO1xuICAgICAgZGF0YS5yZWFkVUludDMyTEUoMSkuc2hvdWxkLmVxdWFsKDApOyAvLyBvZmZzZXQgYXMgdTMyXG5cbiAgICAgIC8vIENvbnRleHQgc3RhdGUgYWNjb3VudHM6IFtjb250ZXh0U3RhdGUod3JpdGFibGUpLCBhdXRob3JpdHldXG4gICAgICByYXdJeC5rZXlzLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIHJhd0l4LmtleXNbMF0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGVxQ3R4QWRkcmVzcyk7XG4gICAgICByYXdJeC5rZXlzWzBdLmlzV3JpdGFibGUuc2hvdWxkLmJlLnRydWUoKTtcbiAgICAgIHJhd0l4LmtleXNbMV0ucHVia2V5LnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKGF1dGhvcml0eUFkZHJlc3MpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVmVyaWZ5VmFsaWRpdHlQcm9vZicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHdpdGggaW5saW5lIHByb29mIGRhdGEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLnZlcmlmeVZhbGlkaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVswXS5zaG91bGQuZXF1YWwoMTIpOyAvLyBWZXJpZnlCYXRjaGVkR3JvdXBlZENpcGhlcnRleHQzSGFuZGxlc1ZhbGlkaXR5XG4gICAgICBkYXRhLmxlbmd0aC5zaG91bGQuZXF1YWwoMSArIDMyMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnlSYW5nZVByb29mJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgd2l0aCBpbmxpbmUgcHJvb2YgZGF0YScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UmFuZ2VQcm9vZih7IHByb29mRGF0YTogJzAwJy5yZXBlYXQoMTAwMCkgfSk7IC8vIHJhbmdlIHByb29mIGlzIH4xMDAwIGJ5dGVzXG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMF0uc2hvdWxkLmVxdWFsKDcpOyAvLyBWZXJpZnlCYXRjaGVkUmFuZ2VQcm9vZlUxMjhcbiAgICAgIGRhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgxICsgMTAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdNdWx0aXBsZSBpbnN0cnVjdGlvbnMgKHYxIHR4IHNpbXVsYXRpb24pJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgQXBwbHlQZW5kaW5nQmFsYW5jZSArIDMgcHJvb2ZzICsgVHJhbnNmZXIgaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLmFwcGx5UGVuZGluZ0JhbGFuY2Uoe1xuICAgICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnMicsXG4gICAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgfSlcbiAgICAgICAgLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KVxuICAgICAgICAudmVyaWZ5VmFsaWRpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pXG4gICAgICAgIC52ZXJpZnlSYW5nZVByb29mKHsgcHJvb2ZEYXRhOiAnMDAnLnJlcGVhdCgxMDAwKSB9KVxuICAgICAgICAuY29uZmlkZW50aWFsVHJhbnNmZXIoe1xuICAgICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGRlc3RpbmF0aW9uVG9rZW5BZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgbmV3U291cmNlRGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDIsXG4gICAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAzLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCg1KTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQXBwbHlQZW5kaW5nQmFsYW5jZScpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzFdLnR5cGUuc2hvdWxkLmVxdWFsKCdWZXJpZnlFcXVhbGl0eVByb29mJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMl0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVZhbGlkaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1szXS50eXBlLnNob3VsZC5lcXVhbCgnVmVyaWZ5UmFuZ2VQcm9vZicpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzRdLnR5cGUuc2hvdWxkLmVxdWFsKCdDb25maWRlbnRpYWxUcmFuc2ZlcicpO1xuXG4gICAgICAvLyBOb3RlOiBDYW5ub3QgdmVyaWZ5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgaGVyZSBiZWNhdXNlIDMgcHJvb2ZzICgzMjArMzIwKzEwMDAgYnl0ZXMpXG4gICAgICAvLyArIHRyYW5zZmVyICgxNjlCKSBleGNlZWRzIHYwIHR4IHNpemUgbGltaXQgKDEyMzJCKS4gVGhlc2UgYXJlIHYxIHRyYW5zYWN0aW9ucyAoNDEzMkIpLlxuICAgICAgLy8gVGhlIGluc3RydWN0aW9uIGRhdGEgbGF5b3V0cyBhcmUgdmVyaWZpZWQgaW5kaXZpZHVhbGx5IGluIHRoZSB0ZXN0cyBhYm92ZS5cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgQ29uZmlndXJlQWNjb3VudCArIFZlcmlmeVB1YmtleVZhbGlkaXR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlclxuICAgICAgICAuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgICB9KVxuICAgICAgICAudmVyaWZ5UHVia2V5VmFsaWRpdHkoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIGluc3RydWN0aW9uc1swXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlndXJlQ29uZmlkZW50aWFsVHJhbnNmZXJBY2NvdW50Jyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeVB1YmtleVZhbGlkaXR5Jyk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCkuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmF3IHRyYW5zYWN0aW9uIHZhbGlkaXR5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIHZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGVtcHR5IGJ1aWxkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvY29uZmlkZW50aWFsIHRyYW5zZmVyIGluc3RydWN0aW9uLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBtaXNzaW5nIHRva2VuQWRkcmVzcyBvbiBjb25maWd1cmVBY2NvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PlxuICAgICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICAgIHRva2VuQWRkcmVzczogJycsXG4gICAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyDilIDilIDilIAgRml4LXNwZWNpZmljIHRlc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRlc2NyaWJlKCdGaXggIzE6IHNpZ25lZCBpOCBwcm9vZiBpbnN0cnVjdGlvbiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGVuY29kZSBuZWdhdGl2ZSBvZmZzZXQgb24gQ29uZmlndXJlQWNjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSwgLy8gcHJvb2YgaXMgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDI1NSk7IC8vIC0xIGFzIGk4ID0gMjU1IGFzIHU4ICh0d28ncyBjb21wbGVtZW50KVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldCBvbiBXaXRoZHJhdycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsV2l0aGRyYXcoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBlcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgICAgbmV3RGVjcnlwdGFibGVBdmFpbGFibGVCYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgZXF1YWxpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMixcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gICAgICBkYXRhWzQ3XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICAgIGRhdGFbNDhdLnNob3VsZC5lcXVhbCgyNTQpOyAvLyAtMiBhcyBpOFxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgZW5jb2RlIG5lZ2F0aXZlIG9mZnNldHMgb24gVHJhbnNmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogLTMsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0yLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGFbMTY2XS5zaG91bGQuZXF1YWwoMjUzKTsgLy8gLTMgYXMgaThcbiAgICAgIGRhdGFbMTY3XS5zaG91bGQuZXF1YWwoMjU0KTsgLy8gLTIgYXMgaThcbiAgICAgIGRhdGFbMTY4XS5zaG91bGQuZXF1YWwoMjU1KTsgLy8gLTEgYXMgaThcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMjogaW5zdHJ1Y3Rpb24gb3JkZXIgcHJlc2VydmF0aW9uIGluIHBhcnNlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHByZXNlcnZlIGludGVybGVhdmVkIENUIGFuZCBjdXN0b20gaW5zdHJ1Y3Rpb24gb3JkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzEnLFxuICAgICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIH0pXG4gICAgICAgIC52ZXJpZnlFcXVhbGl0eVByb29mKHsgcHJvb2ZEYXRhOiBwcm9vZkRhdGFIZXggfSlcbiAgICAgICAgLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgICBzb3VyY2VUb2tlbkFkZHJlc3M6IHRva2VuQWRkcmVzcyxcbiAgICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgICAgdHJhbnNmZXJBbW91bnRBdWRpdG9yQ2lwaGVydGV4dEhpOiB6ZXJvQnl0ZXM2NCxcbiAgICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGE7XG4gICAgICAvLyBPcmRlciBzaG91bGQgYmU6IEFwcGx5UGVuZGluZ0JhbGFuY2UsIFZlcmlmeUVxdWFsaXR5UHJvb2YsIENvbmZpZGVudGlhbFRyYW5zZmVyXG4gICAgICBpbnN0cnVjdGlvbnMuc2hvdWxkLmhhdmUubGVuZ3RoKDMpO1xuICAgICAgaW5zdHJ1Y3Rpb25zWzBdLnR5cGUuc2hvdWxkLmVxdWFsKCdBcHBseVBlbmRpbmdCYWxhbmNlJyk7XG4gICAgICBpbnN0cnVjdGlvbnNbMV0udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcmlmeUVxdWFsaXR5UHJvb2YnKTtcbiAgICAgIGluc3RydWN0aW9uc1syXS50eXBlLnNob3VsZC5lcXVhbCgnQ29uZmlkZW50aWFsVHJhbnNmZXInKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjMzogVmVyaWZ5UHVia2V5VmFsaWRpdHkgY29udGV4dCBzdGF0ZSBtb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbm90IHRocm93IHdoZW4gb25seSBjb250ZXh0IHN0YXRlIGFjY291bnRzIGFyZSBwcm92aWRlZCAobm8gcHJvb2ZEYXRhKScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5UHVia2V5VmFsaWRpdHkoe1xuICAgICAgICBjb250ZXh0U3RhdGVBY2NvdW50QWRkcmVzczogZXFDdHhBZGRyZXNzLFxuICAgICAgICBjb250ZXh0U3RhdGVBdXRob3JpdHlBZGRyZXNzOiBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3SXggPSBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdO1xuICAgICAgLy8gU2hvdWxkIHByb2R1Y2UgYW4gb2Zmc2V0LWJhc2VkIGluc3RydWN0aW9uLCBub3QgdGhyb3dcbiAgICAgIHJhd0l4LmRhdGFbMF0uc2hvdWxkLmVxdWFsKDQpO1xuICAgICAgcmF3SXgua2V5cy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzQ6IGNvbnRleHQgc3RhdGUgYWRkcmVzcyByZXF1aXJlZCB3aGVuIG9mZnNldCA9PSAwJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IFdpdGhkcmF3IHdpdGggb2Zmc2V0IDAgYnV0IG1pc3NpbmcgZXF1YWxpdHkgY29udGV4dCBzdGF0ZSBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxXaXRoZHJhdyh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIHJhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiByYW5nZUN0eEFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgICBuZXdEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsIC8vIGNvbnRleHQgc3RhdGUgbW9kZSBidXQgbm8gYWRkcmVzc1xuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9lcXVhbGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzcyBpcyByZXF1aXJlZC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgVHJhbnNmZXIgd2l0aCBvZmZzZXQgMCBidXQgbWlzc2luZyByYW5nZSBjb250ZXh0IHN0YXRlIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFRyYW5zZmVyKHtcbiAgICAgICAgc291cmNlVG9rZW5BZGRyZXNzOiB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBkZXN0aW5hdGlvblRva2VuQWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiB2YWxpZGl0eUN0eEFkZHJlc3MsXG4gICAgICAgIG5ld1NvdXJjZURlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRMbzogemVyb0J5dGVzNjQsXG4gICAgICAgIHRyYW5zZmVyQW1vdW50QXVkaXRvckNpcGhlcnRleHRIaTogemVyb0J5dGVzNjQsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgY2lwaGVydGV4dFZhbGlkaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLCAvLyBjb250ZXh0IHN0YXRlIG1vZGUgYnV0IG5vIGFkZHJlc3NcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL3JhbmdlUHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzIGlzIHJlcXVpcmVkLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzU6IG51bWVyaWMgc3RyaW5nIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgYW1vdW50IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICdhYmMnLFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiBleHBlY3RlZCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmcvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGFtb3VudCBvbiBEZXBvc2l0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxEZXBvc2l0KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnLTEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBhbW91bnQ6IGV4cGVjdGVkIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZy8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLW51bWVyaWMgY291bnRlciBvbiBBcHBseVBlbmRpbmdCYWxhbmNlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5hcHBseVBlbmRpbmdCYWxhbmNlKHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBleHBlY3RlZFBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ25vdC1hLW51bWJlcicsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGV4cGVjdGVkUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBub24tbnVtZXJpYyBjb3VudGVyIG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJ2ZvbycsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXIvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBvZiAwIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YS5yZWFkQmlnVUludDY0TEUoMikudG9TdHJpbmcoKS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZpeCAjNjogY2Fub25pY2FsIFpLIHByb29mIHByb2dyYW0gSUQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1c2UgY2Fub25pY2FsIHprLWVsZ2FtYWwtcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIudmVyaWZ5RXF1YWxpdHlQcm9vZih7IHByb29mRGF0YTogcHJvb2ZEYXRhSGV4IH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCdaa0UxR2FtYTFQcm9vZjExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IG92ZXJyaWRpbmcgWksgcHJvb2YgcHJvZ3JhbSBpZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVByb2dyYW1JZCA9IHRlc3REYXRhLmFzc29jaWF0ZWRUb2tlbkFjY291bnRzLmFjY291bnRzWzBdLnB1YjsgLy8gYW55IHZhbGlkIHB1YmtleVxuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci56a1Byb29mUHJvZ3JhbUlkKGN1c3RvbVByb2dyYW1JZCk7XG4gICAgICBidWlsZGVyLnZlcmlmeUVxdWFsaXR5UHJvb2YoeyBwcm9vZkRhdGE6IHByb29mRGF0YUhleCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBzb2xUeCh0eCkuaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZC50b1N0cmluZygpLnNob3VsZC5lcXVhbChjdXN0b21Qcm9ncmFtSWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRml4ICM4OiBmcm9tKCkgcm91dGluZyBmb3IgQ1QgdHJhbnNhY3Rpb25zJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcm91dGUgQ1QgdHJhbnNhY3Rpb24gdG8gQ29uZmlkZW50aWFsVHJhbnNmZXJCdWlsZGVyIG9uIGZyb20oKScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGEgQ1QgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBQYXJzZSBpdCBiYWNrIHZpYSBmYWN0b3J5LmZyb20oKVxuICAgICAgY29uc3QgcGFyc2VkQnVpbGRlciA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgICAvLyBTaG91bGQgYmUgYSBDb25maWRlbnRpYWxUcmFuc2ZlckJ1aWxkZXIsIG5vdCBDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXJcbiAgICAgIHBhcnNlZEJ1aWxkZXIuY29uc3RydWN0b3IubmFtZS5zaG91bGQuZXF1YWwoJ0NvbmZpZGVudGlhbFRyYW5zZmVyQnVpbGRlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByb3V0ZSBub24tQ1QgY3VzdG9tIHRyYW5zYWN0aW9uIHRvIEN1c3RvbUluc3RydWN0aW9uQnVpbGRlciBvbiBmcm9tKCknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBCdWlsZCBhIG5vbi1DVCBjdXN0b20gdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IGN1c3RvbUJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY3VzdG9tQnVpbGRlci5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgY3VzdG9tQnVpbGRlci5zZW5kZXIoYWNjb3VudC5wdWIpO1xuICAgICAgY3VzdG9tQnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgIHByb2dyYW1JZDogJ01lbW9TcTRncUFCQVhLYjk2cW5IOFR5c05jV3hNeVdDcVhnRExHbWZjSHInLFxuICAgICAgICBrZXlzOiBbXSxcbiAgICAgICAgZGF0YTogJ2hlbGxvJyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGN1c3RvbUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgLy8gUGFyc2UgaXQgYmFjayB2aWEgZmFjdG9yeS5mcm9tKClcbiAgICAgIGNvbnN0IHBhcnNlZEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgICAgcGFyc2VkQnVpbGRlci5jb25zdHJ1Y3Rvci5uYW1lLnNob3VsZC5lcXVhbCgnQ3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzk6IHJhbmdlIHZhbGlkYXRpb24gZm9yIGRlY2ltYWxzIGFuZCBwcm9vZiBvZmZzZXRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVqZWN0IGRlY2ltYWxzID4gMjU1IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogMjU2LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBkZWNpbWFsczogZXhwZWN0ZWQgdTggXFwoMC0yNTVcXCkvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IG5lZ2F0aXZlIGRlY2ltYWxzIG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxMDAnLFxuICAgICAgICBkZWNpbWFsczogLTEsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3Qgbm9uLWludGVnZXIgZGVjaW1hbHMgb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzEwMCcsXG4gICAgICAgIGRlY2ltYWxzOiA2LjUsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGRlY2ltYWxzOiBleHBlY3RlZCB1OCBcXCgwLTI1NVxcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0ID4gMTI3IG9uIENvbmZpZ3VyZUFjY291bnQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZ3VyZUFjY291bnQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBkZWNyeXB0YWJsZVplcm9CYWxhbmNlOiB6ZXJvQnl0ZXMzNixcbiAgICAgICAgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogJzY1NTM2JyxcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMTI4LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOCBcXCgtMTI4IHRvIDEyN1xcKS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgcHJvb2Ygb2Zmc2V0IDwgLTEyOCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICc2NTUzNicsXG4gICAgICAgIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IC0xMjksXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIHByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4IFxcKC0xMjggdG8gMTI3XFwpLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBlcXVhbGl0eSBwcm9vZiBvZmZzZXQgPiAxMjcgb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMjAwLFxuICAgICAgICByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKC9JbnZhbGlkIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogZXhwZWN0ZWQgaTgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVqZWN0IHJhbmdlIHByb29mIG9mZnNldCA8IC0xMjggb24gV2l0aGRyYXcnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbFdpdGhkcmF3KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZXF1YWxpdHlQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IGVxQ3R4QWRkcmVzcyxcbiAgICAgICAgcmFuZ2VQcm9vZkNvbnRleHRTdGF0ZUFkZHJlc3M6IHJhbmdlQ3R4QWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiAnMTAwJyxcbiAgICAgICAgZGVjaW1hbHM6IDYsXG4gICAgICAgIG5ld0RlY3J5cHRhYmxlQXZhaWxhYmxlQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMCxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAtMjAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCByYW5nZVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IGV4cGVjdGVkIGk4Lyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCB2YWxpZGl0eSBwcm9vZiBvZmZzZXQgb3V0IG9mIGk4IHJhbmdlIG9uIFRyYW5zZmVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWRlbnRpYWxUcmFuc2Zlcih7XG4gICAgICAgIHNvdXJjZVRva2VuQWRkcmVzczogdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgZGVzdGluYXRpb25Ub2tlbkFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGVxdWFsaXR5UHJvb2ZDb250ZXh0U3RhdGVBZGRyZXNzOiBlcUN0eEFkZHJlc3MsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogdmFsaWRpdHlDdHhBZGRyZXNzLFxuICAgICAgICByYW5nZVByb29mQ29udGV4dFN0YXRlQWRkcmVzczogcmFuZ2VDdHhBZGRyZXNzLFxuICAgICAgICBuZXdTb3VyY2VEZWNyeXB0YWJsZUF2YWlsYWJsZUJhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0TG86IHplcm9CeXRlczY0LFxuICAgICAgICB0cmFuc2ZlckFtb3VudEF1ZGl0b3JDaXBoZXJ0ZXh0SGk6IHplcm9CeXRlczY0LFxuICAgICAgICBlcXVhbGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDAsXG4gICAgICAgIGNpcGhlcnRleHRWYWxpZGl0eVByb29mSW5zdHJ1Y3Rpb25PZmZzZXQ6IDI1NSxcbiAgICAgICAgcmFuZ2VQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aCgvSW52YWxpZCBjaXBoZXJ0ZXh0VmFsaWRpdHlQcm9vZkluc3RydWN0aW9uT2Zmc2V0OiBleHBlY3RlZCBpOC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhY2NlcHQgYm91bmRhcnkgb2Zmc2V0IHZhbHVlcyAoLTEyOCBhbmQgMTI3KScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlndXJlQWNjb3VudCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGRlY3J5cHRhYmxlWmVyb0JhbGFuY2U6IHplcm9CeXRlczM2LFxuICAgICAgICBtYXhpbXVtUGVuZGluZ0JhbGFuY2VDcmVkaXRDb3VudGVyOiAnNjU1MzYnLFxuICAgICAgICBwcm9vZkluc3RydWN0aW9uT2Zmc2V0OiAxMjcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBkYXRhID0gc29sVHgodHgpLmluc3RydWN0aW9uc1swXS5kYXRhO1xuICAgICAgZGF0YVs0Nl0uc2hvdWxkLmVxdWFsKDEyNyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdGaXggIzEwOiB1NjQgb3ZlcmZsb3cgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBhbW91bnQgZXhjZWVkaW5nIHU2NCBtYXggb24gRGVwb3NpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjdEJ1aWxkZXIoKTtcbiAgICAgIGJ1aWxkZXIuY29uZmlkZW50aWFsRGVwb3NpdCh7XG4gICAgICAgIHRva2VuQWRkcmVzcyxcbiAgICAgICAgbWludEFkZHJlc3MsXG4gICAgICAgIGF1dGhvcml0eUFkZHJlc3MsXG4gICAgICAgIGFtb3VudDogJzE4NDQ2NzQ0MDczNzA5NTUxNjE2JywgLy8gMl42NFxuICAgICAgICBkZWNpbWFsczogNixcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgYW1vdW50OiB2YWx1ZSBleGNlZWRzIHU2NCBtYXgvKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFtb3VudCBhdCB1NjQgbWF4IG9uIERlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBidWlsZGVyID0gY3RCdWlsZGVyKCk7XG4gICAgICBidWlsZGVyLmNvbmZpZGVudGlhbERlcG9zaXQoe1xuICAgICAgICB0b2tlbkFkZHJlc3MsXG4gICAgICAgIG1pbnRBZGRyZXNzLFxuICAgICAgICBhdXRob3JpdHlBZGRyZXNzLFxuICAgICAgICBhbW91bnQ6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIC8vIDJeNjQgLSAxXG4gICAgICAgIGRlY2ltYWxzOiA2LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgZGF0YSA9IHNvbFR4KHR4KS5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgICAgIGRhdGEucmVhZEJpZ1VJbnQ2NExFKDIpLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgY291bnRlciBleGNlZWRpbmcgdTY0IG1heCBvbiBDb25maWd1cmVBY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRlciA9IGN0QnVpbGRlcigpO1xuICAgICAgYnVpbGRlci5jb25maWd1cmVBY2NvdW50KHtcbiAgICAgICAgdG9rZW5BZGRyZXNzLFxuICAgICAgICBtaW50QWRkcmVzcyxcbiAgICAgICAgYXV0aG9yaXR5QWRkcmVzcyxcbiAgICAgICAgZGVjcnlwdGFibGVaZXJvQmFsYW5jZTogemVyb0J5dGVzMzYsXG4gICAgICAgIG1heGltdW1QZW5kaW5nQmFsYW5jZUNyZWRpdENvdW50ZXI6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNicsIC8vIDJeNjRcbiAgICAgICAgcHJvb2ZJbnN0cnVjdGlvbk9mZnNldDogMSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoL0ludmFsaWQgbWF4aW11bVBlbmRpbmdCYWxhbmNlQ3JlZGl0Q291bnRlcjogdmFsdWUgZXhjZWVkcyB1NjQgbWF4Lyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=