@bitgo-beta/sdk-coin-sol 7.6.4-beta.76 → 7.6.4-beta.761

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 (541) 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 +538 -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 +1119 -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 +143 -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/solToken.d.ts.map +1 -0
  185. package/dist/cjs/test/unit/solToken.js +37 -0
  186. package/dist/cjs/test/unit/token2022Resolve.d.ts +2 -0
  187. package/dist/cjs/test/unit/token2022Resolve.d.ts.map +1 -0
  188. package/dist/cjs/test/unit/token2022Resolve.js +252 -0
  189. package/dist/cjs/test/unit/tokenExtensions.d.ts +2 -0
  190. package/dist/cjs/test/unit/tokenExtensions.d.ts.map +1 -0
  191. package/dist/cjs/test/unit/tokenExtensions.js +73 -0
  192. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  193. package/dist/cjs/test/unit/transaction.js +1129 -0
  194. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  195. package/dist/cjs/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  196. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  197. package/dist/cjs/test/unit/transactionBuilder/ataInitBuilder.js +508 -0
  198. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts +2 -0
  199. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.d.ts.map +1 -0
  200. package/dist/cjs/test/unit/transactionBuilder/closeAtaBuilder.js +343 -0
  201. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts +2 -0
  202. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.d.ts.map +1 -0
  203. package/dist/cjs/test/unit/transactionBuilder/computeUnitLimit.js +346 -0
  204. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts +2 -0
  205. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.d.ts.map +1 -0
  206. package/dist/cjs/test/unit/transactionBuilder/confidentialEnablementV1.js +124 -0
  207. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts +2 -0
  208. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.d.ts.map +1 -0
  209. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferBuilder.js +922 -0
  210. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts +2 -0
  211. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.d.ts.map +1 -0
  212. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1.js +194 -0
  213. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts +2 -0
  214. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.d.ts.map +1 -0
  215. package/dist/cjs/test/unit/transactionBuilder/confidentialTransferV1Ops.js +168 -0
  216. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/transactionBuilder/customInstructionBuilder.js +724 -0
  218. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  219. package/dist/cjs/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  220. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  221. package/dist/cjs/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  222. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  224. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  225. package/dist/cjs/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  226. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  227. package/dist/cjs/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  228. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/transactionBuilder/tokenTransferBuilder.js +926 -0
  230. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  231. package/dist/cjs/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  232. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  233. package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +302 -0
  234. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  235. package/dist/cjs/test/unit/transactionBuilder/transferBuilderV2.js +910 -0
  236. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts +2 -0
  237. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/transactionBuilder/v1PaymentBuilder.js +138 -0
  239. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts +2 -0
  240. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/transactionBuilder/v1TransactionBuilder.js +331 -0
  242. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  243. package/dist/cjs/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  244. package/dist/{test → cjs/test}/unit/utils.d.ts.map +1 -1
  245. package/dist/cjs/test/unit/utils.js +663 -0
  246. package/dist/cjs/test/unit/versionedTransaction.d.ts.map +1 -0
  247. package/dist/cjs/test/unit/versionedTransaction.js +207 -0
  248. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  249. package/dist/esm/bigint-buffer-guard.d.ts +1 -0
  250. package/dist/esm/index.d.ts +7 -0
  251. package/dist/esm/index.js +7 -0
  252. package/dist/esm/lib/ataInitializationBuilder.d.ts +58 -0
  253. package/dist/esm/lib/ataInitializationBuilder.d.ts.map +1 -0
  254. package/dist/esm/lib/ataInitializationBuilder.js +191 -0
  255. package/dist/esm/lib/closeAtaBuilder.d.ts +55 -0
  256. package/dist/esm/lib/closeAtaBuilder.d.ts.map +1 -0
  257. package/dist/esm/lib/closeAtaBuilder.js +155 -0
  258. package/dist/esm/lib/confidentialTransferBuilder.d.ts +136 -0
  259. package/dist/esm/lib/confidentialTransferBuilder.d.ts.map +1 -0
  260. package/dist/esm/lib/confidentialTransferBuilder.js +368 -0
  261. package/dist/esm/lib/constants.d.ts +235 -0
  262. package/dist/esm/lib/constants.d.ts.map +1 -0
  263. package/dist/esm/lib/constants.js +274 -0
  264. package/dist/esm/lib/customInstructionBuilder.d.ts +83 -0
  265. package/dist/{src → esm}/lib/customInstructionBuilder.d.ts.map +1 -1
  266. package/dist/esm/lib/customInstructionBuilder.js +385 -0
  267. package/dist/esm/lib/explainTransactionWasm.d.ts +21 -0
  268. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  269. package/dist/esm/lib/explainTransactionWasm.js +301 -0
  270. package/dist/esm/lib/iface.d.ts +538 -0
  271. package/dist/esm/lib/iface.d.ts.map +1 -0
  272. package/dist/esm/lib/iface.js +3 -0
  273. package/dist/esm/lib/index.d.ts +31 -0
  274. package/dist/esm/lib/index.d.ts.map +1 -0
  275. package/dist/esm/lib/index.js +31 -0
  276. package/dist/esm/lib/instructionParamsFactory.d.ts +14 -0
  277. package/dist/esm/lib/instructionParamsFactory.d.ts.map +1 -0
  278. package/dist/esm/lib/instructionParamsFactory.js +1276 -0
  279. package/dist/esm/lib/jitoStakePoolOperations.d.ts +113 -0
  280. package/dist/esm/lib/jitoStakePoolOperations.js +189 -0
  281. package/dist/esm/lib/keyPair.d.ts +32 -0
  282. package/dist/esm/lib/keyPair.d.ts.map +1 -0
  283. package/dist/esm/lib/keyPair.js +75 -0
  284. package/dist/esm/lib/messages/index.d.ts +2 -0
  285. package/dist/esm/lib/messages/index.js +2 -0
  286. package/dist/esm/lib/messages/messageBuilderFactory.d.ts +7 -0
  287. package/dist/{src → esm}/lib/messages/messageBuilderFactory.js +5 -9
  288. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts +25 -0
  289. package/dist/esm/lib/recoverNestedAtaBuilder.d.ts.map +1 -0
  290. package/dist/esm/lib/recoverNestedAtaBuilder.js +83 -0
  291. package/dist/esm/lib/scaledUiAmount.d.ts +30 -0
  292. package/dist/esm/lib/scaledUiAmount.d.ts.map +1 -0
  293. package/dist/esm/lib/scaledUiAmount.js +108 -0
  294. package/dist/esm/lib/serialization/codecs/v1/config.d.ts +21 -0
  295. package/dist/esm/lib/serialization/codecs/v1/config.d.ts.map +1 -0
  296. package/dist/esm/lib/serialization/codecs/v1/config.js +30 -0
  297. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts +14 -0
  298. package/dist/esm/lib/serialization/codecs/v1/instruction.d.ts.map +1 -0
  299. package/dist/esm/lib/serialization/codecs/v1/instruction.js +29 -0
  300. package/dist/esm/lib/serialization/codecs/v1/message.d.ts +27 -0
  301. package/dist/esm/lib/serialization/codecs/v1/message.d.ts.map +1 -0
  302. package/dist/esm/lib/serialization/codecs/v1/message.js +188 -0
  303. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts +36 -0
  304. package/dist/esm/lib/serialization/compileTransactionMessage.d.ts.map +1 -0
  305. package/dist/esm/lib/serialization/compileTransactionMessage.js +208 -0
  306. package/dist/esm/lib/serialization/index.d.ts +5 -0
  307. package/dist/esm/lib/serialization/index.d.ts.map +1 -0
  308. package/dist/esm/lib/serialization/index.js +5 -0
  309. package/dist/esm/lib/serialization/parseWireTransaction.d.ts +9 -0
  310. package/dist/esm/lib/serialization/parseWireTransaction.d.ts.map +1 -0
  311. package/dist/esm/lib/serialization/parseWireTransaction.js +50 -0
  312. package/dist/esm/lib/serialization/wire-transaction.d.ts +14 -0
  313. package/dist/esm/lib/serialization/wire-transaction.d.ts.map +1 -0
  314. package/dist/esm/lib/serialization/wire-transaction.js +48 -0
  315. package/dist/esm/lib/solInstructionFactory.d.ts +10 -0
  316. package/dist/esm/lib/solInstructionFactory.d.ts.map +1 -0
  317. package/dist/esm/lib/solInstructionFactory.js +1113 -0
  318. package/dist/esm/lib/stakingActivateBuilder.d.ts +59 -0
  319. package/dist/{src → esm}/lib/stakingActivateBuilder.d.ts.map +1 -1
  320. package/dist/esm/lib/stakingActivateBuilder.js +122 -0
  321. package/dist/esm/lib/stakingAuthorizeBuilder.d.ts +43 -0
  322. package/dist/esm/lib/stakingAuthorizeBuilder.js +82 -0
  323. package/dist/esm/lib/stakingDeactivateBuilder.d.ts +81 -0
  324. package/dist/{src → esm}/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  325. package/dist/esm/lib/stakingDeactivateBuilder.js +207 -0
  326. package/dist/esm/lib/stakingDelegateBuilder.d.ts +42 -0
  327. package/dist/{src → esm}/lib/stakingDelegateBuilder.d.ts.map +1 -1
  328. package/dist/esm/lib/stakingDelegateBuilder.js +119 -0
  329. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.d.ts +33 -0
  330. package/dist/esm/lib/stakingRawMsgAuthorizeBuilder.js +103 -0
  331. package/dist/esm/lib/stakingWithdrawBuilder.d.ts +31 -0
  332. package/dist/{src → esm}/lib/stakingWithdrawBuilder.d.ts.map +1 -1
  333. package/dist/esm/lib/stakingWithdrawBuilder.js +80 -0
  334. package/dist/esm/lib/token2022Resolve.d.ts +106 -0
  335. package/dist/esm/lib/token2022Resolve.d.ts.map +1 -0
  336. package/dist/esm/lib/token2022Resolve.js +194 -0
  337. package/dist/esm/lib/tokenExtensions.d.ts +26 -0
  338. package/dist/esm/lib/tokenExtensions.d.ts.map +1 -0
  339. package/dist/esm/lib/tokenExtensions.js +103 -0
  340. package/dist/esm/lib/tokenTransferBuilder.d.ts +67 -0
  341. package/dist/esm/lib/tokenTransferBuilder.d.ts.map +1 -0
  342. package/dist/esm/lib/tokenTransferBuilder.js +230 -0
  343. package/dist/esm/lib/transaction.d.ts +148 -0
  344. package/dist/esm/lib/transaction.d.ts.map +1 -0
  345. package/dist/esm/lib/transaction.js +754 -0
  346. package/dist/esm/lib/transactionBuilder.d.ts +169 -0
  347. package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
  348. package/dist/esm/lib/transactionBuilder.js +455 -0
  349. package/dist/esm/lib/transactionBuilderFactory.d.ts +152 -0
  350. package/dist/esm/lib/transactionBuilderFactory.d.ts.map +1 -0
  351. package/dist/esm/lib/transactionBuilderFactory.js +245 -0
  352. package/dist/esm/lib/transferBuilder.d.ts +26 -0
  353. package/dist/{src → esm}/lib/transferBuilder.d.ts.map +1 -1
  354. package/dist/esm/lib/transferBuilder.js +74 -0
  355. package/dist/esm/lib/transferBuilderV2.d.ts +69 -0
  356. package/dist/esm/lib/transferBuilderV2.d.ts.map +1 -0
  357. package/dist/esm/lib/transferBuilderV2.js +245 -0
  358. package/dist/esm/lib/utils.d.ts +216 -0
  359. package/dist/{src → esm}/lib/utils.d.ts.map +1 -1
  360. package/dist/esm/lib/utils.js +642 -0
  361. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts +29 -0
  362. package/dist/esm/lib/v1CustomInstructionBuilder.d.ts.map +1 -0
  363. package/dist/esm/lib/v1CustomInstructionBuilder.js +32 -0
  364. package/dist/esm/lib/v1PaymentBuilder.d.ts +36 -0
  365. package/dist/esm/lib/v1PaymentBuilder.d.ts.map +1 -0
  366. package/dist/esm/lib/v1PaymentBuilder.js +63 -0
  367. package/dist/esm/lib/v1TransactionBuilder.d.ts +253 -0
  368. package/dist/esm/lib/v1TransactionBuilder.d.ts.map +1 -0
  369. package/dist/esm/lib/v1TransactionBuilder.js +591 -0
  370. package/dist/esm/lib/walletInitializationBuilder.d.ts +26 -0
  371. package/dist/esm/lib/walletInitializationBuilder.js +64 -0
  372. package/dist/esm/register.d.ts +5 -0
  373. package/dist/esm/register.d.ts.map +1 -0
  374. package/dist/esm/register.js +24 -0
  375. package/dist/esm/sol.d.ts +351 -0
  376. package/dist/esm/sol.d.ts.map +1 -0
  377. package/dist/esm/sol.js +1666 -0
  378. package/dist/esm/solToken.d.ts +44 -0
  379. package/dist/esm/solToken.d.ts.map +1 -0
  380. package/dist/esm/solToken.js +75 -0
  381. package/dist/esm/tsol.d.ts +11 -0
  382. package/dist/esm/tsol.js +20 -0
  383. package/package.json +37 -17
  384. package/dist/src/config/token2022StaticConfig.d.ts +0 -3
  385. package/dist/src/config/token2022StaticConfig.d.ts.map +0 -1
  386. package/dist/src/config/token2022StaticConfig.js +0 -50
  387. package/dist/src/lib/ataInitializationBuilder.d.ts.map +0 -1
  388. package/dist/src/lib/ataInitializationBuilder.js +0 -196
  389. package/dist/src/lib/closeAtaBuilder.d.ts +0 -19
  390. package/dist/src/lib/closeAtaBuilder.d.ts.map +0 -1
  391. package/dist/src/lib/closeAtaBuilder.js +0 -69
  392. package/dist/src/lib/constants.d.ts.map +0 -1
  393. package/dist/src/lib/constants.js +0 -171
  394. package/dist/src/lib/customInstructionBuilder.js +0 -289
  395. package/dist/src/lib/iface.d.ts +0 -244
  396. package/dist/src/lib/iface.d.ts.map +0 -1
  397. package/dist/src/lib/iface.js +0 -7
  398. package/dist/src/lib/index.d.ts.map +0 -1
  399. package/dist/src/lib/index.js +0 -77
  400. package/dist/src/lib/instructionParamsFactory.d.ts.map +0 -1
  401. package/dist/src/lib/instructionParamsFactory.js +0 -1036
  402. package/dist/src/lib/jitoStakePoolOperations.js +0 -200
  403. package/dist/src/lib/keyPair.d.ts.map +0 -1
  404. package/dist/src/lib/keyPair.js +0 -63
  405. package/dist/src/lib/solInstructionFactory.d.ts.map +0 -1
  406. package/dist/src/lib/solInstructionFactory.js +0 -572
  407. package/dist/src/lib/stakingActivateBuilder.js +0 -120
  408. package/dist/src/lib/stakingAuthorizeBuilder.js +0 -89
  409. package/dist/src/lib/stakingDeactivateBuilder.js +0 -208
  410. package/dist/src/lib/stakingDelegateBuilder.js +0 -120
  411. package/dist/src/lib/stakingRawMsgAuthorizeBuilder.js +0 -110
  412. package/dist/src/lib/stakingWithdrawBuilder.js +0 -78
  413. package/dist/src/lib/token2022Config.d.ts +0 -44
  414. package/dist/src/lib/token2022Config.d.ts.map +0 -1
  415. package/dist/src/lib/token2022Config.js +0 -27
  416. package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
  417. package/dist/src/lib/tokenTransferBuilder.js +0 -188
  418. package/dist/src/lib/transaction.d.ts.map +0 -1
  419. package/dist/src/lib/transaction.js +0 -595
  420. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  421. package/dist/src/lib/transactionBuilder.js +0 -380
  422. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  423. package/dist/src/lib/transactionBuilderFactory.js +0 -202
  424. package/dist/src/lib/transferBuilder.js +0 -70
  425. package/dist/src/lib/transferBuilderV2.d.ts +0 -43
  426. package/dist/src/lib/transferBuilderV2.d.ts.map +0 -1
  427. package/dist/src/lib/transferBuilderV2.js +0 -210
  428. package/dist/src/lib/utils.js +0 -589
  429. package/dist/src/lib/walletInitializationBuilder.js +0 -71
  430. package/dist/src/register.d.ts +0 -3
  431. package/dist/src/register.d.ts.map +0 -1
  432. package/dist/src/register.js +0 -15
  433. package/dist/src/sol.d.ts.map +0 -1
  434. package/dist/src/sol.js +0 -1324
  435. package/dist/src/solToken.d.ts.map +0 -1
  436. package/dist/src/solToken.js +0 -69
  437. package/dist/src/tsol.js +0 -24
  438. package/dist/test/fixtures/sol.js +0 -1433
  439. package/dist/test/resources/sol.d.ts.map +0 -1
  440. package/dist/test/resources/sol.js +0 -320
  441. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +0 -1
  442. package/dist/test/unit/fixtures/solBackupKey.js +0 -8
  443. package/dist/test/unit/getBuilderFactory.d.ts.map +0 -1
  444. package/dist/test/unit/getBuilderFactory.js +0 -10
  445. package/dist/test/unit/instructionParamsFactory.d.ts.map +0 -1
  446. package/dist/test/unit/instructionParamsFactory.js +0 -412
  447. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +0 -1
  448. package/dist/test/unit/instructionParamsFactory.staking.js +0 -1059
  449. package/dist/test/unit/keyPair.js +0 -177
  450. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +0 -1
  451. package/dist/test/unit/messages/messageBuilderFactory.js +0 -118
  452. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +0 -1
  453. package/dist/test/unit/messages/simpleMessageBuilder.js +0 -194
  454. package/dist/test/unit/sol.js +0 -3180
  455. package/dist/test/unit/solInstructionFactory.d.ts.map +0 -1
  456. package/dist/test/unit/solInstructionFactory.js +0 -454
  457. package/dist/test/unit/solToken.d.ts.map +0 -1
  458. package/dist/test/unit/solToken.js +0 -31
  459. package/dist/test/unit/transaction.d.ts.map +0 -1
  460. package/dist/test/unit/transaction.js +0 -983
  461. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +0 -1
  462. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +0 -202
  463. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +0 -1
  464. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +0 -471
  465. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +0 -1
  466. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +0 -413
  467. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +0 -1
  468. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +0 -430
  469. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +0 -1
  470. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +0 -157
  471. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +0 -1
  472. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +0 -384
  473. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +0 -1
  474. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +0 -224
  475. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -1
  476. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +0 -259
  477. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +0 -1
  478. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +0 -787
  479. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +0 -1
  480. package/dist/test/unit/transactionBuilder/transactionBuilder.js +0 -495
  481. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +0 -1
  482. package/dist/test/unit/transactionBuilder/transferBuilder.js +0 -286
  483. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +0 -1
  484. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +0 -862
  485. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +0 -1
  486. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +0 -259
  487. package/dist/test/unit/utils.js +0 -517
  488. package/dist/test/unit/versionedTransaction.d.ts.map +0 -1
  489. package/dist/test/unit/versionedTransaction.js +0 -207
  490. package/dist/tsconfig.tsbuildinfo +0 -1
  491. /package/dist/{src → cjs/src}/bigint-buffer-guard.d.ts +0 -0
  492. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  493. /package/dist/{src → cjs/src}/lib/jitoStakePoolOperations.d.ts +0 -0
  494. /package/dist/{src → cjs/src}/lib/messages/index.d.ts +0 -0
  495. /package/dist/{src → cjs/src}/lib/messages/messageBuilderFactory.d.ts +0 -0
  496. /package/dist/{src → cjs/src}/lib/stakingActivateBuilder.d.ts +0 -0
  497. /package/dist/{src → cjs/src}/lib/stakingAuthorizeBuilder.d.ts +0 -0
  498. /package/dist/{src → cjs/src}/lib/stakingDeactivateBuilder.d.ts +0 -0
  499. /package/dist/{src → cjs/src}/lib/stakingDelegateBuilder.d.ts +0 -0
  500. /package/dist/{src → cjs/src}/lib/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  501. /package/dist/{src → cjs/src}/lib/stakingWithdrawBuilder.d.ts +0 -0
  502. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  503. /package/dist/{src → cjs/src}/lib/walletInitializationBuilder.d.ts +0 -0
  504. /package/dist/{src → cjs/src}/tsol.d.ts +0 -0
  505. /package/dist/{test → cjs/test}/fixtures/sol.d.ts +0 -0
  506. /package/dist/{test → cjs/test}/unit/fixtures/solBackupKey.d.ts +0 -0
  507. /package/dist/{test → cjs/test}/unit/getBuilderFactory.d.ts +0 -0
  508. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.d.ts +0 -0
  509. /package/dist/{test → cjs/test}/unit/instructionParamsFactory.staking.d.ts +0 -0
  510. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  511. /package/dist/{test → cjs/test}/unit/messages/messageBuilderFactory.d.ts +0 -0
  512. /package/dist/{test → cjs/test}/unit/messages/simpleMessageBuilder.d.ts +0 -0
  513. /package/dist/{test → cjs/test}/unit/sol.d.ts +0 -0
  514. /package/dist/{test → cjs/test}/unit/solInstructionFactory.d.ts +0 -0
  515. /package/dist/{test → cjs/test}/unit/solToken.d.ts +0 -0
  516. /package/dist/{test → cjs/test}/unit/transaction.d.ts +0 -0
  517. /package/dist/{test → cjs/test}/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +0 -0
  518. /package/dist/{test → cjs/test}/unit/transactionBuilder/ataInitBuilder.d.ts +0 -0
  519. /package/dist/{test → cjs/test}/unit/transactionBuilder/customInstructionBuilder.d.ts +0 -0
  520. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingActivateBuilder.d.ts +0 -0
  521. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +0 -0
  522. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +0 -0
  523. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingDelegateBuilder.d.ts +0 -0
  524. /package/dist/{test → cjs/test}/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +0 -0
  525. /package/dist/{test → cjs/test}/unit/transactionBuilder/tokenTransferBuilder.d.ts +0 -0
  526. /package/dist/{test → cjs/test}/unit/transactionBuilder/transactionBuilder.d.ts +0 -0
  527. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilder.d.ts +0 -0
  528. /package/dist/{test → cjs/test}/unit/transactionBuilder/transferBuilderV2.d.ts +0 -0
  529. /package/dist/{test → cjs/test}/unit/transactionBuilder/walletInitBuilder.d.ts +0 -0
  530. /package/dist/{test → cjs/test}/unit/utils.d.ts +0 -0
  531. /package/dist/{test → cjs/test}/unit/versionedTransaction.d.ts +0 -0
  532. /package/dist/{src → esm}/bigint-buffer-guard.d.ts.map +0 -0
  533. /package/dist/{src → esm}/bigint-buffer-guard.js +0 -0
  534. /package/dist/{src → esm}/index.d.ts.map +0 -0
  535. /package/dist/{src → esm}/lib/jitoStakePoolOperations.d.ts.map +0 -0
  536. /package/dist/{src → esm}/lib/messages/index.d.ts.map +0 -0
  537. /package/dist/{src → esm}/lib/messages/messageBuilderFactory.d.ts.map +0 -0
  538. /package/dist/{src → esm}/lib/stakingAuthorizeBuilder.d.ts.map +0 -0
  539. /package/dist/{src → esm}/lib/stakingRawMsgAuthorizeBuilder.d.ts.map +0 -0
  540. /package/dist/{src → esm}/lib/walletInitializationBuilder.d.ts.map +0 -0
  541. /package/dist/{src → esm}/tsol.d.ts.map +0 -0
