@perpx/js-sdk 0.0.1

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 (344) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +97 -0
  3. package/build/cjs/__tests__/clients/composite-client.test.js +130 -0
  4. package/build/cjs/__tests__/helpers/baseClients.js +29 -0
  5. package/build/cjs/__tests__/helpers/constants.js +110 -0
  6. package/build/cjs/__tests__/lib/helpers.test.js +45 -0
  7. package/build/cjs/__tests__/lib/util.test.js +67 -0
  8. package/build/cjs/__tests__/lib/validation.test.js +254 -0
  9. package/build/cjs/__tests__/modules/client/AccountEndpoints.test.js +186 -0
  10. package/build/cjs/__tests__/modules/client/FaucetEndpoint.test.js +15 -0
  11. package/build/cjs/__tests__/modules/client/MarketsEndpoints.test.js +69 -0
  12. package/build/cjs/__tests__/modules/client/Transfers.test.js +69 -0
  13. package/build/cjs/__tests__/modules/client/UtilityEndpoints.test.js +28 -0
  14. package/build/cjs/__tests__/modules/client/ValidatorGetEndpoints.test.js +46 -0
  15. package/build/cjs/__tests__/modules/client/ValidatorPostEndpoints.test.js +61 -0
  16. package/build/cjs/__tests__/modules/client/constants.js +7 -0
  17. package/build/cjs/__tests__/modules/onboarding.test.js +51 -0
  18. package/build/cjs/examples/account_endpoints.js +129 -0
  19. package/build/cjs/examples/batch_cancel_orders_example.js +93 -0
  20. package/build/cjs/examples/composite_example.js +50 -0
  21. package/build/cjs/examples/constants.js +35 -0
  22. package/build/cjs/examples/faucet_endpoint.js +23 -0
  23. package/build/cjs/examples/gov_add_new_market.js +77 -0
  24. package/build/cjs/examples/human_readable_orders.json +86 -0
  25. package/build/cjs/examples/human_readable_short_term_orders.json +42 -0
  26. package/build/cjs/examples/json-encoding.js +32 -0
  27. package/build/cjs/examples/long_term_order_cancel_example.js +63 -0
  28. package/build/cjs/examples/markets_endpoints.js +134 -0
  29. package/build/cjs/examples/native_examples.js +112 -0
  30. package/build/cjs/examples/noble_example.js +88 -0
  31. package/build/cjs/examples/optimal_node.js +70 -0
  32. package/build/cjs/examples/permissioned_keys_example.js +104 -0
  33. package/build/cjs/examples/raw_orders.json +130 -0
  34. package/build/cjs/examples/short_term_order_cancel_example.js +54 -0
  35. package/build/cjs/examples/short_term_order_composite_example.js +68 -0
  36. package/build/cjs/examples/test.js +50 -0
  37. package/build/cjs/examples/transfer_example_deposit.js +29 -0
  38. package/build/cjs/examples/transfer_example_send.js +42 -0
  39. package/build/cjs/examples/transfer_example_subaccount_transfer.js +29 -0
  40. package/build/cjs/examples/transfer_example_withdraw.js +30 -0
  41. package/build/cjs/examples/transfer_example_withdraw_other.js +42 -0
  42. package/build/cjs/examples/utility_endpoints.js +42 -0
  43. package/build/cjs/examples/validator_get_example.js +158 -0
  44. package/build/cjs/examples/validator_post_example.js +76 -0
  45. package/build/cjs/examples/wallet_address.js +22 -0
  46. package/build/cjs/examples/websocket_example.js +36 -0
  47. package/build/cjs/examples/websocket_orderbook_example.js +196 -0
  48. package/build/cjs/package.json +1 -0
  49. package/build/cjs/src/clients/composite-client.js +839 -0
  50. package/build/cjs/src/clients/constants.js +288 -0
  51. package/build/cjs/src/clients/faucet-client.js +36 -0
  52. package/build/cjs/src/clients/helpers/chain-helpers.js +178 -0
  53. package/build/cjs/src/clients/helpers/request-helpers.js +65 -0
  54. package/build/cjs/src/clients/indexer-client.js +56 -0
  55. package/build/cjs/src/clients/lib/axios/axiosRequest.js +34 -0
  56. package/build/cjs/src/clients/lib/axios/errors.js +28 -0
  57. package/build/cjs/src/clients/lib/axios/index.js +23 -0
  58. package/build/cjs/src/clients/lib/axios/types.js +11 -0
  59. package/build/cjs/src/clients/lib/cctpProto.js +3242 -0
  60. package/build/cjs/src/clients/lib/errors.js +58 -0
  61. package/build/cjs/src/clients/lib/registry.js +52 -0
  62. package/build/cjs/src/clients/modules/account.js +223 -0
  63. package/build/cjs/src/clients/modules/composer.js +419 -0
  64. package/build/cjs/src/clients/modules/get.js +442 -0
  65. package/build/cjs/src/clients/modules/local-wallet.js +82 -0
  66. package/build/cjs/src/clients/modules/markets.js +54 -0
  67. package/build/cjs/src/clients/modules/post.js +412 -0
  68. package/build/cjs/src/clients/modules/proto-includes.js +69 -0
  69. package/build/cjs/src/clients/modules/rest.js +41 -0
  70. package/build/cjs/src/clients/modules/signer.js +93 -0
  71. package/build/cjs/src/clients/modules/tendermintClient.js +137 -0
  72. package/build/cjs/src/clients/modules/utility.js +52 -0
  73. package/build/cjs/src/clients/modules/vault.js +25 -0
  74. package/build/cjs/src/clients/native.js +1330 -0
  75. package/build/cjs/src/clients/noble-client.js +96 -0
  76. package/build/cjs/src/clients/socket-client.js +304 -0
  77. package/build/cjs/src/clients/subaccount.js +45 -0
  78. package/build/cjs/src/clients/types.js +43 -0
  79. package/build/cjs/src/clients/validator-client.js +87 -0
  80. package/build/cjs/src/index.js +73 -0
  81. package/build/cjs/src/lib/constants.js +23 -0
  82. package/build/cjs/src/lib/errors.js +37 -0
  83. package/build/cjs/src/lib/helpers.js +108 -0
  84. package/build/cjs/src/lib/onboarding.js +75 -0
  85. package/build/cjs/src/lib/trading-key-utils.js +120 -0
  86. package/build/cjs/src/lib/utils.js +89 -0
  87. package/build/cjs/src/lib/validation.js +159 -0
  88. package/build/cjs/src/network_optimizer.js +109 -0
  89. package/build/cjs/src/types.js +25 -0
  90. package/build/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  91. package/build/esm/__tests__/clients/composite-client.test.d.ts +2 -0
  92. package/build/esm/__tests__/clients/composite-client.test.d.ts.map +1 -0
  93. package/build/esm/__tests__/clients/composite-client.test.js +128 -0
  94. package/build/esm/__tests__/helpers/baseClients.d.ts +19 -0
  95. package/build/esm/__tests__/helpers/baseClients.d.ts.map +1 -0
  96. package/build/esm/__tests__/helpers/baseClients.js +22 -0
  97. package/build/esm/__tests__/helpers/constants.d.ts +19 -0
  98. package/build/esm/__tests__/helpers/constants.d.ts.map +1 -0
  99. package/build/esm/__tests__/helpers/constants.js +104 -0
  100. package/build/esm/__tests__/lib/helpers.test.d.ts +2 -0
  101. package/build/esm/__tests__/lib/helpers.test.d.ts.map +1 -0
  102. package/build/esm/__tests__/lib/helpers.test.js +40 -0
  103. package/build/esm/__tests__/lib/util.test.d.ts +2 -0
  104. package/build/esm/__tests__/lib/util.test.d.ts.map +1 -0
  105. package/build/esm/__tests__/lib/util.test.js +65 -0
  106. package/build/esm/__tests__/lib/validation.test.d.ts +2 -0
  107. package/build/esm/__tests__/lib/validation.test.d.ts.map +1 -0
  108. package/build/esm/__tests__/lib/validation.test.js +249 -0
  109. package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts +2 -0
  110. package/build/esm/__tests__/modules/client/AccountEndpoints.test.d.ts.map +1 -0
  111. package/build/esm/__tests__/modules/client/AccountEndpoints.test.js +181 -0
  112. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts +2 -0
  113. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.d.ts.map +1 -0
  114. package/build/esm/__tests__/modules/client/FaucetEndpoint.test.js +13 -0
  115. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts +2 -0
  116. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.d.ts.map +1 -0
  117. package/build/esm/__tests__/modules/client/MarketsEndpoints.test.js +66 -0
  118. package/build/esm/__tests__/modules/client/Transfers.test.d.ts +2 -0
  119. package/build/esm/__tests__/modules/client/Transfers.test.d.ts.map +1 -0
  120. package/build/esm/__tests__/modules/client/Transfers.test.js +64 -0
  121. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts +2 -0
  122. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.d.ts.map +1 -0
  123. package/build/esm/__tests__/modules/client/UtilityEndpoints.test.js +26 -0
  124. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts +2 -0
  125. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.d.ts.map +1 -0
  126. package/build/esm/__tests__/modules/client/ValidatorGetEndpoints.test.js +44 -0
  127. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts +2 -0
  128. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.d.ts.map +1 -0
  129. package/build/esm/__tests__/modules/client/ValidatorPostEndpoints.test.js +56 -0
  130. package/build/esm/__tests__/modules/client/constants.d.ts +4 -0
  131. package/build/esm/__tests__/modules/client/constants.d.ts.map +1 -0
  132. package/build/esm/__tests__/modules/client/constants.js +4 -0
  133. package/build/esm/__tests__/modules/onboarding.test.d.ts +2 -0
  134. package/build/esm/__tests__/modules/onboarding.test.d.ts.map +1 -0
  135. package/build/esm/__tests__/modules/onboarding.test.js +49 -0
  136. package/build/esm/examples/account_endpoints.d.ts +5 -0
  137. package/build/esm/examples/account_endpoints.d.ts.map +1 -0
  138. package/build/esm/examples/account_endpoints.js +127 -0
  139. package/build/esm/examples/batch_cancel_orders_example.d.ts +2 -0
  140. package/build/esm/examples/batch_cancel_orders_example.d.ts.map +1 -0
  141. package/build/esm/examples/batch_cancel_orders_example.js +88 -0
  142. package/build/esm/examples/composite_example.d.ts +2 -0
  143. package/build/esm/examples/composite_example.d.ts.map +1 -0
  144. package/build/esm/examples/composite_example.js +45 -0
  145. package/build/esm/examples/constants.d.ts +13 -0
  146. package/build/esm/examples/constants.d.ts.map +1 -0
  147. package/build/esm/examples/constants.js +29 -0
  148. package/build/esm/examples/faucet_endpoint.d.ts +5 -0
  149. package/build/esm/examples/faucet_endpoint.d.ts.map +1 -0
  150. package/build/esm/examples/faucet_endpoint.js +21 -0
  151. package/build/esm/examples/gov_add_new_market.d.ts +2 -0
  152. package/build/esm/examples/gov_add_new_market.d.ts.map +1 -0
  153. package/build/esm/examples/gov_add_new_market.js +72 -0
  154. package/build/esm/examples/human_readable_orders.json +86 -0
  155. package/build/esm/examples/human_readable_short_term_orders.json +42 -0
  156. package/build/esm/examples/json-encoding.d.ts +2 -0
  157. package/build/esm/examples/json-encoding.d.ts.map +1 -0
  158. package/build/esm/examples/json-encoding.js +27 -0
  159. package/build/esm/examples/long_term_order_cancel_example.d.ts +2 -0
  160. package/build/esm/examples/long_term_order_cancel_example.d.ts.map +1 -0
  161. package/build/esm/examples/long_term_order_cancel_example.js +58 -0
  162. package/build/esm/examples/markets_endpoints.d.ts +5 -0
  163. package/build/esm/examples/markets_endpoints.d.ts.map +1 -0
  164. package/build/esm/examples/markets_endpoints.js +131 -0
  165. package/build/esm/examples/native_examples.d.ts +2 -0
  166. package/build/esm/examples/native_examples.d.ts.map +1 -0
  167. package/build/esm/examples/native_examples.js +110 -0
  168. package/build/esm/examples/noble_example.d.ts +2 -0
  169. package/build/esm/examples/noble_example.d.ts.map +1 -0
  170. package/build/esm/examples/noble_example.js +83 -0
  171. package/build/esm/examples/optimal_node.d.ts +2 -0
  172. package/build/esm/examples/optimal_node.d.ts.map +1 -0
  173. package/build/esm/examples/optimal_node.js +68 -0
  174. package/build/esm/examples/permissioned_keys_example.d.ts +2 -0
  175. package/build/esm/examples/permissioned_keys_example.d.ts.map +1 -0
  176. package/build/esm/examples/permissioned_keys_example.js +99 -0
  177. package/build/esm/examples/raw_orders.json +130 -0
  178. package/build/esm/examples/short_term_order_cancel_example.d.ts +2 -0
  179. package/build/esm/examples/short_term_order_cancel_example.d.ts.map +1 -0
  180. package/build/esm/examples/short_term_order_cancel_example.js +49 -0
  181. package/build/esm/examples/short_term_order_composite_example.d.ts +2 -0
  182. package/build/esm/examples/short_term_order_composite_example.d.ts.map +1 -0
  183. package/build/esm/examples/short_term_order_composite_example.js +63 -0
  184. package/build/esm/examples/test.d.ts +2 -0
  185. package/build/esm/examples/test.d.ts.map +1 -0
  186. package/build/esm/examples/test.js +45 -0
  187. package/build/esm/examples/transfer_example_deposit.d.ts +2 -0
  188. package/build/esm/examples/transfer_example_deposit.d.ts.map +1 -0
  189. package/build/esm/examples/transfer_example_deposit.js +24 -0
  190. package/build/esm/examples/transfer_example_send.d.ts +2 -0
  191. package/build/esm/examples/transfer_example_send.d.ts.map +1 -0
  192. package/build/esm/examples/transfer_example_send.js +37 -0
  193. package/build/esm/examples/transfer_example_subaccount_transfer.d.ts +2 -0
  194. package/build/esm/examples/transfer_example_subaccount_transfer.d.ts.map +1 -0
  195. package/build/esm/examples/transfer_example_subaccount_transfer.js +24 -0
  196. package/build/esm/examples/transfer_example_withdraw.d.ts +2 -0
  197. package/build/esm/examples/transfer_example_withdraw.d.ts.map +1 -0
  198. package/build/esm/examples/transfer_example_withdraw.js +25 -0
  199. package/build/esm/examples/transfer_example_withdraw_other.d.ts +2 -0
  200. package/build/esm/examples/transfer_example_withdraw_other.d.ts.map +1 -0
  201. package/build/esm/examples/transfer_example_withdraw_other.js +37 -0
  202. package/build/esm/examples/utility_endpoints.d.ts +5 -0
  203. package/build/esm/examples/utility_endpoints.d.ts.map +1 -0
  204. package/build/esm/examples/utility_endpoints.js +40 -0
  205. package/build/esm/examples/validator_get_example.d.ts +2 -0
  206. package/build/esm/examples/validator_get_example.d.ts.map +1 -0
  207. package/build/esm/examples/validator_get_example.js +156 -0
  208. package/build/esm/examples/validator_post_example.d.ts +2 -0
  209. package/build/esm/examples/validator_post_example.d.ts.map +1 -0
  210. package/build/esm/examples/validator_post_example.js +71 -0
  211. package/build/esm/examples/wallet_address.d.ts +2 -0
  212. package/build/esm/examples/wallet_address.d.ts.map +1 -0
  213. package/build/esm/examples/wallet_address.js +17 -0
  214. package/build/esm/examples/websocket_example.d.ts +2 -0
  215. package/build/esm/examples/websocket_example.d.ts.map +1 -0
  216. package/build/esm/examples/websocket_example.js +34 -0
  217. package/build/esm/examples/websocket_orderbook_example.d.ts +2 -0
  218. package/build/esm/examples/websocket_orderbook_example.d.ts.map +1 -0
  219. package/build/esm/examples/websocket_orderbook_example.js +194 -0
  220. package/build/esm/src/clients/composite-client.d.ts +457 -0
  221. package/build/esm/src/clients/composite-client.d.ts.map +1 -0
  222. package/build/esm/src/clients/composite-client.js +832 -0
  223. package/build/esm/src/clients/constants.d.ts +173 -0
  224. package/build/esm/src/clients/constants.d.ts.map +1 -0
  225. package/build/esm/src/clients/constants.js +264 -0
  226. package/build/esm/src/clients/faucet-client.d.ts +18 -0
  227. package/build/esm/src/clients/faucet-client.d.ts.map +1 -0
  228. package/build/esm/src/clients/faucet-client.js +29 -0
  229. package/build/esm/src/clients/helpers/chain-helpers.d.ts +15 -0
  230. package/build/esm/src/clients/helpers/chain-helpers.d.ts.map +1 -0
  231. package/build/esm/src/clients/helpers/chain-helpers.js +163 -0
  232. package/build/esm/src/clients/helpers/request-helpers.d.ts +3 -0
  233. package/build/esm/src/clients/helpers/request-helpers.d.ts.map +1 -0
  234. package/build/esm/src/clients/helpers/request-helpers.js +58 -0
  235. package/build/esm/src/clients/indexer-client.d.ts +40 -0
  236. package/build/esm/src/clients/indexer-client.d.ts.map +1 -0
  237. package/build/esm/src/clients/indexer-client.js +49 -0
  238. package/build/esm/src/clients/lib/axios/axiosRequest.d.ts +9 -0
  239. package/build/esm/src/clients/lib/axios/axiosRequest.d.ts.map +1 -0
  240. package/build/esm/src/clients/lib/axios/axiosRequest.js +28 -0
  241. package/build/esm/src/clients/lib/axios/errors.d.ts +31 -0
  242. package/build/esm/src/clients/lib/axios/errors.d.ts.map +1 -0
  243. package/build/esm/src/clients/lib/axios/errors.js +23 -0
  244. package/build/esm/src/clients/lib/axios/index.d.ts +7 -0
  245. package/build/esm/src/clients/lib/axios/index.d.ts.map +1 -0
  246. package/build/esm/src/clients/lib/axios/index.js +7 -0
  247. package/build/esm/src/clients/lib/axios/types.d.ts +12 -0
  248. package/build/esm/src/clients/lib/axios/types.d.ts.map +1 -0
  249. package/build/esm/src/clients/lib/axios/types.js +8 -0
  250. package/build/esm/src/clients/lib/cctpProto.d.ts +670 -0
  251. package/build/esm/src/clients/lib/cctpProto.d.ts.map +1 -0
  252. package/build/esm/src/clients/lib/cctpProto.js +3234 -0
  253. package/build/esm/src/clients/lib/errors.d.ts +36 -0
  254. package/build/esm/src/clients/lib/errors.d.ts.map +1 -0
  255. package/build/esm/src/clients/lib/errors.js +50 -0
  256. package/build/esm/src/clients/lib/registry.d.ts +4 -0
  257. package/build/esm/src/clients/lib/registry.d.ts.map +1 -0
  258. package/build/esm/src/clients/lib/registry.js +48 -0
  259. package/build/esm/src/clients/modules/account.d.ts +30 -0
  260. package/build/esm/src/clients/modules/account.d.ts.map +1 -0
  261. package/build/esm/src/clients/modules/account.js +217 -0
  262. package/build/esm/src/clients/modules/composer.d.ts +38 -0
  263. package/build/esm/src/clients/modules/composer.d.ts.map +1 -0
  264. package/build/esm/src/clients/modules/composer.js +412 -0
  265. package/build/esm/src/clients/modules/get.d.ts +199 -0
  266. package/build/esm/src/clients/modules/get.d.ts.map +1 -0
  267. package/build/esm/src/clients/modules/get.js +402 -0
  268. package/build/esm/src/clients/modules/local-wallet.d.ts +42 -0
  269. package/build/esm/src/clients/modules/local-wallet.d.ts.map +1 -0
  270. package/build/esm/src/clients/modules/local-wallet.js +76 -0
  271. package/build/esm/src/clients/modules/markets.d.ts +14 -0
  272. package/build/esm/src/clients/modules/markets.d.ts.map +1 -0
  273. package/build/esm/src/clients/modules/markets.js +48 -0
  274. package/build/esm/src/clients/modules/post.d.ts +137 -0
  275. package/build/esm/src/clients/modules/post.d.ts.map +1 -0
  276. package/build/esm/src/clients/modules/post.js +405 -0
  277. package/build/esm/src/clients/modules/proto-includes.d.ts +30 -0
  278. package/build/esm/src/clients/modules/proto-includes.d.ts.map +1 -0
  279. package/build/esm/src/clients/modules/proto-includes.js +30 -0
  280. package/build/esm/src/clients/modules/rest.d.ts +13 -0
  281. package/build/esm/src/clients/modules/rest.d.ts.map +1 -0
  282. package/build/esm/src/clients/modules/rest.js +35 -0
  283. package/build/esm/src/clients/modules/signer.d.ts +19 -0
  284. package/build/esm/src/clients/modules/signer.d.ts.map +1 -0
  285. package/build/esm/src/clients/modules/signer.js +86 -0
  286. package/build/esm/src/clients/modules/tendermintClient.d.ts +52 -0
  287. package/build/esm/src/clients/modules/tendermintClient.d.ts.map +1 -0
  288. package/build/esm/src/clients/modules/tendermintClient.js +133 -0
  289. package/build/esm/src/clients/modules/utility.d.ts +32 -0
  290. package/build/esm/src/clients/modules/utility.d.ts.map +1 -0
  291. package/build/esm/src/clients/modules/utility.js +46 -0
  292. package/build/esm/src/clients/modules/vault.d.ts +12 -0
  293. package/build/esm/src/clients/modules/vault.d.ts.map +1 -0
  294. package/build/esm/src/clients/modules/vault.js +19 -0
  295. package/build/esm/src/clients/native.d.ts +75 -0
  296. package/build/esm/src/clients/native.d.ts.map +1 -0
  297. package/build/esm/src/clients/native.js +1237 -0
  298. package/build/esm/src/clients/noble-client.d.ts +39 -0
  299. package/build/esm/src/clients/noble-client.d.ts.map +1 -0
  300. package/build/esm/src/clients/noble-client.js +92 -0
  301. package/build/esm/src/clients/socket-client.d.ts +149 -0
  302. package/build/esm/src/clients/socket-client.d.ts.map +1 -0
  303. package/build/esm/src/clients/socket-client.js +297 -0
  304. package/build/esm/src/clients/subaccount.d.ts +26 -0
  305. package/build/esm/src/clients/subaccount.d.ts.map +1 -0
  306. package/build/esm/src/clients/subaccount.js +41 -0
  307. package/build/esm/src/clients/types.d.ts +139 -0
  308. package/build/esm/src/clients/types.d.ts.map +1 -0
  309. package/build/esm/src/clients/types.js +26 -0
  310. package/build/esm/src/clients/validator-client.d.ts +41 -0
  311. package/build/esm/src/clients/validator-client.d.ts.map +1 -0
  312. package/build/esm/src/clients/validator-client.js +80 -0
  313. package/build/esm/src/index.d.ts +17 -0
  314. package/build/esm/src/index.d.ts.map +1 -0
  315. package/build/esm/src/index.js +19 -0
  316. package/build/esm/src/lib/constants.d.ts +13 -0
  317. package/build/esm/src/lib/constants.d.ts.map +1 -0
  318. package/build/esm/src/lib/constants.js +20 -0
  319. package/build/esm/src/lib/errors.d.ts +23 -0
  320. package/build/esm/src/lib/errors.d.ts.map +1 -0
  321. package/build/esm/src/lib/errors.js +31 -0
  322. package/build/esm/src/lib/helpers.d.ts +32 -0
  323. package/build/esm/src/lib/helpers.d.ts.map +1 -0
  324. package/build/esm/src/lib/helpers.js +98 -0
  325. package/build/esm/src/lib/onboarding.d.ts +46 -0
  326. package/build/esm/src/lib/onboarding.d.ts.map +1 -0
  327. package/build/esm/src/lib/onboarding.js +69 -0
  328. package/build/esm/src/lib/trading-key-utils.d.ts +37 -0
  329. package/build/esm/src/lib/trading-key-utils.d.ts.map +1 -0
  330. package/build/esm/src/lib/trading-key-utils.js +111 -0
  331. package/build/esm/src/lib/utils.d.ts +49 -0
  332. package/build/esm/src/lib/utils.d.ts.map +1 -0
  333. package/build/esm/src/lib/utils.js +79 -0
  334. package/build/esm/src/lib/validation.d.ts +35 -0
  335. package/build/esm/src/lib/validation.d.ts.map +1 -0
  336. package/build/esm/src/lib/validation.js +147 -0
  337. package/build/esm/src/network_optimizer.d.ts +21 -0
  338. package/build/esm/src/network_optimizer.d.ts.map +1 -0
  339. package/build/esm/src/network_optimizer.js +104 -0
  340. package/build/esm/src/types.d.ts +26 -0
  341. package/build/esm/src/types.d.ts.map +1 -0
  342. package/build/esm/src/types.js +8 -0
  343. package/build/esm/tsconfig.esm.tsbuildinfo +1 -0
  344. package/package.json +129 -0
