@bitgo/sdk-coin-ton 4.0.5 → 4.0.7

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 (224) hide show
  1. package/dist/cjs/src/index.d.ts.map +1 -0
  2. package/dist/{src → cjs/src}/index.js +1 -1
  3. package/dist/cjs/src/jettonToken.d.ts.map +1 -0
  4. package/dist/cjs/src/jettonToken.js +52 -0
  5. package/dist/cjs/src/lib/constants.d.ts.map +1 -0
  6. package/dist/cjs/src/lib/constants.js +12 -0
  7. package/dist/{src → cjs/src}/lib/explainTransactionWasm.d.ts +15 -1
  8. package/dist/cjs/src/lib/explainTransactionWasm.d.ts.map +1 -0
  9. package/dist/cjs/src/lib/explainTransactionWasm.js +104 -0
  10. package/dist/cjs/src/lib/iface.d.ts.map +1 -0
  11. package/dist/cjs/src/lib/iface.js +3 -0
  12. package/dist/cjs/src/lib/index.d.ts.map +1 -0
  13. package/dist/{src → cjs/src}/lib/index.js +1 -1
  14. package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
  15. package/dist/cjs/src/lib/keyPair.js +103 -0
  16. package/dist/cjs/src/lib/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  17. package/dist/cjs/src/lib/singleNominatorWithdrawBuilder.js +38 -0
  18. package/dist/cjs/src/lib/tokenTransaction.d.ts.map +1 -0
  19. package/dist/cjs/src/lib/tokenTransaction.js +97 -0
  20. package/dist/cjs/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/tokenTransferBuilder.js +57 -0
  22. package/dist/cjs/src/lib/tonWhalesDepositBuilder.d.ts.map +1 -0
  23. package/dist/cjs/src/lib/tonWhalesDepositBuilder.js +42 -0
  24. package/dist/cjs/src/lib/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/tonWhalesVestingDepositBuilder.js +37 -0
  26. package/dist/cjs/src/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  27. package/dist/cjs/src/lib/tonWhalesVestingWithdrawBuilder.js +37 -0
  28. package/dist/cjs/src/lib/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  29. package/dist/cjs/src/lib/tonWhalesWithdrawalBuilder.js +60 -0
  30. package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
  31. package/dist/cjs/src/lib/transaction.js +415 -0
  32. package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
  33. package/dist/cjs/src/lib/transactionBuilder.js +152 -0
  34. package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/transactionBuilderFactory.js +100 -0
  36. package/dist/cjs/src/lib/transactionExplanation.d.ts.map +1 -0
  37. package/dist/cjs/src/lib/transactionExplanation.js +3 -0
  38. package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
  39. package/dist/cjs/src/lib/transferBuilder.js +21 -0
  40. package/dist/cjs/src/lib/utils.d.ts.map +1 -0
  41. package/dist/cjs/src/lib/utils.js +159 -0
  42. package/dist/cjs/src/register.d.ts.map +1 -0
  43. package/dist/cjs/src/register.js +15 -0
  44. package/dist/cjs/src/ton.d.ts.map +1 -0
  45. package/dist/cjs/src/ton.js +520 -0
  46. package/dist/cjs/src/tton.d.ts.map +1 -0
  47. package/dist/cjs/src/tton.js +30 -0
  48. package/dist/cjs/test/resources/ton.d.ts.map +1 -0
  49. package/dist/cjs/test/resources/ton.js +208 -0
  50. package/dist/cjs/test/unit/explainTransactionWasm.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/explainTransactionWasm.js +147 -0
  52. package/dist/cjs/test/unit/jettonToken.d.ts.map +1 -0
  53. package/dist/cjs/test/unit/jettonToken.js +341 -0
  54. package/dist/{test → cjs/test}/unit/keyPair.d.ts.map +1 -1
  55. package/dist/cjs/test/unit/keyPair.js +55 -0
  56. package/dist/cjs/test/unit/singleNominatorWithdrawBuilder.d.ts.map +1 -0
  57. package/dist/cjs/test/unit/singleNominatorWithdrawBuilder.js +314 -0
  58. package/dist/cjs/test/unit/tokenTransferBuilder.d.ts.map +1 -0
  59. package/dist/cjs/test/unit/tokenTransferBuilder.js +262 -0
  60. package/dist/{test → cjs/test}/unit/ton.d.ts.map +1 -1
  61. package/dist/cjs/test/unit/ton.js +752 -0
  62. package/dist/cjs/test/unit/tonWhalesDepositBuilder.d.ts.map +1 -0
  63. package/dist/cjs/test/unit/tonWhalesDepositBuilder.js +114 -0
  64. package/dist/cjs/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +1 -0
  65. package/dist/cjs/test/unit/tonWhalesVestingDepositBuilder.js +136 -0
  66. package/dist/cjs/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +1 -0
  67. package/dist/cjs/test/unit/tonWhalesVestingWithdrawBuilder.js +136 -0
  68. package/dist/cjs/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +1 -0
  69. package/dist/cjs/test/unit/tonWhalesWithdrawalBuilder.js +130 -0
  70. package/dist/cjs/test/unit/transferBuilder.d.ts.map +1 -0
  71. package/dist/cjs/test/unit/transferBuilder.js +281 -0
  72. package/dist/cjs/test/unit/wasmCrossCompatibility.d.ts.map +1 -0
  73. package/dist/cjs/test/unit/wasmCrossCompatibility.js +176 -0
  74. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  75. package/dist/esm/index.d.ts +6 -0
  76. package/dist/esm/index.js +6 -0
  77. package/dist/esm/jettonToken.d.ts +19 -0
  78. package/dist/esm/jettonToken.js +48 -0
  79. package/dist/esm/lib/constants.d.ts +9 -0
  80. package/dist/esm/lib/constants.js +9 -0
  81. package/dist/esm/lib/explainTransactionWasm.d.ts +36 -0
  82. package/dist/esm/lib/explainTransactionWasm.d.ts.map +1 -0
  83. package/dist/esm/lib/explainTransactionWasm.js +99 -0
  84. package/dist/esm/lib/iface.d.ts +32 -0
  85. package/dist/{src → esm}/lib/iface.js +1 -2
  86. package/dist/esm/lib/index.d.ts +14 -0
  87. package/dist/esm/lib/index.js +14 -0
  88. package/dist/esm/lib/keyPair.d.ts +25 -0
  89. package/dist/esm/lib/keyPair.js +63 -0
  90. package/dist/esm/lib/singleNominatorWithdrawBuilder.d.ts +17 -0
  91. package/dist/esm/lib/singleNominatorWithdrawBuilder.js +34 -0
  92. package/dist/esm/lib/tokenTransaction.d.ts +16 -0
  93. package/dist/esm/lib/tokenTransaction.js +90 -0
  94. package/dist/esm/lib/tokenTransferBuilder.d.ts +20 -0
  95. package/dist/esm/lib/tokenTransferBuilder.js +53 -0
  96. package/dist/esm/lib/tonWhalesDepositBuilder.d.ts +12 -0
  97. package/dist/esm/lib/tonWhalesDepositBuilder.js +38 -0
  98. package/dist/esm/lib/tonWhalesVestingDepositBuilder.d.ts +12 -0
  99. package/dist/esm/lib/tonWhalesVestingDepositBuilder.js +33 -0
  100. package/dist/esm/lib/tonWhalesVestingWithdrawBuilder.d.ts +12 -0
  101. package/dist/esm/lib/tonWhalesVestingWithdrawBuilder.js +33 -0
  102. package/dist/esm/lib/tonWhalesWithdrawalBuilder.d.ts +30 -0
  103. package/dist/esm/lib/tonWhalesWithdrawalBuilder.js +56 -0
  104. package/dist/esm/lib/transaction.d.ts +42 -0
  105. package/dist/esm/lib/transaction.js +408 -0
  106. package/dist/esm/lib/transactionBuilder.d.ts +74 -0
  107. package/dist/esm/lib/transactionBuilder.js +145 -0
  108. package/dist/esm/lib/transactionBuilderFactory.d.ts +32 -0
  109. package/dist/esm/lib/transactionBuilderFactory.js +96 -0
  110. package/dist/esm/lib/transactionExplanation.d.ts +14 -0
  111. package/dist/{src → esm}/lib/transactionExplanation.js +1 -2
  112. package/dist/esm/lib/transferBuilder.d.ts +9 -0
  113. package/dist/esm/lib/transferBuilder.js +17 -0
  114. package/dist/esm/lib/utils.d.ts +41 -0
  115. package/dist/esm/lib/utils.js +151 -0
  116. package/dist/esm/register.d.ts +3 -0
  117. package/dist/esm/register.js +11 -0
  118. package/dist/esm/ton.d.ts +59 -0
  119. package/dist/{src → esm}/ton.d.ts.map +1 -1
  120. package/dist/esm/ton.js +480 -0
  121. package/dist/esm/tton.d.ts +22 -0
  122. package/dist/esm/tton.js +26 -0
  123. package/package.json +27 -10
  124. package/dist/src/jettonToken.js +0 -52
  125. package/dist/src/lib/constants.js +0 -12
  126. package/dist/src/lib/explainTransactionWasm.d.ts.map +0 -1
  127. package/dist/src/lib/explainTransactionWasm.js +0 -61
  128. package/dist/src/lib/keyPair.js +0 -103
  129. package/dist/src/lib/singleNominatorWithdrawBuilder.js +0 -38
  130. package/dist/src/lib/tokenTransaction.js +0 -97
  131. package/dist/src/lib/tokenTransferBuilder.js +0 -57
  132. package/dist/src/lib/tonWhalesDepositBuilder.js +0 -42
  133. package/dist/src/lib/tonWhalesVestingDepositBuilder.js +0 -37
  134. package/dist/src/lib/tonWhalesVestingWithdrawBuilder.js +0 -37
  135. package/dist/src/lib/tonWhalesWithdrawalBuilder.js +0 -60
  136. package/dist/src/lib/transaction.js +0 -415
  137. package/dist/src/lib/transactionBuilder.js +0 -152
  138. package/dist/src/lib/transactionBuilderFactory.js +0 -100
  139. package/dist/src/lib/transferBuilder.js +0 -21
  140. package/dist/src/lib/utils.js +0 -159
  141. package/dist/src/register.js +0 -15
  142. package/dist/src/ton.js +0 -525
  143. package/dist/src/tton.js +0 -30
  144. package/dist/test/resources/ton.d.ts.map +0 -1
  145. package/dist/test/resources/ton.js +0 -208
  146. package/dist/test/unit/explainTransactionWasm.d.ts.map +0 -1
  147. package/dist/test/unit/explainTransactionWasm.js +0 -147
  148. package/dist/test/unit/jettonToken.d.ts.map +0 -1
  149. package/dist/test/unit/jettonToken.js +0 -341
  150. package/dist/test/unit/keyPair.js +0 -55
  151. package/dist/test/unit/singleNominatorWithdrawBuilder.d.ts.map +0 -1
  152. package/dist/test/unit/singleNominatorWithdrawBuilder.js +0 -314
  153. package/dist/test/unit/tokenTransferBuilder.d.ts.map +0 -1
  154. package/dist/test/unit/tokenTransferBuilder.js +0 -262
  155. package/dist/test/unit/ton.js +0 -752
  156. package/dist/test/unit/tonWhalesDepositBuilder.d.ts.map +0 -1
  157. package/dist/test/unit/tonWhalesDepositBuilder.js +0 -114
  158. package/dist/test/unit/tonWhalesVestingDepositBuilder.d.ts.map +0 -1
  159. package/dist/test/unit/tonWhalesVestingDepositBuilder.js +0 -136
  160. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.d.ts.map +0 -1
  161. package/dist/test/unit/tonWhalesVestingWithdrawBuilder.js +0 -136
  162. package/dist/test/unit/tonWhalesWithdrawalBuilder.d.ts.map +0 -1
  163. package/dist/test/unit/tonWhalesWithdrawalBuilder.js +0 -130
  164. package/dist/test/unit/transferBuilder.d.ts.map +0 -1
  165. package/dist/test/unit/transferBuilder.js +0 -281
  166. package/dist/test/unit/wasmCrossCompatibility.d.ts.map +0 -1
  167. package/dist/test/unit/wasmCrossCompatibility.js +0 -176
  168. package/dist/tsconfig.tsbuildinfo +0 -1
  169. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  170. /package/dist/{src → cjs/src}/jettonToken.d.ts +0 -0
  171. /package/dist/{src → cjs/src}/lib/constants.d.ts +0 -0
  172. /package/dist/{src → cjs/src}/lib/iface.d.ts +0 -0
  173. /package/dist/{src → cjs/src}/lib/index.d.ts +0 -0
  174. /package/dist/{src → cjs/src}/lib/keyPair.d.ts +0 -0
  175. /package/dist/{src → cjs/src}/lib/singleNominatorWithdrawBuilder.d.ts +0 -0
  176. /package/dist/{src → cjs/src}/lib/tokenTransaction.d.ts +0 -0
  177. /package/dist/{src → cjs/src}/lib/tokenTransferBuilder.d.ts +0 -0
  178. /package/dist/{src → cjs/src}/lib/tonWhalesDepositBuilder.d.ts +0 -0
  179. /package/dist/{src → cjs/src}/lib/tonWhalesVestingDepositBuilder.d.ts +0 -0
  180. /package/dist/{src → cjs/src}/lib/tonWhalesVestingWithdrawBuilder.d.ts +0 -0
  181. /package/dist/{src → cjs/src}/lib/tonWhalesWithdrawalBuilder.d.ts +0 -0
  182. /package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -0
  183. /package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -0
  184. /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
  185. /package/dist/{src → cjs/src}/lib/transactionExplanation.d.ts +0 -0
  186. /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
  187. /package/dist/{src → cjs/src}/lib/utils.d.ts +0 -0
  188. /package/dist/{src → cjs/src}/register.d.ts +0 -0
  189. /package/dist/{src → cjs/src}/ton.d.ts +0 -0
  190. /package/dist/{src → cjs/src}/tton.d.ts +0 -0
  191. /package/dist/{test → cjs/test}/resources/ton.d.ts +0 -0
  192. /package/dist/{test → cjs/test}/unit/explainTransactionWasm.d.ts +0 -0
  193. /package/dist/{test → cjs/test}/unit/jettonToken.d.ts +0 -0
  194. /package/dist/{test → cjs/test}/unit/keyPair.d.ts +0 -0
  195. /package/dist/{test → cjs/test}/unit/singleNominatorWithdrawBuilder.d.ts +0 -0
  196. /package/dist/{test → cjs/test}/unit/tokenTransferBuilder.d.ts +0 -0
  197. /package/dist/{test → cjs/test}/unit/ton.d.ts +0 -0
  198. /package/dist/{test → cjs/test}/unit/tonWhalesDepositBuilder.d.ts +0 -0
  199. /package/dist/{test → cjs/test}/unit/tonWhalesVestingDepositBuilder.d.ts +0 -0
  200. /package/dist/{test → cjs/test}/unit/tonWhalesVestingWithdrawBuilder.d.ts +0 -0
  201. /package/dist/{test → cjs/test}/unit/tonWhalesWithdrawalBuilder.d.ts +0 -0
  202. /package/dist/{test → cjs/test}/unit/transferBuilder.d.ts +0 -0
  203. /package/dist/{test → cjs/test}/unit/wasmCrossCompatibility.d.ts +0 -0
  204. /package/dist/{src → esm}/index.d.ts.map +0 -0
  205. /package/dist/{src → esm}/jettonToken.d.ts.map +0 -0
  206. /package/dist/{src → esm}/lib/constants.d.ts.map +0 -0
  207. /package/dist/{src → esm}/lib/iface.d.ts.map +0 -0
  208. /package/dist/{src → esm}/lib/index.d.ts.map +0 -0
  209. /package/dist/{src → esm}/lib/keyPair.d.ts.map +0 -0
  210. /package/dist/{src → esm}/lib/singleNominatorWithdrawBuilder.d.ts.map +0 -0
  211. /package/dist/{src → esm}/lib/tokenTransaction.d.ts.map +0 -0
  212. /package/dist/{src → esm}/lib/tokenTransferBuilder.d.ts.map +0 -0
  213. /package/dist/{src → esm}/lib/tonWhalesDepositBuilder.d.ts.map +0 -0
  214. /package/dist/{src → esm}/lib/tonWhalesVestingDepositBuilder.d.ts.map +0 -0
  215. /package/dist/{src → esm}/lib/tonWhalesVestingWithdrawBuilder.d.ts.map +0 -0
  216. /package/dist/{src → esm}/lib/tonWhalesWithdrawalBuilder.d.ts.map +0 -0
  217. /package/dist/{src → esm}/lib/transaction.d.ts.map +0 -0
  218. /package/dist/{src → esm}/lib/transactionBuilder.d.ts.map +0 -0
  219. /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
  220. /package/dist/{src → esm}/lib/transactionExplanation.d.ts.map +0 -0
  221. /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
  222. /package/dist/{src → esm}/lib/utils.d.ts.map +0 -0
  223. /package/dist/{src → esm}/register.d.ts.map +0 -0
  224. /package/dist/{src → esm}/tton.d.ts.map +0 -0
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transaction = void 0;
7
+ const tonweb_1 = __importDefault(require("tonweb"));
8
+ const bn_js_1 = require("bn.js");
9
+ const sdk_core_1 = require("@bitgo/sdk-core");
10
+ const constants_1 = require("./constants");
11
+ class Transaction extends sdk_core_1.BaseTransaction {
12
+ constructor(coinConfig) {
13
+ super(coinConfig);
14
+ this.bounceable = false;
15
+ this.fromAddressBounceable = true;
16
+ this.toAddressBounceable = true;
17
+ this.isV3ContractMessage = false;
18
+ }
19
+ canSign(key) {
20
+ return false;
21
+ }
22
+ toBroadcastFormat() {
23
+ return this.finalMessage;
24
+ }
25
+ toJson() {
26
+ const otherFormat = new tonweb_1.default.Address(this.recipient.address).toString(true, true, !new tonweb_1.default.Address(this.recipient.address).isBounceable);
27
+ return {
28
+ id: this._id,
29
+ sender: this.sender,
30
+ destination: this.recipient.address,
31
+ destinationAlias: otherFormat,
32
+ amount: this.recipient.amount,
33
+ withdrawAmount: this.withdrawAmount,
34
+ seqno: this.seqno,
35
+ sub_wallet_id: this.sub_wallet_id,
36
+ expirationTime: this.expireTime,
37
+ publicKey: this.publicKey,
38
+ signature: this._signatures[0],
39
+ bounceable: this.bounceable,
40
+ };
41
+ }
42
+ get signablePayload() {
43
+ return Buffer.from(this.unsignedMessage, 'hex');
44
+ }
45
+ /**
46
+ * Set the transaction type.
47
+ * @param {TransactionType} transactionType The transaction type to be set.
48
+ */
49
+ set transactionType(transactionType) {
50
+ this._type = transactionType;
51
+ }
52
+ async build() {
53
+ if (!this.sub_wallet_id) {
54
+ if (this.isV3ContractMessage) {
55
+ this.sub_wallet_id = constants_1.VESTING_CONTRACT_WALLET_ID;
56
+ }
57
+ else {
58
+ this.sub_wallet_id = constants_1.WALLET_ID;
59
+ }
60
+ }
61
+ const signingMessage = this.createSigningMessage(this.sub_wallet_id, this.seqno, this.expireTime);
62
+ const sendMode = 3; // default sendMode
63
+ signingMessage.bits.writeUint8(sendMode);
64
+ const outMsg = this.createOutMsg(this.recipient.address, this.recipient.amount, this.message);
65
+ signingMessage.refs.push(outMsg);
66
+ this.unsignedMessage = Buffer.from(await signingMessage.hash()).toString('hex');
67
+ const signature = this._signatures.length > 0 ? this._signatures[0] : Buffer.from(new Uint8Array(64)).toString('hex');
68
+ const finalMessage = await this.createExternalMessage(signingMessage, this.seqno, signature);
69
+ this.finalMessage = tonweb_1.default.utils.bytesToBase64(await finalMessage.toBoc(false));
70
+ const originalTxId = tonweb_1.default.utils.bytesToBase64(await finalMessage.hash());
71
+ this._id = originalTxId.replace(/\//g, '_').replace(/\+/g, '-');
72
+ }
73
+ createSigningMessage(walletId, seqno, expireAt) {
74
+ const message = new tonweb_1.default.boc.Cell();
75
+ message.bits.writeUint(walletId, 32);
76
+ // expireAt should be set as per the provided arg value, regardless of the seqno
77
+ message.bits.writeUint(expireAt, 32);
78
+ message.bits.writeUint(seqno, 32);
79
+ if (!this.isV3ContractMessage) {
80
+ message.bits.writeUint(0, 8); // op
81
+ }
82
+ return message;
83
+ }
84
+ createOutMsg(address, amount, payload) {
85
+ let payloadCell = new tonweb_1.default.boc.Cell();
86
+ if (payload) {
87
+ if (payload.refs) {
88
+ // is Cell
89
+ payloadCell = payload;
90
+ }
91
+ else if (typeof payload === 'string') {
92
+ if (payload.length > 0) {
93
+ if (payload.length > 24 && payload.substring(0, 8) === constants_1.WITHDRAW_OPCODE) {
94
+ // payload is a withdraw txn message
95
+ const queryId = payload.substring(8, 24);
96
+ const withdrawAmount = payload.substring(24);
97
+ /* eslint-disable-next-line no-console */
98
+ console.log(`payload: ${payload}, queryId: ${queryId}, withdrawAmount: ${withdrawAmount}`);
99
+ payloadCell.bits.writeUint(parseInt(constants_1.WITHDRAW_OPCODE, 16), 32);
100
+ payloadCell.bits.writeUint(parseInt(queryId, 16), 64);
101
+ payloadCell.bits.writeCoins(new bn_js_1.BN(withdrawAmount));
102
+ }
103
+ else if (payload.length >= 26 && payload.substring(0, 10) === constants_1.TON_WHALES_DEPOSIT_OPCODE) {
104
+ const queryId = payload.substring(10, 26);
105
+ payloadCell.bits.writeUint(parseInt(constants_1.TON_WHALES_DEPOSIT_OPCODE, 10), 32);
106
+ payloadCell.bits.writeUint(parseInt(queryId, 16), 64);
107
+ // The Ton Whales protocol requires a specific 'gas limit' field in the payload
108
+ // structure (OpCode -> QueryId -> GasLimit -> Amount).
109
+ payloadCell.bits.writeCoins(tonweb_1.default.utils.toNano('1'));
110
+ }
111
+ else if (payload.length >= 26 && payload.substring(0, 10) === constants_1.TON_WHALES_WITHDRAW_OPCODE) {
112
+ const queryId = payload.substring(10, 26);
113
+ const amountStr = payload.substring(26);
114
+ payloadCell.bits.writeUint(parseInt(constants_1.TON_WHALES_WITHDRAW_OPCODE, 10), 32);
115
+ payloadCell.bits.writeUint(new bn_js_1.BN(queryId, 16), 64);
116
+ // The Ton Whales protocol requires a specific 'gas limit' field in the payload
117
+ // structure (OpCode -> QueryId -> GasLimit -> Amount).
118
+ // We hardcode 1 TON here to match the Deposit implementation and ensure
119
+ // sufficient gas for the pool to process the request.
120
+ payloadCell.bits.writeCoins(tonweb_1.default.utils.toNano('1'));
121
+ payloadCell.bits.writeCoins(new bn_js_1.BN(amountStr));
122
+ }
123
+ else {
124
+ payloadCell.bits.writeUint(0, 32);
125
+ payloadCell.bits.writeString(payload);
126
+ }
127
+ }
128
+ }
129
+ else {
130
+ payloadCell.bits.writeBytes(payload);
131
+ }
132
+ }
133
+ const orderHeader = tonweb_1.default.Contract.createInternalMessageHeader(new tonweb_1.default.Address(address), new bn_js_1.BN(amount), true, this.bounceable);
134
+ return tonweb_1.default.Contract.createCommonMsgInfo(orderHeader, undefined, payloadCell);
135
+ }
136
+ async createExternalMessage(signingMessage, seqno, signature) {
137
+ const body = new tonweb_1.default.boc.Cell();
138
+ body.bits.writeBytes(Buffer.from(signature, 'hex'));
139
+ body.writeCell(signingMessage);
140
+ let stateInit;
141
+ if (seqno === 0 && !this.isV3ContractMessage) {
142
+ const WalletClass = tonweb_1.default.Wallets.all['v4R2'];
143
+ const wallet = new WalletClass(new tonweb_1.default.HttpProvider(), {
144
+ publicKey: tonweb_1.default.utils.hexToBytes(this.publicKey),
145
+ wc: 0,
146
+ });
147
+ const deploy = await wallet.createStateInit();
148
+ stateInit = deploy.stateInit;
149
+ }
150
+ const header = tonweb_1.default.Contract.createExternalMessageHeader(this.sender);
151
+ return tonweb_1.default.Contract.createCommonMsgInfo(header, stateInit, body);
152
+ }
153
+ loadInputsAndOutputs() {
154
+ const outputs = [];
155
+ const inputs = [];
156
+ inputs.push({
157
+ address: this.sender,
158
+ value: this.recipient.amount,
159
+ coin: this._coinConfig.name,
160
+ });
161
+ outputs.push({
162
+ address: this.recipient.address,
163
+ value: this.recipient.amount,
164
+ coin: this._coinConfig.name,
165
+ });
166
+ this._outputs = outputs;
167
+ this._inputs = inputs;
168
+ }
169
+ fromRawTransaction(rawTransaction) {
170
+ try {
171
+ const cell = tonweb_1.default.boc.Cell.oneFromBoc(tonweb_1.default.utils.base64ToBytes(rawTransaction));
172
+ const parsed = this.parseTransaction(cell);
173
+ this.sender = parsed.fromAddress;
174
+ this.recipient = { address: parsed.toAddress, amount: parsed.value };
175
+ this.withdrawAmount = parsed.withdrawAmount;
176
+ this.seqno = parsed.seqno;
177
+ this.publicKey = parsed.publicKey;
178
+ this.expireTime = parsed.expireAt;
179
+ this.message = parsed.payload;
180
+ this._signatures.push(parsed.signature);
181
+ this.bounceable = parsed.bounce;
182
+ this.sub_wallet_id = parsed.walletId;
183
+ }
184
+ catch (e) {
185
+ throw new Error('invalid raw transaction');
186
+ }
187
+ }
188
+ /** @inheritDoc */
189
+ explainTransaction() {
190
+ const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'withdrawAmount'];
191
+ const outputs = [this.recipient];
192
+ const outputAmount = this.recipient.amount;
193
+ const withdrawAmount = this.withdrawAmount;
194
+ return {
195
+ displayOrder,
196
+ id: this.id,
197
+ outputs,
198
+ outputAmount,
199
+ changeOutputs: [],
200
+ changeAmount: '0',
201
+ fee: { fee: 'UNKNOWN' },
202
+ withdrawAmount,
203
+ };
204
+ }
205
+ parseTransaction(cell) {
206
+ const slice = cell.beginParse();
207
+ // header
208
+ if (slice.loadUint(2).toNumber() !== 2)
209
+ throw Error('invalid header');
210
+ const externalSourceAddress = slice.loadAddress();
211
+ if (externalSourceAddress !== null)
212
+ throw Error('invalid externalSourceAddress');
213
+ const externalDestAddress = slice.loadAddress();
214
+ const externalImportFee = slice.loadCoins();
215
+ if (!externalImportFee.eq(new bn_js_1.BN(0)))
216
+ throw new Error('invalid externalImportFee');
217
+ // stateInit
218
+ let publicKey;
219
+ if (slice.loadBit()) {
220
+ if (slice.loadBit()) {
221
+ const stateInit = slice.loadRef();
222
+ stateInit.loadRef();
223
+ const data = stateInit.loadRef();
224
+ const seqno = data.loadUint(32).toNumber();
225
+ if (seqno !== 0)
226
+ throw new Error('invalid seqno');
227
+ const walletId = data.loadUint(32).toNumber();
228
+ if (walletId !== constants_1.WALLET_ID)
229
+ throw new Error('invalid wallet id');
230
+ const publicKeyBuf = new Uint8Array(32);
231
+ for (let i = 0; i < publicKeyBuf.length; i++) {
232
+ publicKeyBuf[i] = data.loadUint(8);
233
+ }
234
+ publicKey = Buffer.from(publicKeyBuf).toString('hex');
235
+ }
236
+ }
237
+ // body
238
+ const bodySlice = slice.loadBit() ? slice.loadRef() : slice;
239
+ return {
240
+ fromAddress: externalDestAddress.toString(true, true, this.fromAddressBounceable),
241
+ publicKey,
242
+ ...this.parseTransactionBody(bodySlice),
243
+ };
244
+ }
245
+ parseTransactionBody(slice) {
246
+ const signature = Buffer.from(slice.loadBits(512)).toString('hex');
247
+ // signing message
248
+ const walletId = slice.loadUint(32).toNumber();
249
+ if (walletId !== constants_1.WALLET_ID && walletId !== constants_1.VESTING_CONTRACT_WALLET_ID)
250
+ throw new Error('invalid walletId');
251
+ const expireAt = slice.loadUint(32).toNumber();
252
+ const seqno = slice.loadUint(32).toNumber();
253
+ const op = slice.loadUint(8).toNumber();
254
+ if (op !== 3) {
255
+ if (op !== 0)
256
+ throw new Error('invalid op');
257
+ const sendMode = slice.loadUint(8).toNumber();
258
+ if (sendMode !== 3)
259
+ throw new Error('invalid sendMode');
260
+ }
261
+ else {
262
+ this.isV3ContractMessage = true;
263
+ }
264
+ let order = slice.loadRef();
265
+ if (order.loadBit())
266
+ throw Error('invalid internal header');
267
+ if (!order.loadBit())
268
+ throw Error('invalid ihrDisabled');
269
+ const bounce = order.loadBit();
270
+ if (order.loadBit())
271
+ throw Error('invalid bounced');
272
+ const sourceAddress = order.loadAddress();
273
+ if (sourceAddress !== null)
274
+ throw Error('invalid externalSourceAddress');
275
+ const destAddress = order.loadAddress();
276
+ const value = order.loadCoins().toString();
277
+ if (order.loadBit())
278
+ throw Error('invalid currencyCollection');
279
+ const ihrFees = order.loadCoins();
280
+ if (!ihrFees.eq(new bn_js_1.BN(0)))
281
+ throw new Error('invalid ihrFees');
282
+ const fwdFees = order.loadCoins();
283
+ if (!fwdFees.eq(new bn_js_1.BN(0)))
284
+ throw new Error('invalid fwdFees');
285
+ const createdLt = order.loadUint(64);
286
+ if (!createdLt.eq(new bn_js_1.BN(0)))
287
+ throw new Error('invalid createdLt');
288
+ const createdAt = order.loadUint(32);
289
+ if (!createdAt.eq(new bn_js_1.BN(0)))
290
+ throw new Error('invalid createdAt');
291
+ // order stateInit
292
+ if (order.loadBit()) {
293
+ order.loadRef(); // don't parse stateInit
294
+ }
295
+ // order body
296
+ let payload;
297
+ let withdrawAmount;
298
+ this.transactionType = sdk_core_1.TransactionType.Send;
299
+ if (order.getFreeBits() > 0) {
300
+ if (order.loadBit()) {
301
+ order = order.loadRef();
302
+ }
303
+ if (order.getFreeBits() > 32) {
304
+ const opcode = order.loadUint(32).toNumber();
305
+ if (opcode === 0) {
306
+ const payloadBytes = order.loadBits(order.getFreeBits());
307
+ payload = new TextDecoder().decode(payloadBytes);
308
+ if (payload === 'Deposit') {
309
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesVestingDeposit;
310
+ }
311
+ else if (payload === 'Withdraw') {
312
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesVestingWithdrawal;
313
+ }
314
+ else if (payload === constants_1.SINGLE_NOMINATOR_WITHDRAW_ALL_COMMENT) {
315
+ this.transactionType = sdk_core_1.TransactionType.SingleNominatorWithdraw;
316
+ }
317
+ }
318
+ else if (opcode === 4096) {
319
+ const queryId = order.loadUint(64).toNumber();
320
+ withdrawAmount = order.loadCoins().toNumber().toString();
321
+ payload = constants_1.WITHDRAW_OPCODE + queryId.toString(16).padStart(16, '0') + withdrawAmount;
322
+ this.transactionType = sdk_core_1.TransactionType.SingleNominatorWithdraw;
323
+ }
324
+ else if (opcode === constants_1.JETTON_TRANSFER_OPCODE) {
325
+ this.transactionType = sdk_core_1.TransactionType.SendToken;
326
+ const queryId = order.loadUint(64).toNumber();
327
+ if (queryId !== 0)
328
+ throw new Error('invalid queryId for jetton transfer');
329
+ const jettonAmount = order.loadCoins();
330
+ if (!jettonAmount.gt(new bn_js_1.BN(0)))
331
+ throw new Error('invalid jettonAmount');
332
+ const jettonRecipient = order.loadAddress();
333
+ if (!jettonRecipient)
334
+ throw new Error('invalid jettonRecipient');
335
+ const forwarderAddress = order.loadAddress();
336
+ if (!forwarderAddress)
337
+ throw new Error('invalid forwarderAddress');
338
+ order.loadBit(); // skip bit
339
+ const forwardTonAmount = order.loadCoins();
340
+ if (!forwardTonAmount.gt(new bn_js_1.BN(0)))
341
+ throw new Error('invalid forwardTonAmount');
342
+ let message = '';
343
+ if (order.loadBit()) {
344
+ order = order.loadRef();
345
+ const messageOpcode = order.loadUint(32).toNumber();
346
+ if (messageOpcode !== 0)
347
+ throw new Error('invalid message opcode');
348
+ const messageBytes = order.loadBits(order.getFreeBits());
349
+ message = new TextDecoder().decode(messageBytes);
350
+ }
351
+ payload = {
352
+ jettonAmount: jettonAmount.toString(),
353
+ jettonRecipient: jettonRecipient.toString(true, true, this.toAddressBounceable),
354
+ forwarderAddress: forwarderAddress.toString(true, true, this.fromAddressBounceable),
355
+ forwardTonAmount: forwardTonAmount.toString(),
356
+ message: message,
357
+ };
358
+ }
359
+ else if (opcode === parseInt(constants_1.TON_WHALES_DEPOSIT_OPCODE, 10)) {
360
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesDeposit;
361
+ const queryId = order.loadUint(64).toNumber();
362
+ // This is the gas limit, which must be read to advance the cursor
363
+ // We do not need to store it
364
+ order.loadCoins();
365
+ payload = constants_1.TON_WHALES_DEPOSIT_OPCODE + queryId.toString(16).padStart(16, '0');
366
+ }
367
+ else if (opcode === parseInt(constants_1.TON_WHALES_WITHDRAW_OPCODE, 10)) {
368
+ this.transactionType = sdk_core_1.TransactionType.TonWhalesWithdrawal;
369
+ const queryId = order.loadUint(64).toNumber();
370
+ order.loadCoins(); // Skip Gas (Hardcoded in builder)
371
+ const amount = order.loadCoins();
372
+ withdrawAmount = amount.toString(); // Decimal String
373
+ // Reconstruct Payload: Decimal Op + Hex Query + Decimal Amount
374
+ const queryHex = new bn_js_1.BN(queryId).toString(16).padStart(16, '0');
375
+ payload = constants_1.TON_WHALES_WITHDRAW_OPCODE + queryHex + withdrawAmount;
376
+ }
377
+ else {
378
+ payload = '';
379
+ }
380
+ }
381
+ }
382
+ return {
383
+ toAddress: destAddress.toString(true, true, this.fromAddressBounceable),
384
+ value,
385
+ bounce,
386
+ seqno,
387
+ withdrawAmount,
388
+ expireAt,
389
+ payload,
390
+ signature,
391
+ walletId,
392
+ };
393
+ }
394
+ parseTransferStateInit(slice) {
395
+ if (slice === null)
396
+ return {};
397
+ slice.loadRef();
398
+ const data = slice.loadRef();
399
+ const seqno = data.loadUint(32).toNumber();
400
+ if (seqno !== 0)
401
+ throw new Error('invalid seqno');
402
+ const walletId = data.loadUint(32).toNumber();
403
+ if (walletId !== constants_1.WALLET_ID)
404
+ throw new Error('invalid wallet id');
405
+ const publicKey = new Uint8Array(32);
406
+ for (let i = 0; i < publicKey.length; i++) {
407
+ publicKey[i] = data.loadUint(8);
408
+ }
409
+ return {
410
+ publicKey: Buffer.from(publicKey).toString('hex'),
411
+ };
412
+ }
413
+ }
414
+ exports.Transaction = Transaction;
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUM1QixpQ0FBMkI7QUFHM0IsOENBQW9IO0FBR3BILDJDQVFxQjtBQUVyQixNQUFhLFdBQVksU0FBUSwwQkFBZTtJQWdCOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGlCQUFpQjtRQUNmLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sV0FBVyxHQUFHLElBQUksZ0JBQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQ3JFLElBQUksRUFDSixJQUFJLEVBQ0osQ0FBQyxJQUFJLGdCQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUN6RCxDQUFDO1FBQ0YsT0FBTztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBYTtZQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUNuQyxnQkFBZ0IsRUFBRSxXQUFXO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1B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RSxNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPO1lBQ0wsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUNsRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBemJELGtDQXliQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUb25XZWIgZnJvbSAndG9ud2ViJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgQ2VsbCB9IGZyb20gJ3RvbndlYi9kaXN0L3R5cGVzL2JvYy9jZWxsJztcblxuaW1wb3J0IHsgQmFzZUtleSwgQmFzZVRyYW5zYWN0aW9uLCBFbnRyeSwgUmVjaXBpZW50LCBUcmFuc2FjdGlvblJlY2lwaWVudCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIFdJVEhEUkFXX09QQ09ERSxcbiAgV0FMTEVUX0lELFxuICBKRVRUT05fVFJBTlNGRVJfT1BDT0RFLFxuICBWRVNUSU5HX0NPTlRSQUNUX1dBTExFVF9JRCxcbiAgVE9OX1dIQUxFU19ERVBPU0lUX09QQ09ERSxcbiAgVE9OX1dIQUxFU19XSVRIRFJBV19PUENPREUsXG4gIFNJTkdMRV9OT01JTkFUT1JfV0lUSERSQVdfQUxMX0NPTU1FTlQsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHVibGljIHJlY2lwaWVudDogUmVjaXBpZW50O1xuICBwdWJsaWMgYm91bmNlYWJsZTogYm9vbGVhbjtcbiAgcHVibGljIGZyb21BZGRyZXNzQm91bmNlYWJsZTogYm9vbGVhbjtcbiAgcHVibGljIHRvQWRkcmVzc0JvdW5jZWFibGU6IGJvb2xlYW47XG4gIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmc7XG4gIHB1YmxpYyB3aXRoZHJhd0Ftb3VudDogc3RyaW5nO1xuICBzZXFubzogbnVtYmVyO1xuICBleHBpcmVUaW1lOiBudW1iZXI7XG4gIHNlbmRlcjogc3RyaW5nO1xuICBwdWJsaWNLZXk6IHN0cmluZztcbiAgaXNWM0NvbnRyYWN0TWVzc2FnZTogYm9vbGVhbjtcbiAgc3ViX3dhbGxldF9pZDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgdW5zaWduZWRNZXNzYWdlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBmaW5hbE1lc3NhZ2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuYm91bmNlYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnRvQWRkcmVzc0JvdW5jZWFibGUgPSB0cnVlO1xuICAgIHRoaXMuaXNWM0NvbnRyYWN0TWVzc2FnZSA9IGZhbHNlO1xuICB9XG5cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpbmFsTWVzc2FnZTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGNvbnN0IG90aGVyRm9ybWF0ID0gbmV3IFRvbldlYi5BZGRyZXNzKHRoaXMucmVjaXBpZW50LmFkZHJlc3MpLnRvU3RyaW5nKFxuICAgICAgdHJ1ZSxcbiAgICAgIHRydWUsXG4gICAgICAhbmV3IFRvbldlYi5BZGRyZXNzKHRoaXMucmVjaXBpZW50LmFkZHJlc3MpLmlzQm91bmNlYWJsZVxuICAgICk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLl9pZCBhcyBzdHJpbmcsXG4gICAgICBzZW5kZXI6IHRoaXMuc2VuZGVyLFxuICAgICAgZGVzdGluYXRpb246IHRoaXMucmVjaXBpZW50LmFkZHJlc3MsXG4gICAgICBkZXN0aW5hdGlvbkFsaWFzOiBvdGhlckZvcm1hdCxcbiAgICAgIGFtb3VudDogdGhpcy5yZWNpcGllbnQuYW1vdW50LFxuICAgICAgd2l0aGRyYXdBbW91bnQ6IHRoaXMud2l0aGRyYXdBbW91bnQsXG4gICAgICBzZXFubzogdGhpcy5zZXFubyxcbiAgICAgIHN1Yl93YWxsZXRfaWQ6IHRoaXMuc3ViX3dhbGxldF9pZCxcbiAgICAgIGV4cGlyYXRpb25UaW1lOiB0aGlzLmV4cGlyZVRpbWUsXG4gICAgICBwdWJsaWNLZXk6IHRoaXMucHVibGljS2V5LFxuICAgICAgc2lnbmF0dXJlOiB0aGlzLl9zaWduYXR1cmVzWzBdLFxuICAgICAgYm91bmNlYWJsZTogdGhpcy5ib3VuY2VhYmxlLFxuICAgIH07XG4gIH1cblxuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRoaXMudW5zaWduZWRNZXNzYWdlLCAnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHNldCB0cmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnN1Yl93YWxsZXRfaWQpIHtcbiAgICAgIGlmICh0aGlzLmlzVjNDb250cmFjdE1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zdWJfd2FsbGV0X2lkID0gVkVTVElOR19DT05UUkFDVF9XQUxMRVRfSUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1Yl93YWxsZXRfaWQgPSBXQUxMRVRfSUQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNpZ25pbmdNZXNzYWdlID0gdGhpcy5jcmVhdGVTaWduaW5nTWVzc2FnZSh0aGlzLnN1Yl93YWxsZXRfaWQsIHRoaXMuc2Vxbm8sIHRoaXMuZXhwaXJlVGltZSk7XG4gICAgY29uc3Qgc2VuZE1vZGUgPSAzOyAvLyBkZWZhdWx0IHNlbmRNb2RlXG4gICAgc2lnbmluZ01lc3NhZ2UuYml0cy53cml0ZVVpbnQ4KHNlbmRNb2RlKTtcbiAgICBjb25zdCBvdXRNc2cgPSB0aGlzLmNyZWF0ZU91dE1zZyh0aGlzLnJlY2lwaWVudC5hZGRyZXNzLCB0aGlzLnJlY2lwaWVudC5hbW91bnQsIHRoaXMubWVzc2FnZSk7XG4gICAgc2lnbmluZ01lc3NhZ2UucmVmcy5wdXNoKG91dE1zZyk7XG4gICAgdGhpcy51bnNpZ25lZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbShhd2FpdCBzaWduaW5nTWVzc2FnZS5oYXNoKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHNpZ25hdHVyZSA9XG4gICAgICB0aGlzLl9zaWduYXR1cmVzLmxlbmd0aCA+IDAgPyB0aGlzLl9zaWduYXR1cmVzWzBdIDogQnVmZmVyLmZyb20obmV3IFVpbnQ4QXJyYXkoNjQpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgZmluYWxNZXNzYWdlID0gYXdhaXQgdGhpcy5jcmVhdGVFeHRlcm5hbE1lc3NhZ2Uoc2lnbmluZ01lc3NhZ2UsIHRoaXMuc2Vxbm8sIHNpZ25hdHVyZSk7XG5cbiAgICB0aGlzLmZpbmFsTWVzc2FnZSA9IFRvbldlYi51dGlscy5ieXRlc1RvQmFzZTY0KGF3YWl0IGZpbmFsTWVzc2FnZS50b0JvYyhmYWxzZSkpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxUeElkID0gVG9uV2ViLnV0aWxzLmJ5dGVzVG9CYXNlNjQoYXdhaXQgZmluYWxNZXNzYWdlLmhhc2goKSk7XG4gICAgdGhpcy5faWQgPSBvcmlnaW5hbFR4SWQucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvXFwrL2csICctJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlU2lnbmluZ01lc3NhZ2Uod2FsbGV0SWQsIHNlcW5vLCBleHBpcmVBdCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVG9uV2ViLmJvYy5DZWxsKCk7XG4gICAgbWVzc2FnZS5iaXRzLndyaXRlVWludCh3YWxsZXRJZCwgMzIpO1xuICAgIC8vIGV4cGlyZUF0IHNob3VsZCBiZSBzZXQgYXMgcGVyIHRoZSBwcm92aWRlZCBhcmcgdmFsdWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNlcW5vXG4gICAgbWVzc2FnZS5iaXRzLndyaXRlVWludChleHBpcmVBdCwgMzIpO1xuICAgIG1lc3NhZ2UuYml0cy53cml0ZVVpbnQoc2Vxbm8sIDMyKTtcbiAgICBpZiAoIXRoaXMuaXNWM0NvbnRyYWN0TWVzc2FnZSkge1xuICAgICAgbWVzc2FnZS5iaXRzLndyaXRlVWludCgwLCA4KTsgLy8gb3BcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlT3V0TXNnKGFkZHJlc3MsIGFtb3VudCwgcGF5bG9hZCkge1xuICAgIGxldCBwYXlsb2FkQ2VsbCA9IG5ldyBUb25XZWIuYm9jLkNlbGwoKTtcbiAgICBpZiAocGF5bG9hZCkge1xuICAgICAgaWYgKHBheWxvYWQucmVmcykge1xuICAgICAgICAvLyBpcyBDZWxsXG4gICAgICAgIHBheWxvYWRDZWxsID0gcGF5bG9hZDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBpZiAocGF5bG9hZC5sZW5ndGggPiAyNCAmJiBwYXlsb2FkLnN1YnN0cmluZygwLCA4KSA9PT0gV0lUSERSQVdfT1BDT0RFKSB7XG4gICAgICAgICAgICAvLyBwYXlsb2FkIGlzIGEgd2l0aGRyYXcgdHhuIG1lc3NhZ2VcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBwYXlsb2FkLnN1YnN0cmluZyg4LCAyNCk7XG4gICAgICAgICAgICBjb25zdCB3aXRoZHJhd0Ftb3VudCA9IHBheWxvYWQuc3Vic3RyaW5nKDI0KTtcbiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlICovXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgcGF5bG9hZDogJHtwYXlsb2FkfSwgcXVlcnlJZDogJHtxdWVyeUlkfSwgd2l0aGRyYXdBbW91bnQ6ICR7d2l0aGRyYXdBbW91bnR9YCk7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlVWludChwYXJzZUludChXSVRIRFJBV19PUENPREUsIDE2KSwgMzIpO1xuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZVVpbnQocGFyc2VJbnQocXVlcnlJZCwgMTYpLCA2NCk7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQ29pbnMobmV3IEJOKHdpdGhkcmF3QW1vdW50KSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkLmxlbmd0aCA+PSAyNiAmJiBwYXlsb2FkLnN1YnN0cmluZygwLCAxMCkgPT09IFRPTl9XSEFMRVNfREVQT1NJVF9PUENPREUpIHtcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5SWQgPSBwYXlsb2FkLnN1YnN0cmluZygxMCwgMjYpO1xuICAgICAgICAgICAgcGF5bG9hZENlbGwuYml0cy53cml0ZVVpbnQocGFyc2VJbnQoVE9OX1dIQUxFU19ERVBPU0lUX09QQ09ERSwgMTApLCAzMik7XG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlVWludChwYXJzZUludChxdWVyeUlkLCAxNiksIDY0KTtcbiAgICAgICAgICAgIC8vIFRoZSBUb24gV2hhbGVzIHByb3RvY29sIHJlcXVpcmVzIGEgc3BlY2lmaWMgJ2dhcyBsaW1pdCcgZmllbGQgaW4gdGhlIHBheWxvYWRcbiAgICAgICAgICAgIC8vIHN0cnVjdHVyZSAoT3BDb2RlIC0+IFF1ZXJ5SWQgLT4gR2FzTGltaXQgLT4gQW1vdW50KS5cbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVDb2lucyhUb25XZWIudXRpbHMudG9OYW5vKCcxJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZC5sZW5ndGggPj0gMjYgJiYgcGF5bG9hZC5zdWJzdHJpbmcoMCwgMTApID09PSBUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSkge1xuICAgICAgICAgICAgY29uc3QgcXVlcnlJZCA9IHBheWxvYWQuc3Vic3RyaW5nKDEwLCAyNik7XG4gICAgICAgICAgICBjb25zdCBhbW91bnRTdHIgPSBwYXlsb2FkLnN1YnN0cmluZygyNik7XG5cbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KHBhcnNlSW50KFRPTl9XSEFMRVNfV0lUSERSQVdfT1BDT0RFLCAxMCksIDMyKTtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KG5ldyBCTihxdWVyeUlkLCAxNiksIDY0KTtcbiAgICAgICAgICAgIC8vIFRoZSBUb24gV2hhbGVzIHByb3RvY29sIHJlcXVpcmVzIGEgc3BlY2lmaWMgJ2dhcyBsaW1pdCcgZmllbGQgaW4gdGhlIHBheWxvYWRcbiAgICAgICAgICAgIC8vIHN0cnVjdHVyZSAoT3BDb2RlIC0+IFF1ZXJ5SWQgLT4gR2FzTGltaXQgLT4gQW1vdW50KS5cbiAgICAgICAgICAgIC8vIFdlIGhhcmRjb2RlIDEgVE9OIGhlcmUgdG8gbWF0Y2ggdGhlIERlcG9zaXQgaW1wbGVtZW50YXRpb24gYW5kIGVuc3VyZVxuICAgICAgICAgICAgLy8gc3VmZmljaWVudCBnYXMgZm9yIHRoZSBwb29sIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuXG4gICAgICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQ29pbnMoVG9uV2ViLnV0aWxzLnRvTmFubygnMScpKTtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVDb2lucyhuZXcgQk4oYW1vdW50U3RyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVVaW50KDAsIDMyKTtcbiAgICAgICAgICAgIHBheWxvYWRDZWxsLmJpdHMud3JpdGVTdHJpbmcocGF5bG9hZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkQ2VsbC5iaXRzLndyaXRlQnl0ZXMocGF5bG9hZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3JkZXJIZWFkZXIgPSBUb25XZWIuQ29udHJhY3QuY3JlYXRlSW50ZXJuYWxNZXNzYWdlSGVhZGVyKFxuICAgICAgbmV3IFRvbldlYi5BZGRyZXNzKGFkZHJlc3MpLFxuICAgICAgbmV3IEJOKGFtb3VudCksXG4gICAgICB0cnVlLFxuICAgICAgdGhpcy5ib3VuY2VhYmxlXG4gICAgKTtcbiAgICByZXR1cm4gVG9uV2ViLkNvbnRyYWN0LmNyZWF0ZUNvbW1vbk1zZ0luZm8ob3JkZXJIZWFkZXIsIHVuZGVmaW5lZCwgcGF5bG9hZENlbGwpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRXh0ZXJuYWxNZXNzYWdlKHNpZ25pbmdNZXNzYWdlOiBDZWxsLCBzZXFubzogbnVtYmVyLCBzaWduYXR1cmU6IHN0cmluZyk6IFByb21pc2U8Q2VsbD4ge1xuICAgIGNvbnN0IGJvZHkgPSBuZXcgVG9uV2ViLmJvYy5DZWxsKCk7XG5cbiAgICBib2R5LmJpdHMud3JpdGVCeXRlcyhCdWZmZXIuZnJvbShzaWduYXR1cmUsICdoZXgnKSk7XG4gICAgYm9keS53cml0ZUNlbGwoc2lnbmluZ01lc3NhZ2UpO1xuXG4gICAgbGV0IHN0YXRlSW5pdDtcbiAgICBpZiAoc2Vxbm8gPT09IDAgJiYgIXRoaXMuaXNWM0NvbnRyYWN0TWVzc2FnZSkge1xuICAgICAgY29uc3QgV2FsbGV0Q2xhc3MgPSBUb25XZWIuV2FsbGV0cy5hbGxbJ3Y0UjInXTtcbiAgICAgIGNvbnN0IHdhbGxldCA9IG5ldyBXYWxsZXRDbGFzcyhuZXcgVG9uV2ViLkh0dHBQcm92aWRlcigpLCB7XG4gICAgICAgIHB1YmxpY0tleTogVG9uV2ViLnV0aWxzLmhleFRvQnl0ZXModGhpcy5wdWJsaWNLZXkpLFxuICAgICAgICB3YzogMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95ID0gYXdhaXQgd2FsbGV0LmNyZWF0ZVN0YXRlSW5pdCgpO1xuICAgICAgc3RhdGVJbml0ID0gZGVwbG95LnN0YXRlSW5pdDtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXIgPSBUb25XZWIuQ29udHJhY3QuY3JlYXRlRXh0ZXJuYWxNZXNzYWdlSGVhZGVyKHRoaXMuc2VuZGVyKTtcbiAgICByZXR1cm4gVG9uV2ViLkNvbnRyYWN0LmNyZWF0ZUNvbW1vbk1zZ0luZm8oaGVhZGVyLCBzdGF0ZUluaXQsIGJvZHkpO1xuICB9XG5cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgY29uc3Qgb3V0cHV0czogRW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IGlucHV0czogRW50cnlbXSA9IFtdO1xuICAgIGlucHV0cy5wdXNoKHtcbiAgICAgIGFkZHJlc3M6IHRoaXMuc2VuZGVyLFxuICAgICAgdmFsdWU6IHRoaXMucmVjaXBpZW50LmFtb3VudCxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KTtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgYWRkcmVzczogdGhpcy5yZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiB0aGlzLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSk7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gaW5wdXRzO1xuICB9XG5cbiAgZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2VsbCA9IFRvbldlYi5ib2MuQ2VsbC5vbmVGcm9tQm9jKFRvbldlYi51dGlscy5iYXNlNjRUb0J5dGVzKHJhd1RyYW5zYWN0aW9uKSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSB0aGlzLnBhcnNlVHJhbnNhY3Rpb24oY2VsbCk7XG5cbiAgICAgIHRoaXMuc2VuZGVyID0gcGFyc2VkLmZyb21BZGRyZXNzO1xuICAgICAgdGhpcy5yZWNpcGllbnQgPSB7IGFkZHJlc3M6IHBhcnNlZC50b0FkZHJlc3MsIGFtb3VudDogcGFyc2VkLnZhbHVlIH07XG4gICAgICB0aGlzLndpdGhkcmF3QW1vdW50ID0gcGFyc2VkLndpdGhkcmF3QW1vdW50O1xuICAgICAgdGhpcy5zZXFubyA9IHBhcnNlZC5zZXFubztcbiAgICAgIHRoaXMucHVibGljS2V5ID0gcGFyc2VkLnB1YmxpY0tleSBhcyBzdHJpbmc7XG4gICAgICB0aGlzLmV4cGlyZVRpbWUgPSBwYXJzZWQuZXhwaXJlQXQ7XG4gICAgICB0aGlzLm1lc3NhZ2UgPSBwYXJzZWQucGF5bG9hZDtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChwYXJzZWQuc2lnbmF0dXJlKTtcbiAgICAgIHRoaXMuYm91bmNlYWJsZSA9IHBhcnNlZC5ib3VuY2U7XG4gICAgICB0aGlzLnN1Yl93YWxsZXRfaWQgPSBwYXJzZWQud2FsbGV0SWQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdvdXRwdXRzJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VPdXRwdXRzJywgJ2NoYW5nZUFtb3VudCcsICdmZWUnLCAnd2l0aGRyYXdBbW91bnQnXTtcblxuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbdGhpcy5yZWNpcGllbnRdO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHRoaXMucmVjaXBpZW50LmFtb3VudDtcbiAgICBjb25zdCB3aXRoZHJhd0Ftb3VudCA9IHRoaXMud2l0aGRyYXdBbW91bnQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICBmZWU6IHsgZmVlOiAnVU5LTk9XTicgfSxcbiAgICAgIHdpdGhkcmF3QW1vdW50LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VUcmFuc2FjdGlvbihjZWxsOiBDZWxsKTogYW55IHtcbiAgICBjb25zdCBzbGljZSA9IChjZWxsIGFzIGFueSkuYmVnaW5QYXJzZSgpO1xuXG4gICAgLy8gaGVhZGVyXG5cbiAgICBpZiAoc2xpY2UubG9hZFVpbnQoMikudG9OdW1iZXIoKSAhPT0gMikgdGhyb3cgRXJyb3IoJ2ludmFsaWQgaGVhZGVyJyk7XG5cbiAgICBjb25zdCBleHRlcm5hbFNvdXJjZUFkZHJlc3MgPSBzbGljZS5sb2FkQWRkcmVzcygpO1xuICAgIGlmIChleHRlcm5hbFNvdXJjZUFkZHJlc3MgIT09IG51bGwpIHRocm93IEVycm9yKCdpbnZhbGlkIGV4dGVybmFsU291cmNlQWRkcmVzcycpO1xuXG4gICAgY29uc3QgZXh0ZXJuYWxEZXN0QWRkcmVzcyA9IHNsaWNlLmxvYWRBZGRyZXNzKCk7XG5cbiAgICBjb25zdCBleHRlcm5hbEltcG9ydEZlZSA9IHNsaWNlLmxvYWRDb2lucygpO1xuICAgIGlmICghZXh0ZXJuYWxJbXBvcnRGZWUuZXEobmV3IEJOKDApKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGV4dGVybmFsSW1wb3J0RmVlJyk7XG5cbiAgICAvLyBzdGF0ZUluaXRcblxuICAgIGxldCBwdWJsaWNLZXk7XG4gICAgaWYgKHNsaWNlLmxvYWRCaXQoKSkge1xuICAgICAgaWYgKHNsaWNlLmxvYWRCaXQoKSkge1xuICAgICAgICBjb25zdCBzdGF0ZUluaXQgPSBzbGljZS5sb2FkUmVmKCk7XG4gICAgICAgIHN0YXRlSW5pdC5sb2FkUmVmKCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBzdGF0ZUluaXQubG9hZFJlZigpO1xuICAgICAgICBjb25zdCBzZXFubyA9IGRhdGEubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG4gICAgICAgIGlmIChzZXFubyAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlcW5vJyk7XG4gICAgICAgIGNvbnN0IHdhbGxldElkID0gZGF0YS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcbiAgICAgICAgaWYgKHdhbGxldElkICE9PSBXQUxMRVRfSUQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB3YWxsZXQgaWQnKTtcbiAgICAgICAgY29uc3QgcHVibGljS2V5QnVmID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB1YmxpY0tleUJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHB1YmxpY0tleUJ1ZltpXSA9IGRhdGEubG9hZFVpbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljS2V5ID0gQnVmZmVyLmZyb20ocHVibGljS2V5QnVmKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gYm9keVxuICAgIGNvbnN0IGJvZHlTbGljZSA9IHNsaWNlLmxvYWRCaXQoKSA/IHNsaWNlLmxvYWRSZWYoKSA6IHNsaWNlO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21BZGRyZXNzOiBleHRlcm5hbERlc3RBZGRyZXNzLnRvU3RyaW5nKHRydWUsIHRydWUsIHRoaXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKSxcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIC4uLnRoaXMucGFyc2VUcmFuc2FjdGlvbkJvZHkoYm9keVNsaWNlKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRyYW5zYWN0aW9uQm9keShzbGljZTogYW55KTogYW55IHtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBCdWZmZXIuZnJvbShzbGljZS5sb2FkQml0cyg1MTIpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgLy8gc2lnbmluZyBtZXNzYWdlXG5cbiAgICBjb25zdCB3YWxsZXRJZCA9IHNsaWNlLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgIGlmICh3YWxsZXRJZCAhPT0gV0FMTEVUX0lEICYmIHdhbGxldElkICE9PSBWRVNUSU5HX0NPTlRSQUNUX1dBTExFVF9JRCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHdhbGxldElkJyk7XG5cbiAgICBjb25zdCBleHBpcmVBdCA9IHNsaWNlLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuXG4gICAgY29uc3Qgc2Vxbm8gPSBzbGljZS5sb2FkVWludCgzMikudG9OdW1iZXIoKTtcblxuICAgIGNvbnN0IG9wID0gc2xpY2UubG9hZFVpbnQoOCkudG9OdW1iZXIoKTtcbiAgICBpZiAob3AgIT09IDMpIHtcbiAgICAgIGlmIChvcCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG9wJyk7XG5cbiAgICAgIGNvbnN0IHNlbmRNb2RlID0gc2xpY2UubG9hZFVpbnQoOCkudG9OdW1iZXIoKTtcbiAgICAgIGlmIChzZW5kTW9kZSAhPT0gMykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlbmRNb2RlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNWM0NvbnRyYWN0TWVzc2FnZSA9IHRydWU7XG4gICAgfVxuXG4gICAgbGV0IG9yZGVyID0gc2xpY2UubG9hZFJlZigpO1xuXG4gICAgaWYgKG9yZGVyLmxvYWRCaXQoKSkgdGhyb3cgRXJyb3IoJ2ludmFsaWQgaW50ZXJuYWwgaGVhZGVyJyk7XG4gICAgaWYgKCFvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGlockRpc2FibGVkJyk7XG4gICAgY29uc3QgYm91bmNlID0gb3JkZXIubG9hZEJpdCgpO1xuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGJvdW5jZWQnKTtcbiAgICBjb25zdCBzb3VyY2VBZGRyZXNzID0gb3JkZXIubG9hZEFkZHJlc3MoKTtcbiAgICBpZiAoc291cmNlQWRkcmVzcyAhPT0gbnVsbCkgdGhyb3cgRXJyb3IoJ2ludmFsaWQgZXh0ZXJuYWxTb3VyY2VBZGRyZXNzJyk7XG4gICAgY29uc3QgZGVzdEFkZHJlc3MgPSBvcmRlci5sb2FkQWRkcmVzcygpO1xuICAgIGNvbnN0IHZhbHVlID0gb3JkZXIubG9hZENvaW5zKCkudG9TdHJpbmcoKTtcblxuICAgIGlmIChvcmRlci5sb2FkQml0KCkpIHRocm93IEVycm9yKCdpbnZhbGlkIGN1cnJlbmN5Q29sbGVjdGlvbicpO1xuICAgIGNvbnN0IGlockZlZXMgPSBvcmRlci5sb2FkQ29pbnMoKTtcbiAgICBpZiAoIWlockZlZXMuZXEobmV3IEJOKDApKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGlockZlZXMnKTtcbiAgICBjb25zdCBmd2RGZWVzID0gb3JkZXIubG9hZENvaW5zKCk7XG4gICAgaWYgKCFmd2RGZWVzLmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmd2RGZWVzJyk7XG4gICAgY29uc3QgY3JlYXRlZEx0ID0gb3JkZXIubG9hZFVpbnQoNjQpO1xuICAgIGlmICghY3JlYXRlZEx0LmVxKG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjcmVhdGVkTHQnKTtcbiAgICBjb25zdCBjcmVhdGVkQXQgPSBvcmRlci5sb2FkVWludCgzMik7XG4gICAgaWYgKCFjcmVhdGVkQXQuZXEobmV3IEJOKDApKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNyZWF0ZWRBdCcpO1xuXG4gICAgLy8gb3JkZXIgc3RhdGVJbml0XG4gICAgaWYgKG9yZGVyLmxvYWRCaXQoKSkge1xuICAgICAgb3JkZXIubG9hZFJlZigpOyAvLyBkb24ndCBwYXJzZSBzdGF0ZUluaXRcbiAgICB9XG5cbiAgICAvLyBvcmRlciBib2R5XG4gICAgbGV0IHBheWxvYWQ7XG4gICAgbGV0IHdpdGhkcmF3QW1vdW50O1xuICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgaWYgKG9yZGVyLmdldEZyZWVCaXRzKCkgPiAwKSB7XG4gICAgICBpZiAob3JkZXIubG9hZEJpdCgpKSB7XG4gICAgICAgIG9yZGVyID0gb3JkZXIubG9hZFJlZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JkZXIuZ2V0RnJlZUJpdHMoKSA+IDMyKSB7XG4gICAgICAgIGNvbnN0IG9wY29kZSA9IG9yZGVyLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgICAgICBpZiAob3Bjb2RlID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgcGF5bG9hZEJ5dGVzID0gb3JkZXIubG9hZEJpdHMob3JkZXIuZ2V0RnJlZUJpdHMoKSk7XG4gICAgICAgICAgcGF5bG9hZCA9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShwYXlsb2FkQnl0ZXMpO1xuICAgICAgICAgIGlmIChwYXlsb2FkID09PSAnRGVwb3NpdCcpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlRvbldoYWxlc1Zlc3RpbmdEZXBvc2l0O1xuICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZCA9PT0gJ1dpdGhkcmF3Jykge1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSBUcmFuc2FjdGlvblR5cGUuVG9uV2hhbGVzVmVzdGluZ1dpdGhkcmF3YWw7XG4gICAgICAgICAgfSBlbHNlIGlmIChwYXlsb2FkID09PSBTSU5HTEVfTk9NSU5BVE9SX1dJVEhEUkFXX0FMTF9DT01NRU5UKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TaW5nbGVOb21pbmF0b3JXaXRoZHJhdztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09PSA0MDk2KSB7XG4gICAgICAgICAgY29uc3QgcXVlcnlJZCA9IG9yZGVyLmxvYWRVaW50KDY0KS50b051bWJlcigpO1xuICAgICAgICAgIHdpdGhkcmF3QW1vdW50ID0gb3JkZXIubG9hZENvaW5zKCkudG9OdW1iZXIoKS50b1N0cmluZygpO1xuICAgICAgICAgIHBheWxvYWQgPSBXSVRIRFJBV19PUENPREUgKyBxdWVyeUlkLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgxNiwgJzAnKSArIHdpdGhkcmF3QW1vdW50O1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlNpbmdsZU5vbWluYXRvcldpdGhkcmF3O1xuICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PT0gSkVUVE9OX1RSQU5TRkVSX09QQ09ERSkge1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmRUb2tlbjtcbiAgICAgICAgICBjb25zdCBxdWVyeUlkID0gb3JkZXIubG9hZFVpbnQoNjQpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgaWYgKHF1ZXJ5SWQgIT09IDApIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBxdWVyeUlkIGZvciBqZXR0b24gdHJhbnNmZXInKTtcblxuICAgICAgICAgIGNvbnN0IGpldHRvbkFtb3VudCA9IG9yZGVyLmxvYWRDb2lucygpO1xuICAgICAgICAgIGlmICghamV0dG9uQW1vdW50Lmd0KG5ldyBCTigwKSkpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBqZXR0b25BbW91bnQnKTtcblxuICAgICAgICAgIGNvbnN0IGpldHRvblJlY2lwaWVudCA9IG9yZGVyLmxvYWRBZGRyZXNzKCk7XG4gICAgICAgICAgaWYgKCFqZXR0b25SZWNpcGllbnQpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBqZXR0b25SZWNpcGllbnQnKTtcblxuICAgICAgICAgIGNvbnN0IGZvcndhcmRlckFkZHJlc3MgPSBvcmRlci5sb2FkQWRkcmVzcygpO1xuICAgICAgICAgIGlmICghZm9yd2FyZGVyQWRkcmVzcykgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZvcndhcmRlckFkZHJlc3MnKTtcblxuICAgICAgICAgIG9yZGVyLmxvYWRCaXQoKTsgLy8gc2tpcCBiaXRcblxuICAgICAgICAgIGNvbnN0IGZvcndhcmRUb25BbW91bnQgPSBvcmRlci5sb2FkQ29pbnMoKTtcbiAgICAgICAgICBpZiAoIWZvcndhcmRUb25BbW91bnQuZ3QobmV3IEJOKDApKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZvcndhcmRUb25BbW91bnQnKTtcblxuICAgICAgICAgIGxldCBtZXNzYWdlID0gJyc7XG4gICAgICAgICAgaWYgKG9yZGVyLmxvYWRCaXQoKSkge1xuICAgICAgICAgICAgb3JkZXIgPSBvcmRlci5sb2FkUmVmKCk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlT3Bjb2RlID0gb3JkZXIubG9hZFVpbnQoMzIpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICBpZiAobWVzc2FnZU9wY29kZSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1lc3NhZ2Ugb3Bjb2RlJyk7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQnl0ZXMgPSBvcmRlci5sb2FkQml0cyhvcmRlci5nZXRGcmVlQml0cygpKTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUobWVzc2FnZUJ5dGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgamV0dG9uQW1vdW50OiBqZXR0b25BbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGpldHRvblJlY2lwaWVudDogamV0dG9uUmVjaXBpZW50LnRvU3RyaW5nKHRydWUsIHRydWUsIHRoaXMudG9BZGRyZXNzQm91bmNlYWJsZSksXG4gICAgICAgICAgICBmb3J3YXJkZXJBZGRyZXNzOiBmb3J3YXJkZXJBZGRyZXNzLnRvU3RyaW5nKHRydWUsIHRydWUsIHRoaXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKSxcbiAgICAgICAgICAgIGZvcndhcmRUb25BbW91bnQ6IGZvcndhcmRUb25BbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IHBhcnNlSW50KFRPTl9XSEFMRVNfREVQT1NJVF9PUENPREUsIDEwKSkge1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25UeXBlID0gVHJhbnNhY3Rpb25UeXBlLlRvbldoYWxlc0RlcG9zaXQ7XG4gICAgICAgICAgY29uc3QgcXVlcnlJZCA9IG9yZGVyLmxvYWRVaW50KDY0KS50b051bWJlcigpO1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGdhcyBsaW1pdCwgd2hpY2ggbXVzdCBiZSByZWFkIHRvIGFkdmFuY2UgdGhlIGN1cnNvclxuICAgICAgICAgIC8vIFdlIGRvIG5vdCBuZWVkIHRvIHN0b3JlIGl0XG4gICAgICAgICAgb3JkZXIubG9hZENvaW5zKCk7XG4gICAgICAgICAgcGF5bG9hZCA9IFRPTl9XSEFMRVNfREVQT1NJVF9PUENPREUgKyBxdWVyeUlkLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgxNiwgJzAnKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPT09IHBhcnNlSW50KFRPTl9XSEFMRVNfV0lUSERSQVdfT1BDT0RFLCAxMCkpIHtcbiAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uVHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5Ub25XaGFsZXNXaXRoZHJhd2FsO1xuXG4gICAgICAgICAgY29uc3QgcXVlcnlJZCA9IG9yZGVyLmxvYWRVaW50KDY0KS50b051bWJlcigpO1xuICAgICAgICAgIG9yZGVyLmxvYWRDb2lucygpOyAvLyBTa2lwIEdhcyAoSGFyZGNvZGVkIGluIGJ1aWxkZXIpXG4gICAgICAgICAgY29uc3QgYW1vdW50ID0gb3JkZXIubG9hZENvaW5zKCk7XG5cbiAgICAgICAgICB3aXRoZHJhd0Ftb3VudCA9IGFtb3VudC50b1N0cmluZygpOyAvLyBEZWNpbWFsIFN0cmluZ1xuXG4gICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgUGF5bG9hZDogRGVjaW1hbCBPcCArIEhleCBRdWVyeSArIERlY2ltYWwgQW1vdW50XG4gICAgICAgICAgY29uc3QgcXVlcnlIZXggPSBuZXcgQk4ocXVlcnlJZCkudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDE2LCAnMCcpO1xuICAgICAgICAgIHBheWxvYWQgPSBUT05fV0hBTEVTX1dJVEhEUkFXX09QQ09ERSArIHF1ZXJ5SGV4ICsgd2l0aGRyYXdBbW91bnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF5bG9hZCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0b0FkZHJlc3M6IGRlc3RBZGRyZXNzLnRvU3RyaW5nKHRydWUsIHRydWUsIHRoaXMuZnJvbUFkZHJlc3NCb3VuY2VhYmxlKSxcbiAgICAgIHZhbHVlLFxuICAgICAgYm91bmNlLFxuICAgICAgc2Vxbm8sXG4gICAgICB3aXRoZHJhd0Ftb3VudCxcbiAgICAgIGV4cGlyZUF0LFxuICAgICAgcGF5bG9hZCxcbiAgICAgIHNpZ25hdHVyZSxcbiAgICAgIHdhbGxldElkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVHJhbnNmZXJTdGF0ZUluaXQoc2xpY2U6IGFueSk6IGFueSB7XG4gICAgaWYgKHNsaWNlID09PSBudWxsKSByZXR1cm4ge307XG4gICAgc2xpY2UubG9hZFJlZigpO1xuICAgIGNvbnN0IGRhdGEgPSBzbGljZS5sb2FkUmVmKCk7XG4gICAgY29uc3Qgc2Vxbm8gPSBkYXRhLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgIGlmIChzZXFubyAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNlcW5vJyk7XG4gICAgY29uc3Qgd2FsbGV0SWQgPSBkYXRhLmxvYWRVaW50KDMyKS50b051bWJlcigpO1xuICAgIGlmICh3YWxsZXRJZCAhPT0gV0FMTEVUX0lEKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0IGlkJyk7XG4gICAgY29uc3QgcHVibGljS2V5ID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHVibGljS2V5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBwdWJsaWNLZXlbaV0gPSBkYXRhLmxvYWRVaW50KDgpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHVibGljS2V5OiBCdWZmZXIuZnJvbShwdWJsaWNLZXkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,WAAW,EACX,OAAO,EACP,sBAAsB,EAEtB,UAAU,EACV,SAAS,IAAI,aAAa,EAE1B,eAAe,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,OAAO,CAAC,WAAW,CAAmB;gBAE1B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK5C;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;IAED,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAIvD,kBAAkB;IAClB,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/D;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAKnC;;;;;OAKG;IACH,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAKrC;;;;;OAKG;IACH,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAMhD;;;;;OAKG;IACH,mBAAmB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAU9C,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIjC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAMjE,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ3D,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAMnE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAQpD,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK3C,kBAAkB,IAAI,kBAAkB;IAMxC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAKlD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAK9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAK1C,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB;IAItD,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB;CAI5C"}