@@ -0,0 +1,1129 @@
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 assert_1 = __importDefault(require("assert"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const statics_1 = require("@bitgo-beta/statics");
42
+ const lib_1 = require("../../src/lib");
43
+ const testData = __importStar(require("../resources/sol"));
44
+ const web3_js_1 = require("@solana/web3.js");
45
+ const getBuilderFactory_1 = require("./getBuilderFactory");
46
+ describe('Sol Transaction', () => {
47
+ const coin = statics_1.coins.get('tsol');
48
+ describe('toJson should', () => {
49
+ it('throw empty transaction', () => {
50
+ const tx = new lib_1.Transaction(coin);
51
+ assert_1.default.throws(() => tx.toJson(), /Empty transaction/);
52
+ assert_1.default.throws(() => tx.toBroadcastFormat(), /Empty transaction/);
53
+ });
54
+ it('throw for toJson of empty tx', () => {
55
+ const tx = new lib_1.Transaction(coin);
56
+ (0, should_1.default)(() => tx.toJson()).throwError('Empty transaction');
57
+ tx.solTransaction = new web3_js_1.Transaction();
58
+ tx.solTransaction.recentBlockhash = testData.blockHashes.validBlockHashes[0];
59
+ (0, should_1.default)(() => tx.toJson()).throwError('Invalid transaction, transaction type not supported: undefined');
60
+ });
61
+ it('succeed for a unsigned transfer tx', () => {
62
+ const tx = new lib_1.Transaction(coin);
63
+ tx.fromRawTransaction(testData.TRANSFER_UNSIGNED_TX_WITH_MEMO_AND_DURABLE_NONCE);
64
+ tx.signature.should.be.empty();
65
+ const txJson = tx.toJson();
66
+ txJson.should.have.properties(['id', 'feePayer', 'nonce', 'numSignatures', 'instructionsData']);
67
+ txJson.id?.should.equal(undefined);
68
+ txJson.feePayer?.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
69
+ txJson.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
70
+ txJson.numSignatures.should.equal(0);
71
+ txJson.instructionsData.length.should.equal(3);
72
+ txJson.lamportsPerSignature?.should.be.undefined();
73
+ txJson.instructionsData.should.deepEqual([
74
+ {
75
+ type: 'NonceAdvance',
76
+ params: {
77
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
78
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
79
+ },
80
+ },
81
+ {
82
+ type: 'Transfer',
83
+ params: {
84
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
85
+ toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
86
+ amount: '300000',
87
+ },
88
+ },
89
+ {
90
+ type: 'Memo',
91
+ params: {
92
+ memo: 'test memo',
93
+ },
94
+ },
95
+ ]);
96
+ });
97
+ it('succeed for a multi transfer tx', () => {
98
+ const tx = new lib_1.Transaction(coin);
99
+ tx.fromRawTransaction(testData.MULTI_TRANSFER_SIGNED);
100
+ const txJson = tx.toJson();
101
+ txJson.should.have.properties(['id', 'feePayer', 'nonce', 'numSignatures', 'instructionsData']);
102
+ txJson.id?.should.equal('TPVcc18CYxPnM3eRgQhdb6V6ZLa34Dv3dU7MtvKPuy5ZPKLM1uZPFFEmF2m184PTWKRZ1Uq6NKFZWwr2krKk63f');
103
+ tx.signature.should.deepEqual([
104
+ 'TPVcc18CYxPnM3eRgQhdb6V6ZLa34Dv3dU7MtvKPuy5ZPKLM1uZPFFEmF2m184PTWKRZ1Uq6NKFZWwr2krKk63f',
105
+ ]);
106
+ txJson.feePayer?.should.equal('5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe');
107
+ txJson.nonce.should.equal('GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi');
108
+ txJson.numSignatures.should.equal(1);
109
+ txJson.lamportsPerSignature?.should.be.undefined();
110
+ txJson.instructionsData.length.should.equal(8);
111
+ txJson.instructionsData.should.deepEqual([
112
+ {
113
+ type: 'NonceAdvance',
114
+ params: {
115
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
116
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
117
+ },
118
+ },
119
+ {
120
+ type: 'Transfer',
121
+ params: {
122
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
123
+ toAddress: 'CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S',
124
+ amount: '300000',
125
+ },
126
+ },
127
+ {
128
+ type: 'Transfer',
129
+ params: {
130
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
131
+ toAddress: '6B55XMiaS6tUZw5Tt3G1RaXAqdrvN38yXVDJmWvKLkiM',
132
+ amount: '300000',
133
+ },
134
+ },
135
+ {
136
+ type: 'Transfer',
137
+ params: {
138
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
139
+ toAddress: 'C1UjpxcXNBpp1UyvYsuNBNZ5Da1G1i49g3yTvC23Ny7e',
140
+ amount: '300000',
141
+ },
142
+ },
143
+ {
144
+ type: 'Transfer',
145
+ params: {
146
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
147
+ toAddress: 'CpUYXh9xXoWfkBVaBQRZ8nAgDbT16GZeQdqveeBS1hmk',
148
+ amount: '300000',
149
+ },
150
+ },
151
+ {
152
+ type: 'Transfer',
153
+ params: {
154
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
155
+ toAddress: '64s6NjmEokdhicHEd432X5Ut2EDfDmVqdvGh4rASn1gd',
156
+ amount: '300000',
157
+ },
158
+ },
159
+ {
160
+ type: 'Transfer',
161
+ params: {
162
+ fromAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
163
+ toAddress: '6nXxL2jMSdkgfHm13Twvn1gzRAPdrWnWLfu89PJL3Aqe',
164
+ amount: '300000',
165
+ },
166
+ },
167
+ {
168
+ type: 'Memo',
169
+ params: {
170
+ memo: 'test memo',
171
+ },
172
+ },
173
+ ]);
174
+ });
175
+ });
176
+ describe('sign should', () => {
177
+ it('fail if the tx doesnt have nonce', async () => {
178
+ const tx = new lib_1.Transaction(coin);
179
+ tx.solTransaction = new web3_js_1.Transaction();
180
+ tx.solTransaction.feePayer = new web3_js_1.PublicKey(testData.authAccount.pub);
181
+ const kp = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
182
+ await tx.sign(kp).should.be.rejectedWith('Nonce is required before signing');
183
+ });
184
+ it('fail if the tx doesnt have feePayer', async () => {
185
+ const tx = new lib_1.Transaction(coin);
186
+ const kp = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
187
+ tx.solTransaction = new web3_js_1.Transaction();
188
+ tx.solTransaction.recentBlockhash = testData.blockHashes.validBlockHashes[0];
189
+ await tx.sign(kp).should.be.rejectedWith('feePayer is required before signing');
190
+ });
191
+ it('fail if the KeyPair is not the right one', async () => {
192
+ const tx = new lib_1.Transaction(coin);
193
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
194
+ const keypair = new lib_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 });
195
+ await tx.sign(keypair).should.be.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
196
+ });
197
+ it('fail if the KeyPair doesnt have a prv key', async () => {
198
+ const tx = new lib_1.Transaction(coin);
199
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
200
+ const keypair = new lib_1.KeyPair({ pub: testData.pubKeys.validPubKeys[0] });
201
+ await tx.sign(keypair).should.be.rejectedWith('Missing private key');
202
+ });
203
+ it('succeed to sign with 1 KeyPair', async () => {
204
+ const tx = new lib_1.Transaction(coin);
205
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
206
+ const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
207
+ await tx.sign(keypair).should.be.fulfilled();
208
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
209
+ });
210
+ it('succeed when try to sign with the same keyPair multiple times ', async () => {
211
+ const tx = new lib_1.Transaction(coin);
212
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
213
+ const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
214
+ await tx.sign([keypair, keypair, keypair, keypair]).should.be.fulfilled();
215
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
216
+ });
217
+ it('succeed when try to sign with a keyPair that already signed', async () => {
218
+ const tx = new lib_1.Transaction(coin);
219
+ tx.fromRawTransaction(testData.RAW_TX_SIGNED);
220
+ const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
221
+ await tx.sign(keypair).should.be.fulfilled();
222
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
223
+ });
224
+ });
225
+ describe('addFeePayerSignature should', () => {
226
+ it('fill the signature slot of the fee payer (account 0) of a legacy transaction', () => {
227
+ const tx = new lib_1.Transaction(coin);
228
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
229
+ // accountWithSeed is the fee payer of RAW_TX_UNSIGNED; take its real signature from the signed fixture
230
+ const signed = web3_js_1.Transaction.from(Buffer.from(testData.RAW_TX_SIGNED, 'base64'));
231
+ const feePayerSignature = signed.signatures[0].signature;
232
+ should_1.default.exist(feePayerSignature);
233
+ tx.addFeePayerSignature({ pub: testData.accountWithSeed.publicKey }, feePayerSignature);
234
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
235
+ });
236
+ it('fail for a key that is not account 0', () => {
237
+ const tx = new lib_1.Transaction(coin);
238
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
239
+ (0, should_1.default)(() => tx.addFeePayerSignature({ pub: testData.authAccount.pub }, Buffer.alloc(64))).throwError(/account 0 of the message/);
240
+ });
241
+ it('fail on an unbuilt transaction', () => {
242
+ const tx = new lib_1.Transaction(coin);
243
+ (0, should_1.default)(() => tx.addFeePayerSignature({ pub: testData.authAccount.pub }, Buffer.alloc(64))).throwError('Fee payer signature requires a built transaction');
244
+ });
245
+ });
246
+ describe('transaction parsing', function () {
247
+ it('fromRawTransaction and toBroadcastFormat', async function () {
248
+ const tx = new lib_1.Transaction(coin);
249
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
250
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_UNSIGNED);
251
+ });
252
+ it('fromRawTransaction, sign and toBroadcastFormat ', async function () {
253
+ const tx = new lib_1.Transaction(coin);
254
+ tx.fromRawTransaction(testData.RAW_TX_UNSIGNED);
255
+ const keypair = new lib_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
256
+ await tx.sign(keypair);
257
+ should_1.default.equal(tx.toBroadcastFormat(), testData.RAW_TX_SIGNED);
258
+ });
259
+ });
260
+ describe('explain transaction', function () {
261
+ const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
262
+ const blockHash = testData.blockHashes.validBlockHashes[0];
263
+ const sender = testData.authAccount.pub;
264
+ const address = testData.addresses.validAddresses[0];
265
+ const amount = '10000';
266
+ const wallet = new lib_1.KeyPair(testData.authAccount).getKeys();
267
+ const stakeAccount = new lib_1.KeyPair(testData.stakeAccount).getKeys();
268
+ const validator = testData.validator;
269
+ it('should explain single transfer transaction', async function () {
270
+ const tx = await factory
271
+ .getTransferBuilder()
272
+ .nonce(blockHash)
273
+ .sender(sender)
274
+ .send({ address, amount })
275
+ .fee({ amount: 5000 })
276
+ .build();
277
+ const explainedTransaction = tx.explainTransaction();
278
+ explainedTransaction.should.deepEqual({
279
+ displayOrder: [
280
+ 'id',
281
+ 'type',
282
+ 'blockhash',
283
+ 'durableNonce',
284
+ 'outputAmount',
285
+ 'changeAmount',
286
+ 'outputs',
287
+ 'changeOutputs',
288
+ 'tokenEnablements',
289
+ 'fee',
290
+ 'memo',
291
+ ],
292
+ id: 'UNAVAILABLE',
293
+ type: 'Send',
294
+ changeOutputs: [],
295
+ changeAmount: '0',
296
+ outputAmount: '10000',
297
+ outputs: [
298
+ {
299
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
300
+ amount: '10000',
301
+ },
302
+ ],
303
+ inputs: [
304
+ {
305
+ address: sender,
306
+ value: '10000',
307
+ },
308
+ ],
309
+ feePayer: sender,
310
+ fee: {
311
+ fee: '5000',
312
+ feeRate: 5000,
313
+ },
314
+ memo: undefined,
315
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
316
+ durableNonce: undefined,
317
+ tokenEnablements: [],
318
+ ataOwnerMap: {},
319
+ });
320
+ });
321
+ it('should explain single transfer with durable nonce transaction', async function () {
322
+ const tx = await factory
323
+ .getTransferBuilder()
324
+ .nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
325
+ .sender(sender)
326
+ .send({ address, amount })
327
+ .build();
328
+ const explainedTransaction = tx.explainTransaction();
329
+ explainedTransaction.should.deepEqual({
330
+ displayOrder: [
331
+ 'id',
332
+ 'type',
333
+ 'blockhash',
334
+ 'durableNonce',
335
+ 'outputAmount',
336
+ 'changeAmount',
337
+ 'outputs',
338
+ 'changeOutputs',
339
+ 'tokenEnablements',
340
+ 'fee',
341
+ 'memo',
342
+ ],
343
+ id: 'UNAVAILABLE',
344
+ type: 'Send',
345
+ changeOutputs: [],
346
+ changeAmount: '0',
347
+ outputAmount: '10000',
348
+ outputs: [
349
+ {
350
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
351
+ amount: '10000',
352
+ },
353
+ ],
354
+ inputs: [
355
+ {
356
+ address: sender,
357
+ value: '10000',
358
+ },
359
+ ],
360
+ feePayer: sender,
361
+ fee: {
362
+ fee: '0',
363
+ feeRate: undefined,
364
+ },
365
+ memo: undefined,
366
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
367
+ durableNonce: {
368
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
369
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
370
+ },
371
+ tokenEnablements: [],
372
+ ataOwnerMap: {},
373
+ });
374
+ });
375
+ it('should explain multi transfer with durable nonce and memo transaction', async function () {
376
+ const tx = await factory
377
+ .getTransferBuilder()
378
+ .nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
379
+ .sender(sender)
380
+ .memo('memo text')
381
+ .send({ address, amount })
382
+ .send({ address: testData.addresses.validAddresses[1], amount })
383
+ .send({ address: testData.addresses.validAddresses[2], amount })
384
+ .build();
385
+ const explainedTransaction = tx.explainTransaction();
386
+ explainedTransaction.should.deepEqual({
387
+ displayOrder: [
388
+ 'id',
389
+ 'type',
390
+ 'blockhash',
391
+ 'durableNonce',
392
+ 'outputAmount',
393
+ 'changeAmount',
394
+ 'outputs',
395
+ 'changeOutputs',
396
+ 'tokenEnablements',
397
+ 'fee',
398
+ 'memo',
399
+ ],
400
+ id: 'UNAVAILABLE',
401
+ type: 'Send',
402
+ changeOutputs: [],
403
+ changeAmount: '0',
404
+ outputAmount: '30000',
405
+ outputs: [
406
+ {
407
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
408
+ amount: '10000',
409
+ },
410
+ {
411
+ address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
412
+ amount: '10000',
413
+ },
414
+ {
415
+ address: '2n2xqWM9Z18LqxfJzkNrMMFWiDUFYA2k6WSgSnf6EnJs',
416
+ amount: '10000',
417
+ },
418
+ ],
419
+ inputs: [
420
+ {
421
+ address: sender,
422
+ value: '10000',
423
+ },
424
+ {
425
+ address: sender,
426
+ value: '10000',
427
+ },
428
+ {
429
+ address: sender,
430
+ value: '10000',
431
+ },
432
+ ],
433
+ feePayer: sender,
434
+ fee: {
435
+ fee: '0',
436
+ feeRate: undefined,
437
+ },
438
+ memo: 'memo text',
439
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
440
+ durableNonce: {
441
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
442
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
443
+ },
444
+ tokenEnablements: [],
445
+ ataOwnerMap: {},
446
+ });
447
+ });
448
+ it('should explain signed transfer transaction', async function () {
449
+ const tx = await factory
450
+ .getTransferBuilder()
451
+ .fee({ amount: 5000 })
452
+ .nonce(blockHash)
453
+ .sender(sender)
454
+ .send({ address, amount })
455
+ .build();
456
+ await tx.sign(new lib_1.KeyPair({ prv: testData.authAccount.prv }));
457
+ const explainedTransaction = tx.explainTransaction();
458
+ explainedTransaction.should.deepEqual({
459
+ displayOrder: [
460
+ 'id',
461
+ 'type',
462
+ 'blockhash',
463
+ 'durableNonce',
464
+ 'outputAmount',
465
+ 'changeAmount',
466
+ 'outputs',
467
+ 'changeOutputs',
468
+ 'tokenEnablements',
469
+ 'fee',
470
+ 'memo',
471
+ ],
472
+ id: tx.id,
473
+ type: 'Send',
474
+ changeOutputs: [],
475
+ changeAmount: '0',
476
+ outputAmount: '10000',
477
+ outputs: [
478
+ {
479
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
480
+ amount: '10000',
481
+ },
482
+ ],
483
+ inputs: [
484
+ {
485
+ address: sender,
486
+ value: '10000',
487
+ },
488
+ ],
489
+ feePayer: sender,
490
+ fee: {
491
+ fee: '5000',
492
+ feeRate: 5000,
493
+ },
494
+ memo: undefined,
495
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
496
+ durableNonce: undefined,
497
+ tokenEnablements: [],
498
+ ataOwnerMap: {},
499
+ });
500
+ });
501
+ it('should explain wallet init transaction', async function () {
502
+ const tx = await factory
503
+ .getWalletInitializationBuilder()
504
+ .fee({ amount: 5000 })
505
+ .sender(sender)
506
+ .nonce(blockHash)
507
+ .address(testData.addresses.validAddresses[1])
508
+ .amount(amount)
509
+ .build();
510
+ const explainedTransaction = tx.explainTransaction();
511
+ explainedTransaction.should.deepEqual({
512
+ displayOrder: [
513
+ 'id',
514
+ 'type',
515
+ 'blockhash',
516
+ 'durableNonce',
517
+ 'outputAmount',
518
+ 'changeAmount',
519
+ 'outputs',
520
+ 'changeOutputs',
521
+ 'tokenEnablements',
522
+ 'fee',
523
+ 'memo',
524
+ ],
525
+ id: 'UNAVAILABLE',
526
+ type: 'WalletInitialization',
527
+ changeOutputs: [],
528
+ changeAmount: '0',
529
+ outputAmount: '10000',
530
+ outputs: [
531
+ {
532
+ address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
533
+ amount: '10000',
534
+ },
535
+ ],
536
+ inputs: [
537
+ {
538
+ address: sender,
539
+ value: '10000',
540
+ },
541
+ ],
542
+ feePayer: sender,
543
+ fee: {
544
+ fee: '10000',
545
+ feeRate: 5000,
546
+ },
547
+ memo: undefined,
548
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
549
+ durableNonce: undefined,
550
+ tokenEnablements: [],
551
+ ataOwnerMap: {},
552
+ });
553
+ });
554
+ it('should explain wallet init with durable nonce and memo transaction', async function () {
555
+ const tx = await factory
556
+ .getWalletInitializationBuilder()
557
+ .sender(sender)
558
+ .nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
559
+ .memo('memo text')
560
+ .address(testData.addresses.validAddresses[1])
561
+ .amount(amount)
562
+ .build();
563
+ const explainedTransaction = tx.explainTransaction();
564
+ explainedTransaction.should.deepEqual({
565
+ displayOrder: [
566
+ 'id',
567
+ 'type',
568
+ 'blockhash',
569
+ 'durableNonce',
570
+ 'outputAmount',
571
+ 'changeAmount',
572
+ 'outputs',
573
+ 'changeOutputs',
574
+ 'tokenEnablements',
575
+ 'fee',
576
+ 'memo',
577
+ ],
578
+ id: 'UNAVAILABLE',
579
+ type: 'WalletInitialization',
580
+ changeOutputs: [],
581
+ changeAmount: '0',
582
+ outputAmount: '10000',
583
+ outputs: [
584
+ {
585
+ address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
586
+ amount: '10000',
587
+ },
588
+ ],
589
+ inputs: [
590
+ {
591
+ address: sender,
592
+ value: '10000',
593
+ },
594
+ ],
595
+ feePayer: sender,
596
+ fee: {
597
+ fee: '0',
598
+ feeRate: undefined,
599
+ },
600
+ memo: 'memo text',
601
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
602
+ durableNonce: {
603
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
604
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
605
+ },
606
+ tokenEnablements: [],
607
+ ataOwnerMap: {},
608
+ });
609
+ });
610
+ it('should explain signed wallet init transaction', async function () {
611
+ const tx = await factory
612
+ .getWalletInitializationBuilder()
613
+ .fee({ amount: 5000 })
614
+ .sender(sender)
615
+ .nonce(blockHash)
616
+ .address(testData.addresses.validAddresses[1])
617
+ .amount(amount)
618
+ .build();
619
+ await tx.sign(new lib_1.KeyPair({ prv: testData.authAccount.prv }));
620
+ const explainedTransaction = tx.explainTransaction();
621
+ explainedTransaction.should.deepEqual({
622
+ displayOrder: [
623
+ 'id',
624
+ 'type',
625
+ 'blockhash',
626
+ 'durableNonce',
627
+ 'outputAmount',
628
+ 'changeAmount',
629
+ 'outputs',
630
+ 'changeOutputs',
631
+ 'tokenEnablements',
632
+ 'fee',
633
+ 'memo',
634
+ ],
635
+ id: tx.id,
636
+ type: 'WalletInitialization',
637
+ changeOutputs: [],
638
+ changeAmount: '0',
639
+ outputAmount: '10000',
640
+ outputs: [
641
+ {
642
+ address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
643
+ amount: '10000',
644
+ },
645
+ ],
646
+ inputs: [
647
+ {
648
+ address: sender,
649
+ value: '10000',
650
+ },
651
+ ],
652
+ feePayer: sender,
653
+ fee: {
654
+ fee: '10000',
655
+ feeRate: 5000,
656
+ },
657
+ memo: undefined,
658
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
659
+ durableNonce: undefined,
660
+ tokenEnablements: [],
661
+ ataOwnerMap: {},
662
+ });
663
+ });
664
+ it('should explain create ATA transaction with tokenEnablements field', async function () {
665
+ const tx = await factory
666
+ .getAtaInitializationBuilder()
667
+ .fee({ amount: 5000 })
668
+ .sender(sender)
669
+ .nonce(blockHash)
670
+ .mint('tsol:usdc')
671
+ .rentExemptAmount(amount)
672
+ .build();
673
+ const explainedTransaction = tx.explainTransaction();
674
+ // Verify the tokenEnablements field exists and contains the correct data
675
+ explainedTransaction.should.have.property('tokenEnablements');
676
+ explainedTransaction.tokenEnablements.should.be.an.Array();
677
+ explainedTransaction.tokenEnablements.length.should.equal(1);
678
+ explainedTransaction.tokenEnablements[0].should.have.properties(['address', 'tokenName', 'tokenAddress']);
679
+ explainedTransaction.tokenEnablements[0].tokenName.should.equal('tsol:usdc');
680
+ // Verify displayOrder includes tokenEnablements
681
+ explainedTransaction.displayOrder.should.containEql('tokenEnablements');
682
+ // Verify other important fields
683
+ explainedTransaction.id.should.equal('UNAVAILABLE');
684
+ explainedTransaction.type.should.equal('AssociatedTokenAccountInitialization');
685
+ explainedTransaction.outputs.should.be.an.Array().and.be.empty();
686
+ explainedTransaction.fee.fee.should.equal('15000');
687
+ explainedTransaction.fee.feeRate.should.equal(5000);
688
+ explainedTransaction.blockhash.should.equal('5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen');
689
+ should_1.default.not.exist(explainedTransaction.durableNonce);
690
+ });
691
+ it('should explain multiple token enablements in a transaction', async function () {
692
+ // Create a transaction with multiple token enablements
693
+ const txBuilder = factory.getAtaInitializationBuilder();
694
+ txBuilder.nonce(blockHash);
695
+ txBuilder.sender(sender);
696
+ txBuilder.enableToken({
697
+ ownerAddress: sender,
698
+ tokenName: 'tsol:usdc',
699
+ ataAddress: 'DfGJHsrY7RchVwPfigT4T3Wkc4zGq1kkbWzNaVQrDE4w',
700
+ });
701
+ txBuilder.enableToken({
702
+ ownerAddress: sender,
703
+ tokenName: 'tsol:ray',
704
+ ataAddress: 'GHhhPAuh5PdyeCM4zHPT7jz3jAGrXTPQu6mUMTtZ8TTf',
705
+ });
706
+ txBuilder.rentExemptAmount(amount);
707
+ txBuilder.fee({ amount: 5000 });
708
+ const tx = await txBuilder.build();
709
+ const explainedTransaction = tx.explainTransaction();
710
+ // Verify the tokenEnablements field contains multiple entries
711
+ explainedTransaction.should.have.property('tokenEnablements');
712
+ explainedTransaction.tokenEnablements.should.be.an.Array();
713
+ explainedTransaction.tokenEnablements.length.should.equal(2);
714
+ // Check the first token enablement
715
+ explainedTransaction.tokenEnablements[0].should.have.properties(['address', 'tokenName', 'tokenAddress']);
716
+ explainedTransaction.tokenEnablements[0].tokenName.should.equal('tsol:usdc');
717
+ // Check the second token enablement
718
+ explainedTransaction.tokenEnablements[1].should.have.properties(['address', 'tokenName', 'tokenAddress']);
719
+ explainedTransaction.tokenEnablements[1].tokenName.should.equal('tsol:ray');
720
+ // Verify outputs is empty (since token enablements are no longer added to outputs)
721
+ explainedTransaction.outputs.should.be.an.Array();
722
+ explainedTransaction.outputs.should.be.empty();
723
+ // Display order should include tokenEnablements
724
+ explainedTransaction.displayOrder.should.containEql('tokenEnablements');
725
+ });
726
+ it('should activate builder ', async function () {
727
+ const tx = await factory
728
+ .getStakingActivateBuilder()
729
+ .stakingAddress(stakeAccount.pub)
730
+ .sender(wallet.pub)
731
+ .nonce(blockHash)
732
+ .amount(amount)
733
+ .validator(validator.pub)
734
+ .fee({ amount: 5000 })
735
+ .build();
736
+ const explainedTransaction = tx.explainTransaction();
737
+ explainedTransaction.should.deepEqual({
738
+ displayOrder: [
739
+ 'id',
740
+ 'type',
741
+ 'blockhash',
742
+ 'durableNonce',
743
+ 'outputAmount',
744
+ 'changeAmount',
745
+ 'outputs',
746
+ 'changeOutputs',
747
+ 'tokenEnablements',
748
+ 'fee',
749
+ 'memo',
750
+ ],
751
+ id: 'UNAVAILABLE',
752
+ type: 'StakingActivate',
753
+ changeOutputs: [],
754
+ changeAmount: '0',
755
+ outputAmount: '10000',
756
+ outputs: [
757
+ {
758
+ address: '7dRuGFbU2y2kijP6o1LYNzVyz4yf13MooqoionCzv5Za',
759
+ amount: '10000',
760
+ },
761
+ ],
762
+ inputs: [
763
+ {
764
+ address: sender,
765
+ value: '10000',
766
+ },
767
+ ],
768
+ feePayer: sender,
769
+ fee: {
770
+ fee: '10000',
771
+ feeRate: 5000,
772
+ },
773
+ memo: undefined,
774
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
775
+ durableNonce: undefined,
776
+ tokenEnablements: [],
777
+ ataOwnerMap: {},
778
+ });
779
+ });
780
+ it('should deactivate builder ', async function () {
781
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
782
+ const tx = await factory
783
+ .getStakingDeactivateBuilder()
784
+ .stakingAddress(stakeAccount.pub)
785
+ .sender(wallet.pub)
786
+ .stakingAddress(stakeAccount.pub)
787
+ .nonce(recentBlockHash)
788
+ .fee({ amount: 5000 })
789
+ .build();
790
+ const explainedTransaction = tx.explainTransaction();
791
+ explainedTransaction.should.deepEqual({
792
+ displayOrder: [
793
+ 'id',
794
+ 'type',
795
+ 'blockhash',
796
+ 'durableNonce',
797
+ 'outputAmount',
798
+ 'changeAmount',
799
+ 'outputs',
800
+ 'changeOutputs',
801
+ 'tokenEnablements',
802
+ 'fee',
803
+ 'memo',
804
+ ],
805
+ id: 'UNAVAILABLE',
806
+ type: 'StakingDeactivate',
807
+ changeOutputs: [],
808
+ changeAmount: '0',
809
+ outputAmount: '0',
810
+ outputs: [],
811
+ inputs: [],
812
+ feePayer: sender,
813
+ fee: {
814
+ fee: '5000',
815
+ feeRate: 5000,
816
+ },
817
+ memo: undefined,
818
+ blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
819
+ durableNonce: undefined,
820
+ tokenEnablements: [],
821
+ ataOwnerMap: {},
822
+ });
823
+ });
824
+ it('should explain withdraw transaction ', async function () {
825
+ const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
826
+ const tx = await factory
827
+ .getStakingWithdrawBuilder()
828
+ .stakingAddress(stakeAccount.pub)
829
+ .sender(wallet.pub)
830
+ .amount(amount)
831
+ .nonce(recentBlockHash)
832
+ .fee({ amount: 5000 })
833
+ .build();
834
+ const explainedTransaction = tx.explainTransaction();
835
+ explainedTransaction.should.deepEqual({
836
+ displayOrder: [
837
+ 'id',
838
+ 'type',
839
+ 'blockhash',
840
+ 'durableNonce',
841
+ 'outputAmount',
842
+ 'changeAmount',
843
+ 'outputs',
844
+ 'changeOutputs',
845
+ 'tokenEnablements',
846
+ 'fee',
847
+ 'memo',
848
+ ],
849
+ id: 'UNAVAILABLE',
850
+ type: 'StakingWithdraw',
851
+ changeOutputs: [],
852
+ changeAmount: '0',
853
+ outputAmount: '10000',
854
+ outputs: [
855
+ {
856
+ address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
857
+ amount: '10000',
858
+ },
859
+ ],
860
+ inputs: [
861
+ {
862
+ address: stakeAccount.pub,
863
+ value: '10000',
864
+ },
865
+ ],
866
+ feePayer: sender,
867
+ fee: {
868
+ fee: '5000',
869
+ feeRate: 5000,
870
+ },
871
+ memo: undefined,
872
+ blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',
873
+ durableNonce: undefined,
874
+ tokenEnablements: [],
875
+ ataOwnerMap: {},
876
+ });
877
+ });
878
+ it('should explain withdraw transaction with memo and durable nonce ', async function () {
879
+ const tx = await factory
880
+ .getStakingWithdrawBuilder()
881
+ .stakingAddress(stakeAccount.pub)
882
+ .sender(wallet.pub)
883
+ .amount(amount)
884
+ .nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
885
+ .memo('memo text')
886
+ .fee({ amount: 5000 })
887
+ .build();
888
+ tx.signablePayload;
889
+ const explainedTransaction = tx.explainTransaction();
890
+ explainedTransaction.should.deepEqual({
891
+ displayOrder: [
892
+ 'id',
893
+ 'type',
894
+ 'blockhash',
895
+ 'durableNonce',
896
+ 'outputAmount',
897
+ 'changeAmount',
898
+ 'outputs',
899
+ 'changeOutputs',
900
+ 'tokenEnablements',
901
+ 'fee',
902
+ 'memo',
903
+ ],
904
+ id: 'UNAVAILABLE',
905
+ type: 'StakingWithdraw',
906
+ changeOutputs: [],
907
+ changeAmount: '0',
908
+ outputAmount: '10000',
909
+ outputs: [
910
+ {
911
+ address: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
912
+ amount: '10000',
913
+ },
914
+ ],
915
+ inputs: [
916
+ {
917
+ address: stakeAccount.pub,
918
+ value: '10000',
919
+ },
920
+ ],
921
+ feePayer: sender,
922
+ fee: {
923
+ fee: '5000',
924
+ feeRate: 5000,
925
+ },
926
+ memo: 'memo text',
927
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
928
+ durableNonce: {
929
+ walletNonceAddress: testData.nonceAccount.pub,
930
+ authWalletAddress: sender,
931
+ },
932
+ tokenEnablements: [],
933
+ ataOwnerMap: {},
934
+ });
935
+ });
936
+ it('should explain single token transfer transaction', async function () {
937
+ const tx = await factory
938
+ .getTokenTransferBuilder()
939
+ .nonce(blockHash)
940
+ .sender(sender)
941
+ .send({ address, amount, tokenName: 'tsol:usdc' })
942
+ .fee({ amount: 5000 })
943
+ .build();
944
+ const explainedTransaction = tx.explainTransaction();
945
+ explainedTransaction.should.deepEqual({
946
+ displayOrder: [
947
+ 'id',
948
+ 'type',
949
+ 'blockhash',
950
+ 'durableNonce',
951
+ 'outputAmount',
952
+ 'changeAmount',
953
+ 'outputs',
954
+ 'changeOutputs',
955
+ 'tokenEnablements',
956
+ 'fee',
957
+ 'memo',
958
+ ],
959
+ id: 'UNAVAILABLE',
960
+ type: 'Send',
961
+ changeOutputs: [],
962
+ changeAmount: '0',
963
+ outputAmount: '0',
964
+ outputs: [
965
+ {
966
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
967
+ amount: '10000',
968
+ tokenName: 'tsol:usdc',
969
+ },
970
+ ],
971
+ inputs: [
972
+ {
973
+ address: sender,
974
+ value: '10000',
975
+ },
976
+ ],
977
+ feePayer: sender,
978
+ fee: {
979
+ fee: '5000',
980
+ feeRate: 5000,
981
+ },
982
+ memo: undefined,
983
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
984
+ durableNonce: undefined,
985
+ tokenEnablements: [],
986
+ ataOwnerMap: {},
987
+ });
988
+ });
989
+ it('should explain single token transfer transaction with optional params', async function () {
990
+ const tx = await factory
991
+ .getTokenTransferBuilder()
992
+ .nonce(blockHash)
993
+ .sender(sender)
994
+ .send({
995
+ address,
996
+ amount,
997
+ tokenName: 'tsol:ams',
998
+ tokenAddress: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
999
+ programId: 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
1000
+ decimalPlaces: 9,
1001
+ })
1002
+ .fee({ amount: 5000 })
1003
+ .build();
1004
+ const explainedTransaction = tx.explainTransaction();
1005
+ explainedTransaction.should.deepEqual({
1006
+ displayOrder: [
1007
+ 'id',
1008
+ 'type',
1009
+ 'blockhash',
1010
+ 'durableNonce',
1011
+ 'outputAmount',
1012
+ 'changeAmount',
1013
+ 'outputs',
1014
+ 'changeOutputs',
1015
+ 'tokenEnablements',
1016
+ 'fee',
1017
+ 'memo',
1018
+ ],
1019
+ id: 'UNAVAILABLE',
1020
+ type: 'Send',
1021
+ changeOutputs: [],
1022
+ changeAmount: '0',
1023
+ outputAmount: '0',
1024
+ outputs: [
1025
+ {
1026
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
1027
+ amount: '10000',
1028
+ // WASM path resolves token name via @bitgo-beta/statics; this mint is not registered,
1029
+ // so the raw mint address is returned instead of the human-readable name.
1030
+ tokenName: 'F4uLeXioFz3hw13MposuwaQbMcZbCjqvEGPPeRRB1Byf',
1031
+ },
1032
+ ],
1033
+ inputs: [
1034
+ {
1035
+ address: sender,
1036
+ value: '10000',
1037
+ },
1038
+ ],
1039
+ feePayer: sender,
1040
+ fee: {
1041
+ fee: '5000',
1042
+ feeRate: 5000,
1043
+ },
1044
+ memo: undefined,
1045
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1046
+ durableNonce: undefined,
1047
+ tokenEnablements: [],
1048
+ ataOwnerMap: {},
1049
+ });
1050
+ });
1051
+ it('should explain multi token transfer with durable nonce and memo transaction', async function () {
1052
+ const tx = await factory
1053
+ .getTokenTransferBuilder()
1054
+ .nonce(blockHash, { walletNonceAddress: testData.nonceAccount.pub, authWalletAddress: sender })
1055
+ .sender(sender)
1056
+ .memo('memo text')
1057
+ .send({ address, amount, tokenName: 'tsol:usdc' })
1058
+ .send({ address: testData.addresses.validAddresses[1], amount, tokenName: 'tsol:usdc' })
1059
+ .send({ address: testData.addresses.validAddresses[2], amount, tokenName: 'tsol:usdc' })
1060
+ .build();
1061
+ const explainedTransaction = tx.explainTransaction();
1062
+ explainedTransaction.should.deepEqual({
1063
+ displayOrder: [
1064
+ 'id',
1065
+ 'type',
1066
+ 'blockhash',
1067
+ 'durableNonce',
1068
+ 'outputAmount',
1069
+ 'changeAmount',
1070
+ 'outputs',
1071
+ 'changeOutputs',
1072
+ 'tokenEnablements',
1073
+ 'fee',
1074
+ 'memo',
1075
+ ],
1076
+ id: 'UNAVAILABLE',
1077
+ type: 'Send',
1078
+ changeOutputs: [],
1079
+ changeAmount: '0',
1080
+ outputAmount: '0',
1081
+ outputs: [
1082
+ {
1083
+ address: 'DesU7XscZjng8yj5VX6AZsk3hWSW4sQ3rTG2LuyQ2P4H',
1084
+ amount: '10000',
1085
+ tokenName: 'tsol:usdc',
1086
+ },
1087
+ {
1088
+ address: 'Azz9EmNuhtjoYrhWvidWx1Hfd14SNBsYyzXhA9Tnoca8',
1089
+ amount: '10000',
1090
+ tokenName: 'tsol:usdc',
1091
+ },
1092
+ {
1093
+ address: '2n2xqWM9Z18LqxfJzkNrMMFWiDUFYA2k6WSgSnf6EnJs',
1094
+ amount: '10000',
1095
+ tokenName: 'tsol:usdc',
1096
+ },
1097
+ ],
1098
+ inputs: [
1099
+ {
1100
+ address: sender,
1101
+ value: '10000',
1102
+ },
1103
+ {
1104
+ address: sender,
1105
+ value: '10000',
1106
+ },
1107
+ {
1108
+ address: sender,
1109
+ value: '10000',
1110
+ },
1111
+ ],
1112
+ feePayer: sender,
1113
+ fee: {
1114
+ fee: '0',
1115
+ feeRate: undefined,
1116
+ },
1117
+ memo: 'memo text',
1118
+ blockhash: '5ne7phA48Jrvpn39AtupB8ZkCCAy8gLTfpGihZPuDqen',
1119
+ durableNonce: {
1120
+ authWalletAddress: '5hr5fisPi6DXNuuRpm5XUbzpiEnmdyxXuBDTwzwZj5Pe',
1121
+ walletNonceAddress: '8Y7RM6JfcX4ASSNBkrkrmSbRu431YVi9Y3oLFnzC2dCh',
1122
+ },
1123
+ tokenEnablements: [],
1124
+ ataOwnerMap: {},
1125
+ });
1126
+ });
1127
+ });
1128
+ });
1129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGlEQUE0QztBQUM1Qyx1Q0FBcUQ7QUFDckQsMkRBQTZDO0FBQzdDLDZDQUEyRTtBQUMzRSwyREFBd0Q7QUFFeEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQixNQUFNLElBQUksR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9CLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDbkUsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDMUQsRUFBRSxDQUFDLGNBQWMsR0FBRyxJQUFJLHFCQUFjLEVBQUUsQ0FBQztZQUN6QyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUN6RyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7WUFDNUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQztZQUNqRixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFDaEcsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzlFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZDO29CQUNFLElBQUksRUFBRSxjQUFjO29CQUNwQixNQUFNLEVBQUU7d0JBQ04sa0JBQWtCLEVBQUUsOENBQThDO3dCQUNsRSxpQkFBaUIsRUFBRSw4Q0FBOEM7cUJBQ2xFO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixNQUFNLEVBQUU7d0JBQ04sV0FBVyxFQUFFLDhDQUE4Qzt3QkFDM0QsU0FBUyxFQUFFLDhDQUE4Qzt3QkFDekQsTUFBTSxFQUFFLFFBQVE7cUJBQ2pCO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLE1BQU0sRUFBRTt3QkFDTixJQUFJLEVBQUUsV0FBVztxQkFDbEI7aUJBQ0Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7WUFDekMsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUN0RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUNoRyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQ3JCLHlGQUF5RixDQUMxRixDQUFDO1lBQ0YsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUM1Qix5RkFBeUY7YUFDMUYsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDOUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDMUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDdkM7b0JBQ0UsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLE1BQU0sRUFBRTt3QkFDTixrQkFBa0IsRUFBRSw4Q0FBOEM7d0JBQ2xFLGlCQUFpQixFQUFFLDhDQUE4QztxQkFDbEU7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRTt3QkFDTixXQUFXLEVBQUUsOENBQThDO3dCQUMzRCxTQUFTLEVBQUUsOENBQThDO3dCQUN6RCxNQUFNLEVBQUUsUUFBUTtxQkFDakI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osTUFBTSxFQUFFO3dCQUNOLElBQUksRUFBRSxXQUFXO3FCQUNsQjtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtRQUMzQixFQUFFLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxxQkFBYyxFQUFFLENBQUM7WUFDekMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxtQkFBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckUsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsa0NBQWtDLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRCxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsTUFBTSxFQUFFLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqRSxFQUFFLENBQUMsY0FBYyxHQUFHLElBQUkscUJBQWMsRUFBRSxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxjQUFjLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN0RSxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNoSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtZQUN6RCxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDOUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqRixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0VBQWdFLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDOUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqRixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzNFLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakYsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1FBQzNDLEVBQUUsQ0FBQyw4RUFBOEUsRUFBRSxHQUFHLEVBQUU7WUFDdEYsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFFaEQsdUdBQXVHO1lBQ3ZHLE1BQU0sTUFBTSxHQUFHLHFCQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2xGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFtQixDQUFDO1lBQ25FLGdCQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFaEMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN4RixnQkFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0NBQXNDLEVBQUUsR0FBRyxFQUFFO1lBQzlDLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2hELElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ25HLDBCQUEwQixDQUMzQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUNuRyxrREFBa0QsQ0FDbkQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDBDQUEwQyxFQUFFLEtBQUs7WUFDbEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFLEtBQUs7WUFDekQsTUFBTSxFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqRixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFFckMsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEtBQUs7WUFDcEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQixrQkFBa0IsRUFBRTtpQkFDcEIsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQ3pCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDckIsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOO3dCQUNFLE9BQU8sRUFBRSxNQUFNO3dCQUNmLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLE1BQU07b0JBQ1gsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7Z0JBQ0QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsU0FBUyxFQUFFLDhDQUE4QztnQkFDekQsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEtBQUs7WUFDdkUsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQixrQkFBa0IsRUFBRTtpQkFDcEIsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUM5RixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztpQkFDekIsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOO3dCQUNFLE9BQU8sRUFBRSxNQUFNO3dCQUNmLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLEdBQUc7b0JBQ1IsT0FBTyxFQUFFLFNBQVM7aUJBQ25CO2dCQUNELElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRTtvQkFDWixpQkFBaUIsRUFBRSw4Q0FBOEM7b0JBQ2pFLGtCQUFrQixFQUFFLDhDQUE4QztpQkFDbkU7Z0JBQ0QsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSztZQUMvRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLGtCQUFrQixFQUFFO2lCQUNwQixLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQzlGLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDakIsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUN6QixJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQy9ELElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztpQkFDL0QsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTztxQkFDaEI7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLDhDQUE4Qzt3QkFDdkQsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO29CQUNEO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsR0FBRztvQkFDUixPQUFPLEVBQUUsU0FBUztpQkFDbkI7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRTtvQkFDWixpQkFBaUIsRUFBRSw4Q0FBOEM7b0JBQ2pFLGtCQUFrQixFQUFFLDhDQUE4QztpQkFDbkU7Z0JBQ0QsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUUsS0FBSztZQUNwRCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLGtCQUFrQixFQUFFO2lCQUNwQixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLEtBQUssQ0FBQyxTQUFTLENBQUM7aUJBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUN6QixLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU8sRUFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0UsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxZQUFZLEVBQUU7b0JBQ1osSUFBSTtvQkFDSixNQUFNO29CQUNOLFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsU0FBUztvQkFDVCxlQUFlO29CQUNmLGtCQUFrQjtvQkFDbEIsS0FBSztvQkFDTCxNQUFNO2lCQUNQO2dCQUNELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDVCxJQUFJLEVBQUUsTUFBTTtnQkFDWixhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxPQUFPO2dCQUNyQixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsT0FBTyxFQUFFLDhDQUE4Qzt3QkFDdkQsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2dCQUNELE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxPQUFPLEVBQUUsTUFBTTt3QkFDZixLQUFLLEVBQUUsT0FBTztxQkFDZjtpQkFDRjtnQkFDRCxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsR0FBRyxFQUFFO29CQUNILEdBQUcsRUFBRSxNQUFNO29CQUNYLE9BQU8sRUFBRSxJQUFJO2lCQUNkO2dCQUNELElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRSxTQUFTO2dCQUN2QixnQkFBZ0IsRUFBRSxFQUFFO2dCQUNwQixXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLO1lBQ2hELE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTztpQkFDckIsOEJBQThCLEVBQUU7aUJBQ2hDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztpQkFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxLQUFLLENBQUMsU0FBUyxDQUFDO2lCQUNoQixPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLElBQUksRUFBRSxzQkFBc0I7Z0JBQzVCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOO3dCQUNFLE9BQU8sRUFBRSxNQUFNO3dCQUNmLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLE9BQU87b0JBQ1osT0FBTyxFQUFFLElBQUk7aUJBQ2Q7Z0JBQ0QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsU0FBUyxFQUFFLDhDQUE4QztnQkFDekQsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9FQUFvRSxFQUFFLEtBQUs7WUFDNUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQiw4QkFBOEIsRUFBRTtpQkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQzlGLElBQUksQ0FBQyxXQUFXLENBQUM7aUJBQ2pCLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxLQUFLLEVBQUUsQ0FBQztZQUVYLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsWUFBWSxFQUFFO29CQUNaLElBQUk7b0JBQ0osTUFBTTtvQkFDTixXQUFXO29CQUNYLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxjQUFjO29CQUNkLFNBQVM7b0JBQ1QsZUFBZTtvQkFDZixrQkFBa0I7b0JBQ2xCLEtBQUs7b0JBQ0wsTUFBTTtpQkFDUDtnQkFDRCxFQUFFLEVBQUUsYUFBYTtnQkFDakIsSUFBSSxFQUFFLHNCQUFzQjtnQkFDNUIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsT0FBTztnQkFDckIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsR0FBRztvQkFDUixPQUFPLEVBQUUsU0FBUztpQkFDbkI7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRTtvQkFDWixpQkFBaUIsRUFBRSw4Q0FBOEM7b0JBQ2pFLGtCQUFrQixFQUFFLDhDQUE4QztpQkFDbkU7Z0JBQ0QsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsS0FBSztZQUN2RCxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLDhCQUE4QixFQUFFO2lCQUNoQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTyxFQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLGFBQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUvRSxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNULElBQUksRUFBRSxzQkFBc0I7Z0JBQzVCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLE9BQU87Z0JBQ3JCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOO3dCQUNFLE9BQU8sRUFBRSxNQUFNO3dCQUNmLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLE9BQU87b0JBQ1osT0FBTyxFQUFFLElBQUk7aUJBQ2Q7Z0JBQ0QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsU0FBUyxFQUFFLDhDQUE4QztnQkFDekQsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1FQUFtRSxFQUFFLEtBQUs7WUFDM0UsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQiwyQkFBMkIsRUFBRTtpQkFDN0IsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLEtBQUssQ0FBQyxTQUFTLENBQUM7aUJBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUM7aUJBQ2pCLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztpQkFDeEIsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRXJELHlFQUF5RTtZQUN6RSxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlELG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNELG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdELG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO1lBQzFHLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRTdFLGdEQUFnRDtZQUNoRCxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRXhFLGdDQUFnQztZQUNoQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNwRCxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQy9FLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pFLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEQsb0JBQW9CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM1RixnQkFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSztZQUNwRSx1REFBdUQ7WUFDdkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDeEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxXQUFXLENBQUM7Z0JBQ3BCLFlBQVksRUFBRSxNQUFNO2dCQUNwQixTQUFTLEVBQUUsV0FBVztnQkFDdEIsVUFBVSxFQUFFLDhDQUE4QzthQUMzRCxDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsV0FBVyxDQUFDO2dCQUNwQixZQUFZLEVBQUUsTUFBTTtnQkFDcEIsU0FBUyxFQUFFLFVBQVU7Z0JBQ3JCLFVBQVUsRUFBRSw4Q0FBOEM7YUFDM0QsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVoQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBRXJELDhEQUE4RDtZQUM5RCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlELG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNELG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdELG1DQUFtQztZQUNuQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUMxRyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU3RSxvQ0FBb0M7WUFDcEMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDMUcsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFNUUsbUZBQW1GO1lBQ25GLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvQyxnREFBZ0Q7WUFDaEQsb0JBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQkFBMEIsRUFBRSxLQUFLO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTztpQkFDckIseUJBQXlCLEVBQUU7aUJBQzNCLGNBQWMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDbEIsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztpQkFDeEIsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyQixLQUFLLEVBQUUsQ0FBQztZQUVYLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsWUFBWSxFQUFFO29CQUNaLElBQUk7b0JBQ0osTUFBTTtvQkFDTixXQUFXO29CQUNYLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxjQUFjO29CQUNkLFNBQVM7b0JBQ1QsZUFBZTtvQkFDZixrQkFBa0I7b0JBQ2xCLEtBQUs7b0JBQ0wsTUFBTTtpQkFDUDtnQkFDRCxFQUFFLEVBQUUsYUFBYTtnQkFDakIsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsT0FBTztnQkFDckIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsT0FBTztvQkFDWixPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsOENBQThDO2dCQUN6RCxZQUFZLEVBQUUsU0FBUztnQkFDdkIsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNEJBQTRCLEVBQUUsS0FBSztZQUNwQyxNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztZQUN2RSxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLDJCQUEyQixFQUFFO2lCQUM3QixjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztpQkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7aUJBQ2xCLGNBQWMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUNoQyxLQUFLLENBQUMsZUFBZSxDQUFDO2lCQUN0QixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLEtBQUssRUFBRSxDQUFDO1lBRVgsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxZQUFZLEVBQUU7b0JBQ1osSUFBSTtvQkFDSixNQUFNO29CQUNOLFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsU0FBUztvQkFDVCxlQUFlO29CQUNmLGtCQUFrQjtvQkFDbEIsS0FBSztvQkFDTCxNQUFNO2lCQUNQO2dCQUNELEVBQUUsRUFBRSxhQUFhO2dCQUNqQixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixPQUFPLEVBQUUsRUFBRTtnQkFDWCxNQUFNLEVBQUUsRUFBRTtnQkFDVixRQUFRLEVBQUUsTUFBTTtnQkFDaEIsR0FBRyxFQUFFO29CQUNILEdBQUcsRUFBRSxNQUFNO29CQUNYLE9BQU8sRUFBRSxJQUFJO2lCQUNkO2dCQUNELElBQUksRUFBRSxTQUFTO2dCQUNmLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRSxTQUFTO2dCQUN2QixnQkFBZ0IsRUFBRSxFQUFFO2dCQUNwQixXQUFXLEVBQUUsRUFBRTthQUNoQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLO1lBQzlDLE1BQU0sZUFBZSxHQUFHLDhDQUE4QyxDQUFDO1lBQ3ZFLE1BQU0sRUFBRSxHQUFHLE1BQU0sT0FBTztpQkFDckIseUJBQXlCLEVBQUU7aUJBQzNCLGNBQWMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO2lCQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztpQkFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxLQUFLLENBQUMsZUFBZSxDQUFDO2lCQUN0QixHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQ3JCLEtBQUssRUFBRSxDQUFDO1lBRVgsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxZQUFZLEVBQUU7b0JBQ1osSUFBSTtvQkFDSixNQUFNO29CQUNOLFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsU0FBUztvQkFDVCxlQUFlO29CQUNmLGtCQUFrQjtvQkFDbEIsS0FBSztvQkFDTCxNQUFNO2lCQUNQO2dCQUNELEVBQUUsRUFBRSxhQUFhO2dCQUNqQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxPQUFPO2dCQUNyQixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsT0FBTyxFQUFFLDhDQUE4Qzt3QkFDdkQsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2dCQUNELE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUc7d0JBQ3pCLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLE1BQU07b0JBQ1gsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7Z0JBQ0QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsU0FBUyxFQUFFLDhDQUE4QztnQkFDekQsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtFQUFrRSxFQUFFLEtBQUs7WUFDMUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQix5QkFBeUIsRUFBRTtpQkFDM0IsY0FBYyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7aUJBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsQ0FBQztpQkFDOUYsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDakIsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyQixLQUFLLEVBQUUsQ0FBQztZQUNYLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFFbkIsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxZQUFZLEVBQUU7b0JBQ1osSUFBSTtvQkFDSixNQUFNO29CQUNOLFdBQVc7b0JBQ1gsY0FBYztvQkFDZCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsU0FBUztvQkFDVCxlQUFlO29CQUNmLGtCQUFrQjtvQkFDbEIsS0FBSztvQkFDTCxNQUFNO2lCQUNQO2dCQUNELEVBQUUsRUFBRSxhQUFhO2dCQUNqQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLFlBQVksRUFBRSxPQUFPO2dCQUNyQixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsT0FBTyxFQUFFLDhDQUE4Qzt3QkFDdkQsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO2lCQUNGO2dCQUNELE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxPQUFPLEVBQUUsWUFBWSxDQUFDLEdBQUc7d0JBQ3pCLEtBQUssRUFBRSxPQUFPO3FCQUNmO2lCQUNGO2dCQUNELFFBQVEsRUFBRSxNQUFNO2dCQUNoQixHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLE1BQU07b0JBQ1gsT0FBTyxFQUFFLElBQUk7aUJBQ2Q7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRTtvQkFDWixrQkFBa0IsRUFBRSxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUc7b0JBQzdDLGlCQUFpQixFQUFFLE1BQU07aUJBQzFCO2dCQUNELGdCQUFnQixFQUFFLEVBQUU7Z0JBQ3BCLFdBQVcsRUFBRSxFQUFFO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEtBQUs7WUFDMUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPO2lCQUNyQix1QkFBdUIsRUFBRTtpQkFDekIsS0FBSyxDQUFDLFNBQVMsQ0FBQztpQkFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQztpQkFDZCxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztpQkFDakQsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyQixLQUFLLEVBQUUsQ0FBQztZQUVYLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsWUFBWSxFQUFFO29CQUNaLElBQUk7b0JBQ0osTUFBTTtvQkFDTixXQUFXO29CQUNYLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxjQUFjO29CQUNkLFNBQVM7b0JBQ1QsZUFBZTtvQkFDZixrQkFBa0I7b0JBQ2xCLEtBQUs7b0JBQ0wsTUFBTTtpQkFDUDtnQkFDRCxFQUFFLEVBQUUsYUFBYTtnQkFDakIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRSxXQUFXO3FCQUN2QjtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsTUFBTTtvQkFDWCxPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsOENBQThDO2dCQUN6RCxZQUFZLEVBQUUsU0FBUztnQkFDdkIsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUUsS0FBSztZQUMvRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLHVCQUF1QixFQUFFO2lCQUN6QixLQUFLLENBQUMsU0FBUyxDQUFDO2lCQUNoQixNQUFNLENBQUMsTUFBTSxDQUFDO2lCQUNkLElBQUksQ0FBQztnQkFDSixPQUFPO2dCQUNQLE1BQU07Z0JBQ04sU0FBUyxFQUFFLFVBQVU7Z0JBQ3JCLFlBQVksRUFBRSw4Q0FBOEM7Z0JBQzVELFNBQVMsRUFBRSw2Q0FBNkM7Z0JBQ3hELGFBQWEsRUFBRSxDQUFDO2FBQ2pCLENBQUM7aUJBQ0QsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUNyQixLQUFLLEVBQUUsQ0FBQztZQUVYLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDckQsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDcEMsWUFBWSxFQUFFO29CQUNaLElBQUk7b0JBQ0osTUFBTTtvQkFDTixXQUFXO29CQUNYLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxjQUFjO29CQUNkLFNBQVM7b0JBQ1QsZUFBZTtvQkFDZixrQkFBa0I7b0JBQ2xCLEtBQUs7b0JBQ0wsTUFBTTtpQkFDUDtnQkFDRCxFQUFFLEVBQUUsYUFBYTtnQkFDakIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsT0FBTyxFQUFFO29CQUNQO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3dCQUNmLHNGQUFzRjt3QkFDdEYsMEVBQTBFO3dCQUMxRSxTQUFTLEVBQUUsOENBQThDO3FCQUMxRDtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsTUFBTTtvQkFDWCxPQUFPLEVBQUUsSUFBSTtpQkFDZDtnQkFDRCxJQUFJLEVBQUUsU0FBUztnQkFDZixTQUFTLEVBQUUsOENBQThDO2dCQUN6RCxZQUFZLEVBQUUsU0FBUztnQkFDdkIsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkVBQTZFLEVBQUUsS0FBSztZQUNyRixNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU87aUJBQ3JCLHVCQUF1QixFQUFFO2lCQUN6QixLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLENBQUM7aUJBQzlGLE1BQU0sQ0FBQyxNQUFNLENBQUM7aUJBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQztpQkFDakIsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7aUJBQ2pELElBQUksQ0FBQyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2lCQUN2RixJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztpQkFDdkYsS0FBSyxFQUFFLENBQUM7WUFFWCxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3JELG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLFlBQVksRUFBRTtvQkFDWixJQUFJO29CQUNKLE1BQU07b0JBQ04sV0FBVztvQkFDWCxjQUFjO29CQUNkLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO29CQUNsQixLQUFLO29CQUNMLE1BQU07aUJBQ1A7Z0JBQ0QsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLElBQUksRUFBRSxNQUFNO2dCQUNaLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsR0FBRztnQkFDakIsWUFBWSxFQUFFLEdBQUc7Z0JBQ2pCLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsOENBQThDO3dCQUN2RCxNQUFNLEVBQUUsT0FBTzt3QkFDZixTQUFTLEVBQUUsV0FBVztxQkFDdkI7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLDhDQUE4Qzt3QkFDdkQsTUFBTSxFQUFFLE9BQU87d0JBQ2YsU0FBUyxFQUFFLFdBQVc7cUJBQ3ZCO29CQUNEO3dCQUNFLE9BQU8sRUFBRSw4Q0FBOEM7d0JBQ3ZELE1BQU0sRUFBRSxPQUFPO3dCQUNmLFNBQVMsRUFBRSxXQUFXO3FCQUN2QjtpQkFDRjtnQkFDRCxNQUFNLEVBQUU7b0JBQ047d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7b0JBQ0Q7d0JBQ0UsT0FBTyxFQUFFLE1BQU07d0JBQ2YsS0FBSyxFQUFFLE9BQU87cUJBQ2Y7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLEdBQUcsRUFBRTtvQkFDSCxHQUFHLEVBQUUsR0FBRztvQkFDUixPQUFPLEVBQUUsU0FBUztpQkFDbkI7Z0JBQ0QsSUFBSSxFQUFFLFdBQVc7Z0JBQ2pCLFNBQVMsRUFBRSw4Q0FBOEM7Z0JBQ3pELFlBQVksRUFBRTtvQkFDWixpQkFBaUIsRUFBRSw4Q0FBOEM7b0JBQ2pFLGtCQUFrQixFQUFFLDhDQUE4QztpQkFDbkU7Z0JBQ0QsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEtleVBhaXIsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjL2xpYic7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IFB1YmxpY0tleSwgVHJhbnNhY3Rpb24gYXMgU29sVHJhbnNhY3Rpb24gfSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2dldEJ1aWxkZXJGYWN0b3J5JztcblxuZGVzY3JpYmUoJ1NvbCBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgndHNvbCcpO1xuXG4gIGRlc2NyaWJlKCd0b0pzb24gc2hvdWxkJywgKCkgPT4ge1xuICAgIGl0KCd0aHJvdyBlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eC50b0pzb24oKSwgL0VtcHR5IHRyYW5zYWN0aW9uLyk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIC9FbXB0eSB0cmFuc2FjdGlvbi8pO1xuICAgIH0pO1xuICAgIGl0KCd0aHJvdyBmb3IgdG9Kc29uIG9mIGVtcHR5IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBzaG91bGQoKCkgPT4gdHgudG9Kc29uKCkpLnRocm93RXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgICB0eC5zb2xUcmFuc2FjdGlvbiA9IG5ldyBTb2xUcmFuc2FjdGlvbigpO1xuICAgICAgdHguc29sVHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gdGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eC50b0pzb24oKSkudGhyb3dFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiwgdHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkOiB1bmRlZmluZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdWNjZWVkIGZvciBhIHVuc2lnbmVkIHRyYW5zZmVyIHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuVFJBTlNGRVJfVU5TSUdORURfVFhfV0lUSF9NRU1PX0FORF9EVVJBQkxFX05PTkNFKTtcbiAgICAgIHR4LnNpZ25hdHVyZS5zaG91bGQuYmUuZW1wdHkoKTtcbiAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgdHhKc29uLnNob3VsZC5oYXZlLnByb3BlcnRpZXMoWydpZCcsICdmZWVQYXllcicsICdub25jZScsICdudW1TaWduYXR1cmVzJywgJ2luc3RydWN0aW9uc0RhdGEnXSk7XG4gICAgICB0eEpzb24uaWQ/LnNob3VsZC5lcXVhbCh1bmRlZmluZWQpO1xuICAgICAgdHhKc29uLmZlZVBheWVyPy5zaG91bGQuZXF1YWwoJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKCdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScpO1xuICAgICAgdHhKc29uLm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDApO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEubGVuZ3RoLnNob3VsZC5lcXVhbCgzKTtcbiAgICAgIHR4SnNvbi5sYW1wb3J0c1BlclNpZ25hdHVyZT8uc2hvdWxkLmJlLnVuZGVmaW5lZCgpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnTm9uY2VBZHZhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3VjY2VlZCBmb3IgYSBtdWx0aSB0cmFuc2ZlciB0eCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLk1VTFRJX1RSQU5TRkVSX1NJR05FRCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHR4SnNvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnaWQnLCAnZmVlUGF5ZXInLCAnbm9uY2UnLCAnbnVtU2lnbmF0dXJlcycsICdpbnN0cnVjdGlvbnNEYXRhJ10pO1xuICAgICAgdHhKc29uLmlkPy5zaG91bGQuZXF1YWwoXG4gICAgICAgICdUUFZjYzE4Q1l4UG5NM2VSZ1FoZGI2VjZaTGEzNER2M2RVN010dktQdXk1WlBLTE0xdVpQRkZFbUYybTE4NFBUV0tSWjFVcTZOS0ZaV3dyMmtyS2s2M2YnXG4gICAgICApO1xuICAgICAgdHguc2lnbmF0dXJlLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICAnVFBWY2MxOENZeFBuTTNlUmdRaGRiNlY2WkxhMzREdjNkVTdNdHZLUHV5NVpQS0xNMXVaUEZGRW1GMm0xODRQVFdLUloxVXE2TktGWld3cjJrcktrNjNmJyxcbiAgICAgIF0pO1xuICAgICAgdHhKc29uLmZlZVBheWVyPy5zaG91bGQuZXF1YWwoJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyk7XG4gICAgICB0eEpzb24ubm9uY2Uuc2hvdWxkLmVxdWFsKCdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScpO1xuICAgICAgdHhKc29uLm51bVNpZ25hdHVyZXMuc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgdHhKc29uLmxhbXBvcnRzUGVyU2lnbmF0dXJlPy5zaG91bGQuYmUudW5kZWZpbmVkKCk7XG4gICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5sZW5ndGguc2hvdWxkLmVxdWFsKDgpO1xuICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnTm9uY2VBZHZhbmNlJyxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICdDUDVEcGFhNDJSdEptTXVLcUNRc0x3bWE1WWgza251dktzWURGWDg1RjQxUycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICc2QjU1WE1pYVM2dFVadzVUdDNHMVJhWEFxZHJ2TjM4eVhWREptV3ZLTGtpTScsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICdDMVVqcHhjWE5CcHAxVXl2WXN1TkJOWjVEYTFHMWk0OWczeVR2QzIzTnk3ZScsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICdDcFVZWGg5eFhvV2ZrQlZhQlFSWjhuQWdEYlQxNkdaZVFkcXZlZUJTMWhtaycsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICc2NHM2TmptRW9rZGhpY0hFZDQzMlg1VXQyRURmRG1WcWR2R2g0ckFTbjFnZCcsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnVHJhbnNmZXInLFxuICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgZnJvbUFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgICB0b0FkZHJlc3M6ICc2blh4TDJqTVNka2dmSG0xM1R3dm4xZ3pSQVBkclduV0xmdTg5UEpMM0FxZScsXG4gICAgICAgICAgICBhbW91bnQ6ICczMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICBtZW1vOiAndGVzdCBtZW1vJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduIHNob3VsZCcsICgpID0+IHtcbiAgICBpdCgnZmFpbCBpZiB0aGUgdHggZG9lc250IGhhdmUgbm9uY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LnNvbFRyYW5zYWN0aW9uID0gbmV3IFNvbFRyYW5zYWN0aW9uKCk7XG4gICAgICB0eC5zb2xUcmFuc2FjdGlvbi5mZWVQYXllciA9IG5ldyBQdWJsaWNLZXkodGVzdERhdGEuYXV0aEFjY291bnQucHViKTtcbiAgICAgIGNvbnN0IGtwID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLnBydktleXMucHJ2S2V5MS5iYXNlNTggfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKGtwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdOb25jZSBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWwgaWYgdGhlIHR4IGRvZXNudCBoYXZlIGZlZVBheWVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBjb25zdCBrcCA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pO1xuICAgICAgdHguc29sVHJhbnNhY3Rpb24gPSBuZXcgU29sVHJhbnNhY3Rpb24oKTtcbiAgICAgIHR4LnNvbFRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF07XG4gICAgICBhd2FpdCB0eC5zaWduKGtwKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdmZWVQYXllciBpcyByZXF1aXJlZCBiZWZvcmUgc2lnbmluZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWwgaWYgdGhlIEtleVBhaXIgaXMgbm90IHRoZSByaWdodCBvbmUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5wcnZLZXlzLnBydktleTEuYmFzZTU4IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrZXlwYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdmYWlsIGlmIHRoZSBLZXlQYWlyIGRvZXNudCBoYXZlIGEgcHJ2IGtleScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLnB1YktleXMudmFsaWRQdWJLZXlzWzBdIH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrZXlwYWlyKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3VjY2VlZCB0byBzaWduIHdpdGggMSBLZXlQYWlyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrZXlwYWlyKS5zaG91bGQuYmUuZnVsZmlsbGVkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdGVzdERhdGEuUkFXX1RYX1NJR05FRCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3VjY2VlZCB3aGVuIHRyeSB0byBzaWduIHdpdGggdGhlIHNhbWUga2V5UGFpciBtdWx0aXBsZSB0aW1lcyAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2luKTtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgICAgY29uc3Qga2V5cGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTggfSk7XG4gICAgICBhd2FpdCB0eC5zaWduKFtrZXlwYWlyLCBrZXlwYWlyLCBrZXlwYWlyLCBrZXlwYWlyXSkuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N1Y2NlZWQgd2hlbiB0cnkgdG8gc2lnbiB3aXRoIGEga2V5UGFpciB0aGF0IGFscmVhZHkgc2lnbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1NJR05FRCk7XG4gICAgICBjb25zdCBrZXlwYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCB9KTtcbiAgICAgIGF3YWl0IHR4LnNpZ24oa2V5cGFpcikuc2hvdWxkLmJlLmZ1bGZpbGxlZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkRmVlUGF5ZXJTaWduYXR1cmUgc2hvdWxkJywgKCkgPT4ge1xuICAgIGl0KCdmaWxsIHRoZSBzaWduYXR1cmUgc2xvdCBvZiB0aGUgZmVlIHBheWVyIChhY2NvdW50IDApIG9mIGEgbGVnYWN5IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcblxuICAgICAgLy8gYWNjb3VudFdpdGhTZWVkIGlzIHRoZSBmZWUgcGF5ZXIgb2YgUkFXX1RYX1VOU0lHTkVEOyB0YWtlIGl0cyByZWFsIHNpZ25hdHVyZSBmcm9tIHRoZSBzaWduZWQgZml4dHVyZVxuICAgICAgY29uc3Qgc2lnbmVkID0gU29sVHJhbnNhY3Rpb24uZnJvbShCdWZmZXIuZnJvbSh0ZXN0RGF0YS5SQVdfVFhfU0lHTkVELCAnYmFzZTY0JykpO1xuICAgICAgY29uc3QgZmVlUGF5ZXJTaWduYXR1cmUgPSBzaWduZWQuc2lnbmF0dXJlc1swXS5zaWduYXR1cmUgYXMgQnVmZmVyO1xuICAgICAgc2hvdWxkLmV4aXN0KGZlZVBheWVyU2lnbmF0dXJlKTtcblxuICAgICAgdHguYWRkRmVlUGF5ZXJTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkgfSwgZmVlUGF5ZXJTaWduYXR1cmUpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlJBV19UWF9TSUdORUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZhaWwgZm9yIGEga2V5IHRoYXQgaXMgbm90IGFjY291bnQgMCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW4pO1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlJBV19UWF9VTlNJR05FRCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHguYWRkRmVlUGF5ZXJTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YiB9LCBCdWZmZXIuYWxsb2MoNjQpKSkudGhyb3dFcnJvcihcbiAgICAgICAgL2FjY291bnQgMCBvZiB0aGUgbWVzc2FnZS9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZmFpbCBvbiBhbiB1bmJ1aWx0IHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICBzaG91bGQoKCkgPT4gdHguYWRkRmVlUGF5ZXJTaWduYXR1cmUoeyBwdWI6IHRlc3REYXRhLmF1dGhBY2NvdW50LnB1YiB9LCBCdWZmZXIuYWxsb2MoNjQpKSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ZlZSBwYXllciBzaWduYXR1cmUgcmVxdWlyZXMgYSBidWlsdCB0cmFuc2FjdGlvbidcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0cmFuc2FjdGlvbiBwYXJzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdmcm9tUmF3VHJhbnNhY3Rpb24gYW5kIHRvQnJvYWRjYXN0Rm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5SQVdfVFhfVU5TSUdORUQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb21SYXdUcmFuc2FjdGlvbiwgc2lnbiBhbmQgdG9Ccm9hZGNhc3RGb3JtYXQgJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbik7XG4gICAgICB0eC5mcm9tUmF3VHJhbnNhY3Rpb24odGVzdERhdGEuUkFXX1RYX1VOU0lHTkVEKTtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgYXdhaXQgdHguc2lnbihrZXlwYWlyKTtcbiAgICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB0ZXN0RGF0YS5SQVdfVFhfU0lHTkVEKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4cGxhaW4gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c29sJyk7XG4gICAgY29uc3QgYmxvY2tIYXNoID0gdGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXTtcbiAgICBjb25zdCBzZW5kZXIgPSB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wdWI7XG4gICAgY29uc3QgYWRkcmVzcyA9IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXTtcbiAgICBjb25zdCBhbW91bnQgPSAnMTAwMDAnO1xuICAgIGNvbnN0IHdhbGxldCA9IG5ldyBLZXlQYWlyKHRlc3REYXRhLmF1dGhBY2NvdW50KS5nZXRLZXlzKCk7XG4gICAgY29uc3Qgc3Rha2VBY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEuc3Rha2VBY2NvdW50KS5nZXRLZXlzKCk7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGVzdERhdGEudmFsaWRhdG9yO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHNpbmdsZSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdEZXNVN1hzY1pqbmc4eWo1Vlg2QVpzazNoV1NXNHNRM3JURzJMdXlRMlA0SCcsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlUGF5ZXI6IHNlbmRlcixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgICAgYXRhT3duZXJNYXA6IHt9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gc2luZ2xlIHRyYW5zZmVyIHdpdGggZHVyYWJsZSBub25jZSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBzZW5kZXIgfSlcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTZW5kJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnRGVzVTdYc2Naam5nOHlqNVZYNkFac2szaFdTVzRzUTNyVEcyTHV5UTJQNEgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzAnLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICc1bmU3cGhBNDhKcnZwbjM5QXR1cEI4WmtDQ0F5OGdMVGZwR2loWlB1RHFlbicsXG4gICAgICAgIGR1cmFibGVOb25jZToge1xuICAgICAgICAgIGF1dGhXYWxsZXRBZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgIHdhbGxldE5vbmNlQWRkcmVzczogJzhZN1JNNkpmY1g0QVNTTkJrcmtybVNiUnU0MzFZVmk5WTNvTEZuekMyZENoJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICAgIGF0YU93bmVyTWFwOiB7fSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIG11bHRpIHRyYW5zZmVyIHdpdGggZHVyYWJsZSBub25jZSBhbmQgbWVtbyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaCwgeyB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsIGF1dGhXYWxsZXRBZGRyZXNzOiBzZW5kZXIgfSlcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5tZW1vKCdtZW1vIHRleHQnKVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3MsIGFtb3VudCB9KVxuICAgICAgICAuc2VuZCh7IGFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSwgYW1vdW50IH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzJdLCBhbW91bnQgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzMwMDAwJyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdEZXNVN1hzY1pqbmc4eWo1Vlg2QVpzazNoV1NXNHNRM3JURzJMdXlRMlA0SCcsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQXp6OUVtTnVodGpvWXJoV3ZpZFd4MUhmZDE0U05Cc1l5elhoQTlUbm9jYTgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzJuMnhxV005WjE4THF4Zkp6a05yTU1GV2lEVUZZQTJrNldTZ1NuZjZFbkpzJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlUGF5ZXI6IHNlbmRlcixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnMCcsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAnbWVtbyB0ZXh0JyxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICBhdXRoV2FsbGV0QWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6ICc4WTdSTTZKZmNYNEFTU05Ca3Jrcm1TYlJ1NDMxWVZpOVkzb0xGbnpDMmRDaCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRyYW5zZmVyQnVpbGRlcigpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50IH0pXG4gICAgICAgIC5idWlsZCgpO1xuICAgICAgYXdhaXQgKHR4IGFzIFRyYW5zYWN0aW9uKS5zaWduKG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hdXRoQWNjb3VudC5wcnYgfSkpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IHR4LmlkLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWVQYXllcjogc2VuZGVyLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiB3YWxsZXQgaW5pdCB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0V2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyKClcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLmFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1dhbGxldEluaXRpYWxpemF0aW9uJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQXp6OUVtTnVodGpvWXJoV3ZpZFd4MUhmZDE0U05Cc1l5elhoQTlUbm9jYTgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwMDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiB3YWxsZXQgaW5pdCB3aXRoIGR1cmFibGUgbm9uY2UgYW5kIG1lbW8gdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlciB9KVxuICAgICAgICAubWVtbygnbWVtbyB0ZXh0JylcbiAgICAgICAgLmFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdKVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1dhbGxldEluaXRpYWxpemF0aW9uJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQXp6OUVtTnVodGpvWXJoV3ZpZFd4MUhmZDE0U05Cc1l5elhoQTlUbm9jYTgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzAnLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogJ21lbW8gdGV4dCcsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB7XG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICB9LFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgICAgYXRhT3duZXJNYXA6IHt9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gc2lnbmVkIHdhbGxldCBpbml0IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5zZW5kZXIoc2VuZGVyKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuYWRkcmVzcyh0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMV0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAuYnVpbGQoKTtcbiAgICAgIGF3YWl0ICh0eCBhcyBUcmFuc2FjdGlvbikuc2lnbihuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYXV0aEFjY291bnQucHJ2IH0pKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiB0eC5pZCxcbiAgICAgICAgdHlwZTogJ1dhbGxldEluaXRpYWxpemF0aW9uJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnQXp6OUVtTnVodGpvWXJoV3ZpZFd4MUhmZDE0U05Cc1l5elhoQTlUbm9jYTgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwMDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBjcmVhdGUgQVRBIHRyYW5zYWN0aW9uIHdpdGggdG9rZW5FbmFibGVtZW50cyBmaWVsZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKClcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLm1pbnQoJ3Rzb2w6dXNkYycpXG4gICAgICAgIC5yZW50RXhlbXB0QW1vdW50KGFtb3VudClcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdG9rZW5FbmFibGVtZW50cyBmaWVsZCBleGlzdHMgYW5kIGNvbnRhaW5zIHRoZSBjb3JyZWN0IGRhdGFcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5oYXZlLnByb3BlcnR5KCd0b2tlbkVuYWJsZW1lbnRzJyk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi50b2tlbkVuYWJsZW1lbnRzLnNob3VsZC5iZS5hbi5BcnJheSgpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnYWRkcmVzcycsICd0b2tlbk5hbWUnLCAndG9rZW5BZGRyZXNzJ10pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1swXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCd0c29sOnVzZGMnKTtcblxuICAgICAgLy8gVmVyaWZ5IGRpc3BsYXlPcmRlciBpbmNsdWRlcyB0b2tlbkVuYWJsZW1lbnRzXG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5kaXNwbGF5T3JkZXIuc2hvdWxkLmNvbnRhaW5FcWwoJ3Rva2VuRW5hYmxlbWVudHMnKTtcblxuICAgICAgLy8gVmVyaWZ5IG90aGVyIGltcG9ydGFudCBmaWVsZHNcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLmlkLnNob3VsZC5lcXVhbCgnVU5BVkFJTEFCTEUnKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnR5cGUuc2hvdWxkLmVxdWFsKCdBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24nKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLm91dHB1dHMuc2hvdWxkLmJlLmFuLkFycmF5KCkuYW5kLmJlLmVtcHR5KCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5mZWUuZmVlLnNob3VsZC5lcXVhbCgnMTUwMDAnKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLmZlZS5mZWVSYXRlLnNob3VsZC5lcXVhbCg1MDAwKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLmJsb2NraGFzaC5zaG91bGQuZXF1YWwoJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyk7XG4gICAgICBzaG91bGQubm90LmV4aXN0KGV4cGxhaW5lZFRyYW5zYWN0aW9uLmR1cmFibGVOb25jZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gbXVsdGlwbGUgdG9rZW4gZW5hYmxlbWVudHMgaW4gYSB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIENyZWF0ZSBhIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgdG9rZW4gZW5hYmxlbWVudHNcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QXRhSW5pdGlhbGl6YXRpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UoYmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoc2VuZGVyKTtcbiAgICAgIHR4QnVpbGRlci5lbmFibGVUb2tlbih7XG4gICAgICAgIG93bmVyQWRkcmVzczogc2VuZGVyLFxuICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICBhdGFBZGRyZXNzOiAnRGZHSkhzclk3UmNoVndQZmlnVDRUM1drYzR6R3Exa2tiV3pOYVZRckRFNHcnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIuZW5hYmxlVG9rZW4oe1xuICAgICAgICBvd25lckFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgdG9rZW5OYW1lOiAndHNvbDpyYXknLFxuICAgICAgICBhdGFBZGRyZXNzOiAnR0hoaFBBdWg1UGR5ZUNNNHpIUFQ3anozakFHclhUUFF1Nm1VTVR0WjhUVGYnLFxuICAgICAgfSk7XG4gICAgICB0eEJ1aWxkZXIucmVudEV4ZW1wdEFtb3VudChhbW91bnQpO1xuICAgICAgdHhCdWlsZGVyLmZlZSh7IGFtb3VudDogNTAwMCB9KTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgdG9rZW5FbmFibGVtZW50cyBmaWVsZCBjb250YWlucyBtdWx0aXBsZSBlbnRyaWVzXG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgndG9rZW5FbmFibGVtZW50cycpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50cy5zaG91bGQuYmUuYW4uQXJyYXkoKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnRva2VuRW5hYmxlbWVudHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgLy8gQ2hlY2sgdGhlIGZpcnN0IHRva2VuIGVuYWJsZW1lbnRcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnRva2VuRW5hYmxlbWVudHNbMF0uc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ2FkZHJlc3MnLCAndG9rZW5OYW1lJywgJ3Rva2VuQWRkcmVzcyddKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnRva2VuRW5hYmxlbWVudHNbMF0udG9rZW5OYW1lLnNob3VsZC5lcXVhbCgndHNvbDp1c2RjJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoZSBzZWNvbmQgdG9rZW4gZW5hYmxlbWVudFxuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1sxXS5zaG91bGQuaGF2ZS5wcm9wZXJ0aWVzKFsnYWRkcmVzcycsICd0b2tlbk5hbWUnLCAndG9rZW5BZGRyZXNzJ10pO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24udG9rZW5FbmFibGVtZW50c1sxXS50b2tlbk5hbWUuc2hvdWxkLmVxdWFsKCd0c29sOnJheScpO1xuXG4gICAgICAvLyBWZXJpZnkgb3V0cHV0cyBpcyBlbXB0eSAoc2luY2UgdG9rZW4gZW5hYmxlbWVudHMgYXJlIG5vIGxvbmdlciBhZGRlZCB0byBvdXRwdXRzKVxuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24ub3V0cHV0cy5zaG91bGQuYmUuYW4uQXJyYXkoKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLm91dHB1dHMuc2hvdWxkLmJlLmVtcHR5KCk7XG5cbiAgICAgIC8vIERpc3BsYXkgb3JkZXIgc2hvdWxkIGluY2x1ZGUgdG9rZW5FbmFibGVtZW50c1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uZGlzcGxheU9yZGVyLnNob3VsZC5jb250YWluRXFsKCd0b2tlbkVuYWJsZW1lbnRzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjdGl2YXRlIGJ1aWxkZXIgJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGF0b3IodmFsaWRhdG9yLnB1YilcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU3Rha2luZ0FjdGl2YXRlJyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnN2RSdUdGYlUyeTJraWpQNm8xTFlOelZ5ejR5ZjEzTW9vcW9pb25DenY1WmEnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzEwMDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVhY3RpdmF0ZSBidWlsZGVyICcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAubm9uY2UocmVjZW50QmxvY2tIYXNoKVxuICAgICAgICAuZmVlKHsgYW1vdW50OiA1MDAwIH0pXG4gICAgICAgIC5idWlsZCgpO1xuXG4gICAgICBjb25zdCBleHBsYWluZWRUcmFuc2FjdGlvbiA9IHR4LmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdibG9ja2hhc2gnLFxuICAgICAgICAgICdkdXJhYmxlTm9uY2UnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ3Rva2VuRW5hYmxlbWVudHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdtZW1vJyxcbiAgICAgICAgXSxcbiAgICAgICAgaWQ6ICdVTkFWQUlMQUJMRScsXG4gICAgICAgIHR5cGU6ICdTdGFraW5nRGVhY3RpdmF0ZScsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtdLFxuICAgICAgICBpbnB1dHM6IFtdLFxuICAgICAgICBmZWVQYXllcjogc2VuZGVyLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiB3aXRoZHJhdyB0cmFuc2FjdGlvbiAnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNlbnRCbG9ja0hhc2ggPSAnR0h0WFFCc29aSFZuTkZhOVlldkF6RnIxN0RKamdIWGszeWNUS0Q1eEQzWmknO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCBmYWN0b3J5XG4gICAgICAgIC5nZXRTdGFraW5nV2l0aGRyYXdCdWlsZGVyKClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC5ub25jZShyZWNlbnRCbG9ja0hhc2gpXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1N0YWtpbmdXaXRoZHJhdycsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMTAwMDAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzVocjVmaXNQaTZEWE51dVJwbTVYVWJ6cGlFbm1keXhYdUJEVHd6d1pqNVBlJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzdGFrZUFjY291bnQucHViLFxuICAgICAgICAgICAgdmFsdWU6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZmVlUGF5ZXI6IHNlbmRlcixcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiAnNTAwMCcsXG4gICAgICAgICAgZmVlUmF0ZTogNTAwMCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogdW5kZWZpbmVkLFxuICAgICAgICBibG9ja2hhc2g6ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaScsXG4gICAgICAgIGR1cmFibGVOb25jZTogdW5kZWZpbmVkLFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgICAgYXRhT3duZXJNYXA6IHt9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gd2l0aGRyYXcgdHJhbnNhY3Rpb24gd2l0aCBtZW1vIGFuZCBkdXJhYmxlIG5vbmNlICcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0U3Rha2luZ1dpdGhkcmF3QnVpbGRlcigpXG4gICAgICAgIC5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKVxuICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlciB9KVxuICAgICAgICAubWVtbygnbWVtbyB0ZXh0JylcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcbiAgICAgIHR4LnNpZ25hYmxlUGF5bG9hZDtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU3Rha2luZ1dpdGhkcmF3JyxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIGNoYW5nZUFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnNWhyNWZpc1BpNkRYTnV1UnBtNVhVYnpwaUVubWR5eFh1QkRUd3p3Wmo1UGUnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHN0YWtlQWNjb3VudC5wdWIsXG4gICAgICAgICAgICB2YWx1ZTogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWVQYXllcjogc2VuZGVyLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiAnbWVtbyB0ZXh0JyxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHtcbiAgICAgICAgICB3YWxsZXROb25jZUFkZHJlc3M6IHRlc3REYXRhLm5vbmNlQWNjb3VudC5wdWIsXG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgfSxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICAgIGF0YU93bmVyTWFwOiB7fSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHNpbmdsZSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoKVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzLCBhbW91bnQsIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycgfSlcbiAgICAgICAgLmZlZSh7IGFtb3VudDogNTAwMCB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnRGVzVTdYc2Naam5nOHlqNVZYNkFac2szaFdTVzRzUTNyVEcyTHV5UTJQNEgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpbnB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBmZWVQYXllcjogc2VuZGVyLFxuICAgICAgICBmZWU6IHtcbiAgICAgICAgICBmZWU6ICc1MDAwJyxcbiAgICAgICAgICBmZWVSYXRlOiA1MDAwLFxuICAgICAgICB9LFxuICAgICAgICBtZW1vOiB1bmRlZmluZWQsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB1bmRlZmluZWQsXG4gICAgICAgIHRva2VuRW5hYmxlbWVudHM6IFtdLFxuICAgICAgICBhdGFPd25lck1hcDoge30sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBzaW5nbGUgdG9rZW4gdHJhbnNmZXIgdHJhbnNhY3Rpb24gd2l0aCBvcHRpb25hbCBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGZhY3RvcnlcbiAgICAgICAgLmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKClcbiAgICAgICAgLm5vbmNlKGJsb2NrSGFzaClcbiAgICAgICAgLnNlbmRlcihzZW5kZXIpXG4gICAgICAgIC5zZW5kKHtcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOmFtcycsXG4gICAgICAgICAgdG9rZW5BZGRyZXNzOiAnRjR1TGVYaW9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICAgIHByb2dyYW1JZDogJ1Rva2Vua2VnUWZlWnlpTndBSmJOYkdLUEZYQ1d1QnZmOVNzNjIzVlE1REEnLFxuICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IDksXG4gICAgICAgIH0pXG4gICAgICAgIC5mZWUoeyBhbW91bnQ6IDUwMDAgfSlcbiAgICAgICAgLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2Jsb2NraGFzaCcsXG4gICAgICAgICAgJ2R1cmFibGVOb25jZScsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAndG9rZW5FbmFibGVtZW50cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ21lbW8nLFxuICAgICAgICBdLFxuICAgICAgICBpZDogJ1VOQVZBSUxBQkxFJyxcbiAgICAgICAgdHlwZTogJ1NlbmQnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJ0Rlc1U3WHNjWmpuZzh5ajVWWDZBWnNrM2hXU1c0c1EzclRHMkx1eVEyUDRIJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICAgIC8vIFdBU00gcGF0aCByZXNvbHZlcyB0b2tlbiBuYW1lIHZpYSBAYml0Z28tYmV0YS9zdGF0aWNzOyB0aGlzIG1pbnQgaXMgbm90IHJlZ2lzdGVyZWQsXG4gICAgICAgICAgICAvLyBzbyB0aGUgcmF3IG1pbnQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIHRoZSBodW1hbi1yZWFkYWJsZSBuYW1lLlxuICAgICAgICAgICAgdG9rZW5OYW1lOiAnRjR1TGVYaW9GejNodzEzTXBvc3V3YVFiTWNaYkNqcXZFR1BQZVJSQjFCeWYnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlucHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzUwMDAnLFxuICAgICAgICAgIGZlZVJhdGU6IDUwMDAsXG4gICAgICAgIH0sXG4gICAgICAgIG1lbW86IHVuZGVmaW5lZCxcbiAgICAgICAgYmxvY2toYXNoOiAnNW5lN3BoQTQ4SnJ2cG4zOUF0dXBCOFprQ0NBeThnTFRmcEdpaFpQdURxZW4nLFxuICAgICAgICBkdXJhYmxlTm9uY2U6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9rZW5FbmFibGVtZW50czogW10sXG4gICAgICAgIGF0YU93bmVyTWFwOiB7fSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIG11bHRpIHRva2VuIHRyYW5zZmVyIHdpdGggZHVyYWJsZSBub25jZSBhbmQgbWVtbyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgZmFjdG9yeVxuICAgICAgICAuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKVxuICAgICAgICAubm9uY2UoYmxvY2tIYXNoLCB7IHdhbGxldE5vbmNlQWRkcmVzczogdGVzdERhdGEubm9uY2VBY2NvdW50LnB1YiwgYXV0aFdhbGxldEFkZHJlc3M6IHNlbmRlciB9KVxuICAgICAgICAuc2VuZGVyKHNlbmRlcilcbiAgICAgICAgLm1lbW8oJ21lbW8gdGV4dCcpXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzcywgYW1vdW50LCB0b2tlbk5hbWU6ICd0c29sOnVzZGMnIH0pXG4gICAgICAgIC5zZW5kKHsgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzFdLCBhbW91bnQsIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycgfSlcbiAgICAgICAgLnNlbmQoeyBhZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMl0sIGFtb3VudCwgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyB9KVxuICAgICAgICAuYnVpbGQoKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSB0eC5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnYmxvY2toYXNoJyxcbiAgICAgICAgICAnZHVyYWJsZU5vbmNlJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICd0b2tlbkVuYWJsZW1lbnRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgICAnbWVtbycsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnVU5BVkFJTEFCTEUnLFxuICAgICAgICB0eXBlOiAnU2VuZCcsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICAgIG91dHB1dHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAnRGVzVTdYc2Naam5nOHlqNVZYNkFac2szaFdTVzRzUTNyVEcyTHV5UTJQNEgnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAnLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiAndHNvbDp1c2RjJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICdBeno5RW1OdWh0am9ZcmhXdmlkV3gxSGZkMTRTTkJzWXl6WGhBOVRub2NhOCcsXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMCcsXG4gICAgICAgICAgICB0b2tlbk5hbWU6ICd0c29sOnVzZGMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogJzJuMnhxV005WjE4THF4Zkp6a05yTU1GV2lEVUZZQTJrNldTZ1NuZjZFbkpzJyxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwJyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogJ3Rzb2w6dXNkYycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5wdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6ICcxMDAwMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiBzZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogJzEwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiAnMTAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZVBheWVyOiBzZW5kZXIsXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogJzAnLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgbWVtbzogJ21lbW8gdGV4dCcsXG4gICAgICAgIGJsb2NraGFzaDogJzVuZTdwaEE0OEpydnBuMzlBdHVwQjhaa0NDQXk4Z0xUZnBHaWhaUHVEcWVuJyxcbiAgICAgICAgZHVyYWJsZU5vbmNlOiB7XG4gICAgICAgICAgYXV0aFdhbGxldEFkZHJlc3M6ICc1aHI1ZmlzUGk2RFhOdXVScG01WFVienBpRW5tZHl4WHVCRFR3endaajVQZScsXG4gICAgICAgICAgd2FsbGV0Tm9uY2VBZGRyZXNzOiAnOFk3Uk02SmZjWDRBU1NOQmtya3JtU2JSdTQzMVlWaTlZM29MRm56QzJkQ2gnLFxuICAgICAgICB9LFxuICAgICAgICB0b2tlbkVuYWJsZW1lbnRzOiBbXSxcbiAgICAgICAgYXRhT3duZXJNYXA6IHt9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=