@@ -0,0 +1,832 @@
1
+ import { Method } from '@cosmjs/tendermint-rpc';
2
+ import { Order_ConditionType, } from '@perpx/proto/src/codegen/perpx/clob/order';
3
+ import { parseUnits } from 'ethers';
4
+ import Long from 'long';
5
+ import protobuf from 'protobufjs';
6
+ import { bigIntToBytes } from '../lib/helpers';
7
+ import { isStatefulOrder, verifyOrderFlags } from '../lib/validation';
8
+ import { OrderFlags } from '../types';
9
+ import { AuthenticatorType, SHORT_BLOCK_FORWARD, SHORT_BLOCK_WINDOW, SelectedGasDenom, } from './constants';
10
+ import { calculateQuantums, calculateSubticks, calculateSide, calculateTimeInForce, calculateOrderFlags, calculateClientMetadata, calculateConditionType, calculateConditionalOrderTriggerSubticks, calculateVaultQuantums, } from './helpers/chain-helpers';
11
+ import { IndexerClient } from './indexer-client';
12
+ import { UserError } from './lib/errors';
13
+ import { generateRegistry } from './lib/registry';
14
+ import { SubaccountInfo } from './subaccount';
15
+ import { ValidatorClient } from './validator-client';
16
+ // Required for encoding and decoding queries that are of type Long.
17
+ // Must be done once but since the individal modules should be usable
18
+ // - must be set in each module that encounters encoding/decoding Longs.
19
+ // Reference: https://github.com/protobufjs/protobuf.js/issues/921
20
+ protobuf.util.Long = Long;
21
+ protobuf.configure();
22
+ export class CompositeClient {
23
+ /**
24
+ * @description Create and initialize a composite client for a network.
25
+ */
26
+ static async connect(network) {
27
+ const client = new CompositeClient(network);
28
+ await client.initialize();
29
+ return client;
30
+ }
31
+ constructor(network, apiTimeout) {
32
+ this.gasDenom = SelectedGasDenom.USDC;
33
+ this.network = network;
34
+ this._indexerClient = new IndexerClient(network.indexerConfig, apiTimeout);
35
+ }
36
+ async initialize() {
37
+ this._validatorClient = await ValidatorClient.connect(this.network.validatorConfig);
38
+ }
39
+ /**
40
+ * @description Get the underlying indexer client.
41
+ */
42
+ get indexerClient() {
43
+ /**
44
+ * Get the indexer client
45
+ */
46
+ return this._indexerClient;
47
+ }
48
+ /**
49
+ * @description Get the underlying validator client.
50
+ */
51
+ get validatorClient() {
52
+ /**
53
+ * Get the validator client
54
+ */
55
+ return this._validatorClient;
56
+ }
57
+ /**
58
+ * @description Get the currently selected gas denom.
59
+ */
60
+ get selectedGasDenom() {
61
+ if (!this._validatorClient)
62
+ return undefined;
63
+ return this._validatorClient.selectedGasDenom;
64
+ }
65
+ /**
66
+ * @description Set the gas denom used for transaction fees.
67
+ */
68
+ setSelectedGasDenom(gasDenom) {
69
+ if (!this._validatorClient)
70
+ throw new Error('Validator client not initialized');
71
+ this._validatorClient.setSelectedGasDenom(gasDenom);
72
+ }
73
+ /**
74
+ * @description Preload account numbers for faster signing.
75
+ */
76
+ async populateAccountNumberCache(address) {
77
+ if (!this._validatorClient)
78
+ throw new Error('Validator client not initialized');
79
+ await this._validatorClient.populateAccountNumberCache(address);
80
+ }
81
+ /**
82
+ * @description Sign a list of messages with a wallet.
83
+ * the calling function is responsible for creating the messages.
84
+ *
85
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
86
+ * at any point.
87
+ * @returns The Signature.
88
+ */
89
+ async sign(subaccount, messaging, zeroFee, gasPrice, memo, account) {
90
+ return this.validatorClient.post.sign(subaccount, messaging, zeroFee, gasPrice, memo, account);
91
+ }
92
+ /**
93
+ * @description Send a list of messages with a wallet.
94
+ * the calling function is responsible for creating the messages.
95
+ *
96
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
97
+ * at any point.
98
+ * @returns The Transaction Hash.
99
+ */
100
+ async send(subaccount, messaging, zeroFee, gasPrice, memo, broadcastMode, account) {
101
+ return this.validatorClient.post.send(subaccount, messaging, zeroFee, gasPrice, memo, broadcastMode, account, undefined);
102
+ }
103
+ /**
104
+ * @description Send a signed transaction.
105
+ *
106
+ * @param signedTransaction The signed transaction to send.
107
+ *
108
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
109
+ * at any point.
110
+ * @returns The Transaction Hash.
111
+ */
112
+ async sendSignedTransaction(signedTransaction) {
113
+ return this.validatorClient.post.sendSignedTransaction(signedTransaction);
114
+ }
115
+ /**
116
+ * @description Simulate a list of messages with a wallet.
117
+ * the calling function is responsible for creating the messages.
118
+ *
119
+ * To send multiple messages with gas estimate:
120
+ * 1. Client is responsible for creating the messages.
121
+ * 2. Call simulate() to get the gas estimate.
122
+ * 3. Call send() to send the messages.
123
+ *
124
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
125
+ * at any point.
126
+ * @returns The gas estimate.
127
+ */
128
+ async simulate(subaccount, messaging, gasPrice, memo, account) {
129
+ return this.validatorClient.post.simulate(subaccount, messaging, gasPrice, memo, account);
130
+ }
131
+ /**
132
+ * @description Calculate the goodTilBlock value for a SHORT_TERM order
133
+ *
134
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
135
+ * at any point.
136
+ * @returns The goodTilBlock value
137
+ */
138
+ async calculateGoodTilBlock(orderFlags, currentHeight, goodTilBlock) {
139
+ if (orderFlags === OrderFlags.SHORT_TERM) {
140
+ if (goodTilBlock !== undefined && goodTilBlock !== 0 && goodTilBlock !== null) {
141
+ return Promise.resolve(goodTilBlock);
142
+ }
143
+ else {
144
+ const height = currentHeight !== null && currentHeight !== void 0 ? currentHeight : (await this.validatorClient.get.latestBlockHeight());
145
+ return height + SHORT_BLOCK_FORWARD;
146
+ }
147
+ }
148
+ else {
149
+ return Promise.resolve(0);
150
+ }
151
+ }
152
+ /**
153
+ * @description Validate the goodTilBlock value for a SHORT_TERM order
154
+ *
155
+ * @param goodTilBlock Number of blocks from the current block height the order will
156
+ * be valid for.
157
+ *
158
+ * @throws UserError if the goodTilBlock value is not valid given latest block height and
159
+ * SHORT_BLOCK_WINDOW.
160
+ */
161
+ async validateGoodTilBlock(goodTilBlock) {
162
+ const height = await this.validatorClient.get.latestBlockHeight();
163
+ const nextValidBlockHeight = height + 1;
164
+ const lowerBound = nextValidBlockHeight;
165
+ const upperBound = nextValidBlockHeight + SHORT_BLOCK_WINDOW;
166
+ if (goodTilBlock < lowerBound || goodTilBlock > upperBound) {
167
+ throw new UserError(`Invalid Short-Term order GoodTilBlock.
168
+ Should be greater-than-or-equal-to ${lowerBound} and less-than-or-equal-to ${upperBound}.
169
+ Provided good til block: ${goodTilBlock}`);
170
+ }
171
+ }
172
+ /**
173
+ * @description Calculate the goodTilBlockTime value for a LONG_TERM order
174
+ * the calling function is responsible for creating the messages.
175
+ *
176
+ * @param goodTilTimeInSeconds The goodTilTimeInSeconds of the order to place.
177
+ *
178
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
179
+ * at any point.
180
+ * @returns The goodTilBlockTime value
181
+ */
182
+ calculateGoodTilBlockTime(goodTilTimeInSeconds) {
183
+ const now = new Date();
184
+ const millisecondsPerSecond = 1000;
185
+ const interval = goodTilTimeInSeconds * millisecondsPerSecond;
186
+ const future = new Date(now.valueOf() + interval);
187
+ return Math.round(future.getTime() / 1000);
188
+ }
189
+ /**
190
+ * @description Place a short term order with human readable input.
191
+ *
192
+ * Use human readable form of input, including price and size
193
+ * The quantum and subticks are calculated and submitted
194
+ *
195
+ * @param subaccount The subaccount to place the order under
196
+ * @param marketId The market to place the order on
197
+ * @param side The side of the order to place
198
+ * @param price The price of the order to place
199
+ * @param size The size of the order to place
200
+ * @param clientId The client id of the order to place
201
+ * @param timeInForce The time in force of the order to place
202
+ * @param goodTilBlock The goodTilBlock of the order to place
203
+ * @param reduceOnly The reduceOnly of the order to place
204
+ *
205
+ *
206
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
207
+ * at any point.
208
+ * @returns The transaction hash.
209
+ */
210
+ async placeShortTermOrder(subaccount, marketId, side, price, size, clientId, goodTilBlock, timeInForce, reduceOnly, memo) {
211
+ const msgs = new Promise((resolve, reject) => {
212
+ const msg = this.placeShortTermOrderMessage(subaccount, marketId, side, price, size, clientId, goodTilBlock, timeInForce, reduceOnly);
213
+ msg
214
+ .then((it) => {
215
+ resolve([it]);
216
+ })
217
+ .catch((err) => {
218
+ console.log(err);
219
+ reject(err);
220
+ });
221
+ });
222
+ const account = this.validatorClient.post.account(subaccount.address, undefined);
223
+ return this.send(subaccount, () => msgs, true, undefined, memo, undefined, () => account);
224
+ }
225
+ /**
226
+ * @description Place an order with human readable input.
227
+ *
228
+ * Only MARKET and LIMIT types are supported right now
229
+ * Use human readable form of input, including price and size
230
+ * The quantum and subticks are calculated and submitted
231
+ *
232
+ * @param subaccount The subaccount to place the order on.
233
+ * @param marketId The market to place the order on.
234
+ * @param type The type of order to place.
235
+ * @param side The side of the order to place.
236
+ * @param price The price of the order to place.
237
+ * @param size The size of the order to place.
238
+ * @param clientId The client id of the order to place.
239
+ * @param timeInForce The time in force of the order to place.
240
+ * @param goodTilTimeInSeconds The goodTilTimeInSeconds of the order to place.
241
+ * @param execution The execution of the order to place.
242
+ * @param postOnly The postOnly of the order to place.
243
+ * @param reduceOnly The reduceOnly of the order to place.
244
+ * @param triggerPrice The trigger price of conditional orders.
245
+ * @param marketInfo optional market information for calculating quantums and subticks.
246
+ * This can be constructed from Indexer API. If set to null, additional round
247
+ * trip to Indexer API will be made.
248
+ * @param currentHeight Current block height. This can be obtained from ValidatorClient.
249
+ * If set to null, additional round trip to ValidatorClient will be made.
250
+ *
251
+ *
252
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
253
+ * at any point.
254
+ * @returns The transaction hash.
255
+ */
256
+ async placeOrder(subaccount, marketId, type, side, price, size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly, triggerPrice, marketInfo, currentHeight, goodTilBlock, memo, broadcastMode, twapParameters, builderCodeParameters, orderRouterAddress) {
257
+ const msgs = new Promise((resolve) => {
258
+ const msg = this.placeOrderMessage(subaccount, marketId, type, side, price, size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly, triggerPrice, marketInfo, currentHeight, goodTilBlock, twapParameters, builderCodeParameters, orderRouterAddress);
259
+ msg
260
+ .then((it) => resolve([it]))
261
+ .catch((err) => {
262
+ throw err;
263
+ });
264
+ });
265
+ const orderFlags = calculateOrderFlags(type, timeInForce);
266
+ const account = this.validatorClient.post.account(subaccount.address, orderFlags);
267
+ return this.send(subaccount, () => msgs, true, undefined, memo, broadcastMode, () => account);
268
+ }
269
+ /**
270
+ * @description Calculate and create the place order message
271
+ *
272
+ * Only MARKET and LIMIT types are supported right now
273
+ * Use human readable form of input, including price and size
274
+ * The quantum and subticks are calculated and submitted
275
+ *
276
+ * @param subaccount The subaccount to place the order under
277
+ * @param marketId The market to place the order on
278
+ * @param type The type of order to place
279
+ * @param side The side of the order to place
280
+ * @param price The price of the order to place
281
+ * @param size The size of the order to place
282
+ * @param clientId The client id of the order to place
283
+ * @param timeInForce The time in force of the order to place
284
+ * @param goodTilTimeInSeconds The goodTilTimeInSeconds of the order to place
285
+ * @param execution The execution of the order to place
286
+ * @param postOnly The postOnly of the order to place
287
+ * @param reduceOnly The reduceOnly of the order to place
288
+ *
289
+ *
290
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
291
+ * at any point.
292
+ * @returns The message to be passed into the protocol
293
+ */
294
+ async placeOrderMessage(subaccount, marketId, type, side, price, size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly, triggerPrice, marketInfo, currentHeight, goodTilBlock, twapParameters, builderCodeParameters, orderRouterAddress) {
295
+ const orderFlags = calculateOrderFlags(type, timeInForce);
296
+ const result = await Promise.all([
297
+ this.calculateGoodTilBlock(orderFlags, currentHeight, goodTilBlock),
298
+ this.retrieveMarketInfo(marketId, marketInfo),
299
+ ]);
300
+ const desiredGoodTilBlock = result[0];
301
+ const clobPairId = result[1].clobPairId;
302
+ const atomicResolution = result[1].atomicResolution;
303
+ const stepBaseQuantums = result[1].stepBaseQuantums;
304
+ const quantumConversionExponent = result[1].quantumConversionExponent;
305
+ const subticksPerTick = result[1].subticksPerTick;
306
+ const orderSide = calculateSide(side);
307
+ const quantums = calculateQuantums(size, atomicResolution, stepBaseQuantums);
308
+ const subticks = calculateSubticks(price, atomicResolution, quantumConversionExponent, subticksPerTick);
309
+ const orderTimeInForce = calculateTimeInForce(type, timeInForce, execution, postOnly);
310
+ let goodTilBlockTime = 0;
311
+ if (orderFlags === OrderFlags.LONG_TERM || orderFlags === OrderFlags.CONDITIONAL) {
312
+ if (goodTilTimeInSeconds == null) {
313
+ throw new Error('goodTilTimeInSeconds must be set for LONG_TERM or CONDITIONAL order');
314
+ }
315
+ else {
316
+ goodTilBlockTime = this.calculateGoodTilBlockTime(goodTilTimeInSeconds);
317
+ }
318
+ }
319
+ const clientMetadata = calculateClientMetadata(type);
320
+ const conditionalType = calculateConditionType(type);
321
+ const conditionalOrderTriggerSubticks = calculateConditionalOrderTriggerSubticks(type, atomicResolution, quantumConversionExponent, subticksPerTick, triggerPrice);
322
+ return this.validatorClient.post.composer.composeMsgPlaceOrder(subaccount.address, subaccount.subaccountNumber, clientId, clobPairId, orderFlags, desiredGoodTilBlock, goodTilBlockTime, orderSide, quantums, subticks, orderTimeInForce, reduceOnly !== null && reduceOnly !== void 0 ? reduceOnly : false, clientMetadata, conditionalType, conditionalOrderTriggerSubticks, twapParameters, builderCodeParameters, orderRouterAddress);
323
+ }
324
+ async retrieveMarketInfo(marketId, marketInfo) {
325
+ if (marketInfo) {
326
+ return Promise.resolve(marketInfo);
327
+ }
328
+ else {
329
+ const marketsResponse = await this.indexerClient.markets.getPerpetualMarkets(marketId);
330
+ const market = marketsResponse.markets[marketId];
331
+ const clobPairId = market.clobPairId;
332
+ const atomicResolution = market.atomicResolution;
333
+ const stepBaseQuantums = market.stepBaseQuantums;
334
+ const quantumConversionExponent = market.quantumConversionExponent;
335
+ const subticksPerTick = market.subticksPerTick;
336
+ return {
337
+ clobPairId,
338
+ atomicResolution,
339
+ stepBaseQuantums,
340
+ quantumConversionExponent,
341
+ subticksPerTick,
342
+ };
343
+ }
344
+ }
345
+ /**
346
+ * @description Calculate and create the short term place order message
347
+ *
348
+ * Use human readable form of input, including price and size
349
+ * The quantum and subticks are calculated and submitted
350
+ *
351
+ * @param subaccount The subaccount to place the order under
352
+ * @param marketId The market to place the order on
353
+ * @param side The side of the order to place
354
+ * @param price The price of the order to place
355
+ * @param size The size of the order to place
356
+ * @param clientId The client id of the order to place
357
+ * @param timeInForce The time in force of the order to place
358
+ * @param goodTilBlock The goodTilBlock of the order to place
359
+ * @param reduceOnly The reduceOnly of the order to place
360
+ *
361
+ *
362
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
363
+ * at any point.
364
+ * @returns The message to be passed into the protocol
365
+ */
366
+ async placeShortTermOrderMessage(subaccount, marketId, side, price, size, clientId, goodTilBlock, timeInForce, reduceOnly) {
367
+ await this.validateGoodTilBlock(goodTilBlock);
368
+ const marketsResponse = await this.indexerClient.markets.getPerpetualMarkets(marketId);
369
+ const market = marketsResponse.markets[marketId];
370
+ const clobPairId = market.clobPairId;
371
+ const atomicResolution = market.atomicResolution;
372
+ const stepBaseQuantums = market.stepBaseQuantums;
373
+ const quantumConversionExponent = market.quantumConversionExponent;
374
+ const subticksPerTick = market.subticksPerTick;
375
+ const orderSide = calculateSide(side);
376
+ const quantums = calculateQuantums(size, atomicResolution, stepBaseQuantums);
377
+ const subticks = calculateSubticks(price, atomicResolution, quantumConversionExponent, subticksPerTick);
378
+ const orderFlags = OrderFlags.SHORT_TERM;
379
+ return this.validatorClient.post.composer.composeMsgPlaceOrder(subaccount.address, subaccount.subaccountNumber, clientId, clobPairId, orderFlags, goodTilBlock, 0, // Short term orders use goodTilBlock.
380
+ orderSide, quantums, subticks, timeInForce, reduceOnly, 0, // Client metadata is 0 for short term orders.
381
+ Order_ConditionType.CONDITION_TYPE_UNSPECIFIED, // Short term orders cannot be conditional.
382
+ Long.fromInt(0));
383
+ }
384
+ /**
385
+ * @description Cancel an order with order information from web socket or REST.
386
+ *
387
+ * @param subaccount The subaccount to cancel the order from
388
+ * @param clientId The client id of the order to cancel
389
+ * @param orderFlags The order flags of the order to cancel
390
+ * @param clobPairId The clob pair id of the order to cancel
391
+ * @param goodTilBlock The goodTilBlock of the order to cancel
392
+ * @param goodTilBlockTime The goodTilBlockTime of the order to cancel
393
+ *
394
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
395
+ * at any point.
396
+ * @returns The transaction hash.
397
+ */
398
+ async cancelRawOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime) {
399
+ return this.validatorClient.post.cancelOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime);
400
+ }
401
+ /**
402
+ * @description Cancel an order with human readable input.
403
+ *
404
+ * @param subaccount The subaccount to cancel the order from
405
+ * @param clientId The client id of the order to cancel
406
+ * @param orderFlags The order flags of the order to cancel
407
+ * @param marketId The market to cancel the order on
408
+ * @param goodTilBlock The goodTilBlock of the order to cancel
409
+ * @param goodTilBlockTime The goodTilBlockTime of the order to cancel
410
+ *
411
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
412
+ * at any point.
413
+ * @returns The transaction hash.
414
+ */
415
+ async cancelOrder(subaccount, clientId, orderFlags, marketId, goodTilBlock, goodTilTimeInSeconds) {
416
+ const marketsResponse = await this.indexerClient.markets.getPerpetualMarkets(marketId);
417
+ const market = marketsResponse.markets[marketId];
418
+ const clobPairId = market.clobPairId;
419
+ if (!verifyOrderFlags(orderFlags)) {
420
+ throw new Error(`Invalid order flags: ${orderFlags}`);
421
+ }
422
+ let goodTilBlockTime;
423
+ if (isStatefulOrder(orderFlags)) {
424
+ if (goodTilTimeInSeconds === undefined || goodTilTimeInSeconds === 0) {
425
+ throw new Error('goodTilTimeInSeconds must be set for LONG_TERM or CONDITIONAL order');
426
+ }
427
+ if (goodTilBlock !== 0) {
428
+ throw new Error('goodTilBlock should be zero since LONG_TERM or CONDITIONAL orders ' +
429
+ 'use goodTilTimeInSeconds instead of goodTilBlock.');
430
+ }
431
+ goodTilBlockTime = this.calculateGoodTilBlockTime(goodTilTimeInSeconds);
432
+ }
433
+ else {
434
+ if (goodTilBlock === undefined || goodTilBlock === 0) {
435
+ throw new Error('goodTilBlock must be non-zero for SHORT_TERM orders');
436
+ }
437
+ if (goodTilTimeInSeconds !== undefined && goodTilTimeInSeconds !== 0) {
438
+ throw new Error('goodTilTimeInSeconds should be zero since SHORT_TERM orders use goodTilBlock instead of goodTilTimeInSeconds.');
439
+ }
440
+ }
441
+ return this.validatorClient.post.cancelOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime);
442
+ }
443
+ /**
444
+ * @description Batch cancel short term orders using marketId to clobPairId translation.
445
+ *
446
+ * @param subaccount The subaccount to cancel the order from
447
+ * @param shortTermOrders The list of short term order batches to cancel with marketId
448
+ * @param goodTilBlock The goodTilBlock of the order to cancel
449
+ * @returns The transaction hash.
450
+ */
451
+ async batchCancelShortTermOrdersWithMarketId(subaccount, shortTermOrders, goodTilBlock, broadcastMode) {
452
+ const orderBatches = await Promise.all(shortTermOrders.map(async ({ marketId, clobPairId, clientIds }) => ({
453
+ clobPairId: (clobPairId !== null && clobPairId !== void 0 ? clobPairId : (await this.indexerClient.markets.getPerpetualMarkets(marketId)).markets[marketId]).clobPairId,
454
+ clientIds,
455
+ })));
456
+ return this.validatorClient.post.batchCancelShortTermOrders(subaccount, orderBatches, goodTilBlock, broadcastMode);
457
+ }
458
+ /**
459
+ * @description Batch cancel short term orders using clobPairId.
460
+ *
461
+ * @param subaccount The subaccount to cancel the order from
462
+ * @param shortTermOrders The list of short term order batches to cancel with clobPairId
463
+ * @param goodTilBlock The goodTilBlock of the order to cancel
464
+ * @returns The transaction hash.
465
+ */
466
+ async batchCancelShortTermOrdersWithClobPairId(subaccount, shortTermOrders, goodTilBlock, broadcastMode) {
467
+ return this.validatorClient.post.batchCancelShortTermOrders(subaccount, shortTermOrders, goodTilBlock, broadcastMode);
468
+ }
469
+ /**
470
+ * @description Transfer from a subaccount to another subaccount
471
+ *
472
+ * @param subaccount The subaccount to transfer from
473
+ * @param recipientAddress The recipient address
474
+ * @param recipientSubaccountNumber The recipient subaccount number
475
+ * @param amount The amount to transfer
476
+ *
477
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
478
+ * at any point.
479
+ * @returns The transaction hash.
480
+ */
481
+ async transferToSubaccount(subaccount, recipientAddress, recipientSubaccountNumber, amount, memo, broadcastMode) {
482
+ const msgs = new Promise((resolve) => {
483
+ const msg = this.transferToSubaccountMessage(subaccount, recipientAddress, recipientSubaccountNumber, amount);
484
+ resolve([msg]);
485
+ });
486
+ return this.send(subaccount, () => msgs, false, undefined, memo, broadcastMode !== null && broadcastMode !== void 0 ? broadcastMode : Method.BroadcastTxCommit);
487
+ }
488
+ /**
489
+ * @description Create message to transfer from a subaccount to another subaccount
490
+ *
491
+ * @param subaccount The subaccount to transfer from
492
+ * @param recipientAddress The recipient address
493
+ * @param recipientSubaccountNumber The recipient subaccount number
494
+ * @param amount The amount to transfer
495
+ *
496
+ *
497
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
498
+ * at any point.
499
+ * @returns The message
500
+ */
501
+ transferToSubaccountMessage(subaccount, recipientAddress, recipientSubaccountNumber, amount) {
502
+ const validatorClient = this._validatorClient;
503
+ if (validatorClient === undefined) {
504
+ throw new Error('validatorClient not set');
505
+ }
506
+ const quantums = parseUnits(amount, validatorClient.config.denoms.USDC_DECIMALS);
507
+ if (quantums > BigInt(Long.MAX_VALUE.toString())) {
508
+ throw new Error('amount to large');
509
+ }
510
+ if (quantums < 0) {
511
+ throw new Error('amount must be positive');
512
+ }
513
+ return this.validatorClient.post.composer.composeMsgTransfer(subaccount.address, subaccount.subaccountNumber, recipientAddress, recipientSubaccountNumber, 0, Long.fromString(quantums.toString()));
514
+ }
515
+ /**
516
+ * @description Deposit from wallet to subaccount
517
+ *
518
+ * @param subaccount The subaccount to deposit to
519
+ * @param amount The amount to deposit
520
+ *
521
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
522
+ * at any point.
523
+ * @returns The transaction hash.
524
+ */
525
+ async depositToSubaccount(subaccount, amount, memo) {
526
+ const msgs = new Promise((resolve) => {
527
+ const msg = this.depositToSubaccountMessage(subaccount, amount);
528
+ resolve([msg]);
529
+ });
530
+ return this.validatorClient.post.send(subaccount, () => msgs, false, undefined, memo);
531
+ }
532
+ /**
533
+ * @description Create message to deposit from wallet to subaccount
534
+ *
535
+ * @param subaccount The subaccount to deposit to
536
+ * @param amount The amount to deposit
537
+ *
538
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
539
+ * at any point.
540
+ * @returns The message
541
+ */
542
+ depositToSubaccountMessage(subaccount, amount) {
543
+ const validatorClient = this._validatorClient;
544
+ if (validatorClient === undefined) {
545
+ throw new Error('validatorClient not set');
546
+ }
547
+ const quantums = parseUnits(amount, validatorClient.config.denoms.USDC_DECIMALS);
548
+ if (quantums > BigInt(Long.MAX_VALUE.toString())) {
549
+ throw new Error('amount to large');
550
+ }
551
+ if (quantums < 0) {
552
+ throw new Error('amount must be positive');
553
+ }
554
+ return this.validatorClient.post.composer.composeMsgDepositToSubaccount(subaccount.address, subaccount.subaccountNumber, 0, Long.fromString(quantums.toString()));
555
+ }
556
+ /**
557
+ * @description Withdraw from subaccount to wallet
558
+ *
559
+ * @param subaccount The subaccount to withdraw from
560
+ * @param amount The amount to withdraw
561
+ * @param recipient The recipient address, default to subaccount address
562
+ *
563
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
564
+ * at any point.
565
+ * @returns The transaction hash
566
+ */
567
+ async withdrawFromSubaccount(subaccount, amount, recipient, memo) {
568
+ const msgs = new Promise((resolve) => {
569
+ const msg = this.withdrawFromSubaccountMessage(subaccount, amount, recipient);
570
+ resolve([msg]);
571
+ });
572
+ return this.send(subaccount, () => msgs, false, undefined, memo);
573
+ }
574
+ /**
575
+ * @description Create message to withdraw from subaccount to wallet
576
+ * with human readable input.
577
+ *
578
+ * @param subaccount The subaccount to withdraw from
579
+ * @param amount The amount to withdraw
580
+ * @param recipient The recipient address
581
+ *
582
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
583
+ * at any point.
584
+ * @returns The message
585
+ */
586
+ withdrawFromSubaccountMessage(subaccount, amount, recipient) {
587
+ const validatorClient = this._validatorClient;
588
+ if (validatorClient === undefined) {
589
+ throw new Error('validatorClient not set');
590
+ }
591
+ const quantums = parseUnits(amount, validatorClient.config.denoms.USDC_DECIMALS);
592
+ if (quantums > BigInt(Long.MAX_VALUE.toString())) {
593
+ throw new Error('amount to large');
594
+ }
595
+ if (quantums < 0) {
596
+ throw new Error('amount must be positive');
597
+ }
598
+ return this.validatorClient.post.composer.composeMsgWithdrawFromSubaccount(subaccount.address, subaccount.subaccountNumber, 0, Long.fromString(quantums.toString()), recipient);
599
+ }
600
+ /**
601
+ * @description Create message to send chain token from subaccount to wallet
602
+ * with human readable input.
603
+ *
604
+ * @param subaccount The subaccount to withdraw from
605
+ * @param amount The amount to withdraw
606
+ * @param recipient The recipient address
607
+ *
608
+ * @throws UnexpectedClientError if a malformed response is returned with no GRPC error
609
+ * at any point.
610
+ * @returns The message
611
+ */
612
+ sendTokenMessage(wallet, amount, recipient) {
613
+ var _a;
614
+ const address = wallet.address;
615
+ if (address === undefined) {
616
+ throw new UserError('wallet address is not set. Call connectWallet() first');
617
+ }
618
+ const { CHAINTOKEN_DENOM: chainTokenDenom, CHAINTOKEN_DECIMALS: chainTokenDecimals } = ((_a = this._validatorClient) === null || _a === void 0 ? void 0 : _a.config.denoms) || {};
619
+ if (chainTokenDenom === undefined || chainTokenDecimals === undefined) {
620
+ throw new Error('Chain token denom not set in validator config');
621
+ }
622
+ const quantums = parseUnits(amount, chainTokenDecimals);
623
+ return this.validatorClient.post.composer.composeMsgSendToken(address, recipient, chainTokenDenom, quantums.toString());
624
+ }
625
+ /**
626
+ * @description Sign a place order transaction and return a base64 signature.
627
+ */
628
+ async signPlaceOrder(subaccount, marketId, type, side, price,
629
+ // trigger_price: number, // not used for MARKET and LIMIT
630
+ size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly) {
631
+ const msgs = new Promise((resolve) => {
632
+ const msg = this.placeOrderMessage(subaccount, marketId, type, side, price,
633
+ // trigger_price: number, // not used for MARKET and LIMIT
634
+ size, clientId, timeInForce, goodTilTimeInSeconds, execution, postOnly, reduceOnly);
635
+ msg
636
+ .then((it) => resolve([it]))
637
+ .catch((err) => {
638
+ console.log(err);
639
+ });
640
+ });
641
+ const signature = await this.sign(subaccount, () => msgs, true);
642
+ return Buffer.from(signature).toString('base64');
643
+ }
644
+ /**
645
+ * @description Sign a cancel order transaction and return a base64 signature.
646
+ */
647
+ async signCancelOrder(subaccount, clientId, orderFlags, clobPairId, goodTilBlock, goodTilBlockTime) {
648
+ const msgs = new Promise((resolve) => {
649
+ const msg = this.validatorClient.post.composer.composeMsgCancelOrder(subaccount.address, subaccount.subaccountNumber, clientId, clobPairId, orderFlags, goodTilBlock, goodTilBlockTime);
650
+ resolve([msg]);
651
+ });
652
+ const signature = await this.sign(subaccount, () => msgs, true);
653
+ return Buffer.from(signature).toString('base64');
654
+ }
655
+ /**
656
+ * @description Batch cancel, transfer, and place stateful orders in one tx.
657
+ */
658
+ async bulkCancelAndTransferAndPlaceStatefulOrders(subaccount,
659
+ // these are executed in this order, all in one block, and all succeed or all fail
660
+ cancelOrderPayloads, transferToSubaccountPayload, placeOrderPayloads, memo, broadcastMode) {
661
+ if (cancelOrderPayloads.some((c) => c.orderFlags === OrderFlags.SHORT_TERM)) {
662
+ throw new Error('SHORT_TERM cancels cannot be batched');
663
+ }
664
+ if (placeOrderPayloads.some((placePayload) => calculateOrderFlags(placePayload.type, placePayload.timeInForce) ===
665
+ OrderFlags.SHORT_TERM)) {
666
+ throw new Error('SHORT_TERM orders cannot be batched');
667
+ }
668
+ const account = this.validatorClient.post.account(subaccount.address, undefined);
669
+ const msgs = (async () => {
670
+ const cancelMsgPromises = cancelOrderPayloads.map(async (cancelPayload) => {
671
+ const cancelSubaccount = subaccount.cloneWithSubaccount(cancelPayload.subaccountNumber);
672
+ return this.validatorClient.post.cancelOrderMsg(cancelSubaccount.address, cancelSubaccount.subaccountNumber, cancelPayload.clientId, cancelPayload.orderFlags, cancelPayload.clobPairId, cancelPayload.goodTilBlock, cancelPayload.goodTilBlockTime);
673
+ });
674
+ const transferMsg = (() => {
675
+ if (transferToSubaccountPayload == null) {
676
+ return undefined;
677
+ }
678
+ const transferSubaccount = subaccount.cloneWithSubaccount(transferToSubaccountPayload.sourceSubaccountNumber);
679
+ return this.transferToSubaccountMessage(transferSubaccount, transferSubaccount.address, transferToSubaccountPayload.recipientSubaccountNumber, transferToSubaccountPayload.transferAmount);
680
+ })();
681
+ const placeOrderMsgPromises = placeOrderPayloads.map((placePayload) => {
682
+ const placeSubaccount = subaccount.cloneWithSubaccount(placePayload.subaccountNumber);
683
+ return this.placeOrderMessage(placeSubaccount, placePayload.marketId, placePayload.type, placePayload.side, placePayload.price, placePayload.size, placePayload.clientId, placePayload.timeInForce, placePayload.goodTilTimeInSeconds, placePayload.execution, placePayload.postOnly, placePayload.reduceOnly, placePayload.triggerPrice, placePayload.marketInfo, placePayload.currentHeight, placePayload.goodTilBlock);
684
+ });
685
+ return Promise.all([
686
+ ...cancelMsgPromises,
687
+ ...(transferMsg != null ? [transferMsg] : []),
688
+ ...placeOrderMsgPromises,
689
+ ]);
690
+ })();
691
+ return this.send(subaccount, () => msgs, true, undefined, memo, broadcastMode !== null && broadcastMode !== void 0 ? broadcastMode : Method.BroadcastTxCommit, () => account);
692
+ }
693
+ // vaults
694
+ /**
695
+ * @description Deposit USDC into the megavault.
696
+ */
697
+ async depositToMegavault(subaccount, amountUsdc, broadcastMode) {
698
+ return this.validatorClient.post.depositToMegavault(subaccount, bigIntToBytes(calculateVaultQuantums(amountUsdc)), broadcastMode);
699
+ }
700
+ /**
701
+ * @description Create a megavault deposit message.
702
+ */
703
+ depositToMegavaultMessage(subaccount, amountUsdc) {
704
+ return this.validatorClient.post.depositToMegavaultMsg(subaccount.address, subaccount.subaccountNumber, bigIntToBytes(calculateVaultQuantums(amountUsdc)));
705
+ }
706
+ /**
707
+ * @description Withdraw shares from the megavault.
708
+ */
709
+ async withdrawFromMegavault(subaccount, shares, minAmount, broadcastMode) {
710
+ return this.validatorClient.post.withdrawFromMegavault(subaccount, bigIntToBytes(BigInt(Math.floor(shares))), bigIntToBytes(calculateVaultQuantums(minAmount)), broadcastMode);
711
+ }
712
+ /**
713
+ * @description Create a megavault withdraw message.
714
+ */
715
+ withdrawFromMegavaultMessage(subaccount, shares, minAmount) {
716
+ return this.validatorClient.post.withdrawFromMegavaultMsg(subaccount.address, subaccount.subaccountNumber, bigIntToBytes(BigInt(Math.floor(shares))), bigIntToBytes(calculateVaultQuantums(minAmount)));
717
+ }
718
+ /**
719
+ * @description Submit a governance proposal to add a new market.
720
+ *
721
+ * @param params Parameters neeeded to create a new market.
722
+ * @param title Title of the gov proposal.
723
+ * @param summary Summary of the gov proposal.
724
+ * @param initialDepositAmount Initial deposit amount of the gov proposal.
725
+ * @param proposer proposer of the gov proposal.
726
+ *
727
+ * @returns the transaction hash.
728
+ */
729
+ async submitGovAddNewMarketProposal(wallet, params, title, summary, initialDepositAmount, memo, metadata, expedited) {
730
+ const msg = new Promise((resolve) => {
731
+ const composer = this.validatorClient.post.composer;
732
+ const registry = generateRegistry();
733
+ const msgs = [];
734
+ const isDydxUsd = params.ticker.toLowerCase() === 'dydx-usd';
735
+ // x/prices.MsgCreateOracleMarket
736
+ const createOracleMarket = composer.composeMsgCreateOracleMarket(params.id, params.ticker, params.priceExponent, params.minExchanges, params.minPriceChange, params.exchangeConfigJson);
737
+ // x/perpetuals.MsgCreatePerpetual
738
+ const createPerpetual = composer.composeMsgCreatePerpetual(params.id, isDydxUsd ? 1000001 : params.id, params.ticker, params.atomicResolution, params.liquidityTier, params.marketType);
739
+ // x/clob.MsgCreateClobPair
740
+ const createClobPair = composer.composeMsgCreateClobPair(params.id, params.id, params.quantumConversionExponent, params.stepBaseQuantums, params.subticksPerTick);
741
+ // x/clob.MsgUpdateClobPair
742
+ const updateClobPair = composer.composeMsgUpdateClobPair(params.id, params.id, params.quantumConversionExponent, params.stepBaseQuantums, params.subticksPerTick);
743
+ // x/delaymsg.MsgDelayMessage
744
+ const delayMessage = composer.composeMsgDelayMessage(
745
+ // IMPORTANT: must wrap messages in Any type to fit into delaymsg.
746
+ composer.wrapMessageAsAny(registry, updateClobPair), params.delayBlocks);
747
+ // The order matters.
748
+ if (!isDydxUsd) {
749
+ msgs.push(createOracleMarket);
750
+ }
751
+ msgs.push(createPerpetual);
752
+ msgs.push(createClobPair);
753
+ msgs.push(delayMessage);
754
+ // x/gov.v1.MsgSubmitProposal
755
+ const submitProposal = composer.composeMsgSubmitProposal(title, initialDepositAmount, this.validatorClient.config.denoms, // use the client denom.
756
+ summary,
757
+ // IMPORTANT: must wrap messages in Any type for gov's submit proposal.
758
+ composer.wrapMessageArrAsAny(registry, msgs), wallet.address, // proposer
759
+ metadata, expedited);
760
+ resolve([submitProposal]);
761
+ });
762
+ return this.send(SubaccountInfo.forLocalWallet(wallet), () => msg, false, undefined, memo);
763
+ }
764
+ /**
765
+ * @description Create a permissionless market listing transaction.
766
+ */
767
+ async createMarketPermissionless(subaccount, ticker, broadcastMode, gasAdjustment, memo) {
768
+ return this.validatorClient.post.createMarketPermissionless(ticker, subaccount, broadcastMode, gasAdjustment, memo);
769
+ }
770
+ async addAuthenticator(subaccount, authenticatorType, data) {
771
+ // Validate the provided authenticators before sending to the validator
772
+ const authenticator = {
773
+ type: authenticatorType,
774
+ config: JSON.parse(new TextDecoder().decode(data)),
775
+ };
776
+ if (!this.validateAuthenticator(authenticator)) {
777
+ throw new Error('Invalid authenticator, please ensure the authenticator permissions are correct');
778
+ }
779
+ return this.validatorClient.post.addAuthenticator(subaccount, authenticatorType, data);
780
+ }
781
+ /**
782
+ * @description Remove an authenticator by id.
783
+ */
784
+ async removeAuthenticator(subaccount, id) {
785
+ return this.validatorClient.post.removeAuthenticator(subaccount, Long.fromString(id));
786
+ }
787
+ /**
788
+ * @description Fetch authenticators for an account address.
789
+ */
790
+ async getAuthenticators(address) {
791
+ return this.validatorClient.get.getAuthenticators(address);
792
+ }
793
+ /**
794
+ * @description Validate that an authenticator config is supported.
795
+ */
796
+ validateAuthenticator(authenticator) {
797
+ const decodeCompositeConfig = (config) => {
798
+ if (Array.isArray(config)) {
799
+ return config;
800
+ }
801
+ if (typeof config === 'string') {
802
+ try {
803
+ const decoded = Buffer.from(config, 'base64').toString('utf8');
804
+ const parsed = JSON.parse(decoded);
805
+ return Array.isArray(parsed) ? parsed : null;
806
+ }
807
+ catch {
808
+ return null;
809
+ }
810
+ }
811
+ return null;
812
+ };
813
+ const checkAuthenticator = (auth) => {
814
+ if (auth.type === AuthenticatorType.SIGNATURE_VERIFICATION) {
815
+ return true;
816
+ }
817
+ if (auth.type === AuthenticatorType.ANY_OF || auth.type === AuthenticatorType.ALL_OF) {
818
+ const subAuthenticators = decodeCompositeConfig(auth.config);
819
+ if (subAuthenticators == null) {
820
+ return false;
821
+ }
822
+ if (auth.type === AuthenticatorType.ANY_OF) {
823
+ return subAuthenticators.every((nested) => checkAuthenticator(nested));
824
+ }
825
+ return subAuthenticators.some((nested) => checkAuthenticator(nested));
826
+ }
827
+ return false;
828
+ };
829
+ return checkAuthenticator(authenticator);
830
+ }
831
+ }
832
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zaXRlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGllbnRzL2NvbXBvc2l0ZS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBTWhELE9BQU8sRUFDTCxtQkFBbUIsR0FFcEIsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RSxPQUFPLEVBQXlCLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBRUwsaUJBQWlCLEVBTWpCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBQ2pCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsd0NBQXdDLEVBQ3hDLHNCQUFzQixHQUN2QixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJELG9FQUFvRTtBQUNwRSxxRUFBcUU7QUFDckUsd0VBQXdFO0FBQ3hFLGtFQUFrRTtBQUNsRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDMUIsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBcURyQixNQUFNLE9BQU8sZUFBZTtJQU0xQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQWdCO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxZQUFvQixPQUFnQixFQUFFLFVBQW1CO1FBYmxELGFBQVEsR0FBcUIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1FBY3hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVU7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksYUFBYTtRQUNmOztXQUVHO1FBQ0gsT0FBTyxJQUFJLENBQUMsY0FBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZUFBZTtRQUNqQjs7V0FFRztRQUNILE9BQU8sSUFBSSxDQUFDLGdCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZ0JBQWdCO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsbUJBQW1CLENBQUMsUUFBMEI7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxPQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ2hGLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FDUixVQUEwQixFQUMxQixTQUF3QyxFQUN4QyxPQUFnQixFQUNoQixRQUFtQixFQUNuQixJQUFhLEVBQ2IsT0FBZ0M7UUFFaEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQ1IsVUFBMEIsRUFDMUIsU0FBd0MsRUFDeEMsT0FBZ0IsRUFDaEIsUUFBbUIsRUFDbkIsSUFBYSxFQUNiLGFBQTZCLEVBQzdCLE9BQWdDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNuQyxVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxRQUFRLEVBQ1IsSUFBSSxFQUNKLGFBQWEsRUFDYixPQUFPLEVBQ1AsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLGlCQUE2QjtRQUU3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQ1osVUFBMEIsRUFDMUIsU0FBd0MsRUFDeEMsUUFBbUIsRUFDbkIsSUFBYSxFQUNiLE9BQWdDO1FBRWhDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBRUssS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxVQUFzQixFQUN0QixhQUFzQixFQUN0QixZQUFxQjtRQUVyQixJQUFJLFVBQVUsS0FBSyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekMsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxDQUFDLElBQUksWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM5RSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sTUFBTSxHQUFHLGFBQWEsYUFBYixhQUFhLGNBQWIsYUFBYSxHQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7Z0JBQ3JGLE9BQU8sTUFBTSxHQUFHLG1CQUFtQixDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssS0FBSyxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRSxNQUFNLG9CQUFvQixHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUM7UUFDeEMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLEdBQUcsa0JBQWtCLENBQUM7UUFDN0QsSUFBSSxZQUFZLEdBQUcsVUFBVSxJQUFJLFlBQVksR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMzRCxNQUFNLElBQUksU0FBUyxDQUFDOzZDQUNtQixVQUFVLDhCQUE4QixVQUFVO21DQUM1RCxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0sseUJBQXlCLENBQUMsb0JBQTRCO1FBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7UUFDOUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsVUFBMEIsRUFDMUIsUUFBZ0IsRUFDaEIsSUFBZSxFQUNmLEtBQWEsRUFDYixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsV0FBOEIsRUFDOUIsVUFBbUIsRUFDbkIsSUFBYTtRQUViLE1BQU0sSUFBSSxHQUE0QixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNwRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQ3pDLFVBQVUsRUFDVixRQUFRLEVBQ1IsSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osUUFBUSxFQUNSLFlBQVksRUFDWixXQUFXLEVBQ1gsVUFBVSxDQUNYLENBQUM7WUFDRixHQUFHO2lCQUNBLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUNYLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDO2lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNkLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBcUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUNqRSxVQUFVLENBQUMsT0FBTyxFQUNsQixTQUFTLENBQ1YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FDZCxVQUFVLEVBQ1YsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUNWLElBQUksRUFDSixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BOEJHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FDZCxVQUEwQixFQUMxQixRQUFnQixFQUNoQixJQUFlLEVBQ2YsSUFBZSxFQUNmLEtBQWEsRUFDYixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsV0FBOEIsRUFDOUIsb0JBQTZCLEVBQzdCLFNBQTBCLEVBQzFCLFFBQWtCLEVBQ2xCLFVBQW9CLEVBQ3BCLFlBQXFCLEVBQ3JCLFVBQXVCLEVBQ3ZCLGFBQXNCLEVBQ3RCLFlBQXFCLEVBQ3JCLElBQWEsRUFDYixhQUE2QixFQUM3QixjQUFnQyxFQUNoQyxxQkFBOEMsRUFDOUMsa0JBQTJCO1FBRTNCLE1BQU0sSUFBSSxHQUE0QixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FDaEMsVUFBVSxFQUNWLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osUUFBUSxFQUNSLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsU0FBUyxFQUNULFFBQVEsRUFDUixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLGNBQWMsRUFDZCxxQkFBcUIsRUFDckIsa0JBQWtCLENBQ25CLENBQUM7WUFDRixHQUFHO2lCQUNBLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDM0IsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sT0FBTyxHQUFxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ2pFLFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFVBQVUsQ0FDWCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLFVBQVUsRUFDVixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQ1YsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osYUFBYSxFQUNiLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3Qkc7SUFDSyxLQUFLLENBQUMsaUJBQWlCLENBQzdCLFVBQTBCLEVBQzFCLFFBQWdCLEVBQ2hCLElBQWUsRUFDZixJQUFlLEVBQ2YsS0FBYSxFQUNiLElBQVksRUFDWixRQUFnQixFQUNoQixXQUE4QixFQUM5QixvQkFBNkIsRUFDN0IsU0FBMEIsRUFDMUIsUUFBa0IsRUFDbEIsVUFBb0IsRUFDcEIsWUFBcUIsRUFDckIsVUFBdUIsRUFDdkIsYUFBc0IsRUFDdEIsWUFBcUIsRUFDckIsY0FBZ0MsRUFDaEMscUJBQThDLEVBQzlDLGtCQUEyQjtRQUUzQixNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQy9CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQztZQUNuRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztTQUM5QyxDQUFDLENBQUM7UUFDSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1FBQ3BELE1BQU0seUJBQXlCLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO1FBQ3RFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdFLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUNoQyxLQUFLLEVBQ0wsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixlQUFlLENBQ2hCLENBQUM7UUFDRixNQUFNLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RGLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxTQUFTLElBQUksVUFBVSxLQUFLLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqRixJQUFJLG9CQUFvQixJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGdCQUFnQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzFFLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxlQUFlLEdBQUcsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSwrQkFBK0IsR0FBRyx3Q0FBd0MsQ0FDOUUsSUFBSSxFQUNKLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFlBQVksQ0FDYixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQzVELFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFDM0IsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFFBQVEsRUFDUixnQkFBZ0IsRUFDaEIsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksS0FBSyxFQUNuQixjQUFjLEVBQ2QsZUFBZSxFQUNmLCtCQUErQixFQUMvQixjQUFjLEVBQ2QscUJBQXFCLEVBQ3JCLGtCQUFrQixDQUNuQixDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFVBQXVCO1FBQ3hFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUNyQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNqRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztZQUNqRCxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQztZQUNuRSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsVUFBVTtnQkFDVixnQkFBZ0I7Z0JBQ2hCLGdCQUFnQjtnQkFDaEIseUJBQXlCO2dCQUN6QixlQUFlO2FBQ2hCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNLLEtBQUssQ0FBQywwQkFBMEIsQ0FDdEMsVUFBMEIsRUFDMUIsUUFBZ0IsRUFDaEIsSUFBZSxFQUNmLEtBQWEsRUFDYixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsV0FBOEIsRUFDOUIsVUFBbUI7UUFFbkIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFOUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDckMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMseUJBQXlCLENBQUM7UUFDbkUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQ2hDLEtBQUssRUFDTCxnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLGVBQWUsQ0FDaEIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQzVELFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFDM0IsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUNaLENBQUMsRUFBRSxzQ0FBc0M7UUFDekMsU0FBUyxFQUNULFFBQVEsRUFDUixRQUFRLEVBQ1IsV0FBVyxFQUNYLFVBQVUsRUFDVixDQUFDLEVBQUUsOENBQThDO1FBQ2pELG1CQUFtQixDQUFDLDBCQUEwQixFQUFFLDJDQUEyQztRQUMzRixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNoQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUNsQixVQUEwQixFQUMxQixRQUFnQixFQUNoQixVQUFzQixFQUN0QixVQUFrQixFQUNsQixZQUFxQixFQUNyQixnQkFBeUI7UUFFekIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzFDLFVBQVUsRUFDVixRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2YsVUFBMEIsRUFDMUIsUUFBZ0IsRUFDaEIsVUFBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsWUFBcUIsRUFDckIsb0JBQTZCO1FBRTdCLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkYsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBRXJDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUVELElBQUksZ0JBQWdCLENBQUM7UUFDckIsSUFBSSxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFDRCxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDYixvRUFBb0U7b0JBQ2xFLG1EQUFtRCxDQUN0RCxDQUFDO1lBQ0osQ0FBQztZQUNELGdCQUFnQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFDRCxJQUFJLG9CQUFvQixLQUFLLFNBQVMsSUFBSSxvQkFBb0IsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsTUFBTSxJQUFJLEtBQUssQ0FDYiwrR0FBK0csQ0FDaEgsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQzFDLFVBQVUsRUFDVixRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILEtBQUssQ0FBQyxzQ0FBc0MsQ0FDMUMsVUFBMEIsRUFDMUIsZUFBeUMsRUFDekMsWUFBb0IsRUFDcEIsYUFBNkI7UUFFN0IsTUFBTSxZQUFZLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNwQyxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbEUsVUFBVSxFQUFFLENBQ1YsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQ1YsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUNuRixDQUFDLFVBQVU7WUFDWixTQUFTO1NBQ1YsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQ3pELFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsd0NBQXdDLENBQzVDLFVBQTBCLEVBQzFCLGVBQTZCLEVBQzdCLFlBQW9CLEVBQ3BCLGFBQTZCO1FBRTdCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQ3pELFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixVQUEwQixFQUMxQixnQkFBd0IsRUFDeEIseUJBQWlDLEVBQ2pDLE1BQWMsRUFDZCxJQUFhLEVBQ2IsYUFBNkI7UUFFN0IsTUFBTSxJQUFJLEdBQTRCLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUMxQyxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixNQUFNLENBQ1AsQ0FBQztZQUNGLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQ2QsVUFBVSxFQUNWLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDVixLQUFLLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixhQUFhLGFBQWIsYUFBYSxjQUFiLGFBQWEsR0FBSSxNQUFNLENBQUMsaUJBQWlCLENBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsMkJBQTJCLENBQ3pCLFVBQTBCLEVBQzFCLGdCQUF3QixFQUN4Qix5QkFBaUMsRUFDakMsTUFBYztRQUVkLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakYsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FDMUQsVUFBVSxDQUFDLE9BQU8sRUFDbEIsVUFBVSxDQUFDLGdCQUFnQixFQUMzQixnQkFBZ0IsRUFDaEIseUJBQXlCLEVBQ3pCLENBQUMsRUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsVUFBMEIsRUFDMUIsTUFBYyxFQUNkLElBQWE7UUFFYixNQUFNLElBQUksR0FBNEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILDBCQUEwQixDQUFDLFVBQTBCLEVBQUUsTUFBYztRQUNuRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDOUMsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pGLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQ3JFLFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFDM0IsQ0FBQyxFQUNELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxzQkFBc0IsQ0FDMUIsVUFBMEIsRUFDMUIsTUFBYyxFQUNkLFNBQWtCLEVBQ2xCLElBQWE7UUFFYixNQUFNLElBQUksR0FBNEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5RSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCw2QkFBNkIsQ0FDM0IsVUFBMEIsRUFDMUIsTUFBYyxFQUNkLFNBQWtCO1FBRWxCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUM5QyxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDakYsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FDeEUsVUFBVSxDQUFDLE9BQU8sRUFDbEIsVUFBVSxDQUFDLGdCQUFnQixFQUMzQixDQUFDLEVBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFDcEMsU0FBUyxDQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFtQixFQUFFLE1BQWMsRUFBRSxTQUFpQjs7UUFDckUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMxQixNQUFNLElBQUksU0FBUyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUNELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsR0FDbEYsQ0FBQSxNQUFBLElBQUksQ0FBQyxnQkFBZ0IsMENBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSSxFQUFFLENBQUM7UUFFN0MsSUFBSSxlQUFlLEtBQUssU0FBUyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBRXhELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUMzRCxPQUFPLEVBQ1AsU0FBUyxFQUNULGVBQWUsRUFDZixRQUFRLENBQUMsUUFBUSxFQUFFLENBQ3BCLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUNsQixVQUEwQixFQUMxQixRQUFnQixFQUNoQixJQUFlLEVBQ2YsSUFBZSxFQUNmLEtBQWE7SUFDYiw0REFBNEQ7SUFDNUQsSUFBWSxFQUNaLFFBQWdCLEVBQ2hCLFdBQTZCLEVBQzdCLG9CQUE0QixFQUM1QixTQUF5QixFQUN6QixRQUFpQixFQUNqQixVQUFtQjtRQUVuQixNQUFNLElBQUksR0FBNEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQ2hDLFVBQVUsRUFDVixRQUFRLEVBQ1IsSUFBSSxFQUNKLElBQUksRUFDSixLQUFLO1lBQ0wsNERBQTREO1lBQzVELElBQUksRUFDSixRQUFRLEVBQ1IsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsQ0FDWCxDQUFDO1lBQ0YsR0FBRztpQkFDQSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzNCLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsVUFBMEIsRUFDMUIsUUFBZ0IsRUFDaEIsVUFBc0IsRUFDdEIsVUFBa0IsRUFDbEIsWUFBb0IsRUFDcEIsZ0JBQXdCO1FBRXhCLE1BQU0sSUFBSSxHQUE0QixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FDbEUsVUFBVSxDQUFDLE9BQU8sRUFDbEIsVUFBVSxDQUFDLGdCQUFnQixFQUMzQixRQUFRLEVBQ1IsVUFBVSxFQUNWLFVBQVUsRUFDVixZQUFZLEVBQ1osZ0JBQWdCLENBQ2pCLENBQUM7WUFDRixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsMkNBQTJDLENBQy9DLFVBQTBCO0lBQzFCLGtGQUFrRjtJQUNsRixtQkFBNEMsRUFDNUMsMkJBQW9FLEVBQ3BFLGtCQUF1QyxFQUN2QyxJQUFhLEVBQ2IsYUFBNkI7UUFFN0IsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUNFLGtCQUFrQixDQUFDLElBQUksQ0FDckIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUNmLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQztZQUNoRSxVQUFVLENBQUMsVUFBVSxDQUN4QixFQUNELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ2pFLFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFNBQVMsQ0FDVixDQUFDO1FBRUYsTUFBTSxJQUFJLEdBQTRCLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDaEQsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFO2dCQUN4RSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDeEYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQzdDLGdCQUFnQixDQUFDLE9BQU8sRUFDeEIsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQ2pDLGFBQWEsQ0FBQyxRQUFRLEVBQ3RCLGFBQWEsQ0FBQyxVQUFVLEVBQ3hCLGFBQWEsQ0FBQyxVQUFVLEVBQ3hCLGFBQWEsQ0FBQyxZQUFZLEVBQzFCLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDL0IsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3hCLElBQUksMkJBQTJCLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3hDLE9BQU8sU0FBUyxDQUFDO2dCQUNuQixDQUFDO2dCQUNELE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUN2RCwyQkFBMkIsQ0FBQyxzQkFBc0IsQ0FDbkQsQ0FBQztnQkFDRixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FDckMsa0JBQWtCLEVBQ2xCLGtCQUFrQixDQUFDLE9BQU8sRUFDMUIsMkJBQTJCLENBQUMseUJBQXlCLEVBQ3JELDJCQUEyQixDQUFDLGNBQWMsQ0FDM0MsQ0FBQztZQUNKLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFTCxNQUFNLHFCQUFxQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO2dCQUNwRSxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3RGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUMzQixlQUFlLEVBQ2YsWUFBWSxDQUFDLFFBQVEsRUFDckIsWUFBWSxDQUFDLElBQUksRUFDakIsWUFBWSxDQUFDLElBQUksRUFDakIsWUFBWSxDQUFDLEtBQUssRUFDbEIsWUFBWSxDQUFDLElBQUksRUFDakIsWUFBWSxDQUFDLFFBQVEsRUFDckIsWUFBWSxDQUFDLFdBQVcsRUFDeEIsWUFBWSxDQUFDLG9CQUFvQixFQUNqQyxZQUFZLENBQUMsU0FBUyxFQUN0QixZQUFZLENBQUMsUUFBUSxFQUNyQixZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsWUFBWSxFQUN6QixZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsYUFBYSxFQUMxQixZQUFZLENBQUMsWUFBWSxDQUMxQixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ2pCLEdBQUcsaUJBQWlCO2dCQUNwQixHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QyxHQUFHLHFCQUFxQjthQUN6QixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRUwsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLFVBQVUsRUFDVixHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQ1YsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEVBQ0osYUFBYSxhQUFiLGFBQWEsY0FBYixhQUFhLEdBQUksTUFBTSxDQUFDLGlCQUFpQixFQUN6QyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQ2QsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTO0lBRVQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQ3RCLFVBQTBCLEVBQzFCLFVBQWtCLEVBQ2xCLGFBQTZCO1FBRTdCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQ2pELFVBQVUsRUFDVixhQUFhLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsRUFDakQsYUFBYSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCx5QkFBeUIsQ0FBQyxVQUEwQixFQUFFLFVBQWtCO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQ3BELFVBQVUsQ0FBQyxPQUFPLEVBQ2xCLFVBQVUsQ0FBQyxnQkFBZ0IsRUFDM0IsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQ3pCLFVBQTBCLEVBQzFCLE1BQWMsRUFDZCxTQUFpQixFQUNqQixhQUE2QjtRQUU3QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUNwRCxVQUFVLEVBQ1YsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFDekMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ2hELGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsNEJBQTRCLENBQzFCLFVBQTBCLEVBQzFCLE1BQWMsRUFDZCxTQUFpQjtRQUVqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUN2RCxVQUFVLENBQUMsT0FBTyxFQUNsQixVQUFVLENBQUMsZ0JBQWdCLEVBQzNCLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ3pDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUNqRCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxLQUFLLENBQUMsNkJBQTZCLENBQ2pDLE1BQW1CLEVBQ25CLE1BQTZCLEVBQzdCLEtBQWEsRUFDYixPQUFlLEVBQ2Ysb0JBQTRCLEVBQzVCLElBQWEsRUFDYixRQUFpQixFQUNqQixTQUFtQjtRQUVuQixNQUFNLEdBQUcsR0FBNEIsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDcEQsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksR0FBbUIsRUFBRSxDQUFDO1lBRWhDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxDQUFDO1lBRTdELGlDQUFpQztZQUNqQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FDOUQsTUFBTSxDQUFDLEVBQUUsRUFDVCxNQUFNLENBQUMsTUFBTSxFQUNiLE1BQU0sQ0FBQyxhQUFhLEVBQ3BCLE1BQU0sQ0FBQyxZQUFZLEVBQ25CLE1BQU0sQ0FBQyxjQUFjLEVBQ3JCLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDMUIsQ0FBQztZQUVGLGtDQUFrQztZQUNsQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMseUJBQXlCLENBQ3hELE1BQU0sQ0FBQyxFQUFFLEVBQ1QsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQy9CLE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixNQUFNLENBQUMsYUFBYSxFQUNwQixNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFDO1lBRUYsMkJBQTJCO1lBQzNCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsQ0FDdEQsTUFBTSxDQUFDLEVBQUUsRUFDVCxNQUFNLENBQUMsRUFBRSxFQUNULE1BQU0sQ0FBQyx5QkFBeUIsRUFDaEMsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixNQUFNLENBQUMsZUFBZSxDQUN2QixDQUFDO1lBRUYsMkJBQTJCO1lBQzNCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsQ0FDdEQsTUFBTSxDQUFDLEVBQUUsRUFDVCxNQUFNLENBQUMsRUFBRSxFQUNULE1BQU0sQ0FBQyx5QkFBeUIsRUFDaEMsTUFBTSxDQUFDLGdCQUFnQixFQUN2QixNQUFNLENBQUMsZUFBZSxDQUN2QixDQUFDO1lBRUYsNkJBQTZCO1lBQzdCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0I7WUFDbEQsa0VBQWtFO1lBQ2xFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEVBQ25ELE1BQU0sQ0FBQyxXQUFXLENBQ25CLENBQUM7WUFFRixxQkFBcUI7WUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFeEIsNkJBQTZCO1lBQzdCLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsQ0FDdEQsS0FBSyxFQUNMLG9CQUFvQixFQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsd0JBQXdCO1lBQzVELE9BQU87WUFDUCx1RUFBdUU7WUFDdkUsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFDNUMsTUFBTSxDQUFDLE9BQVEsRUFBRSxXQUFXO1lBQzVCLFFBQVEsRUFDUixTQUFTLENBQ1YsQ0FBQztZQUVGLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsMEJBQTBCLENBQzlCLFVBQTBCLEVBQzFCLE1BQWMsRUFDZCxhQUE2QixFQUM3QixhQUFzQixFQUN0QixJQUFhO1FBRWIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FDekQsTUFBTSxFQUNOLFVBQVUsRUFDVixhQUFhLEVBQ2IsYUFBYSxFQUNiLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsVUFBMEIsRUFDMUIsaUJBQW9DLEVBQ3BDLElBQWdCO1FBRWhCLHVFQUF1RTtRQUN2RSxNQUFNLGFBQWEsR0FBa0I7WUFDbkMsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0ZBQWdGLENBQ2pGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixVQUEwQixFQUMxQixFQUFVO1FBRVYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3JDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gscUJBQXFCLENBQUMsYUFBNEI7UUFDaEQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE1BQWUsRUFBMEIsRUFBRTtZQUN4RSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxNQUF5QixDQUFDO1lBQ25DLENBQUM7WUFDRCxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMvRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFFLE1BQTBCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDcEUsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUVGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFtQixFQUFXLEVBQUU7WUFDMUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzNELE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDckYsTUFBTSxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzdELElBQUksaUJBQWlCLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzlCLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUMzQyxPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDekUsQ0FBQztnQkFDRCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4RSxDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixPQUFPLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRiJ9