starknet 4.17.0 → 4.18.0

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 (150) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +2 -10
  3. package/dist/index.d.ts +27 -9
  4. package/dist/index.global.js +30 -13
  5. package/dist/index.global.js.map +1 -1
  6. package/dist/index.js +30 -13
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +30 -13
  9. package/dist/index.mjs.map +1 -1
  10. package/package.json +5 -1
  11. package/.babelrc +0 -6
  12. package/.commitlintrc +0 -22
  13. package/.eslintignore +0 -2
  14. package/.eslintrc +0 -28
  15. package/.prettierrc +0 -6
  16. package/.releaserc +0 -28
  17. package/CODE_OF_CONDUCT.md +0 -128
  18. package/CONTRIBUTING.md +0 -52
  19. package/__mocks__/Account.json +0 -25486
  20. package/__mocks__/ERC20.json +0 -40027
  21. package/__mocks__/TestDapp.json +0 -12962
  22. package/__mocks__/contract.json +0 -33191
  23. package/__mocks__/l1l2_compiled.json +0 -10107
  24. package/__mocks__/multicall.json +0 -8139
  25. package/__mocks__/naming_compiled.json +0 -53283
  26. package/__mocks__/starknetId_compiled.json +0 -44703
  27. package/__mocks__/typedDataExample.json +0 -35
  28. package/__mocks__/typedDataSessionExample.json +0 -42
  29. package/__mocks__/typedDataStructArrayExample.json +0 -44
  30. package/__tests__/account.test.ts +0 -345
  31. package/__tests__/contract.test.ts +0 -249
  32. package/__tests__/defaultProvider.test.ts +0 -177
  33. package/__tests__/fixtures.ts +0 -84
  34. package/__tests__/jest.setup.ts +0 -30
  35. package/__tests__/rpcProvider.test.ts +0 -132
  36. package/__tests__/sequencerProvider.test.ts +0 -123
  37. package/__tests__/utils/__snapshots__/ellipticalCurve.test.ts.snap +0 -5
  38. package/__tests__/utils/__snapshots__/utils.browser.test.ts.snap +0 -5
  39. package/__tests__/utils/__snapshots__/utils.test.ts.snap +0 -5
  40. package/__tests__/utils/address.test.ts +0 -45
  41. package/__tests__/utils/ellipticalCurve.test.ts +0 -91
  42. package/__tests__/utils/merkle.test.ts +0 -256
  43. package/__tests__/utils/shortString.test.ts +0 -22
  44. package/__tests__/utils/starknetId.test.ts +0 -53
  45. package/__tests__/utils/transactionHash.test.ts +0 -17
  46. package/__tests__/utils/typedData.test.ts +0 -223
  47. package/__tests__/utils/uint256.test.ts +0 -32
  48. package/__tests__/utils/utils.browser.test.ts +0 -29
  49. package/__tests__/utils/utils.test.ts +0 -141
  50. package/img/logo.svg +0 -17
  51. package/index.d.ts +0 -2683
  52. package/index.global.js +0 -23192
  53. package/index.global.js.map +0 -1
  54. package/index.js +0 -4910
  55. package/index.js.map +0 -1
  56. package/index.mjs +0 -4852
  57. package/index.mjs.map +0 -1
  58. package/src/account/default.ts +0 -501
  59. package/src/account/index.ts +0 -2
  60. package/src/account/interface.ts +0 -309
  61. package/src/constants.ts +0 -2065
  62. package/src/contract/contractFactory.ts +0 -88
  63. package/src/contract/default.ts +0 -425
  64. package/src/contract/index.ts +0 -3
  65. package/src/contract/interface.ts +0 -106
  66. package/src/index.ts +0 -26
  67. package/src/provider/default.ts +0 -187
  68. package/src/provider/errors.ts +0 -14
  69. package/src/provider/index.ts +0 -9
  70. package/src/provider/interface.ts +0 -281
  71. package/src/provider/rpc.ts +0 -482
  72. package/src/provider/sequencer.ts +0 -523
  73. package/src/provider/utils.ts +0 -100
  74. package/src/signer/default.ts +0 -99
  75. package/src/signer/index.ts +0 -2
  76. package/src/signer/interface.ts +0 -77
  77. package/src/types/account.ts +0 -43
  78. package/src/types/api/index.ts +0 -10
  79. package/src/types/api/openrpc.ts +0 -607
  80. package/src/types/api/rpc.ts +0 -45
  81. package/src/types/api/sequencer.ts +0 -369
  82. package/src/types/contract.ts +0 -5
  83. package/src/types/index.ts +0 -8
  84. package/src/types/lib.ts +0 -143
  85. package/src/types/provider.ts +0 -134
  86. package/src/types/signer.ts +0 -24
  87. package/src/utils/address.ts +0 -44
  88. package/src/utils/calldata.ts +0 -250
  89. package/src/utils/ellipticCurve.ts +0 -120
  90. package/src/utils/encode.ts +0 -66
  91. package/src/utils/events.ts +0 -32
  92. package/src/utils/fetchPonyfill.ts +0 -5
  93. package/src/utils/hash.ts +0 -235
  94. package/src/utils/json.ts +0 -15
  95. package/src/utils/merkle.ts +0 -69
  96. package/src/utils/number.ts +0 -98
  97. package/src/utils/provider.ts +0 -28
  98. package/src/utils/responseParser/index.ts +0 -28
  99. package/src/utils/responseParser/rpc.ts +0 -70
  100. package/src/utils/responseParser/sequencer.ts +0 -135
  101. package/src/utils/shortString.ts +0 -21
  102. package/src/utils/stark.ts +0 -57
  103. package/src/utils/starknetId.ts +0 -116
  104. package/src/utils/transaction.ts +0 -56
  105. package/src/utils/typedData/index.ts +0 -247
  106. package/src/utils/typedData/types.ts +0 -37
  107. package/src/utils/typedData/utils.ts +0 -16
  108. package/src/utils/uint256.ts +0 -32
  109. package/src/utils/url.ts +0 -53
  110. package/tsconfig.eslint.json +0 -4
  111. package/tsup.config.ts +0 -9
  112. package/www/README.md +0 -41
  113. package/www/babel.config.js +0 -3
  114. package/www/code-examples/account.js +0 -65
  115. package/www/code-examples/amm.js +0 -44
  116. package/www/code-examples/erc20.js +0 -13
  117. package/www/code-examples/package-lock.json +0 -336
  118. package/www/code-examples/package.json +0 -15
  119. package/www/docs/API/_category_.json +0 -5
  120. package/www/docs/API/account.md +0 -463
  121. package/www/docs/API/changelog.md +0 -15
  122. package/www/docs/API/contract.md +0 -135
  123. package/www/docs/API/contractFactory.md +0 -45
  124. package/www/docs/API/index.md +0 -3
  125. package/www/docs/API/provider.md +0 -725
  126. package/www/docs/API/signer.md +0 -105
  127. package/www/docs/API/utils.md +0 -374
  128. package/www/docusaurus.config.js +0 -130
  129. package/www/guides/account.md +0 -140
  130. package/www/guides/cra.md +0 -3
  131. package/www/guides/erc20.md +0 -163
  132. package/www/guides/intro.md +0 -63
  133. package/www/package-lock.json +0 -20405
  134. package/www/package.json +0 -43
  135. package/www/sidebars.js +0 -31
  136. package/www/src/components/HomepageFeatures/index.tsx +0 -67
  137. package/www/src/components/HomepageFeatures/styles.module.css +0 -10
  138. package/www/src/css/custom.css +0 -39
  139. package/www/src/pages/index.module.css +0 -23
  140. package/www/src/pages/index.tsx +0 -40
  141. package/www/src/pages/markdown-page.md +0 -7
  142. package/www/static/.nojekyll +0 -0
  143. package/www/static/img/docusaurus.png +0 -0
  144. package/www/static/img/favicon.ico +0 -0
  145. package/www/static/img/logo.svg +0 -17
  146. package/www/static/img/starknet-1.png +0 -0
  147. package/www/static/img/starknet-2.png +0 -0
  148. package/www/static/img/starknet-3.png +0 -0
  149. package/www/static/img/tutorial/docsVersionDropdown.png +0 -0
  150. package/www/static/img/tutorial/localeDropdown.png +0 -0
package/index.js DELETED
@@ -1,4910 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
-
26
- // src/index.ts
27
- var src_exports = {};
28
- __export(src_exports, {
29
- Account: () => Account,
30
- AccountInterface: () => AccountInterface,
31
- Contract: () => Contract,
32
- ContractFactory: () => ContractFactory,
33
- ContractInterface: () => ContractInterface,
34
- GatewayError: () => GatewayError,
35
- HttpError: () => HttpError,
36
- Provider: () => Provider,
37
- ProviderInterface: () => ProviderInterface,
38
- RpcProvider: () => RpcProvider,
39
- SequencerProvider: () => SequencerProvider,
40
- Signer: () => Signer,
41
- SignerInterface: () => SignerInterface,
42
- addAddressPadding: () => addAddressPadding,
43
- buildUrl: () => buildUrl,
44
- constants: () => constants_exports,
45
- defaultProvider: () => defaultProvider,
46
- ec: () => ellipticCurve_exports,
47
- encode: () => encode_exports,
48
- getChecksumAddress: () => getChecksumAddress,
49
- hash: () => hash_exports,
50
- isUrl: () => isUrl,
51
- json: () => json_exports,
52
- merkle: () => merkle_exports,
53
- number: () => number_exports,
54
- shortString: () => shortString_exports,
55
- stark: () => stark_exports,
56
- transaction: () => transaction_exports,
57
- typedData: () => typedData_exports,
58
- uint256: () => uint256_exports,
59
- validateAndParseAddress: () => validateAndParseAddress,
60
- validateChecksumAddress: () => validateChecksumAddress
61
- });
62
- module.exports = __toCommonJS(src_exports);
63
-
64
- // src/contract/default.ts
65
- var import_minimalistic_assert5 = __toESM(require("minimalistic-assert"));
66
-
67
- // src/utils/fetchPonyfill.ts
68
- var import_isomorphic_fetch = __toESM(require("isomorphic-fetch"));
69
- var fetchPonyfill_default = typeof window !== "undefined" && window.fetch || typeof global !== "undefined" && global.fetch || import_isomorphic_fetch.default;
70
-
71
- // src/utils/hash.ts
72
- var hash_exports = {};
73
- __export(hash_exports, {
74
- calculateContractAddressFromHash: () => calculateContractAddressFromHash,
75
- calculateDeclareTransactionHash: () => calculateDeclareTransactionHash,
76
- calculateDeployAccountTransactionHash: () => calculateDeployAccountTransactionHash,
77
- calculateDeployTransactionHash: () => calculateDeployTransactionHash,
78
- calculateTransactionHash: () => calculateTransactionHash,
79
- calculateTransactionHashCommon: () => calculateTransactionHashCommon,
80
- computeHashOnElements: () => computeHashOnElements,
81
- feeTransactionVersion: () => feeTransactionVersion,
82
- getSelector: () => getSelector,
83
- getSelectorFromName: () => getSelectorFromName,
84
- keccakBn: () => keccakBn,
85
- pedersen: () => pedersen,
86
- starknetKeccak: () => starknetKeccak,
87
- transactionVersion: () => transactionVersion
88
- });
89
- var import_keccak = require("ethereum-cryptography/keccak.js");
90
- var import_utils = require("ethereum-cryptography/utils.js");
91
- var import_minimalistic_assert3 = __toESM(require("minimalistic-assert"));
92
-
93
- // src/constants.ts
94
- var constants_exports = {};
95
- __export(constants_exports, {
96
- ALPHA: () => ALPHA,
97
- BETA: () => BETA,
98
- CONSTANT_POINTS: () => CONSTANT_POINTS,
99
- EC_ORDER: () => EC_ORDER,
100
- FIELD_GEN: () => FIELD_GEN,
101
- FIELD_PRIME: () => FIELD_PRIME,
102
- FIELD_SIZE: () => FIELD_SIZE,
103
- IS_BROWSER: () => IS_BROWSER,
104
- MASK_250: () => MASK_250,
105
- MASK_251: () => MASK_251,
106
- MAX_ECDSA_VAL: () => MAX_ECDSA_VAL,
107
- ONE: () => ONE,
108
- StarknetChainId: () => StarknetChainId,
109
- TWO: () => TWO,
110
- TransactionHashPrefix: () => TransactionHashPrefix,
111
- UDC: () => UDC,
112
- ZERO: () => ZERO
113
- });
114
-
115
- // src/utils/number.ts
116
- var number_exports = {};
117
- __export(number_exports, {
118
- assertInRange: () => assertInRange,
119
- bigNumberishArrayToDecimalStringArray: () => bigNumberishArrayToDecimalStringArray,
120
- bigNumberishArrayToHexadecimalStringArray: () => bigNumberishArrayToHexadecimalStringArray,
121
- cleanHex: () => cleanHex,
122
- getDecimalString: () => getDecimalString,
123
- getHexString: () => getHexString,
124
- getHexStringArray: () => getHexStringArray,
125
- hexToDecimalString: () => hexToDecimalString,
126
- isHex: () => isHex,
127
- isStringWholeNumber: () => isStringWholeNumber,
128
- toBN: () => toBN,
129
- toCairoBool: () => toCairoBool,
130
- toFelt: () => toFelt,
131
- toHex: () => toHex,
132
- toHexString: () => toHexString
133
- });
134
- var import_bn = __toESM(require("bn.js"));
135
- var import_minimalistic_assert = __toESM(require("minimalistic-assert"));
136
-
137
- // src/utils/encode.ts
138
- var encode_exports = {};
139
- __export(encode_exports, {
140
- IS_BROWSER: () => IS_BROWSER,
141
- addHexPrefix: () => addHexPrefix,
142
- arrayBufferToString: () => arrayBufferToString,
143
- btoaUniversal: () => btoaUniversal,
144
- buf2hex: () => buf2hex,
145
- calcByteLength: () => calcByteLength,
146
- padLeft: () => padLeft,
147
- removeHexPrefix: () => removeHexPrefix,
148
- sanitizeBytes: () => sanitizeBytes,
149
- sanitizeHex: () => sanitizeHex,
150
- utf8ToArray: () => utf8ToArray
151
- });
152
- var IS_BROWSER = typeof window !== "undefined";
153
- var STRING_ZERO = "0";
154
- function arrayBufferToString(array) {
155
- return new Uint8Array(array).reduce((data, byte) => data + String.fromCharCode(byte), "");
156
- }
157
- function btoaUniversal(b) {
158
- return IS_BROWSER ? btoa(arrayBufferToString(b)) : Buffer.from(b).toString("base64");
159
- }
160
- function buf2hex(buffer) {
161
- return [...buffer].map((x) => x.toString(16).padStart(2, "0")).join("");
162
- }
163
- function removeHexPrefix(hex) {
164
- return hex.replace(/^0x/, "");
165
- }
166
- function addHexPrefix(hex) {
167
- return `0x${removeHexPrefix(hex)}`;
168
- }
169
- function padString(str, length, left, padding = STRING_ZERO) {
170
- const diff = length - str.length;
171
- let result = str;
172
- if (diff > 0) {
173
- const pad = padding.repeat(diff);
174
- result = left ? pad + str : str + pad;
175
- }
176
- return result;
177
- }
178
- function padLeft(str, length, padding = STRING_ZERO) {
179
- return padString(str, length, true, padding);
180
- }
181
- function calcByteLength(length, byteSize = 8) {
182
- const remainder = length % byteSize;
183
- return remainder ? (length - remainder) / byteSize * byteSize + byteSize : length;
184
- }
185
- function sanitizeBytes(str, byteSize = 8, padding = STRING_ZERO) {
186
- return padLeft(str, calcByteLength(str.length, byteSize), padding);
187
- }
188
- function sanitizeHex(hex) {
189
- hex = removeHexPrefix(hex);
190
- hex = sanitizeBytes(hex, 2);
191
- if (hex) {
192
- hex = addHexPrefix(hex);
193
- }
194
- return hex;
195
- }
196
- function utf8ToArray(str) {
197
- return new TextEncoder().encode(str);
198
- }
199
-
200
- // src/utils/number.ts
201
- function isHex(hex) {
202
- return /^0x[0-9a-f]*$/i.test(hex);
203
- }
204
- function toBN(number, base) {
205
- if (typeof number === "string") {
206
- number = number.toLowerCase();
207
- }
208
- if (typeof number === "string" && isHex(number) && !base)
209
- return new import_bn.default(removeHexPrefix(number), "hex");
210
- return new import_bn.default(number, base);
211
- }
212
- function toHex(number) {
213
- return addHexPrefix(number.toString("hex"));
214
- }
215
- function hexToDecimalString(hex) {
216
- return toBN(`0x${hex.replace(/^0x/, "")}`).toString();
217
- }
218
- function toFelt(num) {
219
- if (import_bn.default.isBN(num)) {
220
- return num.toString();
221
- }
222
- return toBN(num).toString();
223
- }
224
- var cleanHex = (hex) => hex.toLowerCase().replace(/^(0x)0+/, "$1");
225
- function assertInRange(input, lowerBound, upperBound, inputName = "") {
226
- const messageSuffix = inputName === "" ? "invalid length" : `invalid ${inputName} length`;
227
- const inputBn = toBN(input);
228
- (0, import_minimalistic_assert.default)(
229
- inputBn.gte(toBN(lowerBound)) && inputBn.lt(toBN(upperBound)),
230
- `Message not signable, ${messageSuffix}.`
231
- );
232
- }
233
- function bigNumberishArrayToDecimalStringArray(rawCalldata) {
234
- return rawCalldata.map((x) => toBN(x).toString(10));
235
- }
236
- function bigNumberishArrayToHexadecimalStringArray(rawCalldata) {
237
- return rawCalldata.map((x) => toHex(toBN(x)));
238
- }
239
- var isStringWholeNumber = (value) => /^\d+$/.test(value);
240
- var toHexString = (value) => toHex(toBN(value));
241
- function getDecimalString(value) {
242
- if (isHex(value)) {
243
- return hexToDecimalString(value);
244
- }
245
- if (isStringWholeNumber(value)) {
246
- return value;
247
- }
248
- throw new Error(`${value} need to be hex-string or whole-number-string`);
249
- }
250
- function getHexString(value) {
251
- if (isHex(value)) {
252
- return value;
253
- }
254
- if (isStringWholeNumber(value)) {
255
- return toHexString(value);
256
- }
257
- throw new Error(`${value} need to be hex-string or whole-number-string`);
258
- }
259
- function getHexStringArray(value) {
260
- return value.map((el) => getHexString(el));
261
- }
262
- var toCairoBool = (value) => (+value).toString();
263
-
264
- // src/constants.ts
265
- var ZERO = toBN(0);
266
- var ONE = toBN(1);
267
- var TWO = toBN(2);
268
- var MASK_250 = TWO.pow(toBN(250)).sub(ONE);
269
- var MASK_251 = TWO.pow(toBN(251));
270
- var StarknetChainId = /* @__PURE__ */ ((StarknetChainId3) => {
271
- StarknetChainId3["MAINNET"] = "0x534e5f4d41494e";
272
- StarknetChainId3["TESTNET"] = "0x534e5f474f45524c49";
273
- StarknetChainId3["TESTNET2"] = "0x534e5f474f45524c4932";
274
- return StarknetChainId3;
275
- })(StarknetChainId || {});
276
- var TransactionHashPrefix = /* @__PURE__ */ ((TransactionHashPrefix2) => {
277
- TransactionHashPrefix2["DECLARE"] = "0x6465636c617265";
278
- TransactionHashPrefix2["DEPLOY"] = "0x6465706c6f79";
279
- TransactionHashPrefix2["DEPLOY_ACCOUNT"] = "0x6465706c6f795f6163636f756e74";
280
- TransactionHashPrefix2["INVOKE"] = "0x696e766f6b65";
281
- TransactionHashPrefix2["L1_HANDLER"] = "0x6c315f68616e646c6572";
282
- return TransactionHashPrefix2;
283
- })(TransactionHashPrefix || {});
284
- var UDC = {
285
- ADDRESS: "0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf",
286
- ENTRYPOINT: "deployContract"
287
- };
288
- var FIELD_PRIME = "800000000000011000000000000000000000000000000000000000000000001";
289
- var FIELD_GEN = "3";
290
- var FIELD_SIZE = 251;
291
- var EC_ORDER = "800000000000010FFFFFFFFFFFFFFFFB781126DCAE7B2321E66A241ADC64D2F";
292
- var ALPHA = "1";
293
- var BETA = "6F21413EFBE40DE150E596D72F7A8C5609AD26C15C915C1F4CDFCB99CEE9E89";
294
- var MAX_ECDSA_VAL = "800000000000000000000000000000000000000000000000000000000000000";
295
- var CONSTANT_POINTS = [
296
- [
297
- "49ee3eba8c1600700ee1b87eb599f16716b0b1022947733551fde4050ca6804",
298
- "3ca0cfe4b3bc6ddf346d49d06ea0ed34e621062c0e056c1d0405d266e10268a"
299
- ],
300
- [
301
- "1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca",
302
- "5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f"
303
- ],
304
- [
305
- "234287dcbaffe7f969c748655fca9e58fa8120b6d56eb0c1080d17957ebe47b",
306
- "3b056f100f96fb21e889527d41f4e39940135dd7a6c94cc6ed0268ee89e5615"
307
- ],
308
- [
309
- "3909690e1123c80678a7ba0fde0e8447f6f02b3f6b960034d1e93524f8b476",
310
- "7122e9063d239d89d4e336753845b76f2b33ca0d7f0c1acd4b9fe974994cc19"
311
- ],
312
- [
313
- "40fd002e38ea01a01b2702eb7c643e9decc2894cbf31765922e281939ab542c",
314
- "109f720a79e2a41471f054ca885efd90c8cfbbec37991d1b6343991e0a3e740"
315
- ],
316
- [
317
- "2f52066635c139fc2f64eb0bd5e3fd7a705f576854ec4f00aa60361fddb981b",
318
- "6d78a24d8a5f97fc600318ce16b3c840315979c3273078ec1a285f217ee6a26"
319
- ],
320
- [
321
- "6a0767a1fd60d5b9027a35af1b68e57a1c366ebcde2006cdd07af27043ef674",
322
- "606b72c0ca0498b8c1817ed7922d550894c324f5efdfc85a19a1ae382411ca2"
323
- ],
324
- [
325
- "7fa463ee2a2d6a585d5c3358918270f6c28c66df1f86803374d1edf3819cc62",
326
- "a996edf01598832e644e1cae9a37288865ad80e2787f9bf958aceccc99afae"
327
- ],
328
- [
329
- "3d4da70d1540da597dbae1651d28487604a4e66a4a1823b97e8e9639393dbec",
330
- "45cdef70c35d3b6f0a2273a9886ccb6306d813e8204bdfd30b4efee63c8a3f9"
331
- ],
332
- [
333
- "1e448fdbcd9896c6fbf5f36cb7e7fcb77a751ff2d942593cae023363cc7750e",
334
- "30c81da0f3a8cb64468eaa491c7ae7b4842b62cb4148820da211afc4caffb3a"
335
- ],
336
- [
337
- "6531acf1a7cb90a4eb27de0b7f915e387a3b0fd063ba6e1289b91f48411be26",
338
- "31330f5daa091889981a3ea782ae997f5f171336ed0487a03f051551a2cafa2"
339
- ],
340
- [
341
- "54be016394d5662d67d7e82f5e889ed2f97ccf95d911f57dd2362c4040ed4f4",
342
- "c6cb184053f054d6a59c1bf0986d17090d25089b3fdcdaf185edc87ef113e5"
343
- ],
344
- [
345
- "35b9ecd0499ca1d5d42dcbb0c6b4042b3733c64b607ca711e706e786ef2afc6",
346
- "5624b476a5b21c3a544f0712d4817b06ad380a5a6529d323bf64da8ef862d8d"
347
- ],
348
- [
349
- "4ce0378e3ee8f77ed58f2ddbd8bb7676c8a38bfb1d3694c275254bd8ca38e23",
350
- "5a16fcbff0769c9cf2b02c31621878ec819fff4b8231bff82c6183db2746820"
351
- ],
352
- [
353
- "648d5c6f98680a1b926bfeb01c00224c56fdcf751b251c4449c8a94f425cfcf",
354
- "72c05ac793cd1620a833fbe2214d36900ebe446e095c62fcb740937f98cca8c"
355
- ],
356
- [
357
- "bd09be3e4e1af8a14189977e334f097c18e4a8bf42577ef5aafa0f807bd89b",
358
- "6e0e72ed7eb65c86cee29c411fb4761122558ee81013344ba8509c49de9f9b6"
359
- ],
360
- [
361
- "35ea4e339b44ae7724419bdfbe07022253137a4afb7cbaffad341ea61249357",
362
- "3665d676a026a174f367bb4417780e53a7803cb02d0db32eb4545c267c42f14"
363
- ],
364
- [
365
- "36457bc744f42e697b825c2d1afd8f4029d696a4514710f81da52d88e178643",
366
- "7c93715896735492a68c7969a024b3a8fd538bffc1521538107de1a5f13ce9c"
367
- ],
368
- [
369
- "5b3a08ebcf9c109cc9082f70d9df2b9c11b5428ee23917b4e790c4c10f6e661",
370
- "9d7b42ab0c20f5510df7ea5e196eec99342739077e9a168198c89da859753"
371
- ],
372
- [
373
- "21883ef8580fc06e59481955d52ece3aca6e82c8c9fc58e216dcf46f96990c6",
374
- "51a6423543e6e8a43e71da34cd90f5b520b8d33b67c4bf857573ab9e301aa4c"
375
- ],
376
- [
377
- "19e86b77f9b581e81092b305c852faf53940a8f15f0a6990c414f04c0fa7ef9",
378
- "515630e35d4398c9c79fc4ee08e1023fa47d8e03c6e7819c6d2ccef45398fa"
379
- ],
380
- [
381
- "888ab8eb4c31bb2ac5b54aa320dbe1a69c96b864e8a5f54d89c1d1a6b86c24",
382
- "730e148467f6a55ce22c5296f5380df88f38de76ef0b2de844cd3094aaaf3ea"
383
- ],
384
- [
385
- "75e79ff13a894e7120dac17b7429c0c32ce7828f726c9973728c0977a5f5977",
386
- "4960526e59c1c736561a201bc56f7d762641b39f609d273cc996f5d9197cfb8"
387
- ],
388
- [
389
- "640fe009249115d7254f72ecafb3006139e4bed7e9041af51458c737282d1d5",
390
- "3cc6c978a575246e2ce4f7ef1fcc7f63085db9ff98a1b1f3fe374087c0332c"
391
- ],
392
- [
393
- "6d6fd09ccab7c26de9b3906191235deb5c34685580c488275356a05e209ca96",
394
- "7157f81a34213dd8f91dea4f6df1bcfabc4ee091a3049eeeb3b7923d39b8645"
395
- ],
396
- [
397
- "5531ca1d00f151d71da820918f74caf2985b24dca20e124721fff507b5a5876",
398
- "518529643d3f25e47f72c322223ba60a63d6bfe78cf3f612215d9c19bf29200"
399
- ],
400
- [
401
- "6192d454e4f8fe212bdfccd5b15dd5056d7622ffe456c6c67e5a7265aea49c4",
402
- "2377a45dc630017ae863cb968ddb38333a70c7946d8684e6d7a6213f634b7bc"
403
- ],
404
- [
405
- "542fb44b4ef3640a64fdb22a2560fb26668065c069cf31d1df424819a39ff18",
406
- "5dbae9b0948e0361aea443503840341c322aa1a1366ce5390e71bf161f78f8c"
407
- ],
408
- [
409
- "299ff3e3412a7eb4cb4a3051b07b1be2e7b1c4b789f39ffb52cba3d048b71de",
410
- "1951d3175c02761b291d86b6c0a08387ad5e2a2130ccc33c852530572cb3958"
411
- ],
412
- [
413
- "628ce3f5367dadc1411133e55eb25e2e3c2880d6e28754a5cb1c5d109627e73",
414
- "ae3e9b7d50964e28bd15380400b7659b87affdef5d2586cbefcd9be7d67c0d"
415
- ],
416
- [
417
- "6ea54aff064895eccf9db2283225d62044ae67621192b3346338948382f5933",
418
- "6431507e51aadacfaf39f102a8ff387756e9b5e1bc8323d44acae55130d93db"
419
- ],
420
- [
421
- "28097d50d175a6235320fe8cfe138dd9e46895d189582e472c38ad7a67d923a",
422
- "7f9eab4133d7d09a7ff63368d6135c26262b62336eca1b5ca33f2096ce388ba"
423
- ],
424
- [
425
- "619fd09cdd6ff4323973f256c2cbdcb224f7f25b8aef623af2d4a0105e62e02",
426
- "2c95f0ae11d47eeae1bc7f1350f75f9185c5bc840382ceb38a797cae9c40308"
427
- ],
428
- [
429
- "641c18982ced304512a3f2395942a38add0d6a7156229c2a7c8b8dfbe9beb96",
430
- "6f6288c9c659b6af5ac975f4180deffe53d516399b2cc62f31732e9d4ba9837"
431
- ],
432
- [
433
- "58ab546e51fe49fc5a382e4064a2bd6cfc268904412f86c26de14f28a71d0f2",
434
- "124b7217943e7e328408e8afdfa7da00dcbc94a2bb85fd8e01fb162d2c2c0a9"
435
- ],
436
- [
437
- "a82c2fdedbb26c3c762a12f7e86b0e01e65320e0a25a8399d665f6e266bf74",
438
- "1a1de28e253f3e10f44d0111e8074f882d7f42e5900780ccbdc31da372d3fd8"
439
- ],
440
- [
441
- "744c725a7455a992e3cf5bd007bc234dd4668dba285f553f38350ad94c1615b",
442
- "7f721a87f48798bdc4a9c0eb88559e2ad7a74112fd901e70ea159e67a9c33f"
443
- ],
444
- [
445
- "434df142ddaa60f7881b6348d91687de40457de7ccfb07f0304b9e820705d0c",
446
- "7fae425e3b53f97dd1f5b20e49ed9fe24ff1efc341ba5e017ac89cf8df0cc39"
447
- ],
448
- [
449
- "7a1e2b809dff46277021cbc376f79c37e1b683bbd6bca5317014f0dc0e1ae73",
450
- "56790278a231912c334eff05281e08af1558e85516b4411ef64647c13bea431"
451
- ],
452
- [
453
- "4931b7990348d41cf8907be79f45bb7991fd18f8a57868351c92fa7a34cbcd7",
454
- "ca35091815cdf0837d396e25aad6052ad32d497a33b123256cffdc008bc50e"
455
- ],
456
- [
457
- "250b815d352fd89f8210b624b147ea7d0a4f47bcac49f3ac9b777840da93ebe",
458
- "1173f10e9691948b7da7632f328520455aadcba46e017f891e0a1d7da2bef04"
459
- ],
460
- [
461
- "2223b85032fa67292f6e1f822628e6756e5c3cc08fc252ab88d63d624e4dfb2",
462
- "55619ba96a7dcec77832fcb22cd5c21c7dcebc0280d730cba0002b67e0a8c63"
463
- ],
464
- [
465
- "249b131e04de73af9820d3e22492d9ec51bdc0c4c4f34d95352fa44dd61f245",
466
- "7576d3b5d136368ff01170a77d8286d0d1c7c40688862fb40813b4af3c6065e"
467
- ],
468
- [
469
- "6777915d9b4769027eb7e04733f8a2d669c84fe06080f55e8a55674dfbf9efb",
470
- "640d0ff384c9635e1af364760f104e058e3c86209fa9d2320aeac887b2e02d8"
471
- ],
472
- [
473
- "2abe3f237681052f002414399111cf07f8421535af41251edc427a36b5b19c9",
474
- "636ce4deaf468a503ab20ccb2f7e5bdc98551656ebf53e9c7786b11dd9090be"
475
- ],
476
- [
477
- "4d5cc5414758ea1be55be779bd7da296c7e11f1564d9e8797ceea347c16f8ea",
478
- "1a680c4c410cf5ddc74e95ff2897c193edaaecce5b2cde4e96bbae5c0054eff"
479
- ],
480
- [
481
- "46c375c684b30adf4d51de81e92afee52b1a3847e177403372c82109373edca",
482
- "1eaadc5783c90a0261306423d52009e991126b3f620e9cb6cffca41ca096f4f"
483
- ],
484
- [
485
- "2ddfb71f51205888118cbabba8fd07d460a810289bfdeeb7118707e310cb152",
486
- "1fd905d07b3933be886f2518246bdafa6f33259a174668808223cd7c28183c7"
487
- ],
488
- [
489
- "386f3879960713d41fdb3b1e41bbebf26b1c0e27a9a75bb1adcc1a0d3e8547b",
490
- "2b21498c0f34ec6f17c720334dc0f36021c2f87afbbbc8847d0bd536eb265e5"
491
- ],
492
- [
493
- "407eae62c6c4de3b942195afec3f45efec71ddb5e6edee3d427631bcdbf9b90",
494
- "436e7f2d78268ef62c4172d2ff1469028bad1f1d0f97ab007064418e61caa8f"
495
- ],
496
- [
497
- "1b881175e21201d17e095e9b3966b354f47de8c1acee5177f5909e0fd72328f",
498
- "69954b1a9b8bfccf8ec384d32924518a935758f3d3662ef754bcc88f1f6f3ec"
499
- ],
500
- [
501
- "7d545a82bff003b8115be32a0c437f7c0a98f776bcf7fddb0392822844f3c5e",
502
- "34b6e53a9565a7daa010711f5bf72254a4e61da3e6a562210a9abc9e8b66d69"
503
- ],
504
- [
505
- "299b9fcd4fadfc4b6141457a3036aaa68501c23df579de26df69d4def89b913",
506
- "b95bf2c2bb303c38bb396382edc798ca6a4847e573ce19b7b08533d1912675"
507
- ],
508
- [
509
- "551f5a4dae4a341a3e20336a7d2f365ddd45849351ec6dd4fcbedfe4806d5d5",
510
- "5865c977a0ecf13ce85ae14c5c316872080bd36f0f614f56b6dfc7ece83792e"
511
- ],
512
- [
513
- "7a1d69c08e68c80ad8b310736e6247a53bcba0183b9b8798833bc696a0fb6e2",
514
- "3ce803a20ebb3b120d5eaf0ad64bed0522fad1a0f2ce39a5c5cbae98c4438f6"
515
- ],
516
- [
517
- "28acacc0bc41d84e83663f02b36981a2c8272ecd72d3901164be2affb09c504",
518
- "7a5aee0b160eaff5b5968ab1a0304ce58c3d5ae0148d9191c39e87668229e5b"
519
- ],
520
- [
521
- "1f78cfdbcc767b68e69a224a077468cdfcb0afd6952b85bccbdb96d1fb8500b",
522
- "4772ba173c6b583284eb001cfc2a124104833f464ff9df096443e10ef3e9dd4"
523
- ],
524
- [
525
- "2774108962ca9897e7f22c064d2ccedac4fef5fc9569331c27cdc336c95774b",
526
- "9e13d79b68e8dc8091c019618f5b07283a710ddf1733dc674a99fc32c12911"
527
- ],
528
- [
529
- "770d116415cd2c4ace0d8b721dd77e4a2ef766591f9ec9fa0b61304548994ed",
530
- "42165d93c82f687635aa2b68492b3adffd516beb4baa94520efa11467a209fd"
531
- ],
532
- [
533
- "5e6e4ece6621e2275415e1fda1e7c4f496de498b77c0b913073c6a6099394b9",
534
- "3d92ce044fc77fa227adc31f6fc17ef8b4ec1c5aafc44630c0d9195075bf56d"
535
- ],
536
- [
537
- "6e69c717b5d98807ff1e404a5187a9ceaf0110b83aa15a84f930928b1171825",
538
- "1ee7cfc3a9744d7fa380ba28604af9df33ac077724374c04588bd71fa16b177"
539
- ],
540
- [
541
- "404318f2d2ceb44f549c80f9d7de9879d8f7da4b81e7350c00e974ebf2daef1",
542
- "3934831b5af70d17a3f1da9d2931bd757e6acf2893236264fc7e0d92ff1a1cb"
543
- ],
544
- [
545
- "20dcb6f394fea6d549b2e75748f61b7ec03b6e52319cb14163373a9c22bb9dc",
546
- "106a8c96cfb95a331618b7416d1498554730499e194a58fbf63019890480fc7"
547
- ],
548
- [
549
- "119000f277ccee013e6bb121194ec1ab5460fb6a96eb702a14079865f4170aa",
550
- "1737a32f5415e8720a5606ec1dd4756f02e7c6817e3723b453d091f2d192773"
551
- ],
552
- [
553
- "45d0fb5cd95db76d05dec3faa12e467a308eabaad363a062353db3cd2d9b749",
554
- "ae08691b5b0cdd19ec499132421638f470f493320e4003d123ab1da761b965"
555
- ],
556
- [
557
- "1257b3e65cdfb6367c6d0942327e799bc66eb221e70c6573a9862889eb51c38",
558
- "593309fd45755dd2cc4afd2b9316bc4638b0c5ddb3009694fcb7b250d0c8a2f"
559
- ],
560
- [
561
- "186dcf9950f72e868014a8accf14aa36e82a7a2a29f86ba37f6632da4189db3",
562
- "55684c9f7a043fc523ed78f756f834b4db823d5e4161bd79602c17d55a5cd8c"
563
- ],
564
- [
565
- "58791d5569f282f5c3b01ecdc9388df7ba3ca223a2dc1eed5edaf2a1d302fb9",
566
- "6298d7dd51561a045bb4089deda9f40b2865589ed433e56d54554f8b45e79f0"
567
- ],
568
- [
569
- "13fd87144aa5aa4b24d5a7bf907d8280d15937fed262d41084898cb688fc28b",
570
- "3fa54367770cc4479a857411ddcabe86627b405ce1cd14ad3b2863bde13abe4"
571
- ],
572
- [
573
- "48118139445415f0c1879224e2dee744ed35280ff00537260402a1741ec3676",
574
- "4dfa39dadaabecfc54ecb7a25319444f8e952782d863790e42a9887064fc0c1"
575
- ],
576
- [
577
- "4ad031bb9eda84f2fe5d354c7948d41558ca657a04508654721810ee72ef158",
578
- "620ebd5d0086b92c6009a42777b946a351c2c7ba852b57d3c9905fc337459ef"
579
- ],
580
- [
581
- "4a34abb016ad8cb4575ea5bd28385d2348e5bcc0cbba90059f90f9c71f86e8b",
582
- "4f781829ad83f9ed1e1b6de0e5f4ac60dfdfe7f23cb4411e815817e705e52c8"
583
- ],
584
- [
585
- "7fc632d7512aab5356b7915dca854c8b12b369ab54f524fbce352f00eb9b9f9",
586
- "2ce80b944fc9158005f630b34385d50c3ad84450a9e1e529925b3211dd2a1de"
587
- ],
588
- [
589
- "65ed10347503cbc0216ca03f7536cca16b6abd18d332a9258685907f2e5c23f",
590
- "3be1a18c6bfa6f2f4898ebefad5a8e844c74626d5baa04a820d407fe28bbca6"
591
- ],
592
- [
593
- "1a8abba1be2e276cdd1f28c912280833a5ede1ec121738fcca47dc070dcc71d",
594
- "21b724378bc029a5199799df005922590d4e59cae52976f8e437bf6693eec4a"
595
- ],
596
- [
597
- "3a99c22dafcfe9004ebb674805736a26aeed7ed5d465ae37226dcbe270a972b",
598
- "5bf67552af08e1e6e2a24bf562c23225e89869cab9bef8becb3669175a3c94f"
599
- ],
600
- [
601
- "4a6a5e4b3501f2b7bbdd8da73ea81ffca347170bdfb6776a037cdd74c560fb4",
602
- "5af167ebb259c2da88740ec559ee04052bb66480b836cadd0e2590c32d7111b"
603
- ],
604
- [
605
- "6890d95308525f0bac9dc25cc1189eb92d29d4b3fe61bc8aee1c716ac17b1e8",
606
- "e6f23f78e882026b53ea4fac6950e56e3da461e52339eb43d2fdb2dade7ca9"
607
- ],
608
- [
609
- "748f4cf4f027efdeaed7c7f91ef3730ff2f2bb0bfc2db8f27aadde947f7d4d5",
610
- "3a1cbc550699411052c76293b8c41a3a8a1ecf12cbbc029a1b2b6ea986fca93"
611
- ],
612
- [
613
- "7321f3f581690922cd0dec40c9c352aae412ec2ccdf718f137f7786ab452cd3",
614
- "5be5130c9277cdb76d7409452438ec15d246b211dd1e276ee58e82a81c98fd4"
615
- ],
616
- [
617
- "6c4d6cb7e7ae70955224b8a912ff57ca218635a2436b36cee25dce8a5cdf51f",
618
- "32f8c03c6db3246946e432e4148e69f5628b200c6d7d72449df6eeac0998039"
619
- ],
620
- [
621
- "1dad5f2e795ea6fa5177f110989516eacf8fb37bd6a091c7c93f1d73a2fe309",
622
- "56b2298c538180e99dea3e171dbb5c6fba0bd0a9ed40537277c0c2373a8e2c4"
623
- ],
624
- [
625
- "1610605baacc9bc62c4cc923dc943347cfece7ae241e746fbe6c2c878221dbd",
626
- "431a82d657e0d109d00dea88cf3fa9b999845221b7b5590a20c40fc71368c1c"
627
- ],
628
- [
629
- "6a4f5c787fb09a5be2b04d2eafa1e6f3d3c863ee22960eb0b64f6eaf6659162",
630
- "14dbc3eaea6146ee7eaace5a91ed9430dad3a47e9ca2f68b455171f8fe6a7b3"
631
- ],
632
- [
633
- "738415b73e55412b0e582e45ff0d7bf4b1bf2922db581783fdcc75559f40e",
634
- "33825aeb3fd8459999eb418d15102ba5864b069c6ea517f0c6e9eab8d9aca47"
635
- ],
636
- [
637
- "2603e72ce53985c70782774057a17944f7b4ce224a809be4e2b5af3606aa1d8",
638
- "92822921809c42318f42dac4d773325f41c43069e990adac7818a45e2554dc"
639
- ],
640
- [
641
- "181cd967ab4615357cc96c82eae9152ce7598c1a1dfdd91a458bddb016ae9fe",
642
- "5d562fdaeb0e12647e230e50eaf216bed52fa73c6b7378821a3bfc4cd66d4ff"
643
- ],
644
- [
645
- "1121726069b9ef5954ba6490100b226e0be53fef3e071b7c58a1286174b789a",
646
- "4b25594cf4e9eb2d14b3f52f2661a9992234fc222c0a0d44517cb77deb9c16f"
647
- ],
648
- [
649
- "e543663969b915337f105f80995a77b356f1a51d8b4a4fb12d44364130e873",
650
- "34b2e3c009fdab4cb7349a580df2e64c0098a123280078e5da6623a9ec6b44f"
651
- ],
652
- [
653
- "4e2f8909bb62de5ef65600e61bbf969293815296b6e23702875e049b3ce5c45",
654
- "3cb81f2c21f22a7add26fa38a9ce5d9cce1bb251bd2698f90c34ff0a84f7af"
655
- ],
656
- [
657
- "37b546e403a1ba970c17b67c2f1361ab9c803f8d2b5cd93803014faa08861ed",
658
- "37079184ea46272f5809b523d060686633f7995167897a153be1772fd6566f6"
659
- ],
660
- [
661
- "27bddca77f7bd7f66b3693567a4238f2e6751d95b0bcb409f6b24d08f84798c",
662
- "6417a85cbfd6fc02df560d3963a241a986baacdfa423f65d7227ce49a96c57d"
663
- ],
664
- [
665
- "2de71a39aa043057d1bc66e45f804542acddf18f7a6d88c0d7fb0ca240debdf",
666
- "306c1ce39ab46300f7cca0f3a2fbfa77296a27e24bc66b0b8044968ec0ee413"
667
- ],
668
- [
669
- "307c877154364c0c03534e7327d5a88e1380ceef6481567ade37a14ee7c1a72",
670
- "3404bc7dbfb33b95d922d0693aaf9358f77888d7d95e773c38d83dbe2e5f995"
671
- ],
672
- [
673
- "79f09ff7c60850e5f5ea020722659a1ed27db4c95dca131f99552f785c8afbc",
674
- "40429528c099349b426ddbf129497176951a64a53db5f9d8bd2be0252cb22b2"
675
- ],
676
- [
677
- "4027dc6b56d446e5972f35464eeac85c5254ef377c902d9fe37aea841bb5292",
678
- "7c3ea37689ef679fa2f5c7e031a78e23d484a8317990fd34d44d95cc1db3717"
679
- ],
680
- [
681
- "645dbf78a3c228c4b7151450b5e65edb58e71f37e1e4bc5f471e0f1abd6d9c2",
682
- "15cfe7850f327b256e23b00627451560c5c6ab60db78d45b7ab286afb6f13ab"
683
- ],
684
- [
685
- "1503ca373757677ad1d911a2b599d01c46eb879d1ce21ae171c7e439846a85f",
686
- "583eb269b7030da6a0c324026919de3f9489d2ff6ae0e6320c36f05469ad66c"
687
- ],
688
- [
689
- "66e1819ba3ec4ad4ae9f7d7588d23baa004e29d3aad2393d52af204a81626ca",
690
- "505249980cbe6273b82ad5038fe04a981896f4117345ac1abcc67e2525c0ee4"
691
- ],
692
- [
693
- "5ec20dbb290254545f9292c0a8e4fbbfb80ad9aab0a0e0e9e9923f784d70ed1",
694
- "bdb1ca3a859227cf5d00eaae1f22584e826ed83b7ccdb65483ed5213dc4323"
695
- ],
696
- [
697
- "a5c1a5011f4b81c5c01ef0b07c0fbf0a166de77280f0ae241f2db6cba15194",
698
- "4444521fb9b33d7dfeb1247d0ee1a2b854ad166cb663d9dd2e686909362a689"
699
- ],
700
- [
701
- "1f35335de40e00c62642dac2fda8b30f071986ce4f11db849df11bc45ad4e0c",
702
- "7801a2c761b90fd4477ba0be9a775003d5dfcd959b1ed198b4681f15e7acbf"
703
- ],
704
- [
705
- "48db4798cf6821c1ffb8178b1d3bb6020e04186c96aaf4670972d367f4ed5f",
706
- "781019494df95b888f1578f1b4a3f8e125ea60eca47ef9207a10630671217a3"
707
- ],
708
- [
709
- "17f653d904210148a8e74d8e719a3061683c164aa6d79c902a19f185ab437bd",
710
- "6780e97985932c3860d810af1e065d454b1cb4be0e7ffe2d8cea7d52526e223"
711
- ],
712
- [
713
- "5c4d0c7432f9b0070436240f9855adae1467cdc9826952ae01b68cd52a3ad89",
714
- "1c5747f968ed91261b7ae9bf1023c999da9816e37de602d6a1a50d397752bff"
715
- ],
716
- [
717
- "6fedd7639fdaa2f7bad4ca0b391710f6f8a7e890250ae8ae4252bb8b39a1e58",
718
- "436a215f655a3fd3778b2335ffdc9aca6b98474e43d764c1f8362830b084f0e"
719
- ],
720
- [
721
- "7fbd45a889c5e9d127bb4f8474d6be7cb9796bbfff923b75e42a1ad4cae37d6",
722
- "484bd12622a6ba81cd53049c550d9ed682a8e765b656b1cbff9bbea637bd1f4"
723
- ],
724
- [
725
- "17d984d47937263f7966a3e7b1eea04071e678494bd749c9e02b48b3234f06d",
726
- "7b341ff08722c4e161005d0037204a7a2001fdda7af2cc1a0b04a027f115a0f"
727
- ],
728
- [
729
- "7f1822045db45ea07e1519c3ee1f7705915f35fe4dd8db1e8921b5d1c740edf",
730
- "33d41e06b93320ad1b3d9580380ec797a05dac3f1cc8008899110ebefde2f78"
731
- ],
732
- [
733
- "7b19453ecb74b7d0e2a66b9890ff73bfbbcd61a266abd6d82dbe665bf32f34d",
734
- "6dba2355420dac582b1f349609ea1c89b89bba2d1a68a0642f1dd12d86e73cb"
735
- ],
736
- [
737
- "273e82a15f395ddf2489a95685bec8bac62c4b459d1b28987d3cb27e4bc9128",
738
- "653375b48a4cf5d5b101c9ef533039bedce5dbeef3f59e8f168bdc99b06ca5f"
739
- ],
740
- [
741
- "3006c9e7fc6a553d8eb4e8a47ce9f10d1a39576ac255ae9e0a4ce3869e76212",
742
- "65fe9e2ef2aae608be309332d464f57e28f1df5de1a6a519751b056971f932e"
743
- ],
744
- [
745
- "5e8f384c8a4607fbe9789fcc52d54249d304d698562597d114c1d81452d3dee",
746
- "3c8bc78066b5d947dc1e405e326ee55ea606c7988f666748d259850fa259a22"
747
- ],
748
- [
749
- "7841b2102e9aa103fb53a642b3e167b21113ea44751ab38e0b5ef8312654db9",
750
- "71bf5c8308fcf9c4a7847494cd9bdd946fddf7d3a37e8bb0b201ff2343deb8e"
751
- ],
752
- [
753
- "40f68027420c11e3ade9aae041978dc18081c4f94943463aac92d887f922a62",
754
- "499c6062594a6c7e21a3cb91ea451813393bff365a27a08f1a515439b83cf42"
755
- ],
756
- [
757
- "6ce77a50d038b222634e87948df0590b79d66087b01e42b9b6d8fa30ebb1465",
758
- "35f5c46bb1be8555a93f155a174d54ec048c2ac8676e7c743054ddc52709d37"
759
- ],
760
- [
761
- "604f8b9f2dacb13d569262864063c2d4bb2b2cd716db6eeb2b1eeabc57746f6",
762
- "68c6799e24f3b44eec3049973445174727a66970f1614a782efa2b91ab1e457"
763
- ],
764
- [
765
- "73d620f3bfe77f672943d448d7dc05327adf64b8e7af50039c469d7f7c994c4",
766
- "4859deb36eaf0c802f0d1514602368143a33ec6ce8fd55248b59025debc6afb"
767
- ],
768
- [
769
- "3fd2bcd1c89d706a3647fbd354097f09c76636e93ae504973f944d8fc3bcc1",
770
- "677ef842cf5eb2444941f527abec567725e469469192354ad509a26ebb3d0e0"
771
- ],
772
- [
773
- "39222ea924ac17b533c72ffb2c47ffdc11d6a7f7c70fbde3a10fb0b8f35eb2f",
774
- "20dc4bd1089019bc1d7379b4feb3eae6eb5af59e9f253845da9fd633057e952"
775
- ],
776
- [
777
- "326f58994e1347f62e4102183215b5db956378d2f61f14aba4dec94577f53c",
778
- "7a03284c296003bbe05178a1d82efdb7b8125511d63e20e50aed789c2e52e1"
779
- ],
780
- [
781
- "53aa8939c74d4ee58f03bc88bace5a45c7bfcf27466201da05dc6723a5f5632",
782
- "2e32535ca7732904a048183247b04b426ecf9b39fc393a9cebe92fb1dc7a7f1"
783
- ],
784
- [
785
- "6cee1a03145e93b3e826e6067005f09c06099c98198c91c222407ba5c8c132e",
786
- "beaecad1274e7c6e5476a100c271aa1a6f86ee5a9fa5c2f26124d5886fa63"
787
- ],
788
- [
789
- "3ec659b8175e1be1bd5a252108714776b813e330393f587814f5f1f32a73332",
790
- "529a5cf9f8c237ae69a94217d173c8d19c156952041f5c980da557990863fa7"
791
- ],
792
- [
793
- "3d66ec5963d0c534d4139c8cef2e1ac48b3e7965fafabf58be26f903318af4e",
794
- "3d3f2de7a95f59b683725ee6283cbaf31f97c4b600df9a4621413223a468740"
795
- ],
796
- [
797
- "7fb38ace8e0932fac2ea0d3eb676db8d684db1817e2e4d59da7996ce398b4a",
798
- "68f92bd5768cdd4710249f9d49ef1d5654e497b9a4ba10bd2971366d83fb400"
799
- ],
800
- [
801
- "1c4a49314d6b4969cdd142c76ceb7682bfb868ace7f7568b0fc8635bda5a9fb",
802
- "5fc0519f1f4cc10b5771312458748c036313b87707ed0540026ac64a5955aa9"
803
- ],
804
- [
805
- "3073c95d08d3b97caea5f0be16b2789bee766f76b7e5499f8ce8f96abb0f344",
806
- "52a8974b4eb9a1f6a0ae2c83cb4715bf18d73f057255fcb3f63b74f7e78f590"
807
- ],
808
- [
809
- "44485b16d597a5de3604df6f7ed7e00b8aeef9e7e8dea8688255153b8bb16aa",
810
- "6cccb0ba170123266f24b5d93a744397dc2c44820edc4f8f5b9a0f5c9b3b940"
811
- ],
812
- [
813
- "7618f77b7b32d512688dd62e0b48231d9574c6361e8be353a7dc04f7c3a115e",
814
- "78ffcd16d80636381ca231aae70d99c9e20298b4f5388fd823ea9fa2b8ddfd9"
815
- ],
816
- [
817
- "7dc82fee1ef95cf5b3720fcc07f63246654bfe39762627839da40e51c75654d",
818
- "4c0ccdd70955da74558de20c88352df8a02aa97e4d5971c500e884740a8cb62"
819
- ],
820
- [
821
- "7fa5d460dc10cbb418b444d9bde97e92c70a99a222b99f244dccee7e62cc04c",
822
- "636163901baa5b7576c38c43407af578b8c4607e01e86011ae2dde587a89f84"
823
- ],
824
- [
825
- "758930d46006623a756c89bd0cc378f6a3c1f43c9a0edbb42274c35e75c16d2",
826
- "1d74dd9f81c2fec811b8cbd6168a745b0a111932b2a345265ef2853b50b6245"
827
- ],
828
- [
829
- "7332ee0626b044d664ef228f8cb84df7c643e52f6a2591ae1c9007ad61ec16e",
830
- "229bd8e630572cbdee54283234cf3e9f060e6382f99943bf234119d47b54470"
831
- ],
832
- [
833
- "78a16ef803aa20a075bb2f66c61bb2dae5698bebb94a0995fa74c3d53de1614",
834
- "246d588b68edb6fed96c128349908c42dcd64c46341b205e79f4aed9b5d3675"
835
- ],
836
- [
837
- "6e1933939bd03b67bba753cc0cbe7d2f25bad68c993887ef8c9e2fcd59b0647",
838
- "599413f7c204a11a5ce315eab11299ab7326603412bb00bc1c59ff75a37d6b4"
839
- ],
840
- [
841
- "4a79957a5a1888ad063b51c69565a2b48e8eb917183e220a1c8d3374526d30e",
842
- "1f092de0e069bba7fc5386e2e9a114c1618f88c4b95e220cd35ffe96f99fcad"
843
- ],
844
- [
845
- "3148aa3df9ece39aca84f59489f2710522216f14be6055ee0027529d1d55e2d",
846
- "617e9a52a92975db0ba1977f71116f7058a0d31b869ac7f3ee2fd80b0c5100c"
847
- ],
848
- [
849
- "5c1188e72384160ae39d07328346cda4f6c12d227448e6236f04dc971625287",
850
- "1643006eb3a3bc6aafd5f685cf054f2a572e6ca58c0118bcec0b833741f116d"
851
- ],
852
- [
853
- "3f72efc93c9b71adc4c51d8fc69d3940b20d08733af2b7d05140fdb1d1c1004",
854
- "7399259987c8f4ebfab46e522380707e58427d3962ee0c2a91760813f76d232"
855
- ],
856
- [
857
- "3129b34c03c51aa8f611e91d5cfcc9bd3ef108ee66e6d3ee35a0e0e50055bb",
858
- "563b18b5650085efb4cf179a029e6afff27b1d3091cd28eaa68d24fa1f801c6"
859
- ],
860
- [
861
- "16eac0f9fb4c67cf89a7fa4ee615bbe731d8edcb709a1b9b50c7d873a530f52",
862
- "7ff8288b6e199ca8f316192881424a37fb080c29daa76b1f0edaccaf580a80e"
863
- ],
864
- [
865
- "75f6b6028c43ce832f65d7e8e620d43b16cba215b4b94df5b60fc24e9655ee4",
866
- "35e9ccfaed2293a8b94b28de03bcb13eb64a26c831e26cc61a39b97969a2ff0"
867
- ],
868
- [
869
- "3c6152fe093bd6316897917ec56a218640ec1b2148f21db9b14fc7a5ff362e8",
870
- "6eef2df27ae7d63a28856b07b73e7aad7ca94f317201a1e675ffc6f9a1710dd"
871
- ],
872
- [
873
- "54e01b5fe4fd96052aad55b3f26b1d254dfc7e2525fffb9ae0a77eb8cc5579",
874
- "7c3d39232ab333675b219abc766ed9b4782c840e6b046614dedb8a619696eb0"
875
- ],
876
- [
877
- "d1e63f8ea8a76429cf254a6d3b668761f0dc572d4bfac4fd56d9eaf58fb6c0",
878
- "2bd0a84d3908a63085824c9329a0983913006ba155b56a58eb3f9becab29c45"
879
- ],
880
- [
881
- "2d6122f2a702edd4da7385b1580796a71d13bd72be94cfb3fec01149c006c2d",
882
- "70eb282fae992efa6f5915e578b640653549f23385ef3a29ab29b1b9b8ad63b"
883
- ],
884
- [
885
- "752fec14beaadb5ddbba6b3a17fcb86579fa588ef407fad0ea07dbb22a640d3",
886
- "3feb6728eca21a1e84e8f9f23010387a53a96a1cb62d86fb37996150a1299ef"
887
- ],
888
- [
889
- "63f94a92f27acde8f5ed949b459506f51d70c85bcc61a34d647264ecc53c65e",
890
- "37e5dce0646ee66f4fdb93b82d54d83a054948fa7d7fa74ab6b36246fc7383e"
891
- ],
892
- [
893
- "d6aa909287a2f05b9528690c741702c4c5f4d486c19a46c38215f52ef79c7b",
894
- "5ebe1128dd81093df4aca0df365d58adab848d1be1a94b95eeb649afd66a018"
895
- ],
896
- [
897
- "12866812b3053e2f7a9572bdaf5ef2b48c6fb62a0eed9ff0356df50e7d05557",
898
- "6785f7eb2cd1c120e4c7167b46861d10117040a2e9f2ca86a71e9d67df90613"
899
- ],
900
- [
901
- "46a730d05330b1b13673cb8a1b8f45460035e4a9f1a1751cfba099c4355c1c",
902
- "76fb0ec6cd16a8141cdcd875c8b2de9fce42d296072643d148ac7e7fa7472df"
903
- ],
904
- [
905
- "4bd4380a22900bd34835e0a908eacf4b6edb61eda0cf483f9212453b37e7516",
906
- "5e9551cd20d8d7ddbf4366880b7d5267385afa1966ff30da4baaf273b009d29"
907
- ],
908
- [
909
- "71f1994ad40baa2922424ae222663a64f93d8b67929e9a10f9e4c1ab19f3833",
910
- "85320fe68ec0d37cc19fdfd03589d66906ffa4046c80e1b094a85f27676346"
911
- ],
912
- [
913
- "5a63b1bf5232f28f808765c6be7ce1f81c52145b39f01c879fae0f4303bee61",
914
- "3bc5d6df68bb6d0577bf9ae2ae59ec0e9b2dc7dd56ea179fb38a41e853db950"
915
- ],
916
- [
917
- "161ded55ff1087032381e6c1449704f63ad2d88df82dfc44a71890fa09b3941",
918
- "78a52e0013842037274ea75daaf8eb4afc04ccc4b07bfaf3f5ee47d165e01b"
919
- ],
920
- [
921
- "1bfce5229c5fbff5c0f452a22317fcfcd9262f23df41840f84fe7d44cfba1a1",
922
- "66b387872c00e63c73006a955d42cf49c46c5708fc9d1579b9ae38341b24a3d"
923
- ],
924
- [
925
- "56d47dadc9cbd1dcb2ee3efcd5d4af5e6aea71df10815c68b54a14e81d11b44",
926
- "47e966ba54df48e9b612a903685e0060a67e4725402e8cb4cf654e54e813a3e"
927
- ],
928
- [
929
- "4b1c44438afd4ddf20a2cf612df2ee494ce84c7274c5529e857693e73018491",
930
- "430403bd31d8f0677e06abff7159384560f27b9622943fea1a3192f14bf40d4"
931
- ],
932
- [
933
- "7f7281728fc2214aa1dbf13176a4624b53814734abd570eb6ef7c7e32379606",
934
- "312da47be347fb3fa2c9089b38df372560dcace2effeeacab4d96ab11567295"
935
- ],
936
- [
937
- "16a28884a1be8183e0d3fc0db84a9afbf47126fd3be548c2a584aaafbfa7dfe",
938
- "7c3f57b3b895564ba562c1cd80b71fda6d2e611665c6ab87744f5390858fe24"
939
- ],
940
- [
941
- "323339f37b327a731232a9580e79952063c7c232bd1380146d8a83c285f4b8b",
942
- "4f16be1d983c7232f92cce6b9690695978d42cecc8eeb8c206e125d1098a265"
943
- ],
944
- [
945
- "624d26cbaa197e104eb83cebf2adeed09a5cdad359993fe5e3529d4d0def21d",
946
- "261b7da3cfb55c788977e0d8d640e3e93ae5a325d962ce85c816d7d32cfc430"
947
- ],
948
- [
949
- "f24ecb7ee83a3e28dab54a330dc93d0429a7aea36412e922dce8fbff40d60d",
950
- "b043e36a258d1df1d21b0cc7be9c4dcae1bd4ed326c110e668ac23d86805a6"
951
- ],
952
- [
953
- "686cea46b710bde1231483bfdbc700cfa3da6ecd5841c0e0c782f9ea24328ec",
954
- "7eb7407aa58edd6911c7c7e8d1e03bb52ead4a2415a0c33325872ff3a521dd6"
955
- ],
956
- [
957
- "3866ee1186264549df3dfcdf8705c0380c9372eef6d4081c2454d3aded1720e",
958
- "634c6d3e8eb8af652a4be73e3b613452c2213104ca875b66b4b15ee5b1716af"
959
- ],
960
- [
961
- "484c687cd2969a1d20a58cdfb9a60f280a473284503b1ecff5de514aaf8206b",
962
- "34d44d26b7427e51a646d1b924084762f5b461685450f21d6a472de565bebd8"
963
- ],
964
- [
965
- "203561333771fa0fe22c4033349f7b877d15b0542a5598e81e067968768247a",
966
- "2b6a533aff6e2163a36a2a89cb7415848bef48db40f952ffd380f47676707c2"
967
- ],
968
- [
969
- "2ffa6cca6233695760251206fc5e34c8d3692498589478cdd3d5b09f0b7c05d",
970
- "6c57d605478fa9626c4ed769554d075daa53e1a1d0bd4d94174d3bfeeb11ad6"
971
- ],
972
- [
973
- "5dccf0fa46a5571f204d0b033b45f299cbb3d9f80fded57253ea4f1c64faaef",
974
- "30a38e131ee8756ee5ea2a3e16618a5dbc28b5b9311308bf037ecc2039dfc7d"
975
- ],
976
- [
977
- "57b0a2eaebeafd950221facdd24790d7d1ab8883e5c5d55635f0d14a1ee4741",
978
- "7b41cc478fa6be38417271db8ed12efc0da6982552c1496025d2df0576bf4ad"
979
- ],
980
- [
981
- "611b5725101f611c387ccaa13889ecf3bb5595071a179ce350029bfca4ad7f1",
982
- "3129755977abc8995fec7eec1123a1561e429fde37ff36af002d3211831ecf4"
983
- ],
984
- [
985
- "1c06bbd0c52fdab9fcaf680c7a93fb821e538a2ed79f00f3c34d5afb9ea6b31",
986
- "3873d3bdfe0be0157bbc141198dc95497823cc222986d24c594b87bd48dc527"
987
- ],
988
- [
989
- "275cdbabc989c615130d36dabfa55ca9d539ed5f67c187444b0a9a12e5b7234",
990
- "2b7f723e68e579e551115d56f0ae71a3b787b843cc04a35b9f11084b006521"
991
- ],
992
- [
993
- "6cc702eb20f8b5940c7da71f8b1801f55c8c2d8e2e4a3c6c983f00bc1ffdd95",
994
- "5d15b3727bc66f3aba6d589acdd139fae115232eb845abe61fbdfc51341352e"
995
- ],
996
- [
997
- "44defb418700cee8c9bd696b872adb005490512d8bba081f8f99a9f15cc981c",
998
- "3b2072cdb1d919b2b65b5cb3557f0a3381d7ca293c267ca4a38f83e77bcc96e"
999
- ],
1000
- [
1001
- "fd83ce77b1578b3a9b8c3cbeaddb1504d2fd4a19c901c21ac65961224e4966",
1002
- "110cbe64fc10c6b9c66f15ca406a35f50b723b35d83c5eb9797a57f8395f4f9"
1003
- ],
1004
- [
1005
- "9dc6ff90e341875e113bbfb507724dc7095a280d2f32cb6ba61a1e0c2d2aef",
1006
- "4aeb622896c852c2747454e8f172c9482955a42ecbe522d6ce07ecde79d0a51"
1007
- ],
1008
- [
1009
- "71c58b0e47b9dd9107ebd8a8c8fa9f0534e78231bac612c1ddc7a94edf33eb7",
1010
- "7f90edaf4792bf8334adbaa0f4ee7c654312725af188682d75f34874c4eccb9"
1011
- ],
1012
- [
1013
- "1f6de1f14988778ceb2dfe844f92394f1f1e72fd1581ceb3bf336c95ce50345",
1014
- "4f6007ed4e022d2ee9fe4ca8207c5f6c766c4f3b85260e941fb24ad0dcbf0bc"
1015
- ],
1016
- [
1017
- "3ddc3ac25ede4a67a97547ed27dc920239b585fb3624177e2e8d59eba678115",
1018
- "a9afd8f8bb759cbd1dff2addc63f47da4ba1291ea34229c09c0637dc5c8d24"
1019
- ],
1020
- [
1021
- "c56b0269d8431556e471cab9d70edda3a37b391696f107b2dc370631de51d",
1022
- "729c52f6b134f733eb750c14bd9f95c077f0f6f6ff4005701e5bedc6544599d"
1023
- ],
1024
- [
1025
- "44d32ce19ac6807cb22e4f25fe1486a36a13926f147fbfa054b63ff0446177d",
1026
- "212a21e8c124c9cd37c80d2dd66913ceaa6b6f666522f115c39382b2d5925e8"
1027
- ],
1028
- [
1029
- "35dfc16f3ae6ccc06a267bf6d931601e52f3e45359ffc513570b65b96adc4f",
1030
- "74311d10f4bece01b5ae65a6affe5c931463aa1b73a3320eeb41bbb7bb1ff62"
1031
- ],
1032
- [
1033
- "e0acd9d2d907031b319b80121dc90699d003d220ea785d50e5033cdb3b1a03",
1034
- "3911ba78d6e507485d6374b0f7d2e6198f6462a7d6d3cf046404a07af690357"
1035
- ],
1036
- [
1037
- "3c57918ca254c0cb7dac251ef4e10c7d82327969552eae15d26c4c52660922a",
1038
- "5fd5f5ff3f14e671548074114c72c48409df8a2e71fc8aa3c8acb506e2a88df"
1039
- ],
1040
- [
1041
- "222ad8b61e219ba2b581f606b7c996516850a46a3db72fe1f72b5a9be6c324c",
1042
- "72015a5e2db648112abd284fd867b59fc5606645177d26cf6e9a655c9912d42"
1043
- ],
1044
- [
1045
- "3c86d5d774bc614469768ad38f7be9a53e9a233942c5c553b82e49aae684764",
1046
- "480febea8229e130dedffff89c11f3c43e11724e6bd89d5566d78752859d41c"
1047
- ],
1048
- [
1049
- "adb73bb8352d0c10175df371f7868ef2c9e0c79ac788430c480c0f7d85c187",
1050
- "60b564785248111502e6f39c4994d6293fac22bc25f4d764b2fb1957d3c9bd8"
1051
- ],
1052
- [
1053
- "3836ab8b46cf4f453a22532c886940b982029b29c42adca90ded5bf77e6bcb9",
1054
- "7b15e91d6355f147b171a90b064a9d8b2d7bf3699bbf4987664c61c950d8996"
1055
- ],
1056
- [
1057
- "12ed96af1a97c45ec31f1531e96f6fb28a03ba52ab8484545fbe0dddc97bb32",
1058
- "6d1f522b6c6cad0940cff8e23decc72bb8d4164696af031415508b025aa8be1"
1059
- ],
1060
- [
1061
- "27382994ae5878223ef802e9b4882f481a1b4008f1eec8484483471f7aa742b",
1062
- "c31750d242b3975b0026a0e86ccdd17d0f680a8c6f53f197fc25eb1f777917"
1063
- ],
1064
- [
1065
- "431677eba3715455bc235557518a74f3b111a88844ef13e159ad44bc16de3e6",
1066
- "30000e1eb6a17d9df776981e65c6e500fded1ac12003adc9446b269812c9197"
1067
- ],
1068
- [
1069
- "4b563e6f42589671579eabfa2cda5502b361c46a5ac8d45c8ed44741a925b33",
1070
- "627bdb41678443fdd1aa607709e9699b652308615f4bea760a3b79ee0d9ab5c"
1071
- ],
1072
- [
1073
- "2932fd3f81fc973ca9def6b7f1bb50f980fe589187cfe9e9f52ba4d356cf2c8",
1074
- "1e6bfd00fa976c4770263a227048214c38850fe0f059e7b3d2c7871ef07d68f"
1075
- ],
1076
- [
1077
- "e44e4f3d96d9dec775b996be57e57fdc28e7c68023109b221c414a244a0dbc",
1078
- "58b1e52fa274812e5184e00e9ad812bec2463140adfb4bea3b2d665867dcc9"
1079
- ],
1080
- [
1081
- "7fcb89be1f4bec745887bb891e53fefd665c53d00a9e74de16b8a7e1f7adfb5",
1082
- "74af0b06633f779897e199609c71cc5649bbb65bc2c0abd4c678f0480c198d1"
1083
- ],
1084
- [
1085
- "62a381ffb904ea3ff4d451d4c8459457cdbc3dc2fd2da646a95d8c1e90c0b7b",
1086
- "1ba058658e09db9e319fa73de8ab4a992b71e4efc22c273725bdcab84e2a315"
1087
- ],
1088
- [
1089
- "1b0fbb7a84c67e668450a54449c7a46261a2d355589f8b84ebfbaf9a77ee938",
1090
- "44f8fffa33dd33a6146c35d196595e22cc4a215f61ee9197cd751400970a1b"
1091
- ],
1092
- [
1093
- "78fe920bd96a356d4d95ee34adafe8fecf071d3107c36f047b4024ddc4b3eea",
1094
- "6162f29607fdbec10181fbac6e57d5cb41b922c5791fb24bd28bcdd75d16c41"
1095
- ],
1096
- [
1097
- "5629b849e026e65d119ac11821d7ab7efd9c52226f75c7427505d6818bb0c8d",
1098
- "1539c0f90970ee8b490e45bbe5568170e5708521a0e59f976be680595906feb"
1099
- ],
1100
- [
1101
- "62bc853f349bac8c6e5921d27ba85dbd9ba20a375d70a7bc008928f3e123b04",
1102
- "6acfeb1de05ba43c3ef1a9110a983a320e77b3ca294abbc04aeca19b194f26f"
1103
- ],
1104
- [
1105
- "4cf4bed663464418285cbae359b5d84ec76b5997d24f3640984c7663421190f",
1106
- "941f818e3e3e8fb1568da85217d17f9250ebc948379014d900a7b1a848494"
1107
- ],
1108
- [
1109
- "52ff3d9ffe9a302f6dfaaf74bab57c08027d5cb699a69b30830540c0a2d47a1",
1110
- "987dd8876873778d933fbfed37aab2f7d6f669c37024f926b1edcb2ca55782"
1111
- ],
1112
- [
1113
- "1109ee32f0bc53de6bfa457060b366e909d7c18061ec9845f46ac715496897f",
1114
- "38f36f172bdfd454b9285f86e6bdece8fdffc95182c7d801b03c671cc55139b"
1115
- ],
1116
- [
1117
- "4b4482f1d84efe23dadf3bb10df3dcaa251312dcdd604f616f1eb540e1f3232",
1118
- "7c9c149dcae9135f940fb54482f9c3cd8193721643a6e23157b8020410d439c"
1119
- ],
1120
- [
1121
- "69cb459b9e415b7581ca163611c470d875971d5d7949de732d1f0f200544a73",
1122
- "a7136fa9dd00c0469863b7def3f83a5611ed628810d7e807e7a873da5a9897"
1123
- ],
1124
- [
1125
- "b66a4e32ac9a4baa8f64780acd94ed3628b2b0ea874ba4dece629af65f9e62",
1126
- "24328ba9996a24389658e3467b8b90dc3927ef8419fe28b3f55b1c1aaa51915"
1127
- ],
1128
- [
1129
- "5ecc3080062dd451236de0e4eb91c5c75100733364bc5469f5fa76f79021ecb",
1130
- "6da4abb9031a27b5be94529324fad8026e7d871570780081b0f424d4fe543c9"
1131
- ],
1132
- [
1133
- "1e3146f00880bb22486d5bc73e54367d54251f4002bcf342d0393b05a4b9ce0",
1134
- "23b6fb8e945d3205f633ba724202db5a99305f807137edf942cd60eef867699"
1135
- ],
1136
- [
1137
- "2e1da8013285598b899f026c6974185db12c97b4c63509769d3d4ad1d18a4e5",
1138
- "1e7e7b668674d1593c39d58bc7bccbf568208732b3519bc2cdf93db34366862"
1139
- ],
1140
- [
1141
- "d26c3f389d81709506f184b53871497c8d36c5c9eee8e3737358204c1acba3",
1142
- "34649c3d39f3b825947fedbca215ae30c5a5995e93b1c8efca4944cf85a082a"
1143
- ],
1144
- [
1145
- "91300478a83595d548f32f259033291fc7d083953b0b8bde88c7559660c563",
1146
- "e5d2bff57fc6551e9b80c06ac7314a71907cdcc66ce82f2cce721a670df10a"
1147
- ],
1148
- [
1149
- "1f7abcb9d462c63ffe92aa56619ae8590089cca4d93ee3e5f34a63882452cc7",
1150
- "7e9f85c7b7ca6e9a4f3a026d1048adbeef69ea9d876c6f647c257b879a81bdd"
1151
- ],
1152
- [
1153
- "4d2caa1323012e4c83b0ad387308b8aef5637bc35ddd882e7f5e41cf2ca410f",
1154
- "47150e808c81a540b6f8864e9d6636589cacaa516f82caaa96506edfbd6f0e"
1155
- ],
1156
- [
1157
- "3c10a6083c38351deb3e6d1b386827d0acf48979b66b95249eb8700ec26b069",
1158
- "47e34bfe561d903cffdd1d849b85aa3cbd31cb4a9bbd8cc2e5fd2f95016cabc"
1159
- ],
1160
- [
1161
- "758bd54868eec045d0b4d3d2bc415d24bce13fee47cefdfda46425c109b657",
1162
- "3392a7c66ea3bd7b044680bbe9f78ae86752097404c067e9d2572f55330df83"
1163
- ],
1164
- [
1165
- "19e718e0ca1d2d6fadbc6006ee7dda7a385430e29f5e239cdd4bb7c3fdcb2f8",
1166
- "5c68249b7fe03ea2e13481a63b6cd4bf74ce42009a89fee0b3f8f968b3ec709"
1167
- ],
1168
- [
1169
- "28077f57ea62401806367e6d54fe45d02de5b072db787ffdcc3854e12a3e855",
1170
- "14f3762689072f5fb41d03e94b01808c739f6d42b7b785b0e464100b150efd2"
1171
- ],
1172
- [
1173
- "3b8a8cefd017363ce867265af3293cec081fa589fe561830f0078778cbd338f",
1174
- "69ccf2383cb7b4f9c806d72535812483e7c5e9a1a5928529d64ca7e085e758d"
1175
- ],
1176
- [
1177
- "77878f388d22161a2953e5aca6bac1ea480e102f329574b4b201640d44a296b",
1178
- "7eb35706a90a03aff7c2fecca72659136547cee98038746db5aba16fd7178df"
1179
- ],
1180
- [
1181
- "97332e6da70961f2ef31b7b628f1018d21db8db015922a301fca7d6fc6a8e6",
1182
- "2e37b06f639fc7a82601b744570a2619e543cbfaf60e474107fcaf4686d3223"
1183
- ],
1184
- [
1185
- "a81518d452d3aac48bf0386c3ff170ef4e684a4def242c964e129c64f4d647",
1186
- "37506e44c85908ec7b7adda9547fbdcc2e3605151fefa77fbf127ce3bc938f2"
1187
- ],
1188
- [
1189
- "e80336b2220b1d666074f6b0dac85353d0e4c2e8bd0f37055a2236a6a9fadc",
1190
- "1cae76d73eda7a5964c5d9d3ad6748aff51f5543c56441d2fdb7b444a39846a"
1191
- ],
1192
- [
1193
- "2c01fd8430ecb44e066f352c4f697fc9fda177dbe162f82862d7b9ea8c918de",
1194
- "6e1dfa99640fdf5b30603d34c7c97c1aa6e6b7f3a2c52a21fc64b0fcac7d591"
1195
- ],
1196
- [
1197
- "744e37b511cd0ddcfe15f3581947014c159de81ed055d15a13c7a2d1fa39f0f",
1198
- "685caa8ff6979a6c63640ac638a3f9c75737f2031bd55322a47384357af164d"
1199
- ],
1200
- [
1201
- "40e627ff84e1a7a9068b4368770f5956128a4d9e9e33e9cf5e24d9a242149fd",
1202
- "2465bd6cb20bbdf810e2bc5c3c458cecf4f3aa163a7ac99c2579e5f33417f2e"
1203
- ],
1204
- [
1205
- "5f635af7f554a17bceb6ccb6e637abf89ab6dadd399189b0a0390e87b1896bc",
1206
- "2aa6238a69f89665646c0e3ca2ba5f709cc6e14351cf71e1b00ec45201417a2"
1207
- ],
1208
- [
1209
- "5edad3063c9fa8305978d7e6a4e037c9fa519b8023c7608dfc3b66e5c1e8985",
1210
- "49f405d07d7d01919da51159ecdad1031a5ac208c026fdfc14d38f633d92183"
1211
- ],
1212
- [
1213
- "2fdf2e8a45858c12926a1f25a62255fb2d02d0149a15ef669f859806683e649",
1214
- "61cfb686bb31e2524470d4ad2ae09e3cc91b16305a21d748098feb1d8ce3b3d"
1215
- ],
1216
- [
1217
- "ecdbd7c37f1dffa3943977278da3bb429afdf948b4ea6cdebace3d3be82381",
1218
- "190b67fb34f7f3ad6afd3d6b6427aa327547d8ac0fb4deeb0feeba1f63d6c60"
1219
- ],
1220
- [
1221
- "233021b483f578dfa5222f8cccba5766ceee0ac65f6d4a3b1673b302a21fb3c",
1222
- "7d4b6d44d175d4b593f06f5a6dcba2cdbc4eaa2097abaf613123546866cf4ef"
1223
- ],
1224
- [
1225
- "42db4e953c2a7a743de9fe20c5798f2247f51db4eabc6f40e86c13909a310ce",
1226
- "12c1a0764a0b9f3666e431923ce15e7fcd0ded5ab153f0b48d362cca1604e65"
1227
- ],
1228
- [
1229
- "30d539e2b545fb957e40e2255f6463b52d227c9808472cee6a3d521aa283a44",
1230
- "5f9eccf747fe6313570f99e845db32b40070acee9ce9e34da7f3c29ca53a07a"
1231
- ],
1232
- [
1233
- "4bd64e5ade3e2733580a6116b4af328751198e7128f9acfe3a3496b545efb5a",
1234
- "4d584768900dabfc0dbaa086632b8051bb3905ef79b84d96c01514441d0cc93"
1235
- ],
1236
- [
1237
- "62d6e771f02e591557197d13c3e77dfa2d1794ac1808407bd8227c4be31b466",
1238
- "5c6f5607c1808e899ba36a425911fa8566b7ea9cc80de8a80538c0fceb837c0"
1239
- ],
1240
- [
1241
- "5ce406218cb2852b1d2fe1836b19462f664631785216e87ffbce26030e2101f",
1242
- "5225f107743c255ab50e7be4a090fe39478d1ef4ff558468559d8cfa87bb94"
1243
- ],
1244
- [
1245
- "670286486e8dda3dc66b0ed3149be7697d3e06c8279844079daa7e42d5af728",
1246
- "26becabe7430380c56e320f5ae3329569cae7b0af06fd5327ee23979d200eb0"
1247
- ],
1248
- [
1249
- "3ef448df33a4394c43e93e5850cd0c5a6dcb18ae1cd865d00fe8ede9336a9f5",
1250
- "56711f6ab7e0e4f7365ac34e284ac2879f40208c46f6febcc1dcf7146ecf015"
1251
- ],
1252
- [
1253
- "4b63fc130288e92f2d6ba238caa7a6364804e29829ac037c57df32fbf762bc3",
1254
- "1eb8c80af55278b4113286c038fff2bfad2da62763bb03426506b869139da0e"
1255
- ],
1256
- [
1257
- "4e7e998557b29a95f805a6e2e26efc1e970108272d4755738c04f28572295c0",
1258
- "97cfcc2f447bde61bde71049d8200a74a3028b21703bc139143d81a3623f09"
1259
- ],
1260
- [
1261
- "574b67898f02964c408f68e9470e7b615be037e40b824e6617f89cb56c21219",
1262
- "49392d5f8e6740a1b0b7444f56d7a17363f8656c6e4c628678c86223f2e46c8"
1263
- ],
1264
- [
1265
- "7e8cb50ea5d5c1b09e219e7305bcb601d99b6d7185b1c388aa8e36fe1e56554",
1266
- "47fefa308645455c12ccb5817da338f0c4f423b341aff4a9d158891a4fd69ba"
1267
- ],
1268
- [
1269
- "67266dea9e71b4ed2bf24a597a823dd048cf31e725db511edceac72998c9ef6",
1270
- "39babd65850befde1f7c28e41dbdbb4caf82bbcf3bcb5b33161f1c2960b2d8"
1271
- ],
1272
- [
1273
- "63e99c2cb9c74eb9227d48065e27abb8f606df8fc83b2c44e4ea38b046bad2b",
1274
- "60494a53dd13ecf34e08079d343c88fb655d6d810785af81f08d5aa9bcdcf9"
1275
- ],
1276
- [
1277
- "3cf0600b0f5a2a4eb78c487cd385350e8c7848e3f6983231881d7f1bbe28543",
1278
- "56dee4288528de609976ef6b903b652127c37b0590e91a2fdbebc3f11df2628"
1279
- ],
1280
- [
1281
- "758f09245fa4b8b23d290ee2b3bfcede199b4fdb11f3cf2502a8ceedd61b129",
1282
- "622d9baadfde781e985d9722e0a04715666769a4cc7a9bea0b96d6386be1746"
1283
- ],
1284
- [
1285
- "38e1a45b81492aa95d7abea2b08b8c14dc0b8a41108b036871fb737910ae18c",
1286
- "145c611262656385e5ed6243568cd3f9f59dbfed7a01ba11e22bb8bb272e08e"
1287
- ],
1288
- [
1289
- "206e54ca53a2f155bd4fc45bf2edb77798ae6623defd4cf22f2dd4a7d119dad",
1290
- "6c94e7f0825ad81680e4cdbcaaaf4df806d57a0d1fb2331926c3fe2b79d22e8"
1291
- ],
1292
- [
1293
- "56e98d2862893caebf66180e84badf19ffc8b53041eaaa313ae7286a8fac3d",
1294
- "526306f9c01afd6e0c1198ea5de17630f5a39c4ecd02d8e6f0d613c355995c6"
1295
- ],
1296
- [
1297
- "4fa56f376c83db33f9dab2656558f3399099ec1de5e3018b7a6932dba8aa378",
1298
- "3fa0984c931c9e38113e0c0e47e4401562761f92a7a23b45168f4e80ff5b54d"
1299
- ],
1300
- [
1301
- "450cfaadfecdb8a2fbd4b95c44cb1db723ee5ac9677c9c188b3d7c8eff4ca58",
1302
- "1a552bdfc0c81be734f1f6ca9a6dd3ab4daa61c11fb53ebb7046eee25d617c7"
1303
- ],
1304
- [
1305
- "6fe20e5c8a8004e33eafc84d16ef770f2f0b7bace19adaaa150f987d295a34d",
1306
- "28a35040a2ebe9a14a162d3208d5eabc6e2f3a8310f926bd80be65aa71775e2"
1307
- ],
1308
- [
1309
- "1bd65f45a35bf62ae8f9ffcbd7de2976b90518b6820c219f039c50043bb1edf",
1310
- "fb5f0f8659f9b6ed7cb0ddd7999506d0c20b26bbe69d1915a31842cfac41eb"
1311
- ],
1312
- [
1313
- "4ba4cc166be8dec764910f75b45f74b40c690c74709e90f3aa372f0bd2d6997",
1314
- "40301cf5c1751f4b971e46c4ede85fcac5c59a5ce5ae7c48151f27b24b219c"
1315
- ],
1316
- [
1317
- "21cfbc678f5a279ebb6ed124273c8df37eaf12a2d04180403ae6b5ec0b1e1ef",
1318
- "4478ed6a346d899ad7b0b10350270aad39ddd5b68529297e4c91a54357f0a7f"
1319
- ],
1320
- [
1321
- "350bfefbe3d864eaadac9cc1195c14159bb736be743aed7380d2384cadd2046",
1322
- "5e2a4b3ad0e1d7b9b8ef72b10d68a80e5ee691d7db591fcfbaad6240d41da8b"
1323
- ],
1324
- [
1325
- "529acd569127f73c8d34345f87e96cebfb48ee12a00a3861cda209337ed94e6",
1326
- "3120671a89b705e5bfd99b0e7fd2118b4914a3ac309b3d74527cacb5ad7491"
1327
- ],
1328
- [
1329
- "55d3d7956a97d10e65a4d8ffeba40deaf0db0b57f8e022cdb3df6df613f5c6d",
1330
- "159e59a6f92f48fcf85aa96c1a03749a4c4e2cf9e2bc94dd36796daebd9b8b9"
1331
- ],
1332
- [
1333
- "405f019ee8f2e972a005c549b0884b5051f63d1e78480b73208dc07d8c65a1f",
1334
- "4301a3d0c285ad309ff24a12c100ead7f48ba1368143712f32ac141ab4d9e8d"
1335
- ],
1336
- [
1337
- "376d59b298d982f02dccad0edd5bbd4e5e8fad7898750675ed0856850a7babe",
1338
- "5233b12bbc50564eb61cc098a17d3d97f06ec7a230380e4c5d3b725cc318eba"
1339
- ],
1340
- [
1341
- "2f55624af6109ef04b2ed035a44a904ace8627f55889f011f768aabf4de9a38",
1342
- "7f64209ce7dfb63337ccf3d8c14f4093295f86996cabfee23b1655549aca089"
1343
- ],
1344
- [
1345
- "3b8965e942bed2714bc2e685fb103496e1e3595ac6a343d6df45fb5ef6979ed",
1346
- "5b7cac7a165cb69ae103dd9052fb39c00ed0aad47989005aee53972d82d45b5"
1347
- ],
1348
- [
1349
- "7abfe3accdec1eae1a50049efdd9a8eb7c2921a08e8bf1fe606e9d5a4039ec4",
1350
- "3af178e7e831f8148244d2d2b284a32991852db6212ad0a9d77540ef648a5fe"
1351
- ],
1352
- [
1353
- "4983196df6ad7d6f0a8d76f86af3863ad8611374a03fc0fd00793181dbde9d",
1354
- "204c1f91b70f975a21d24a8face664e496f00f602daaafa69a3b56098a4cf89"
1355
- ],
1356
- [
1357
- "79e2b91c1531a3b16dbd53e72d94e16bf265cbec261658151acfaea3718ea72",
1358
- "3d9bdb47e8b148c1c5e9e694ffbc2cf71aac74ae1a85e8d8c3f77e580f962eb"
1359
- ],
1360
- [
1361
- "297efceec61b3be17565843cae465c52524b4ecd9331a4170f54f7de8c4556c",
1362
- "6ccef1733624cc8b973ac63dd54e7a53604929affe81c3439525ae5ed6af993"
1363
- ],
1364
- [
1365
- "44f04b1966264a23ccdc870c8563ad2efcd4c8087b5469b90e792287a5581c7",
1366
- "1c417f0e9829fa3d3cbb7c3cf4dc7aac04c5bf66ff3f86b833a42c533aed1fc"
1367
- ],
1368
- [
1369
- "6ff83f5d8b51db3be0bda80eed2e2adb7037f2f58f705e88f0f98197431ac26",
1370
- "64f59b8428894c2b7afd740866065ded42e716c7d48accd3f117f22768ed9fd"
1371
- ],
1372
- [
1373
- "14aa8187c9559f77cd1cf96b2dfc949182529936f2b0b4050ea56e134073b24",
1374
- "5f36508c68b1dc586f3fd3f4e2bd29c6d8258491b8a6aa19ede811ce0d3d0a1"
1375
- ],
1376
- [
1377
- "95e8882a68c5000d1c2be7c0b43e7f2a6f8de906485241f0285a5c73a27a83",
1378
- "1e4cb67207ab73bc1e5d19fa2146fde6d03021393b77a55df4ddda1fd28f5b1"
1379
- ],
1380
- [
1381
- "2ae0704dacb3da47d564514b4c3543505b403ba09a248c6e74593cba1867ff5",
1382
- "5a4b5818088dc9ef4066b90a8893ae80fc89584f987ec1928ef9d72cea2bd67"
1383
- ],
1384
- [
1385
- "61a10898a76fb99989e51c0e823cb60b95ec7ccccb917c42b2b28014f5fd94d",
1386
- "23d8ec1de45366d3b86c64c2da05a2ce3d171adf52ca5522e652ffd0eeee795"
1387
- ],
1388
- [
1389
- "79884133c879cf07734976fd64de220c5a972e04c2a3afb74c362d6c3beecbf",
1390
- "2aaa0e6d4891b792b5643fdf09873343cd0e3fbba3cbd0601b481a4083f32b6"
1391
- ],
1392
- [
1393
- "45f73d2fa82be6c5ccd0f62d2237efe8727c479967d27cce28e42b9a44bad5b",
1394
- "2fa4932215f72d56d8be5205c5851c9b3e5f2a14468e4a7acace5437c6b27dd"
1395
- ],
1396
- [
1397
- "37f53f771850f52f9c8f87b53c6bf0c93c2bed76f5fd1d5697356d0b2325007",
1398
- "50f1a052b79b446fbc7b93ffa1a4515f6c3be3a76a2b0bc5eb8ff327549960c"
1399
- ],
1400
- [
1401
- "71bd6d23e0d2f312d47582efa609101f15b9ccc571fca8ac4fe3457c67fbc9b",
1402
- "3b3fdf86bd4c7fc26d60540a6439b4d179dcbf7b91efb0ddc60dfbff9a148c6"
1403
- ],
1404
- [
1405
- "78219ba049438385b829c13a4993874a4a326c4143de0dd581c7b9956f99b06",
1406
- "5505f1268dcdd4ee01b77abac3bfdcbf3f0513ab097c69ff777b4a631aaf256"
1407
- ],
1408
- [
1409
- "b81e924a86536dcf68bc5a2ca2065a61103ba6c9eb0ae4cf8cce9dbe286f15",
1410
- "653a6dfb51acfe8a844fb8362795e5549d424aed88d3a090366a44f840b5b83"
1411
- ],
1412
- [
1413
- "441c0d7b7aa705046dc0e07ba5f33a7d9df23f694a05192ff8c2d7be2aa3fdc",
1414
- "4c06568c0902bb99d428bfa0a946ed0f0ca0a51fbf07cad88e06e9c78e38a59"
1415
- ],
1416
- [
1417
- "2569c8c78b6d6b92533f29f767c95720d377fa63ad5a3b9827ee0a74b0488aa",
1418
- "4b59c81d3cfe08834f946d9d57614f5366e0bcd9349475aaaebe01341196fe0"
1419
- ],
1420
- [
1421
- "3f2fa285a0471647b214eac652bbad9d58a9f2dd2e812aff0210d0d8a6eb32f",
1422
- "4cdb18e1c2848c2b52c1a6557165bd1a8f55c2f7562f5cc0b326f73c25b696c"
1423
- ],
1424
- [
1425
- "5bb5141ab4fcc5290ae9151b8045a2cd8391547ce7b3b33cbbb10f8fb538092",
1426
- "5a36bfd52acc6a83a9913b937ec086cc27fed030b5fa70dbc5d3c12c9515f56"
1427
- ],
1428
- [
1429
- "3f3fed272edf91aa7f8ca5d70005d390fbc67830ffc69c5fa3ae17582d2771",
1430
- "459057e0883c44d8776fa217405f443e5954f08c4a5db68e437becaa664a999"
1431
- ],
1432
- [
1433
- "5237ca6656237a717a739a4509f70db1b9dedbb6cd232f60c9bd8c4563a6b1f",
1434
- "56c7799dd02896dbe7d69dd8bb9718270549592099569d107b7b49c34bf5a49"
1435
- ],
1436
- [
1437
- "1cf6b8499ac881e0b2fc7def9bc1a28937033b2fc52de99e75909a620c7a281",
1438
- "5769cf4f735366fa386b6858043dc99a100f86fbc77b16d57d77766197ba27a"
1439
- ],
1440
- [
1441
- "1b74b8a6b86dbf9638cdb0601e1a332b8d880753423d38c3394902c57f15e40",
1442
- "6bb2dc10d2ecbb913219d0ebdc8d3337d644ed8b6c4e70637ef4c7e50887488"
1443
- ],
1444
- [
1445
- "61e4da415661bba52a4737e2bcde1a837787c4796b2e1854778534f1582c29b",
1446
- "27c43e632cb7652e8508c9c38e3b4ad0d3dd6ba748d42dc84ec2685e64b9aad"
1447
- ],
1448
- [
1449
- "7c460a204d23f20ce86596dae6ac9b36734e4a9f7c5b43262c97a36c6a41c6e",
1450
- "481a11f9300ab4c4bf6924c5ca884728cc361247377065920966785d043fbbf"
1451
- ],
1452
- [
1453
- "124ff5e55e4effa40daa5b9618d75c49c8b6fad95cbe8c0bfdd83cb9bed8316",
1454
- "33a2ea15d0f71f58a00de71acd7f22ccf9002115e49dd1f7631faa0d32f9987"
1455
- ],
1456
- [
1457
- "61c9f8fc86715e95ff43583a865c5a6515f93381839d557ef884a68637eaf4c",
1458
- "5877daaa42bbab9083b571e12648a9d62ced4470d71653092b6546f4a5acceb"
1459
- ],
1460
- [
1461
- "70a6b9a9e5d1fcc07dd9ebef6d8f5fcf04c6cb34932d0fe2335330ac6dc8d3d",
1462
- "3f0cbd332ac56922e886656bee74f6e9bb4bb88f7af7bba9098678af1f38fc"
1463
- ],
1464
- [
1465
- "41db8a0f1ea78443a39e08a54323743c8897eed1ddc28f41aec6f2655040d9f",
1466
- "7d4bf32f8f4719c2e4af8b7889f3b65cfdd033dc2f971798a12170f2b26efce"
1467
- ],
1468
- [
1469
- "62f035e01acdfe841104942d6c8c07f0fbd618cb85998ea24bcc24cfac1f8",
1470
- "1caa886104b7d753fda93645a746989794cd825c62473b526ea34b3d51b5771"
1471
- ],
1472
- [
1473
- "441c6f016d270e86c19843727b83b864cec060cafc813b23d7e41e5abb1a60a",
1474
- "29fece4e40400f3acae0586f4fc8ed535e805e472123ec38d662d8a0b01c086"
1475
- ],
1476
- [
1477
- "2c791ba0fb0b66177815c98191fa6188dba9c795e34a7c3c8a19086215e3cee",
1478
- "11123151389d4b330db6a665a560407e7cd8c3807c749e2b0cffd9c3074ba77"
1479
- ],
1480
- [
1481
- "5292da4ca71ae75ed0554c267747e39c7a129b3b863e1af3ebb3e368439c4ea",
1482
- "63af6a5016deea8cc674c44f16c63c1db31f09af4fb4d2ea7917c28116661fc"
1483
- ],
1484
- [
1485
- "3367388d5d1b7758dc3d92e244f227bb8a54e3d9909e7b7dd62ab5965e3efc7",
1486
- "7ffb4833071e4b03ea755ccb9938487a478248fe9b1158a08f1ac298801c092"
1487
- ],
1488
- [
1489
- "95c863314b7f18090f8eee602403be823a367a1b416d54c32e5f914e67d922",
1490
- "159c2824f899171deee23e0ed520d4825bd667983df0a8d45d3a1f7156d91f9"
1491
- ],
1492
- [
1493
- "621c6e08b3c57404644ad49ac7629832c141273fa1f323781b3395393fe985c",
1494
- "65d1eb0140652958c4371ebec791e03317d6b2e689d90e304666f1b610783dd"
1495
- ],
1496
- [
1497
- "54313129bf13993952cd2b31ed06013aba85e74c1b8a00e062031f32188a84e",
1498
- "680129efc9eb8ec07fc180e8f6877e5f0f9f44e3000a2c586ed4ce49d12a313"
1499
- ],
1500
- [
1501
- "21ea57a1c8286bb45872e78617853c47b89091670ba51c124afa3362e7260d",
1502
- "7087e5c1536df233ec9bfe2f983e8d7622892b9bf64c450c9823898e2cc2fc8"
1503
- ],
1504
- [
1505
- "3793b05b99e7a57d88db4ed0dbc3b771285abcd9052da50f88595354409f3f3",
1506
- "12164105041c056f127e737c7cd63981e05f246bd2b6b65d1f427019c7c3801"
1507
- ],
1508
- [
1509
- "befd345cef5fcae22ac37dacd6b9128cc58cbba3e3fd774e11b421c2ba392",
1510
- "6209d25f24f88f7876ca604db23d05f78e6b3b67fb033f2f1bee221f352b8c8"
1511
- ],
1512
- [
1513
- "15fa536045fda4c65ff74f10b4e669ce88b9996c6772288289d3ad725987fa6",
1514
- "30e0c2124a35e265e931ccc66ce5ac3697d982814beb407144ff6762cb691df"
1515
- ],
1516
- [
1517
- "38b795bd77ac573576dc204857a488cac2cce19809882631ca2069598c577c8",
1518
- "786ba555d55ebef688b068bb9186a34a08cb00bdfef51619bbf911890ae9a13"
1519
- ],
1520
- [
1521
- "6c66853592196c3eb8d9526dc155205e2c64097adf8684bb0e15eb460ce1c72",
1522
- "1bb4ebf654f4250c8dd1061a4e1b464b31a8a9999ac9960446ef8108a66871a"
1523
- ],
1524
- [
1525
- "5b08dfbc87ad9c00b88e78816973ad2f9c10c70f2156908892cc7b7a2a1fd30",
1526
- "1151f407a77e2556073173d8f5c9ff561d8a23742121ca15f7d0ac391af50ea"
1527
- ],
1528
- [
1529
- "309190eba106aa6ead54b5ca5817969aa68b4b4c627700799a49fc6bdd32ba1",
1530
- "505b6a2bc7b0d78ca6ce2abe7dfb7312369918a4599cccf8a615f6701cfd851"
1531
- ],
1532
- [
1533
- "89cc205966af08acc8910d563af7443d5dfbb5d88dae79c013c678c65dcecc",
1534
- "1f8cf955694b246a423ac725791231257b88936e00347ecaa1e17045c0ab540"
1535
- ],
1536
- [
1537
- "480086b61a80c36cf1e1a350baf554e58ee8d9333186b70c9c512fb9e9d5a84",
1538
- "511edfe58f8d36a6170df743731da1ff525cfd5108be20e30ac4183d1281570"
1539
- ],
1540
- [
1541
- "3caf14fb1d2e90a13ad4eb091250fe37133aabf6029633e905e5a93ead41dbb",
1542
- "49122aff6059dfda19e4b973aba5ebe3804c91728936c6381c1ed1ea9380920"
1543
- ],
1544
- [
1545
- "66d1b8fb2cabc46cd79741ce1cb7326077ad8ea3227a6427244bdd3806bdadd",
1546
- "4a52eb74f4d5371ba3265dffd61c844f9e68d4ff0b44dc4936182f9280bb66b"
1547
- ],
1548
- [
1549
- "373330c5afd53c31257fcc9050fef873e15ea9f81d9810f30744309b04e02b3",
1550
- "5889806607b3dc97a9c5b0c8a2f16d1792099a22866b879ca480cb89a11ef5c"
1551
- ],
1552
- [
1553
- "26840d0ec69a22c6818ff64b8b14633b531508c866e21d1dc9239778ae9e8c7",
1554
- "157971f9a6e3a24d3b307be0e7c8cd352e2eb5cad33cf276270c0f309ee63fc"
1555
- ],
1556
- [
1557
- "ebb84848f1c38c19a754d1b5d9460e39624dadbb30800987c9419c0f933b9f",
1558
- "517b297cf32f4064e6d6c8e761ba8db89809604a701c7b3aa1a9c6beb370ea7"
1559
- ],
1560
- [
1561
- "25780380bc0795ed0dca727c55240f1d63593e552d224adb40df2d3721c0f66",
1562
- "10215fb5a893e0275e9f1f66b217dde35addee91ed0e8f7d79531a2ff57b8c8"
1563
- ],
1564
- [
1565
- "243e1581cd1abfbf18c31c19a4c3d1cedfe69a40bb57b607c9af2717eefc742",
1566
- "1296c27929f14535718c3a4ebe045f00afdc60afc74c7d398d8ce1b6609dc0f"
1567
- ],
1568
- [
1569
- "48babb8649e054bc8e0b902c89e6940c265f48464520649502ef1064eb94562",
1570
- "3235be7852b0526d1a16f6969ec0e5b0e09cedaadc65863dea4e47f4f398264"
1571
- ],
1572
- [
1573
- "592db7c27e63489ef4bcef2eafce89f40067cd9a1ba48bc3dc76b5fc62ad9ca",
1574
- "48b7711b570cd9ac65910e75e752f4b751fdbfb4091a28f59b8c046d3d9f8bc"
1575
- ],
1576
- [
1577
- "31d133456222586ae42a9ec7ce8539ee04afbe0b2ed00a2564dab0798d9b55d",
1578
- "a77c52fa1fd718db5c83e7fda6d7d4d9aafef9ad95cad621470f2b753729e5"
1579
- ],
1580
- [
1581
- "4651668379883521e7983aafcb93811b4a72ef2975b3277773746708ef3e3fc",
1582
- "512507f3f544d80ba5d47f73b571881e8d70d7b1d305b9704bdad036b7abc47"
1583
- ],
1584
- [
1585
- "26069e359b2e847affaef604f772f36224608b7642245d0e643889ed231bddc",
1586
- "75ae1ec379f074ebc91270077c74b4d34347ce183b676b4dbe100bfff143b9e"
1587
- ],
1588
- [
1589
- "3196d01d1fa11dc3803b4813c4bbc6326869f61410f2bd14bc0f570d875aebe",
1590
- "20313217cac79875bd2a503db1e86d1e5559911667a02524759344468d9561d"
1591
- ],
1592
- [
1593
- "483256607f75f06fb126addc60cadddd602154cc4782bcc08351a48745d0b97",
1594
- "2950a7e500ebbe9775f08be37cc2e62ccf9030de18948d1bab07a4a9173f75d"
1595
- ],
1596
- [
1597
- "65f07b6050a2fc6eebe2c29ffa62f764060f7f9d3c82d2cb5e4e368aaa442c9",
1598
- "562c9654b646cb84a213b41de203c871b3eae0a05c9c105a66a53c319c06373"
1599
- ],
1600
- [
1601
- "284870f6181c43f3b01d94baa9c5b6ada0deb861145523ad9169580eb7bed35",
1602
- "5e03e6c40c1cfa3cafb01fd0622349871832a9d35499d06408a83edc1b76d02"
1603
- ],
1604
- [
1605
- "32229810a52137f0e6c3d37595c46f6132822d4b05f42674b48d7a7ac3ad85",
1606
- "7babde959a0cf2c53ee59fc52c77c3adf899453f077f441965629f9aead30cd"
1607
- ],
1608
- [
1609
- "1ea8b98a6b85e74e0a2fbc18b206e290f3ed94ce99ca665e8e2351dfade990a",
1610
- "478e93c4724115fb1648c8d5347422adbc1a0bbf962b2312e14aec80e1be742"
1611
- ],
1612
- [
1613
- "270cbaa08c79140c85b864475a0bf569cc03ac785e57f543dc444f37ce746cf",
1614
- "3a9b8d894016680ae9d1bf3deb931d8987d4d8d8bfed45b81ccc595ec79046b"
1615
- ],
1616
- [
1617
- "6943922708b8ae5b40dd7031ef2e487abc4ac39a3591368285e83d6c9c51f4d",
1618
- "5f157c37d09634e8cbfbef90ea50af59815d011e419a691c67ca3402b5efc33"
1619
- ],
1620
- [
1621
- "48ac6a80979fab4912cf0cb557d917a0bd68825d8658ec100496eaae6ff62e1",
1622
- "2b6931350ab183402e39476340eb1177b7006f7a552915581e29a79bd7203a0"
1623
- ],
1624
- [
1625
- "e3adf9517d92ef22d1e2a787740a292ba32d5ca69faa9e8675f63ed816dce5",
1626
- "36bccf69bb12dadd610145a3399213248d193660d8dc90a2e206f23bf2c7997"
1627
- ],
1628
- [
1629
- "5e6c8ae5afb2fa470f767581f3d578cf6a49547e4b78665edfd45776948bef8",
1630
- "6cbfc11953dd7e195d2ce74e52a60df524767b44c4608bdd755be4bc85eb74c"
1631
- ],
1632
- [
1633
- "15a576a1242d39300f0db3ad770983825988da0457718ecd596c63a0a0eb4a6",
1634
- "69a42e5f6f5a63349b57683a4609bba90f556a1680fa1ec3b02ee7d3211f903"
1635
- ],
1636
- [
1637
- "274cd14e4fbf2ed07402e8ad8075b320c5f76b7ea45ea36af523e95ed63ab50",
1638
- "6ca640f9557c5f2d8b27f6ce95b108880ff4e4816b26b70b6506114389ce656"
1639
- ],
1640
- [
1641
- "4d8284e132e2fe81c5f71be1e3c79ab51b229e2c56c323e207cda179999d123",
1642
- "116cfc00e9fbee1cf16af6282123cdf20eed13021c2037ef4c86f94eb6e6cba"
1643
- ],
1644
- [
1645
- "4056194fb5643e97991942ef5b63cadd89080bf57a01489c4398aca03f0980a",
1646
- "2e2cddb434fa6f6da7859c3d518f0ced8795eea043a6c9613fb3e020103339f"
1647
- ],
1648
- [
1649
- "5d119d5c5ce532afc0875e0ee9b026d878c8773d34237f90a0d0670da6f01b3",
1650
- "4a79fc025ce076b6a4742fbcc8cad313d0a8220c58024a41a5a674c0947e64b"
1651
- ],
1652
- [
1653
- "11800ce4061d99b9d53fd4138802335258f7798c5a935c9979f5a949ce1d483",
1654
- "36745a4741a5c7290eaa8f2a3f9ec955ccb7ca323272e5d35d35c2a724ffac8"
1655
- ],
1656
- [
1657
- "4302525bceb97fa642fd5560a4a39fba3d2c06f68e6aff3332ff1854439ebb3",
1658
- "e31edfd081ce82f8177b2d7d96e69851d09e908c2517114ffb37ee12c0ac64"
1659
- ],
1660
- [
1661
- "2f5fcbb96f0a66fd3bdfbcc78bda361cb812570f50e7c476533d56eee01c0e3",
1662
- "527428a34855b5695c479d8fb7e831a299f7897f36682a74169cc60d160df2d"
1663
- ],
1664
- [
1665
- "52167df045ad0dc999b98de3d035aced9da4434211149b8cf4bf20e774580cf",
1666
- "19051d2a1ad3fab190c5dfaf45188b49b4e90cca22aae54f0a785562d3d3f41"
1667
- ],
1668
- [
1669
- "541b5332491dbdb2b6f6bccceb7634970c046963891fae936dd950f4432b961",
1670
- "78fa54da996a51e3a9c06091d58c2405a806649da2bb1f323807c4eec50eda2"
1671
- ],
1672
- [
1673
- "5f11e973da659b7738f87ca5bd4f3bd02207dd3c8d978f0d3e83fe81030febd",
1674
- "137aba7027069f62d25caed416e13537687bb1428e71e5f0a0c52d52f2e65bc"
1675
- ],
1676
- [
1677
- "15ec941ee6c2110b819b5541be52981c09d83484c9dc735c43f39f5778718b4",
1678
- "4561826142dc5b56acfcf605a78a4090472bb61235bcd605a765e05d0a7e549"
1679
- ],
1680
- [
1681
- "68ba398736d659522f484406110b43c68158bf4992094acf797a38979c587a4",
1682
- "7c1d9e1702e28afddf22fed7a7a79df4315c174d0c6c4f4c75bc77d9b56777f"
1683
- ],
1684
- [
1685
- "67889cea31c81a429fbae643a4fce0ecd690a5c32b99397e39ed6d7a08702df",
1686
- "7ea277c80b671146c9e455b98f42f45b941ac95ca2d15c8fa9ea82ee9b45e01"
1687
- ],
1688
- [
1689
- "596f2c68390ac26505d3c2eca5c77d46f8f3acbed192a2649d8c525a58d2334",
1690
- "49f3bd8c62c610d5c19c52d970bde24b270c4ff7ae900453b909e72483974a0"
1691
- ],
1692
- [
1693
- "567779fb8b0afe592cea284629e3621ccfae3c4d7d3dc559c9fed750591a395",
1694
- "6010bdc33f1cdb374facefff537e7910b72a1120502f312a7ce41df0d552ddd"
1695
- ],
1696
- [
1697
- "cebed0233e810aa6a29a8b0829d28f1c92f303d14dd73d6b12da98117dfc7",
1698
- "4bdd51e1192a00df23aa8d0673e4915877ca41ddb8c9eaf21d39dd167fde7b7"
1699
- ],
1700
- [
1701
- "4c7085f066adeb6781596771972b188177e63f2e2b3788d03e033cdd5af1f06",
1702
- "2929ee89f525862b0cedb3ab9b5166e1680cb77fb4668f10a6a3d76b5434566"
1703
- ],
1704
- [
1705
- "760e341bd836899c226176f47685f69438270c150c6fe7744cd723cd1e72359",
1706
- "1bf09f2f1aac1a10ce8bdf20d5d178db747f01a4aa0aa8a5e4bfeef562cd94e"
1707
- ],
1708
- [
1709
- "6016b94c00b54920027ef64902c61478244b1936337d2ad41d9a8d43dd6a4b2",
1710
- "3bf3dd9bce7f6d6f120de87fcbce6219340b59c2c1d75ee0d45105d33aab1cd"
1711
- ],
1712
- [
1713
- "4929e44ff692eb944d1045bee96e750219cda3bda0500029f0df49a1db30b5b",
1714
- "2e138dcbd092242699004b4ce98764ffe4e892841f56830af298581cd1e523f"
1715
- ],
1716
- [
1717
- "5972d0e526311bacb70a04e88969b6c63c7399b578f0dc28bbd00d65ef01da7",
1718
- "76b22bca9ac12d26530e7b0757e646beb3bbc5680d0f3f82fb8ee57ed4b5e39"
1719
- ],
1720
- [
1721
- "2ca0a42a26e26934ca2d48db960b4719113d87c5e57fb437d557c5eb4e03ac7",
1722
- "62778c02561d4ec5d83a132afd7763a8349207c6b5d01fba70b56ba660cba2e"
1723
- ],
1724
- [
1725
- "5137ee53f076e21a2c23da09f63c0d275408c31e4634a6b6373be5cf13e6c00",
1726
- "14fb446c077beb78e04de3282a63bfde12f9af85caaca4ddfab506cee31c0c1"
1727
- ],
1728
- [
1729
- "7d944853d1627b63f560aeda33acf640d35a4ee4d23a744957a2dae9d5b7c6c",
1730
- "bcb411a210710acbcb9ea12680d89e3e4e652228b6786d3886e95f4d9e6970"
1731
- ],
1732
- [
1733
- "37d412c2ffb173a728477446b60b2b702d07a5243cb5fc8963e623a5ee75843",
1734
- "672c79968908f92cd0cb0b4c65ba86e8f359b015623a89441e1bf859bba84cb"
1735
- ],
1736
- [
1737
- "5b37f472aa80398bff12cc74c8ee784c4fc89757292580d3a498bff17e9f114",
1738
- "7d79da1aab9cfef58a5f3d1c9ec466956a45f8d2af0c1da6dd4c93f720fae6e"
1739
- ],
1740
- [
1741
- "25c09b3f1188c562571536202eb0f5fc4b9a7590417b8ea58b4343685d88a63",
1742
- "3d5b817c73b37e9a1d24ca923351359b42ced2f3cafbcac8c2d6322dc767bb"
1743
- ],
1744
- [
1745
- "32e60904e73f9756f71e0a918d302aeca17cad4acacc81bab15702ab5ff78f0",
1746
- "bcf4c0204f8275072f98a65b09ac58b87cdc9c70c4edfe99fe18870a3a5459"
1747
- ],
1748
- [
1749
- "49c35575996c1517d2daed90d2fe4a58e674d6b4aaa7288d0642c8bf59e562f",
1750
- "57eeee00adea4ca80eeabab57852cbf03f1a57e21872cd44221e0550b9193b8"
1751
- ],
1752
- [
1753
- "10e1776b4c2a867bf1b028c6edec224cc6616c747e272f49e69b67b02a893dd",
1754
- "8d45d62ec8e627b56950f2f7622a0438647f9e9f28e723e4a37cebc039a1b0"
1755
- ],
1756
- [
1757
- "79a93a75ecbe943acc964fd39ecfc971dc6555b2bc335e7b53f52f4eb16cd36",
1758
- "146132a68ce2ca8b48363612226771ac547eb3cf52b6eb7981718faac08aa3c"
1759
- ],
1760
- [
1761
- "6b22d32e0590e169504e7f19864fd646d0994e7ed3e578a5b88f6e095913439",
1762
- "68c3b22d859fb85e5c8fa0a8aea932285945b230957e603394333e9ad5acd82"
1763
- ],
1764
- [
1765
- "71ce5ec8286eb8c93b8481c6d19cf0a288ef4da4397e9c80f65023e516bc097",
1766
- "54470babc742780cd8a05499026e738ccbf81d4170d1731734de68a8e5b402c"
1767
- ],
1768
- [
1769
- "27beb13a43bc6a1f6ce046da438b0beac5899ff4d57962dcfb6476b563f74b",
1770
- "14074e9e93ee45394dfbe833998b9d1691961f8ba3166224b36404448c61bb3"
1771
- ],
1772
- [
1773
- "6b1de6c8f161aa6509a1dcacf2c0aa1bcf6ee9d9b40e032a9d72f77a6fa298c",
1774
- "5e9312eb5b59d6cbadd7d3dcbc39f1b5bd9a8346fdcfdf1107bada6f9cc048"
1775
- ],
1776
- [
1777
- "32670fc3fa43bf39974ba72ea51f0d045d92d084a81fe5282dfc8309aa900b9",
1778
- "518fee521bf1af62356aac3b7e53fdbf57121e030c6e9572b3de69912ca4eb4"
1779
- ],
1780
- [
1781
- "4b9ca363eabed9c66091a347375f7065cd28f49f914447de7cc1461f1375f1e",
1782
- "3a1a3a2e5e7e72476befe2571ece708052d740d02cbe6fed58740968ae609c4"
1783
- ],
1784
- [
1785
- "4cc6da42863a3deca62fa218b7a3b50e034eb4bafd393eccba3f4cbe192ef10",
1786
- "20bfa683c884f203713953b26d2821287ecd305fa2cb70570474533fc07f918"
1787
- ],
1788
- [
1789
- "87705353c44a5ccec8de65cf5433be6b3d9bd21eea49b60e6c907cf1a67a6a",
1790
- "112804b13eee56e3b01aff75fa08fa8374c44fc461aed8a30ad54acd09c24eb"
1791
- ],
1792
- [
1793
- "6cf6eeeb9d339c0a05f72fd5af73fc7588e6d957100ee8999109437bc126cae",
1794
- "54fa257cea22032eac272fcd034dadf2e00d602ef9e519cf7072023c130aad1"
1795
- ],
1796
- [
1797
- "19b32925048c5519d929650c833661b452ef7be7963fab0b6b328ab7dd7a28a",
1798
- "1bd0c14a10bf9b88ea61011c0b2e64d07da151c6203800d5a5d12063838a510"
1799
- ],
1800
- [
1801
- "12a5fc5559428bc3b4eff97b21b63668b866e0722807f1db1f19696bacd9b0d",
1802
- "4c2eb07f0c24047a3d73b560144f3fd32c99d6dbd9fc7cd2fd2a72a6e4b24c7"
1803
- ],
1804
- [
1805
- "13662b7a7d390aa76eb86a7c3bff6d9913eb28db6bd1a7c42de5cdad2e35ce2",
1806
- "40626aded7f56f82cc431ae30527b096f57fbfbc04d3e12a5abae3edf301cf1"
1807
- ],
1808
- [
1809
- "255825bd49b8a2cce114360bd9c8fe8c641af64c8e7710107213cfcb006f43d",
1810
- "3619cce4482335232f9e76a1460be9d296f2d468d26e4f95a78c71524fe59cc"
1811
- ],
1812
- [
1813
- "7f83009eeed4f12f54d341bbf06066480cfcdf51dda103ac54d4bcecf6b3b31",
1814
- "4269519d28faafd7fd68bebfd8404d71ba05d62c4bb6d65d24aa6802fb84ab6"
1815
- ],
1816
- [
1817
- "2f325650eb316646b4eec903fe44828fcb11054f1bd42ca3a77f7e734110b35",
1818
- "44f976082271016f9048e22c507d97d628722bb431f8d5cc1890524e6c386bf"
1819
- ],
1820
- [
1821
- "750b166bb6edc0ee80fae39c7c106879036738df2d79fb2294e1c21e9a24d6b",
1822
- "54f8aa297a1afafe2a17a3254f45861167414327e918d17003c6aad01d0b24c"
1823
- ],
1824
- [
1825
- "3aedb10db9cf3285cdeee375879396fac1fb50dd259e1716f8c01e66f67ca72",
1826
- "7feb9400f621f58c21601f23b7ec7c94a9b6b193c1cd74a8a60846aedadd359"
1827
- ],
1828
- [
1829
- "4ab7151702de76faa493e7a0b1ac20ee4d10c33b83fec9477547cb1236973eb",
1830
- "63f1f122e3ef3acc46b0915ac69c3f5772879799cad889a817f55f5853d1235"
1831
- ],
1832
- [
1833
- "1675ead0d20e5bc3a7a7331999a87ac4c916ae29669e54197bb02aa6364520f",
1834
- "4d1122da90d49e491922d9b533a6a668e2f65a2737ebb391ebb29fb7c1f8a9d"
1835
- ],
1836
- [
1837
- "2f7148111ef53c613157aeec12e16a20f13481da4390b6ce18a85d1d8547087",
1838
- "2eeda779ab395597651d2a0b833ccf53b10280750139916ae2baf4ec57c633d"
1839
- ],
1840
- [
1841
- "4439c7810e7b2ba772b701ec3acdca0b80c9df23047710b87f7dc3f13b337d3",
1842
- "5029cfe704c602a8a4662af0a5860ec03fb88f046d0e3400f2ce7638014c621"
1843
- ],
1844
- [
1845
- "2248eec40b5732a6a488b681f093643af7937071bc73118acae295a32b51b05",
1846
- "1577e4aec30a97b648de4d0b19cf8891151b4eb11f8de9c6d7312f091552e19"
1847
- ],
1848
- [
1849
- "4738424e558d4e0d87a3124ca02ea24f0adc6b7a9768b0d3945ed2a6104857c",
1850
- "33576f92aca3f0c8ae689c3c274c2de6b918940d86a6852e02fc99e35d1614"
1851
- ],
1852
- [
1853
- "7829edd8b866ebf7baaf604ed13d19a9797578f44bbc51b1cd67ca53803e96b",
1854
- "5559040a6083f2af1f9133ccaf5bc2ce06e56ddfc7dd410e9635c0116b62722"
1855
- ],
1856
- [
1857
- "7f927b881f2cdc05e1a69e40bb714af47b630d1425f08ab5d574ee698f33d51",
1858
- "26a465288e96572de303203bd38f4a03031e8158da0591cb037c0a5111d1056"
1859
- ],
1860
- [
1861
- "36a65598552f8753580d1655417d645a140966e10a1e1663015f9fdfae44881",
1862
- "33d5bbfaebf59eae72b89b1aea12ab2ba3c9617f8c3baed1ec16bdf668381b5"
1863
- ],
1864
- [
1865
- "403becfa545c826782026ff409cc16c9d4fe428f1b5b6e630c92439d2fa5fd",
1866
- "47bd6f2bf5d74f710ecb479c79b01fb774fbdad590e683a415cdedf33f71dc5"
1867
- ],
1868
- [
1869
- "3a747826d241b877d3d56b16e0b810cf088eda4fd6048da174c9991a942a5eb",
1870
- "2c7ba19b0a3486a2cdb84d4a388d34beb077a0e467ba44590166f93f6a09d2e"
1871
- ],
1872
- [
1873
- "3d60cd375842714b37bda89dd1f13a7e0f3ff133b522209617d031bce05a537",
1874
- "f77f216451ab01ad5226844d2162a7f32744688bcb4325445539e2ce5cec4"
1875
- ],
1876
- [
1877
- "235bf66f67c9100e7f0e22bb299cdfaa603644b240e0770aec7e7fd163e2a65",
1878
- "37110b3fa83ece3990afca2bea8d5ebb3c7aace60a0147f8e6ab733e2f2b4d5"
1879
- ],
1880
- [
1881
- "3b796d4eb69a55471fa86108f787b3604874e92b6887a7667a6c2bfbbd9a42b",
1882
- "4912d6dc0419732ef82cb3278415851d4e2d7ca89e0f4d7128cc9de51b810fe"
1883
- ],
1884
- [
1885
- "48d53516dd51e49faa7ab46c8c10db1befd10f23c6a9d9bc3640a2f0da44518",
1886
- "73a2fb3d064adadf21aa1362c04affc660598f38a9e069b3afb74d0a99ae9ee"
1887
- ],
1888
- [
1889
- "48c32cff161ed145da0d5b73084897647abb777adf65738559ceab6939cf3e0",
1890
- "3d99308978e828f857c382df32b472bda81e8ec8e30c8844077ba6d6d2ba903"
1891
- ],
1892
- [
1893
- "2947ff091a8ec9684affbc9a62e09e598841c4a6dc638088492aa47dea57097",
1894
- "19a2cc97975e547f97a4d02e42f89e6ced6f5a953cfccdec347867d26926541"
1895
- ],
1896
- [
1897
- "1960d85f30475615f82484eba0bdafb7ea7cac3809f0518a757d66f02b01676",
1898
- "36c8f77baabf0cc8805d993bbe62041fcf4e3239cf9d53278a4fbd91e75eeb7"
1899
- ],
1900
- [
1901
- "2765f28074d21d5a055340b6d40092d2bbef807e02009fabfa08ec0b9bdf38b",
1902
- "7fb189e0553d5df52b6843661814824b3f3cbebbd54988f042fb256c6bf30b"
1903
- ],
1904
- [
1905
- "348836cb2aaa00212f4b1a4e2d7fc5417f246bf2fe5c9a16ebabda449e2e08a",
1906
- "3f7276fd7d69e0d55ce5ee1d2d830534a27227fe0b6d8a36c93f9a78b872969"
1907
- ],
1908
- [
1909
- "7afb9d34b6a42ea8c6d870e4b8191c274201dc1f93a1a2219a2392b7e345a31",
1910
- "42bbc20dc7115e0758b364a110227b16b64ec58fc535ce5ff1a9ad8b8a09fdd"
1911
- ],
1912
- [
1913
- "2cae0c2afee1767fd4c66f52e1f176d217e92e89cc19eb36d5a6c1715f641a",
1914
- "5335efe2d9bc3667d25ea88bf76438a4d6ab9ba5c512f9da7d0529b79b62d83"
1915
- ],
1916
- [
1917
- "1cc5fde334707723c3a06f00c106db88664284a2df47bb6b144d9f960aea3e2",
1918
- "dbbf610d100316938bcd8bcd078513512ecb50d4579690dbefaa419c05980d"
1919
- ],
1920
- [
1921
- "54e90cb8f3a2998d2675c5780679e06c0556b1e618f8fdf07f9a4b2466fbf1e",
1922
- "16248676b6f06ec5e34994bc3115f85c8147b54f34d8500928f2fdc051e2089"
1923
- ],
1924
- [
1925
- "525c70a2ba0dbdd68d75640f47f13d0d415ea595f7030f533f4625c2a46523b",
1926
- "58292c8675e5e1a438f49e0c05648d9a7aa997f2f1fd77d5de1944afe5d7eea"
1927
- ],
1928
- [
1929
- "54726d78d099007393348787a03107ab492e59690a46c87fb02ec554f2353bd",
1930
- "53b54b77184ba75a3391e0ebfa6d6974db028f3f8e34bbd5460759a5848dd76"
1931
- ],
1932
- [
1933
- "4ac81a66903537769d3aac6c483ccc08535cb767b6b5e1ec8017a7393ab70ae",
1934
- "2cb22b77a8a05d26f11a4dec80eff292633aa05553a889c5ab16b6ac6e2ab17"
1935
- ],
1936
- [
1937
- "21d0175349e21114988a2930b9a607d43245783cb4a0c984ce27f4c4206708",
1938
- "59f1f49342cc5496213d3329bf4ca7fb0044337449c579bf53147a1dac9e67c"
1939
- ],
1940
- [
1941
- "167f821b381f4c8adcc39789475fb55ba639e5124fe75f26dd61be396dd5e66",
1942
- "22002c87d4cafb47ac9d27286d5cf5ff7a6715d69814118269b0729be9e4b3a"
1943
- ],
1944
- [
1945
- "31010666c6db83a9f9e4db4c48173afd405783ac53852a6e38a8ff925528843",
1946
- "1f466dc9b5d9094107c741dbf380f9fd98d8549cd50f67169901516f8cce74c"
1947
- ],
1948
- [
1949
- "1ad3875769a5053388a86edc85dd80fdffbbda6a456aea497ff81a0f1f6707b",
1950
- "2de7cdec5e2bad56a71bd2f33a4ae4c874e1ad4210a6ac32b443cfa34e85b1b"
1951
- ],
1952
- [
1953
- "c489650fb7f459ce09cd05a456fc5a46b849b38a671298ed645bcdaab168b0",
1954
- "45610d092b8af1c43ceed474cd17f7bbee65120aa6fa4d37f949e7e41f25327"
1955
- ],
1956
- [
1957
- "394256a5ef4d7af5459587a0bd2edb8acaf5ecfef2563c9a04daf34a4abe4c6",
1958
- "1ebee390dae1403c0c53994e1d064fa64e20fcb45392e209b2b99486a559ffd"
1959
- ],
1960
- [
1961
- "410a1511fead6151e9bedb089b9832d0fe01fab76d3f8459929f767525aeb27",
1962
- "361f0a5ffe09fcc3ad4eff3f5e89508ac247af80267100b69de3c59df561cfa"
1963
- ],
1964
- [
1965
- "38cd437c9f659e110a869605c182ee9fdc26de36baf559d9229e258267bb734",
1966
- "624b1128ea7739bf1cbd0e423af92a4884323c868d2ba0ee9d362946edee2d1"
1967
- ],
1968
- [
1969
- "78b126e50b7042d2a019f95cb87a3213c664ca1bafe345999b1e9e2dac1e608",
1970
- "19e398196b22f4488cbe854c614ad8c353839abc5ab3a4f3f5c03c16ba8a198"
1971
- ],
1972
- [
1973
- "6d3a5ce91132f385a91823c5c8046c4b638f5fe63357424410d901457cdb867",
1974
- "7b80bae16d2d487e122495174f7a70992bc5dafbed72bf84127ead7c57302bb"
1975
- ],
1976
- [
1977
- "32d053a904dc4d88fbe7d0b96e0cbeca22a00aa5c79c753d52b0b60abf31602",
1978
- "3af6a02e5cae6d6490354ae51185149e3fdb6d0d9caab90e95ff58aa0c40377"
1979
- ],
1980
- [
1981
- "49b1fbff5bdb0aa6938b066dde0ed772c0d81f9eff52e7fe038b0ccbd78adb5",
1982
- "1c6e57834eb14d507eed8b36c81ddf92fa91c242467061927a742fafa82b43d"
1983
- ],
1984
- [
1985
- "2f28b8994ca6f234d9293d26196b43b9d1d5306844348c4a638102c05de85f5",
1986
- "759cfb172eab065d477248b3569f4ff5791055f01e95fe71b94b8e615d73c96"
1987
- ],
1988
- [
1989
- "3c2ee954ff534f856f59188fa0f29ed8a022aee0cac52d634f6dc58cd514d70",
1990
- "22bd162e74925f0a876bd8a206b8767dfdd7c898576a73a490f138d9a7f99c6"
1991
- ],
1992
- [
1993
- "5763a7cab001e1aaeabf9ab5b9b2fffe6cc2b299ab04ec4933da74d960e1ab",
1994
- "715ee4f8ee93ab5a1dba00f0a6abc4eec47d49b61254cc27fc36a031e32f0f8"
1995
- ],
1996
- [
1997
- "19976ad8d7b7f47c785408243a227401996b36e47c7a78a7bc7d4256233ba9a",
1998
- "896b713c5d7777b0703821a73c1d9a4c3755501042120534ff13990975e1f5"
1999
- ],
2000
- [
2001
- "61674b992c29827186cab5ff454758dbbed8e89bc23d0bd33193afccc3a04bc",
2002
- "38e1020744c13903809ea30a0662fdb5226ae760cdcf10800faabec452e00f8"
2003
- ],
2004
- [
2005
- "2ea2d48bcb83c0c9cda4efe11f07165cfcbc9ccd26526e5fb12556316d4b1df",
2006
- "1d2d68b74ad384c5c4a9c85453104216357bfcdf635680b40215f0f800974cb"
2007
- ],
2008
- [
2009
- "7881212050264c40c336ed3a15dd2cd868ec9a558f5b728869eab66e8b8ed54",
2010
- "21aaefcc8ad8a161b8971d6880321781dbd939570c540da4c330922b8c81e9b"
2011
- ],
2012
- [
2013
- "b6be88ce0461d20f59c5199573cda0170b61decf6e8e69a6d32f1695adc4ed",
2014
- "5536e4808370716f2bb3423a9a49a38ddbfe91faf3b7a35eb53d3519238b6cf"
2015
- ],
2016
- [
2017
- "e5972af1655eb6dde2e8c77cc58044299922441b5ee41ceaf5cafedc765bcc",
2018
- "550282f37a4783dd60801c237045992d6fbe82a5902e7d837ea25f6f98c7b3a"
2019
- ],
2020
- [
2021
- "7efc1aad1f580d8f50274f1c114c40056be19a8c96fa8c4cb5bf85e1e7f3e4",
2022
- "2689f1c3898b114d668be6413643ee9f879913d40c262541fd0316264c60a4f"
2023
- ],
2024
- [
2025
- "7939db98037f59b0113e9d60051f75ac9c3cfd1a3eb535c73e2d945068c6c5c",
2026
- "410914ca8bbf3c65cdf3e9772ca790c19131c50068d34b7346c10260a578a8e"
2027
- ],
2028
- [
2029
- "225b77ad00a2b83d26690190b74867326eca4f55bfbc3a13be036225ca3b1b5",
2030
- "411faafef89042ce6beb64309fdaff70fa53e9d32d79a21e7f82f80e79ff05e"
2031
- ],
2032
- [
2033
- "1501e64c99c8b6658b0479f2c05c9142d246eaabfccf2fcec8dc4399539d8e1",
2034
- "3bab1e3339e42c9ee66c65b0b20236fdd9362d3ce786ad3a9779ab578af50a8"
2035
- ],
2036
- [
2037
- "59b907b941f24fb8ea2458153e55f07534b388e835af7b69f3c9f54392a335",
2038
- "1d5438c4f2f68a417f3d56f916d899a6ffe910f5f2989ca31687f1b10f60db8"
2039
- ],
2040
- [
2041
- "2887d08a26f484546f360e33abbf7a998b7170a5b30070938b84f072c676bf3",
2042
- "62a78e8d00e5d3a59e2fc424ffa08961567ba1ef24c8531cd7bceee6074a535"
2043
- ],
2044
- [
2045
- "6e3cc8076b3d45377929033af35aab0c6d19ae4fd47c0daf844079ca04c46eb",
2046
- "7b90f338e4d848aa8f19d0b5c3bca916a2a9024acbf14bddb278bca2aa39e5f"
2047
- ],
2048
- [
2049
- "34844dacdd3ec54a3af328bb9d67715ab33425e194ac9977ca02ef22e8f7a88",
2050
- "3c1affc6372f32a1634748124f9e1a03c4f0c993971da0dc28888b0801279d"
2051
- ],
2052
- [
2053
- "436b192e03a49796cf9bc5e93c88268b71c9c24f9c3a85322bba634ebea309d",
2054
- "67a8091ef69d62abcb28ce5df4dc7d53f8dc2b9690344f75ecd03a6d9386044"
2055
- ],
2056
- [
2057
- "592d25b68baff87a6d7fd41ff0dadbddc1bd1316683de3b2d677501c0eb14e4",
2058
- "27ad1e1099683f54589010faeefb19e38569ace43653be8787a42b0591e7bc5"
2059
- ],
2060
- [
2061
- "89a5111ae911512ba62e87b97f643c0219702f235c70f62c6678a129302009",
2062
- "557fa3d98e9ce7b83b47545013a4498f3de43787fb66b1a54521222242f7c1b"
2063
- ],
2064
- [
2065
- "1c9b5e53377e72da5066cb08566bbf9ec31ec1877f455d932cd9b1aa375d34e",
2066
- "72f79555a8bc207863f32d482fca54692825449fd8963fcea3de3a8183a739a"
2067
- ],
2068
- [
2069
- "574a6e05eb14591729515be239ea8c1fa9e12d4049d42876f76c8ff37bca03",
2070
- "5f99b3af43ca68c1c73e8190d5f73c8de162ba643d7d5f0cd73cfa8135db6d3"
2071
- ],
2072
- [
2073
- "513fc5c2e16505b2b25a2f284e167d5401194bcac0dc3ecf8b7c9acb560daa1",
2074
- "687ee7a1a8954d08d3856e1a16ded808e419e789736d3f55f79f7693bad69f5"
2075
- ],
2076
- [
2077
- "53d48bd1205274b1c2b0a0ceb3d21c5fcd7c8892a784931603240b288a598b9",
2078
- "35387abd7ea59c9b956de44d36533cad1f6668c438d666651695ff3862159be"
2079
- ],
2080
- [
2081
- "213eb1ea99e08825110dd61094eb6e8145119dc1c507636f068730b1e086d44",
2082
- "744f6853f4f02f4f042468d0739e0c9f64df720b87ed77d1979547084ef7a89"
2083
- ],
2084
- [
2085
- "735ef017d091ca23264ad0aa7bb9b2be3309b4539605e79ed4a652ccb2fbe3c",
2086
- "7f0ccc7a5747c4e921fff97d431169f690763427e2cfd1ad74d7a0308d7faa9"
2087
- ],
2088
- [
2089
- "3f36babc5a30070b610ed97db44997e6d9115c9c0579ad8f75d295a17130001",
2090
- "79047908a2474e32d5c712a07bf5c4ad522590bb5d6cefda410d30528e12ca8"
2091
- ],
2092
- [
2093
- "51c04907ae88a5926b242fb2862cb1f2c651a94e6caad5bff8601c079fded74",
2094
- "10a585a269f460aed43f54c7de13cdf623fc8de5957526997278be939ef32ad"
2095
- ],
2096
- [
2097
- "c1e1bd626a735aa2c065831317217ecce68e377eb1f67e54ce2e97bc2ef2dc",
2098
- "53c5af23a9b482f420be6dfd37b6886154cfd130794098e1f51c1885ac2556a"
2099
- ],
2100
- [
2101
- "5aff3b30775ae4758e604a4a6262803a545f5ef4e7855fa245ac6a6431a9ece",
2102
- "39a4799e5519047f29333bee9c86c99bfa8056d4aa381c396c4a44331fe795f"
2103
- ],
2104
- [
2105
- "3d753e9723701a8e9d99b91bb93dee2eda7ffa5072fb2cd5c5fd99aebcdb299",
2106
- "15798bf5c17d6d5880fed1553af32dd8d8baf2888c715a886575448a24c7975"
2107
- ],
2108
- [
2109
- "6593e5078466b07a4222d2e544da826d2c583c9cc5f2eaea148b129b00d4aa0",
2110
- "11b352b08a0a61d3cd67d1dc08069dec3bde907b3da0f56de5011b956bf8744"
2111
- ],
2112
- [
2113
- "7a6eb353c5be9ff03fe4a06c01fb71aad2b38144179a291ebcbb2c2417cca65",
2114
- "3de3ecb12f2fa699b46a9d399abf77ca17bebc3e491bfb2542dd0fba991e2bb"
2115
- ],
2116
- [
2117
- "2c7ead583d6c32162091034a9eddfa775b4e84b8bdbea939edb2a80dcf64f6",
2118
- "461790ce40d9c276d962b2a1e9a74d66e9d7335962e234e8a2fc6963d31722d"
2119
- ],
2120
- [
2121
- "34285af023d9b4c2c2b88e8704bf2c05a9b553b00b2e70ff05f8c2970cb134f",
2122
- "33fe678e7671760a83836107428dbade68c3593fbe568f3f8f1b2c568099c44"
2123
- ],
2124
- [
2125
- "6222f720a24466263db6a11842f117fc4bb78da6705f140e48869db3e087441",
2126
- "6eff5b9bf3aeedc962bc5a24b66e7bdad2153450ed53a058bf2c8dbf2907693"
2127
- ],
2128
- [
2129
- "17c6ec5ea206eb97cbf53851e37ce391080e0d2bf1e5395610f79ab0503f7ce",
2130
- "3adb71ca3523d88ceb1e365f12dfb24895453c14daf0046b2626cddadfdf5f7"
2131
- ],
2132
- [
2133
- "70859f9771a713e54974ce11cdaf44b0dcc3e9befa0c0834908d877eeaafd27",
2134
- "d18f794bf0cc0623b711e7450030424e52326c45ba9b03341883ae4828a5f8"
2135
- ],
2136
- [
2137
- "2a820cfd0fd4ab0871e7b303cd545a3086caf8fa818c087a4017197da74efbf",
2138
- "5f992683ff37f6c041b84bfc01503d333ac9763505cc8f69473da01812969d1"
2139
- ],
2140
- [
2141
- "5b0526de2c07fe7cd73e3884f642d57a0ac5e13c68590ed03a14e530616e8c1",
2142
- "eec69d0cbd92c9fca31ec967dba848bec368e792d6678797946a5e34fe3487"
2143
- ],
2144
- [
2145
- "6cf6b3efee707210cb3a72f1e885c3d0953aefb43e5e148c740aa1641725c61",
2146
- "911cb630b898e2c1a9115f9e45bafe3b819edfb1eab6e15612d14289939984"
2147
- ],
2148
- [
2149
- "74e913de55f1e46143cb2ecfc580f8d3d3908f200281322b84e21c989cda293",
2150
- "761d2736c9ac7670ba905bc2629c6c0dbe988820a4454ff415ba68710f7df92"
2151
- ],
2152
- [
2153
- "44084305e0c911a40b7cbefe5f13cffe9a99375d1a584c4a2200958050af7a9",
2154
- "249c83877371564708ea525b64b1e7e12785460d83364446531c9adcacba5f0"
2155
- ],
2156
- [
2157
- "2bf71ad4d1bee1a67fb300477029f54bdb0e09f78bf2ac2e8afc7465a7adbcc",
2158
- "6244dd6cad282539049be57487bfd9900bb0d5da805d02b535096368fcb4cd5"
2159
- ],
2160
- [
2161
- "3a62d8f763b62def36e4089458046a49c5ecb91b861549530773e0548ff2bb",
2162
- "6a10a03ba61e6ac657270465c09aa9526cf1ebe96bdecdf0e7000476a47b9eb"
2163
- ],
2164
- [
2165
- "284eed3a17c51e0677d4fe897f056abe9def8af07a4630e6ca5723e2aa6677",
2166
- "516a06ac1d5626ed03d2eee9de6f60f0311eca703a99b0fb31b9c66b01c27c7"
2167
- ],
2168
- [
2169
- "2a2c63b16cccd685f731d06fe93ce2cffb358d34d03dda9a7368185c1eb0c32",
2170
- "7180baca0ba81284809f92eca1654cd76b925a9242e5d5e0f18d0a55d13c6ec"
2171
- ],
2172
- [
2173
- "5f9466017ec09769611389ea5370ad68dda936d3f5816c9e928ff9574abf9a7",
2174
- "6619b5b145bb5f4f29deb7a4cd68ef4da3995312fa6537f0d01684da4267ece"
2175
- ],
2176
- [
2177
- "74f229babe01b4962b3307589c1a13019134b1db6822698388bebb55d21c30f",
2178
- "156ae857ab3279f754facba0db36398dffec8c31e5e160473198f2f891b7531"
2179
- ],
2180
- [
2181
- "334b9fe3a5fd99bc966ddd1309698fd32afd1f235062f2c275b6616a185de45",
2182
- "221a60053583cc0607f6f2e6966b62fc9dac00538bb7eb1148e007a92116d2"
2183
- ],
2184
- [
2185
- "7ad710ba002a67c731efbaba2149d16fec5d2f7aa3d126fd9886172e9f4ea30",
2186
- "3a10f8e902a7a13aec94d66415347e1314f9bac83a7db176096b809b25ffb86"
2187
- ],
2188
- [
2189
- "4306dd0a184a3283c3097ff8f7434cec80912e9dc04b7df21ba73fda9f8e6d8",
2190
- "6d42bd3d1a8dbddafd09e872e2aa3891ae79ec939dc1b382196bc21c4ab749"
2191
- ],
2192
- [
2193
- "1c3f2124e1135c32a426d1d14e471edd9e0f2c7bd703ee123cbbd608e8c4be7",
2194
- "3cc607a3c3f1ab68dd5fa56c65996002721b8ad8ad4b0dd9e5b1467d316583"
2195
- ],
2196
- [
2197
- "294af33272ffcee0b56a436de1b73759cbddebef4c07888b42c2f92b0b68e1",
2198
- "d837164311d5dca8d37b99ef9eb22708643c83d1cbdfe852f63ea07b06fbad"
2199
- ],
2200
- [
2201
- "753bdb5439a19bbffdfa02b1dc24e8368f22d0a8276b109c11e6feb26f56f39",
2202
- "6ed396231af93647633eab467f1a034f38e76823eb85baf97cae56e2dcd9f75"
2203
- ],
2204
- [
2205
- "5674f0cb892b733fc0b50e121d8679afed0a925c32594cc65ffe83bebe7748e",
2206
- "7fbf0325dd38dd94905adab2c52758552292a6a103d9edfcb11938828e828c8"
2207
- ],
2208
- [
2209
- "4a8f053573a0a74251059d0229d89b6660407ba0b491779fd10f87a5117c81f",
2210
- "21b70112485398bf67ec9d733df24a1df30dea718a93b786f41ed04e3ae3c5e"
2211
- ],
2212
- [
2213
- "726c01ec4a08df8fc8de173311f50d4f3b97c5a9cf68c1536146f827db95ae8",
2214
- "15013cafadefa7f1c4e4dfdd70bd4d3979dd18bd7f0332572ce2a3fd8773d12"
2215
- ],
2216
- [
2217
- "38ac0fbfa98937257460db7e6645d7e5112b6fce7234813fc8a704e8ade8da2",
2218
- "73c0109f86048aad08c443f781ae60ad13b99f7b9cfdf3128fe6d6eeb799a7b"
2219
- ],
2220
- [
2221
- "6f6d3a38621582ace092eb50ecfe9eff265df141ebdcab8653299116fcea291",
2222
- "4a1bf3f39bc919c8f1b720a0b1ce952cad17f2ba98308ee6b76dd9b6f3d7b75"
2223
- ],
2224
- [
2225
- "6a307fc28e1df8d9ad01766419e097797d65cb674436fa1c8f012d3de2c2a1f",
2226
- "26911a635ba824db004875d79dd84834a97ac12643e42829015bf88c1fd6f05"
2227
- ],
2228
- [
2229
- "2a74860e3336d6db916555894cc8028f41508812925db1925457afe40257155",
2230
- "5f8da573f4c39816ce2dba8a20224223a7cfec53117ec78973930c0e9b60244"
2231
- ],
2232
- [
2233
- "4d2b49e1ed0799f719b8269f092cb489a466a645bc0ccabafdc678864c176d7",
2234
- "5410083df7d256f18cbf5697ae5e52c31e075d8a3b27e21d6f5177ca882f6c1"
2235
- ],
2236
- [
2237
- "110ecb9fbf6c333d168cee473cc5ad98809b6cb9eb5d1f6cd28ab5fab504fd3",
2238
- "7e3c54d7533d9f8c3310f219dab0cc3ea4d39b418a748eeffd6bae2b8637a43"
2239
- ],
2240
- [
2241
- "5be4d711b80da70e6d3ac493250bbfd16f20b25f31919b3a91cf14ffbac1096",
2242
- "7f55a0919f082e8885f1515e83c5b39b6022404503507498e1b4422d79c43e2"
2243
- ],
2244
- [
2245
- "2605125b95ca4ba93a21cbbba5762898a7cf9e988f07ab9e64cb3868e3b139d",
2246
- "62f0ccf55b9fc0eaf9736fc8ee484e2acdbe259813af9803cf815829a5e9d3b"
2247
- ],
2248
- [
2249
- "1092bbbf206f2a3068167c3dd99a72de31e206f6c504c071c8214d105ff814d",
2250
- "309f489f68a62089f53b96df5d4fbc3ecc5a1a42eb7ece0e49bad17ad490ff4"
2251
- ],
2252
- [
2253
- "2abdee9409d9c92559ca3f4e6bddd649c31aa09b90bfcb4a612af491241e18d",
2254
- "3ffa8eac180a29de3f8a69efca84bac046f921f5725e96a6ff0530be1436aaf"
2255
- ],
2256
- [
2257
- "376313f27d00bb1aae7ec991745efe6ee28c6b50de0c6cd9845cc4bb4f83543",
2258
- "6a8e0a9389ba528b156fa94ac090a895d7b795818d4941c29415d9e2984c547"
2259
- ],
2260
- [
2261
- "a80380c71bd466a696b3f0fbf02817c9459d9798f4f3899cf32edf647fe066",
2262
- "6a09805e814e7cdfc76eba4b79f1df5ae559e0f0aba9f728d3cba4ea5c57471"
2263
- ],
2264
- [
2265
- "223694b921d247d989a79b9b2b2f07496036c40cb043eab074a9d6a2cd2ffed",
2266
- "c247217f1b1df35e30d9e15fdaadf42d6fb0edd3a5a7e265d4cdc426c120aa"
2267
- ],
2268
- [
2269
- "102333620df278c6714bbc880fc087db58c1b9b4d77ed4d61b32a74bfc7c3e2",
2270
- "6a77d37727ccf71c2caeb151faf4404d4b94e9047f9f0a7c3966367f3b53c65"
2271
- ],
2272
- [
2273
- "891626f466536929ee7eadcd18b41925706dedab7528ed5f0f7abf039eb9d2",
2274
- "5f73d11c141c933a35b2d0d06e5cbae614a20d17dc3b439f8bcdc3413c5ea37"
2275
- ],
2276
- [
2277
- "215c23fd3f073f870e5e80303967391bf173f8adcdbeec72d131c557babc203",
2278
- "10634332e9d9439a321597dc5b0fac9ff478834c3d6e281735f21a4a5e13266"
2279
- ],
2280
- [
2281
- "21ea0bdc1332bc36e6aeb43be9071651c27e4ea2eadec636c8d818d4af72a36",
2282
- "3a523d9643dccc6bb9c7c58413312caa3e60ba9c7c7f0177e0f3f469a3241e3"
2283
- ],
2284
- [
2285
- "60deaed1bffb6190beed40caaf2bfab5e43d3707aff7ad3f278d571aa247eae",
2286
- "e41f71ff254c1418e6a66992af307789fe04d6606fb2670900bb1a089fd879"
2287
- ],
2288
- [
2289
- "1e1fac4a1646253fb1332fadc21fbdd3e3a24a840d129400f520ae4116a4cf5",
2290
- "69c406f9f46576afad68808de0ab7e8922b6226af748e721d9097e21f1800f3"
2291
- ],
2292
- [
2293
- "5db0ddcdf79ffe74d6454c12d2bc60b06776db03c75dc413f5be42ea9a91b5e",
2294
- "134c3d6c699841f17306835bb193785228ffe7ab212a01a861c56b086a18cec"
2295
- ],
2296
- [
2297
- "626814e320fb5bea505b248fd1c1389ad586c1cfe04923fe2f83173e915f4f8",
2298
- "7ae407a926e887206a8b85cf485f1f327c9bb8ccbb6897024e2d122877d8ee0"
2299
- ],
2300
- [
2301
- "23186237dc7d3b570cea645282ad4c359731bbfa54e7f036426bf6493812cd",
2302
- "7d1fbab7e61a22d3b00993290d9f4cd5d820061573e787f66c2cff9a18e1eaf"
2303
- ],
2304
- [
2305
- "54302dcb0e6cc1c6e44cca8f61a63bb2ca65048d53fb325d36ff12c49a58202",
2306
- "1b77b3e37d13504b348046268d8ae25ce98ad783c25561a879dcc77e99c2426"
2307
- ],
2308
- [
2309
- "13961b56b9fc0e412e468c385c22bd0680a25624ec211ffbb6bc877b2a6926c",
2310
- "62f7f7792c77cd981fad13cb6863fe099c4d971c1374109185eae99943f16e9"
2311
- ],
2312
- [
2313
- "47abd7308c70659af3f00fafe6837298af3cb530b6c2ba710ffd07a6bc1ae98",
2314
- "75d0c8a7377aa9f0663d0c124a5659750847afabc29e39893fd27534a4a03cb"
2315
- ],
2316
- [
2317
- "2c6276b764fb398fa555857dbe0ce0ec18fab7a233bf23851295739801f0585",
2318
- "5d8f4897ce44007ec5bfcb9aeb78b8f6e1d40a514f72d213c9300d2770d2b8c"
2319
- ]
2320
- ];
2321
-
2322
- // src/utils/ellipticCurve.ts
2323
- var ellipticCurve_exports = {};
2324
- __export(ellipticCurve_exports, {
2325
- ec: () => ec,
2326
- genKeyPair: () => genKeyPair,
2327
- getKeyPair: () => getKeyPair,
2328
- getKeyPairFromPublicKey: () => getKeyPairFromPublicKey,
2329
- getStarkKey: () => getStarkKey,
2330
- sign: () => sign,
2331
- verify: () => verify
2332
- });
2333
- var import_elliptic = __toESM(require("elliptic"));
2334
- var import_hash = __toESM(require("hash.js"));
2335
- var import_minimalistic_assert2 = __toESM(require("minimalistic-assert"));
2336
- var { ec: EC, curves } = import_elliptic.default;
2337
- var ec = new EC(
2338
- new curves.PresetCurve({
2339
- type: "short",
2340
- prime: null,
2341
- p: FIELD_PRIME,
2342
- a: "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001",
2343
- b: "06f21413 efbe40de 150e596d 72f7a8c5 609ad26c 15c915c1 f4cdfcb9 9cee9e89",
2344
- n: EC_ORDER,
2345
- hash: import_hash.default.sha256,
2346
- gRed: false,
2347
- g: CONSTANT_POINTS[1]
2348
- })
2349
- );
2350
- function fixMessage(msg) {
2351
- const pureHex = msg.replace(/^0x0*/, "");
2352
- if (pureHex.length <= 62) {
2353
- return pureHex;
2354
- }
2355
- (0, import_minimalistic_assert2.default)(pureHex.length === 63);
2356
- return `${pureHex}0`;
2357
- }
2358
- var genKeyPair = ec.genKeyPair.bind(ec);
2359
- function getKeyPair(pk) {
2360
- const pkBn = toBN(pk);
2361
- return ec.keyFromPrivate(removeHexPrefix(toHex(pkBn)), "hex");
2362
- }
2363
- function getStarkKey(keyPair) {
2364
- keyPair.getPublic(true, "hex");
2365
- return addHexPrefix(sanitizeBytes(keyPair.pub.getX().toString(16), 2));
2366
- }
2367
- function getKeyPairFromPublicKey(publicKey) {
2368
- const publicKeyBn = toBN(publicKey);
2369
- return ec.keyFromPublic(removeHexPrefix(toHex(publicKeyBn)), "hex");
2370
- }
2371
- function sign(keyPair, msgHash) {
2372
- const msgHashBN = toBN(addHexPrefix(msgHash));
2373
- assertInRange(msgHashBN, ZERO, toBN(addHexPrefix(MAX_ECDSA_VAL)), "msgHash");
2374
- const msgSignature = keyPair.sign(fixMessage(msgHash));
2375
- const { r, s } = msgSignature;
2376
- const w = s.invm(ec.n);
2377
- assertInRange(r, ONE, toBN(addHexPrefix(MAX_ECDSA_VAL)), "r");
2378
- assertInRange(s, ONE, toBN(addHexPrefix(EC_ORDER)), "s");
2379
- assertInRange(w, ONE, toBN(addHexPrefix(MAX_ECDSA_VAL)), "w");
2380
- return [r.toString(), s.toString()];
2381
- }
2382
- function chunkArray(arr, n) {
2383
- return Array(Math.ceil(arr.length / n)).fill("").map((_, i) => arr.slice(i * n, i * n + n));
2384
- }
2385
- function verify(keyPair, msgHash, sig) {
2386
- const keyPairArray = Array.isArray(keyPair) ? keyPair : [keyPair];
2387
- const msgHashBN = toBN(addHexPrefix(msgHash));
2388
- (0, import_minimalistic_assert2.default)(sig.length % 2 === 0, "Signature must be an array of length dividable by 2");
2389
- assertInRange(msgHashBN, ZERO, toBN(addHexPrefix(MAX_ECDSA_VAL)), "msgHash");
2390
- (0, import_minimalistic_assert2.default)(keyPairArray.length === sig.length / 2, "Signature and keyPair length must be equal");
2391
- return chunkArray(sig, 2).every(([r, s], i) => {
2392
- const rBN = toBN(r);
2393
- const sBN = toBN(s);
2394
- const w = sBN.invm(ec.n);
2395
- assertInRange(rBN, ONE, toBN(addHexPrefix(MAX_ECDSA_VAL)), "r");
2396
- assertInRange(sBN, ONE, toBN(addHexPrefix(EC_ORDER)), "s");
2397
- assertInRange(w, ONE, toBN(addHexPrefix(MAX_ECDSA_VAL)), "w");
2398
- return ec.verify(fixMessage(msgHash), { r: rBN, s: sBN }, keyPairArray[i]) ?? false;
2399
- });
2400
- }
2401
-
2402
- // src/utils/hash.ts
2403
- var transactionVersion = 1;
2404
- var feeTransactionVersion = toBN(2).pow(toBN(128)).add(toBN(transactionVersion));
2405
- function keccakBn(value) {
2406
- const hexWithoutPrefix = removeHexPrefix(toHex(toBN(value)));
2407
- const evenHex = hexWithoutPrefix.length % 2 === 0 ? hexWithoutPrefix : `0${hexWithoutPrefix}`;
2408
- return addHexPrefix(buf2hex((0, import_keccak.keccak256)((0, import_utils.hexToBytes)(evenHex))));
2409
- }
2410
- function keccakHex(value) {
2411
- return addHexPrefix(buf2hex((0, import_keccak.keccak256)(utf8ToArray(value))));
2412
- }
2413
- function starknetKeccak(value) {
2414
- return toBN(keccakHex(value)).and(MASK_250);
2415
- }
2416
- function getSelectorFromName(funcName) {
2417
- return toHex(starknetKeccak(funcName));
2418
- }
2419
- function getSelector(value) {
2420
- if (isHex(value)) {
2421
- return value;
2422
- }
2423
- if (isStringWholeNumber(value)) {
2424
- return toHexString(value);
2425
- }
2426
- return getSelectorFromName(value);
2427
- }
2428
- var constantPoints = CONSTANT_POINTS.map(
2429
- (coords) => ec.curve.point(coords[0], coords[1])
2430
- );
2431
- function pedersen(input) {
2432
- let point = constantPoints[0];
2433
- for (let i = 0; i < input.length; i += 1) {
2434
- let x = toBN(input[i]);
2435
- (0, import_minimalistic_assert3.default)(x.gte(ZERO) && x.lt(toBN(addHexPrefix(FIELD_PRIME))), `Invalid input: ${input[i]}`);
2436
- if (!x.isZero()) {
2437
- for (let j = 0; j < 252; j += 1) {
2438
- const pt = constantPoints[2 + i * 252 + j];
2439
- (0, import_minimalistic_assert3.default)(!point.getX().eq(pt.getX()));
2440
- if (x.and(ONE).toNumber() !== 0) {
2441
- point = point.add(pt);
2442
- }
2443
- x = x.shrn(1);
2444
- }
2445
- }
2446
- }
2447
- return addHexPrefix(point.getX().toString(16));
2448
- }
2449
- function computeHashOnElements(data) {
2450
- return [...data, data.length].reduce((x, y) => pedersen([x, y]), 0).toString();
2451
- }
2452
- function calculateTransactionHashCommon(txHashPrefix, version, contractAddress, entryPointSelector, calldata, maxFee, chainId, additionalData = []) {
2453
- const calldataHash = computeHashOnElements(calldata);
2454
- const dataToHash = [
2455
- txHashPrefix,
2456
- version,
2457
- contractAddress,
2458
- entryPointSelector,
2459
- calldataHash,
2460
- maxFee,
2461
- chainId,
2462
- ...additionalData
2463
- ];
2464
- return computeHashOnElements(dataToHash);
2465
- }
2466
- function calculateDeployTransactionHash(contractAddress, constructorCalldata, version, chainId) {
2467
- return calculateTransactionHashCommon(
2468
- "0x6465706c6f79" /* DEPLOY */,
2469
- version,
2470
- contractAddress,
2471
- getSelectorFromName("constructor"),
2472
- constructorCalldata,
2473
- ZERO,
2474
- chainId
2475
- );
2476
- }
2477
- function calculateDeclareTransactionHash(classHash, senderAddress, version, maxFee, chainId, nonce) {
2478
- return calculateTransactionHashCommon(
2479
- "0x6465636c617265" /* DECLARE */,
2480
- version,
2481
- senderAddress,
2482
- 0,
2483
- [classHash],
2484
- maxFee,
2485
- chainId,
2486
- [nonce]
2487
- );
2488
- }
2489
- function calculateDeployAccountTransactionHash(contractAddress, classHash, constructorCalldata, salt, version, maxFee, chainId, nonce) {
2490
- const calldata = [classHash, salt, ...constructorCalldata];
2491
- return calculateTransactionHashCommon(
2492
- "0x6465706c6f795f6163636f756e74" /* DEPLOY_ACCOUNT */,
2493
- version,
2494
- contractAddress,
2495
- 0,
2496
- calldata,
2497
- maxFee,
2498
- chainId,
2499
- [nonce]
2500
- );
2501
- }
2502
- function calculateTransactionHash(contractAddress, version, calldata, maxFee, chainId, nonce) {
2503
- return calculateTransactionHashCommon(
2504
- "0x696e766f6b65" /* INVOKE */,
2505
- version,
2506
- contractAddress,
2507
- 0,
2508
- calldata,
2509
- maxFee,
2510
- chainId,
2511
- [nonce]
2512
- );
2513
- }
2514
- function calculateContractAddressFromHash(salt, classHash, constructorCalldata, deployerAddress) {
2515
- const constructorCalldataHash = computeHashOnElements(constructorCalldata);
2516
- const CONTRACT_ADDRESS_PREFIX = toFelt("0x535441524b4e45545f434f4e54524143545f41444452455353");
2517
- const dataToHash = [
2518
- CONTRACT_ADDRESS_PREFIX,
2519
- deployerAddress,
2520
- salt,
2521
- classHash,
2522
- constructorCalldataHash
2523
- ];
2524
- return computeHashOnElements(dataToHash);
2525
- }
2526
-
2527
- // src/utils/json.ts
2528
- var json_exports = {};
2529
- __export(json_exports, {
2530
- default: () => json_default,
2531
- parse: () => parse,
2532
- parseAlwaysAsBig: () => parseAlwaysAsBig,
2533
- stringify: () => stringify,
2534
- stringifyAlwaysAsBig: () => stringifyAlwaysAsBig
2535
- });
2536
- var import_json_bigint = __toESM(require("json-bigint"));
2537
- var json = (alwaysParseAsBig) => {
2538
- return (0, import_json_bigint.default)({
2539
- alwaysParseAsBig,
2540
- useNativeBigInt: true,
2541
- protoAction: "preserve",
2542
- constructorAction: "preserve"
2543
- });
2544
- };
2545
- var { parse, stringify } = json(false);
2546
- var { parse: parseAlwaysAsBig, stringify: stringifyAlwaysAsBig } = json(true);
2547
- var json_default = { parse, stringify };
2548
-
2549
- // src/utils/stark.ts
2550
- var stark_exports = {};
2551
- __export(stark_exports, {
2552
- compileCalldata: () => compileCalldata,
2553
- compressProgram: () => compressProgram,
2554
- estimatedFeeToMaxFee: () => estimatedFeeToMaxFee,
2555
- formatSignature: () => formatSignature,
2556
- makeAddress: () => makeAddress,
2557
- randomAddress: () => randomAddress
2558
- });
2559
- var import_pako = require("pako");
2560
- function compressProgram(jsonProgram) {
2561
- const stringified = typeof jsonProgram === "string" ? jsonProgram : stringify(jsonProgram);
2562
- const compressedProgram = (0, import_pako.gzip)(stringified);
2563
- return btoaUniversal(compressedProgram);
2564
- }
2565
- function randomAddress() {
2566
- const randomKeyPair = genKeyPair();
2567
- return getStarkKey(randomKeyPair);
2568
- }
2569
- function makeAddress(input) {
2570
- return addHexPrefix(input).toLowerCase();
2571
- }
2572
- function formatSignature(sig) {
2573
- if (!sig)
2574
- return [];
2575
- try {
2576
- return sig.map((x) => toBN(x)).map((x) => x.toString());
2577
- } catch (e) {
2578
- return [];
2579
- }
2580
- }
2581
- function compileCalldata(args) {
2582
- return Object.values(args).flatMap((value) => {
2583
- if (Array.isArray(value))
2584
- return [toBN(value.length).toString(), ...value.map((x) => toBN(x).toString())];
2585
- if (typeof value === "object" && "type" in value)
2586
- return Object.entries(value).filter(([k]) => k !== "type").map(([, v]) => toBN(v).toString());
2587
- return toBN(value).toString();
2588
- });
2589
- }
2590
- function estimatedFeeToMaxFee(estimatedFee, overhead = 0.5) {
2591
- const overHeadPercent = Math.round((1 + overhead) * 100);
2592
- return toBN(estimatedFee).mul(toBN(overHeadPercent)).div(toBN(100));
2593
- }
2594
-
2595
- // src/utils/provider.ts
2596
- function wait(delay) {
2597
- return new Promise((res) => {
2598
- setTimeout(res, delay);
2599
- });
2600
- }
2601
- function parseCalldata(calldata = []) {
2602
- return calldata.map((data) => {
2603
- if (typeof data === "string" && isHex(data)) {
2604
- return data;
2605
- }
2606
- return toHex(toBN(data));
2607
- });
2608
- }
2609
- function parseContract(contract) {
2610
- const parsedContract = typeof contract === "string" ? parse(contract) : contract;
2611
- return {
2612
- ...parsedContract,
2613
- program: compressProgram(parsedContract.program)
2614
- };
2615
- }
2616
-
2617
- // src/utils/responseParser/rpc.ts
2618
- var RPCResponseParser = class {
2619
- parseGetBlockResponse(res) {
2620
- return {
2621
- timestamp: res.timestamp,
2622
- block_hash: res.block_hash,
2623
- block_number: res.block_number,
2624
- new_root: res.new_root,
2625
- parent_hash: res.parent_hash,
2626
- status: res.status,
2627
- transactions: res.transactions
2628
- };
2629
- }
2630
- parseGetTransactionResponse(res) {
2631
- return {
2632
- calldata: res.calldata || [],
2633
- contract_address: res.contract_address,
2634
- max_fee: res.max_fee,
2635
- nonce: res.nonce,
2636
- signature: res.signature || [],
2637
- transaction_hash: res.transaction_hash,
2638
- version: res.version
2639
- };
2640
- }
2641
- parseFeeEstimateResponse(res) {
2642
- return {
2643
- overall_fee: toBN(res.overall_fee),
2644
- gas_consumed: toBN(res.gas_consumed),
2645
- gas_price: toBN(res.gas_price)
2646
- };
2647
- }
2648
- parseCallContractResponse(res) {
2649
- return {
2650
- result: res
2651
- };
2652
- }
2653
- };
2654
-
2655
- // src/provider/utils.ts
2656
- var import_bn2 = require("bn.js");
2657
- var validBlockTags = ["latest", "pending"];
2658
- var Block = class {
2659
- constructor(_identifier) {
2660
- this.hash = null;
2661
- this.number = null;
2662
- this.tag = null;
2663
- this.valueOf = () => this.number;
2664
- this.toString = () => this.hash;
2665
- this.setIdentifier(_identifier);
2666
- }
2667
- setIdentifier(__identifier) {
2668
- if (typeof __identifier === "string" && isHex(__identifier)) {
2669
- this.hash = __identifier;
2670
- } else if (import_bn2.BN.isBN(__identifier)) {
2671
- this.hash = toHex(__identifier);
2672
- } else if (typeof __identifier === "number") {
2673
- this.number = __identifier;
2674
- } else if (typeof __identifier === "string" && validBlockTags.includes(__identifier)) {
2675
- this.tag = __identifier;
2676
- } else {
2677
- this.tag = "pending";
2678
- }
2679
- }
2680
- get queryIdentifier() {
2681
- if (this.number !== null) {
2682
- return `blockNumber=${this.number}`;
2683
- }
2684
- if (this.hash !== null) {
2685
- return `blockHash=${this.hash}`;
2686
- }
2687
- return `blockNumber=${this.tag}`;
2688
- }
2689
- get identifier() {
2690
- if (this.number !== null) {
2691
- return { block_number: this.number };
2692
- }
2693
- if (this.hash !== null) {
2694
- return { block_hash: this.hash };
2695
- }
2696
- return this.tag;
2697
- }
2698
- set identifier(_identifier) {
2699
- this.setIdentifier(_identifier);
2700
- }
2701
- };
2702
-
2703
- // src/provider/rpc.ts
2704
- var defaultOptions = {
2705
- headers: { "Content-Type": "application/json" },
2706
- blockIdentifier: "latest",
2707
- retries: 200
2708
- };
2709
- var RpcProvider = class {
2710
- constructor(optionsOrProvider) {
2711
- this.responseParser = new RPCResponseParser();
2712
- const { nodeUrl, retries, headers, blockIdentifier } = optionsOrProvider;
2713
- this.nodeUrl = nodeUrl;
2714
- this.retries = retries || defaultOptions.retries;
2715
- this.headers = { ...defaultOptions.headers, ...headers };
2716
- this.blockIdentifier = blockIdentifier || defaultOptions.blockIdentifier;
2717
- this.getChainId().then((chainId) => {
2718
- this.chainId = chainId;
2719
- });
2720
- }
2721
- fetch(method, params) {
2722
- return fetchPonyfill_default(this.nodeUrl, {
2723
- method: "POST",
2724
- body: stringify({ method, jsonrpc: "2.0", params, id: 0 }),
2725
- headers: this.headers
2726
- });
2727
- }
2728
- errorHandler(error) {
2729
- if (error) {
2730
- const { code, message } = error;
2731
- throw new Error(`${code}: ${message}`);
2732
- }
2733
- }
2734
- async fetchEndpoint(method, params) {
2735
- var _a;
2736
- try {
2737
- const rawResult = await this.fetch(method, params);
2738
- const { error, result } = await rawResult.json();
2739
- this.errorHandler(error);
2740
- return result;
2741
- } catch (error) {
2742
- this.errorHandler((_a = error == null ? void 0 : error.response) == null ? void 0 : _a.data);
2743
- throw error;
2744
- }
2745
- }
2746
- async getChainId() {
2747
- return this.fetchEndpoint("starknet_chainId");
2748
- }
2749
- async getBlock(blockIdentifier = this.blockIdentifier) {
2750
- return this.getBlockWithTxHashes(blockIdentifier).then(
2751
- this.responseParser.parseGetBlockResponse
2752
- );
2753
- }
2754
- async getBlockHashAndNumber() {
2755
- return this.fetchEndpoint("starknet_blockHashAndNumber");
2756
- }
2757
- async getBlockWithTxHashes(blockIdentifier = this.blockIdentifier) {
2758
- const block_id = new Block(blockIdentifier).identifier;
2759
- return this.fetchEndpoint("starknet_getBlockWithTxHashes", { block_id });
2760
- }
2761
- async getBlockWithTxs(blockIdentifier = this.blockIdentifier) {
2762
- const block_id = new Block(blockIdentifier).identifier;
2763
- return this.fetchEndpoint("starknet_getBlockWithTxs", { block_id });
2764
- }
2765
- async getClassHashAt(contractAddress, blockIdentifier = this.blockIdentifier) {
2766
- const block_id = new Block(blockIdentifier).identifier;
2767
- return this.fetchEndpoint("starknet_getClassHashAt", {
2768
- block_id,
2769
- contract_address: contractAddress
2770
- });
2771
- }
2772
- async getNonceForAddress(contractAddress, blockIdentifier = this.blockIdentifier) {
2773
- const block_id = new Block(blockIdentifier).identifier;
2774
- return this.fetchEndpoint("starknet_getNonce", {
2775
- contract_address: contractAddress,
2776
- block_id
2777
- });
2778
- }
2779
- async getPendingTransactions() {
2780
- return this.fetchEndpoint("starknet_pendingTransactions");
2781
- }
2782
- async getProtocolVersion() {
2783
- throw new Error("Pathfinder does not implement this rpc 0.1.0 method");
2784
- }
2785
- async getStateUpdate(blockIdentifier = this.blockIdentifier) {
2786
- const block_id = new Block(blockIdentifier).identifier;
2787
- return this.fetchEndpoint("starknet_getStateUpdate", { block_id });
2788
- }
2789
- async getStorageAt(contractAddress, key, blockIdentifier = this.blockIdentifier) {
2790
- const parsedKey = toHex(toBN(key));
2791
- const block_id = new Block(blockIdentifier).identifier;
2792
- return this.fetchEndpoint("starknet_getStorageAt", {
2793
- contract_address: contractAddress,
2794
- key: parsedKey,
2795
- block_id
2796
- });
2797
- }
2798
- async getTransaction(txHash) {
2799
- return this.getTransactionByHash(txHash).then(this.responseParser.parseGetTransactionResponse);
2800
- }
2801
- async getTransactionByHash(txHash) {
2802
- return this.fetchEndpoint("starknet_getTransactionByHash", { transaction_hash: txHash });
2803
- }
2804
- async getTransactionByBlockIdAndIndex(blockIdentifier, index) {
2805
- const block_id = new Block(blockIdentifier).identifier;
2806
- return this.fetchEndpoint("starknet_getTransactionByBlockIdAndIndex", { block_id, index });
2807
- }
2808
- async getTransactionReceipt(txHash) {
2809
- return this.fetchEndpoint("starknet_getTransactionReceipt", { transaction_hash: txHash });
2810
- }
2811
- async getClassByHash(classHash) {
2812
- return this.getClass(classHash);
2813
- }
2814
- async getClass(classHash, blockIdentifier = this.blockIdentifier) {
2815
- const block_id = new Block(blockIdentifier).identifier;
2816
- return this.fetchEndpoint("starknet_getClass", { class_hash: classHash, block_id });
2817
- }
2818
- async getClassAt(contractAddress, blockIdentifier = this.blockIdentifier) {
2819
- const block_id = new Block(blockIdentifier).identifier;
2820
- return this.fetchEndpoint("starknet_getClassAt", {
2821
- block_id,
2822
- contract_address: contractAddress
2823
- });
2824
- }
2825
- async getCode(_contractAddress, _blockIdentifier) {
2826
- throw new Error("RPC does not implement getCode function");
2827
- }
2828
- async getEstimateFee(invocation, invocationDetails, blockIdentifier = this.blockIdentifier) {
2829
- return this.getInvokeEstimateFee(invocation, invocationDetails, blockIdentifier);
2830
- }
2831
- async getInvokeEstimateFee(invocation, invocationDetails, blockIdentifier = this.blockIdentifier) {
2832
- const block_id = new Block(blockIdentifier).identifier;
2833
- return this.fetchEndpoint("starknet_estimateFee", {
2834
- request: {
2835
- type: "INVOKE",
2836
- sender_address: invocation.contractAddress,
2837
- calldata: parseCalldata(invocation.calldata),
2838
- signature: bigNumberishArrayToHexadecimalStringArray(invocation.signature || []),
2839
- version: toHex(toBN((invocationDetails == null ? void 0 : invocationDetails.version) || 0)),
2840
- nonce: toHex(toBN(invocationDetails.nonce)),
2841
- max_fee: toHex(toBN((invocationDetails == null ? void 0 : invocationDetails.maxFee) || 0))
2842
- },
2843
- block_id
2844
- }).then(this.responseParser.parseFeeEstimateResponse);
2845
- }
2846
- async getDeclareEstimateFee({ senderAddress, contractDefinition, signature }, details, blockIdentifier = this.blockIdentifier) {
2847
- const block_id = new Block(blockIdentifier).identifier;
2848
- return this.fetchEndpoint("starknet_estimateFee", {
2849
- request: {
2850
- type: "DECLARE",
2851
- contract_class: {
2852
- program: contractDefinition.program,
2853
- entry_points_by_type: contractDefinition.entry_points_by_type,
2854
- abi: contractDefinition.abi
2855
- },
2856
- sender_address: senderAddress,
2857
- signature: bigNumberishArrayToHexadecimalStringArray(signature || []),
2858
- version: toHex(toBN((details == null ? void 0 : details.version) || 0)),
2859
- nonce: toHex(toBN(details.nonce)),
2860
- max_fee: toHex(toBN((details == null ? void 0 : details.maxFee) || 0))
2861
- },
2862
- block_id
2863
- }).then(this.responseParser.parseFeeEstimateResponse);
2864
- }
2865
- async getDeployAccountEstimateFee({ classHash, constructorCalldata, addressSalt, signature }, details, blockIdentifier = this.blockIdentifier) {
2866
- const block_id = new Block(blockIdentifier).identifier;
2867
- return this.fetchEndpoint("starknet_estimateFee", {
2868
- request: {
2869
- type: "DEPLOY_ACCOUNT",
2870
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
2871
- class_hash: toHex(toBN(classHash)),
2872
- contract_address_salt: toHex(toBN(addressSalt || 0)),
2873
- signature: bigNumberishArrayToHexadecimalStringArray(signature || []),
2874
- version: toHex(toBN((details == null ? void 0 : details.version) || 0)),
2875
- nonce: toHex(toBN(details.nonce)),
2876
- max_fee: toHex(toBN((details == null ? void 0 : details.maxFee) || 0))
2877
- },
2878
- block_id
2879
- }).then(this.responseParser.parseFeeEstimateResponse);
2880
- }
2881
- async declareContract({ contractDefinition, signature, senderAddress }, details) {
2882
- return this.fetchEndpoint("starknet_addDeclareTransaction", {
2883
- declare_transaction: {
2884
- contract_class: {
2885
- program: contractDefinition.program,
2886
- entry_points_by_type: contractDefinition.entry_points_by_type,
2887
- abi: contractDefinition.abi
2888
- },
2889
- type: "DECLARE",
2890
- version: toHex(toBN(details.version || 0)),
2891
- max_fee: toHex(toBN(details.maxFee || 0)),
2892
- signature: bigNumberishArrayToHexadecimalStringArray(signature || []),
2893
- sender_address: senderAddress,
2894
- nonce: toHex(toBN(details.nonce))
2895
- }
2896
- });
2897
- }
2898
- async deployAccountContract({ classHash, constructorCalldata, addressSalt, signature }, details) {
2899
- return this.fetchEndpoint("starknet_addDeployAccountTransaction", {
2900
- constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []),
2901
- class_hash: toHex(toBN(classHash)),
2902
- contract_address_salt: toHex(toBN(addressSalt || 0)),
2903
- type: "DEPLOY",
2904
- max_fee: toHex(toBN(details.maxFee || 0)),
2905
- version: toHex(toBN(details.version || 0)),
2906
- signature: bigNumberishArrayToHexadecimalStringArray(signature || []),
2907
- nonce: toHex(toBN(details.nonce))
2908
- });
2909
- }
2910
- async invokeFunction(functionInvocation, details) {
2911
- return this.fetchEndpoint("starknet_addInvokeTransaction", {
2912
- invoke_transaction: {
2913
- sender_address: functionInvocation.contractAddress,
2914
- calldata: parseCalldata(functionInvocation.calldata),
2915
- type: "INVOKE",
2916
- max_fee: toHex(toBN(details.maxFee || 0)),
2917
- version: toHex(toBN(details.version || 0)),
2918
- signature: bigNumberishArrayToHexadecimalStringArray(functionInvocation.signature || []),
2919
- nonce: toHex(toBN(details.nonce))
2920
- }
2921
- });
2922
- }
2923
- async callContract(call, blockIdentifier = this.blockIdentifier) {
2924
- const block_id = new Block(blockIdentifier).identifier;
2925
- const result = await this.fetchEndpoint("starknet_call", {
2926
- request: {
2927
- contract_address: call.contractAddress,
2928
- entry_point_selector: getSelectorFromName(call.entrypoint),
2929
- calldata: parseCalldata(call.calldata)
2930
- },
2931
- block_id
2932
- });
2933
- return this.responseParser.parseCallContractResponse(result);
2934
- }
2935
- async traceTransaction(transactionHash) {
2936
- return this.fetchEndpoint("starknet_traceTransaction", { transaction_hash: transactionHash });
2937
- }
2938
- async traceBlockTransactions(blockHash) {
2939
- return this.fetchEndpoint("starknet_traceBlockTransactions", { block_hash: blockHash });
2940
- }
2941
- async waitForTransaction(txHash, retryInterval = 8e3, successStates = ["ACCEPTED_ON_L1", "ACCEPTED_ON_L2", "PENDING"]) {
2942
- const errorStates = ["REJECTED", "NOT_RECEIVED"];
2943
- let { retries } = this;
2944
- let onchain = false;
2945
- let txReceipt = {};
2946
- while (!onchain) {
2947
- await wait(retryInterval);
2948
- try {
2949
- txReceipt = await this.getTransactionReceipt(txHash);
2950
- if (!("status" in txReceipt)) {
2951
- const error = new Error("pending transaction");
2952
- throw error;
2953
- }
2954
- if (txReceipt.status && successStates.includes(txReceipt.status)) {
2955
- onchain = true;
2956
- } else if (txReceipt.status && errorStates.includes(txReceipt.status)) {
2957
- const message = txReceipt.status;
2958
- const error = new Error(message);
2959
- error.response = txReceipt;
2960
- throw error;
2961
- }
2962
- } catch (error) {
2963
- if (error instanceof Error && errorStates.includes(error.message)) {
2964
- throw error;
2965
- }
2966
- if (retries === 0) {
2967
- throw new Error(`waitForTransaction timed-out with retries ${this.retries}`);
2968
- }
2969
- }
2970
- retries -= 1;
2971
- }
2972
- await wait(retryInterval);
2973
- return txReceipt;
2974
- }
2975
- async getTransactionCount(blockIdentifier = this.blockIdentifier) {
2976
- const block_id = new Block(blockIdentifier).identifier;
2977
- return this.fetchEndpoint("starknet_getBlockTransactionCount", { block_id });
2978
- }
2979
- async getBlockNumber() {
2980
- return this.fetchEndpoint("starknet_blockNumber");
2981
- }
2982
- async getSyncingStats() {
2983
- return this.fetchEndpoint("starknet_syncing");
2984
- }
2985
- async getEvents(eventFilter) {
2986
- return this.fetchEndpoint("starknet_getEvents", { filter: eventFilter });
2987
- }
2988
- };
2989
-
2990
- // src/provider/sequencer.ts
2991
- var import_url_join2 = __toESM(require("url-join"));
2992
-
2993
- // src/utils/responseParser/index.ts
2994
- var ResponseParser = class {
2995
- };
2996
-
2997
- // src/utils/responseParser/sequencer.ts
2998
- var SequencerAPIResponseParser = class extends ResponseParser {
2999
- parseGetBlockResponse(res) {
3000
- return {
3001
- ...res,
3002
- new_root: res.state_root,
3003
- parent_hash: res.parent_block_hash,
3004
- transactions: Object.values(res.transactions).map((value) => "transaction_hash" in value && value.transaction_hash).filter(Boolean)
3005
- };
3006
- }
3007
- parseGetTransactionResponse(res) {
3008
- return {
3009
- ...res,
3010
- calldata: "calldata" in res.transaction ? res.transaction.calldata : [],
3011
- contract_address: "contract_address" in res.transaction ? res.transaction.contract_address : void 0,
3012
- contract_class: "contract_class" in res.transaction ? res.transaction.contract_class : void 0,
3013
- entry_point_selector: "entry_point_selector" in res.transaction ? res.transaction.entry_point_selector : void 0,
3014
- max_fee: "max_fee" in res.transaction ? res.transaction.max_fee : void 0,
3015
- nonce: res.transaction.nonce,
3016
- sender_address: "sender_address" in res.transaction ? res.transaction.sender_address : void 0,
3017
- signature: "signature" in res.transaction ? res.transaction.signature : void 0,
3018
- transaction_hash: "transaction_hash" in res.transaction ? res.transaction.transaction_hash : void 0,
3019
- version: "version" in res.transaction ? res.transaction.version : void 0
3020
- };
3021
- }
3022
- parseGetTransactionReceiptResponse(res) {
3023
- return {
3024
- transaction_hash: res.transaction_hash,
3025
- status: res.status,
3026
- messages_sent: res.l2_to_l1_messages,
3027
- events: res.events,
3028
- ..."block_hash" in res && { block_hash: res.block_hash },
3029
- ..."block_number" in res && { block_number: res.block_number },
3030
- ..."actual_fee" in res && { actual_fee: res.actual_fee },
3031
- ..."transaction_index" in res && { transaction_index: res.transaction_index },
3032
- ..."execution_resources" in res && { execution_resources: res.execution_resources },
3033
- ..."l1_to_l2_consumed_message" in res && {
3034
- l1_to_l2_consumed_message: res["l1_to_l2_consumed_message"]
3035
- },
3036
- ..."transaction_failure_reason" in res && {
3037
- transaction_failure_reason: res.transaction_failure_reason
3038
- }
3039
- };
3040
- }
3041
- parseFeeEstimateResponse(res) {
3042
- if ("overall_fee" in res) {
3043
- let gasInfo = {};
3044
- try {
3045
- gasInfo = {
3046
- gas_consumed: toBN(res.gas_usage),
3047
- gas_price: toBN(res.gas_price)
3048
- };
3049
- } catch {
3050
- }
3051
- return {
3052
- overall_fee: toBN(res.overall_fee),
3053
- ...gasInfo
3054
- };
3055
- }
3056
- return {
3057
- overall_fee: toBN(res.amount)
3058
- };
3059
- }
3060
- parseCallContractResponse(res) {
3061
- return {
3062
- result: res.result
3063
- };
3064
- }
3065
- parseInvokeFunctionResponse(res) {
3066
- return {
3067
- transaction_hash: res.transaction_hash
3068
- };
3069
- }
3070
- parseDeployContractResponse(res) {
3071
- return {
3072
- transaction_hash: res.transaction_hash,
3073
- contract_address: res.address
3074
- };
3075
- }
3076
- parseDeclareContractResponse(res) {
3077
- return {
3078
- transaction_hash: res.transaction_hash,
3079
- class_hash: res.class_hash
3080
- };
3081
- }
3082
- };
3083
-
3084
- // src/utils/url.ts
3085
- var import_url_join = __toESM(require("url-join"));
3086
- var protocolAndDomainRE = /^(?:\w+:)?\/\/(\S+)$/;
3087
- var localhostDomainRE = /^localhost[:?\d]*(?:[^:?\d]\S*)?$/;
3088
- var nonLocalhostDomainRE = /^[^\s.]+\.\S{2,}$/;
3089
- function isUrl(s) {
3090
- if (!s) {
3091
- return false;
3092
- }
3093
- if (typeof s !== "string") {
3094
- return false;
3095
- }
3096
- const match = s.match(protocolAndDomainRE);
3097
- if (!match) {
3098
- return false;
3099
- }
3100
- const everythingAfterProtocol = match[1];
3101
- if (!everythingAfterProtocol) {
3102
- return false;
3103
- }
3104
- if (localhostDomainRE.test(everythingAfterProtocol) || nonLocalhostDomainRE.test(everythingAfterProtocol)) {
3105
- return true;
3106
- }
3107
- return false;
3108
- }
3109
- function buildUrl(baseUrl, defaultPath, urlOrPath) {
3110
- return isUrl(urlOrPath) ? urlOrPath : (0, import_url_join.default)(baseUrl, urlOrPath ?? defaultPath);
3111
- }
3112
-
3113
- // src/provider/errors.ts
3114
- var import_ts_custom_error = require("ts-custom-error");
3115
- var GatewayError = class extends import_ts_custom_error.CustomError {
3116
- constructor(message, errorCode) {
3117
- super(message);
3118
- this.errorCode = errorCode;
3119
- }
3120
- };
3121
- var HttpError = class extends import_ts_custom_error.CustomError {
3122
- constructor(message, errorCode) {
3123
- super(message);
3124
- this.errorCode = errorCode;
3125
- }
3126
- };
3127
-
3128
- // src/provider/sequencer.ts
3129
- function isEmptyQueryObject(obj) {
3130
- return obj === void 0 || Object.keys(obj).length === 0 || Object.keys(obj).length === 1 && Object.entries(obj).every(([k, v]) => k === "blockIdentifier" && v === null);
3131
- }
3132
- var defaultOptions2 = {
3133
- network: "goerli-alpha-2",
3134
- blockIdentifier: "pending"
3135
- };
3136
- var SequencerProvider = class {
3137
- constructor(optionsOrProvider = defaultOptions2) {
3138
- this.responseParser = new SequencerAPIResponseParser();
3139
- if ("network" in optionsOrProvider) {
3140
- this.baseUrl = SequencerProvider.getNetworkFromName(optionsOrProvider.network);
3141
- this.feederGatewayUrl = buildUrl(this.baseUrl, "feeder_gateway");
3142
- this.gatewayUrl = buildUrl(this.baseUrl, "gateway");
3143
- } else {
3144
- this.baseUrl = optionsOrProvider.baseUrl;
3145
- this.feederGatewayUrl = buildUrl(
3146
- this.baseUrl,
3147
- "feeder_gateway",
3148
- optionsOrProvider.feederGatewayUrl
3149
- );
3150
- this.gatewayUrl = buildUrl(this.baseUrl, "gateway", optionsOrProvider.gatewayUrl);
3151
- }
3152
- this.chainId = (optionsOrProvider == null ? void 0 : optionsOrProvider.chainId) ?? SequencerProvider.getChainIdFromBaseUrl(this.baseUrl);
3153
- this.headers = optionsOrProvider.headers;
3154
- this.blockIdentifier = (optionsOrProvider == null ? void 0 : optionsOrProvider.blockIdentifier) || defaultOptions2.blockIdentifier;
3155
- }
3156
- static getNetworkFromName(name) {
3157
- switch (name) {
3158
- case "mainnet-alpha":
3159
- return "https://alpha-mainnet.starknet.io";
3160
- case "goerli-alpha":
3161
- return "https://alpha4.starknet.io";
3162
- case "goerli-alpha-2":
3163
- return "https://alpha4-2.starknet.io";
3164
- default:
3165
- return "https://alpha4.starknet.io";
3166
- }
3167
- }
3168
- static getChainIdFromBaseUrl(baseUrl) {
3169
- try {
3170
- const url = new URL(baseUrl);
3171
- if (url.host.includes("mainnet.starknet.io")) {
3172
- return "0x534e5f4d41494e" /* MAINNET */;
3173
- }
3174
- if (url.host.includes("alpha4-2.starknet.io")) {
3175
- return "0x534e5f474f45524c4932" /* TESTNET2 */;
3176
- }
3177
- } catch {
3178
- console.error(`Could not parse baseUrl: ${baseUrl}`);
3179
- }
3180
- return "0x534e5f474f45524c49" /* TESTNET */;
3181
- }
3182
- getFetchUrl(endpoint) {
3183
- const gatewayUrlEndpoints = ["add_transaction"];
3184
- return gatewayUrlEndpoints.includes(endpoint) ? this.gatewayUrl : this.feederGatewayUrl;
3185
- }
3186
- getFetchMethod(endpoint) {
3187
- const postMethodEndpoints = [
3188
- "add_transaction",
3189
- "call_contract",
3190
- "estimate_fee",
3191
- "estimate_message_fee"
3192
- ];
3193
- return postMethodEndpoints.includes(endpoint) ? "POST" : "GET";
3194
- }
3195
- getQueryString(query) {
3196
- if (isEmptyQueryObject(query)) {
3197
- return "";
3198
- }
3199
- const queryString = Object.entries(query).map(([key, value]) => {
3200
- if (key === "blockIdentifier") {
3201
- const block = new Block(value);
3202
- return `${block.queryIdentifier}`;
3203
- }
3204
- return `${key}=${value}`;
3205
- }).join("&");
3206
- return `?${queryString}`;
3207
- }
3208
- getHeaders(method) {
3209
- if (method === "POST") {
3210
- return {
3211
- "Content-Type": "application/json",
3212
- ...this.headers
3213
- };
3214
- }
3215
- return this.headers;
3216
- }
3217
- async fetchEndpoint(endpoint, ...[query, request]) {
3218
- const baseUrl = this.getFetchUrl(endpoint);
3219
- const method = this.getFetchMethod(endpoint);
3220
- const queryString = this.getQueryString(query);
3221
- const headers = this.getHeaders(method);
3222
- const url = (0, import_url_join2.default)(baseUrl, endpoint, queryString);
3223
- try {
3224
- const res = await fetchPonyfill_default(url, {
3225
- method,
3226
- body: stringify(request),
3227
- headers
3228
- });
3229
- const textResponse = await res.text();
3230
- if (!res.ok) {
3231
- let responseBody;
3232
- try {
3233
- responseBody = parse(textResponse);
3234
- } catch {
3235
- throw new HttpError(res.statusText, res.status);
3236
- }
3237
- const errorCode = responseBody.code || (responseBody == null ? void 0 : responseBody.status_code);
3238
- throw new GatewayError(responseBody.message, errorCode);
3239
- }
3240
- if (endpoint === "estimate_fee") {
3241
- return parseAlwaysAsBig(textResponse, (_, v) => {
3242
- if (v && typeof v === "bigint") {
3243
- return toBN(v.toString());
3244
- }
3245
- return v;
3246
- });
3247
- }
3248
- return parse(textResponse);
3249
- } catch (err) {
3250
- if (err instanceof GatewayError || err instanceof HttpError) {
3251
- throw err;
3252
- }
3253
- if (err instanceof Error) {
3254
- throw Error(`Could not ${method} from endpoint \`${url}\`: ${err.message}`);
3255
- }
3256
- throw err;
3257
- }
3258
- }
3259
- async getChainId() {
3260
- return Promise.resolve(this.chainId);
3261
- }
3262
- async callContract({ contractAddress, entrypoint: entryPointSelector, calldata = [] }, blockIdentifier = this.blockIdentifier) {
3263
- return this.fetchEndpoint(
3264
- "call_contract",
3265
- { blockIdentifier },
3266
- {
3267
- signature: [],
3268
- contract_address: contractAddress,
3269
- entry_point_selector: getSelectorFromName(entryPointSelector),
3270
- calldata
3271
- }
3272
- ).then(this.responseParser.parseCallContractResponse);
3273
- }
3274
- async getBlock(blockIdentifier = this.blockIdentifier) {
3275
- return this.fetchEndpoint("get_block", { blockIdentifier }).then(
3276
- this.responseParser.parseGetBlockResponse
3277
- );
3278
- }
3279
- async getNonceForAddress(contractAddress, blockIdentifier = this.blockIdentifier) {
3280
- return this.fetchEndpoint("get_nonce", { contractAddress, blockIdentifier });
3281
- }
3282
- async getStorageAt(contractAddress, key, blockIdentifier = this.blockIdentifier) {
3283
- const parsedKey = toBN(key).toString(10);
3284
- return this.fetchEndpoint("get_storage_at", {
3285
- blockIdentifier,
3286
- contractAddress,
3287
- key: parsedKey
3288
- });
3289
- }
3290
- async getTransaction(txHash) {
3291
- const txHashHex = toHex(toBN(txHash));
3292
- return this.fetchEndpoint("get_transaction", { transactionHash: txHashHex }).then(
3293
- (value) => this.responseParser.parseGetTransactionResponse(value)
3294
- );
3295
- }
3296
- async getTransactionReceipt(txHash) {
3297
- const txHashHex = toHex(toBN(txHash));
3298
- return this.fetchEndpoint("get_transaction_receipt", { transactionHash: txHashHex }).then(
3299
- this.responseParser.parseGetTransactionReceiptResponse
3300
- );
3301
- }
3302
- async getClassAt(contractAddress, blockIdentifier = this.blockIdentifier) {
3303
- return this.fetchEndpoint("get_full_contract", { blockIdentifier, contractAddress }).then(
3304
- parseContract
3305
- );
3306
- }
3307
- async getClassHashAt(contractAddress, blockIdentifier = this.blockIdentifier) {
3308
- return this.fetchEndpoint("get_class_hash_at", { blockIdentifier, contractAddress });
3309
- }
3310
- async getClassByHash(classHash) {
3311
- return this.fetchEndpoint("get_class_by_hash", { classHash }).then(parseContract);
3312
- }
3313
- async invokeFunction(functionInvocation, details) {
3314
- return this.fetchEndpoint("add_transaction", void 0, {
3315
- type: "INVOKE_FUNCTION",
3316
- contract_address: functionInvocation.contractAddress,
3317
- calldata: bigNumberishArrayToDecimalStringArray(functionInvocation.calldata ?? []),
3318
- signature: bigNumberishArrayToDecimalStringArray(functionInvocation.signature ?? []),
3319
- nonce: toHex(toBN(details.nonce)),
3320
- max_fee: toHex(toBN(details.maxFee || 0)),
3321
- version: toHex(toBN(details.version || 1))
3322
- }).then(this.responseParser.parseInvokeFunctionResponse);
3323
- }
3324
- async deployAccountContract({ classHash, constructorCalldata, addressSalt, signature }, details) {
3325
- return this.fetchEndpoint("add_transaction", void 0, {
3326
- type: "DEPLOY_ACCOUNT",
3327
- contract_address_salt: addressSalt ?? randomAddress(),
3328
- constructor_calldata: bigNumberishArrayToDecimalStringArray(constructorCalldata ?? []),
3329
- class_hash: toHex(toBN(classHash)),
3330
- max_fee: toHex(toBN(details.maxFee || 0)),
3331
- version: toHex(toBN(details.version || 0)),
3332
- nonce: toHex(toBN(details.nonce)),
3333
- signature: bigNumberishArrayToDecimalStringArray(signature || [])
3334
- }).then(this.responseParser.parseDeployContractResponse);
3335
- }
3336
- async declareContract({ senderAddress, contractDefinition, signature }, details) {
3337
- return this.fetchEndpoint("add_transaction", void 0, {
3338
- type: "DECLARE",
3339
- contract_class: contractDefinition,
3340
- nonce: toHex(toBN(details.nonce)),
3341
- signature: bigNumberishArrayToDecimalStringArray(signature || []),
3342
- sender_address: senderAddress,
3343
- max_fee: toHex(toBN(details.maxFee || 0)),
3344
- version: toHex(toBN(details.version || 1))
3345
- }).then(this.responseParser.parseDeclareContractResponse);
3346
- }
3347
- async getEstimateFee(invocation, invocationDetails, blockIdentifier = this.blockIdentifier) {
3348
- return this.getInvokeEstimateFee(invocation, invocationDetails, blockIdentifier);
3349
- }
3350
- async getInvokeEstimateFee(invocation, invocationDetails, blockIdentifier = this.blockIdentifier) {
3351
- return this.fetchEndpoint(
3352
- "estimate_fee",
3353
- { blockIdentifier },
3354
- {
3355
- type: "INVOKE_FUNCTION",
3356
- contract_address: invocation.contractAddress,
3357
- calldata: invocation.calldata ?? [],
3358
- signature: bigNumberishArrayToDecimalStringArray(invocation.signature || []),
3359
- version: toHex(toBN((invocationDetails == null ? void 0 : invocationDetails.version) || 1)),
3360
- nonce: toHex(toBN(invocationDetails.nonce))
3361
- }
3362
- ).then(this.responseParser.parseFeeEstimateResponse);
3363
- }
3364
- async getDeclareEstimateFee({ senderAddress, contractDefinition, signature }, details, blockIdentifier = this.blockIdentifier) {
3365
- return this.fetchEndpoint(
3366
- "estimate_fee",
3367
- { blockIdentifier },
3368
- {
3369
- type: "DECLARE",
3370
- sender_address: senderAddress,
3371
- contract_class: contractDefinition,
3372
- signature: bigNumberishArrayToDecimalStringArray(signature || []),
3373
- version: toHex(toBN((details == null ? void 0 : details.version) || 1)),
3374
- nonce: toHex(toBN(details.nonce))
3375
- }
3376
- ).then(this.responseParser.parseFeeEstimateResponse);
3377
- }
3378
- async getDeployAccountEstimateFee({ classHash, addressSalt, constructorCalldata, signature }, details, blockIdentifier = this.blockIdentifier) {
3379
- return this.fetchEndpoint(
3380
- "estimate_fee",
3381
- { blockIdentifier },
3382
- {
3383
- type: "DEPLOY_ACCOUNT",
3384
- class_hash: toHex(toBN(classHash)),
3385
- constructor_calldata: bigNumberishArrayToDecimalStringArray(constructorCalldata || []),
3386
- contract_address_salt: toHex(toBN(addressSalt || 0)),
3387
- signature: bigNumberishArrayToDecimalStringArray(signature || []),
3388
- version: toHex(toBN((details == null ? void 0 : details.version) || 0)),
3389
- nonce: toHex(toBN(details.nonce))
3390
- }
3391
- ).then(this.responseParser.parseFeeEstimateResponse);
3392
- }
3393
- async getCode(contractAddress, blockIdentifier = this.blockIdentifier) {
3394
- return this.fetchEndpoint("get_code", { contractAddress, blockIdentifier });
3395
- }
3396
- async waitForTransaction(txHash, retryInterval = 8e3, successStates = ["ACCEPTED_ON_L1", "ACCEPTED_ON_L2", "PENDING"]) {
3397
- const errorStates = ["REJECTED", "NOT_RECEIVED"];
3398
- let onchain = false;
3399
- let res;
3400
- while (!onchain) {
3401
- await wait(retryInterval);
3402
- res = await this.getTransactionStatus(txHash);
3403
- if (successStates.includes(res.tx_status)) {
3404
- onchain = true;
3405
- } else if (errorStates.includes(res.tx_status)) {
3406
- const message = res.tx_failure_reason ? `${res.tx_status}: ${res.tx_failure_reason.code}
3407
- ${res.tx_failure_reason.error_message}` : res.tx_status;
3408
- const error = new Error(message);
3409
- error.response = res;
3410
- throw error;
3411
- }
3412
- }
3413
- const txReceipt = await this.getTransactionReceipt(txHash);
3414
- return txReceipt;
3415
- }
3416
- async getTransactionStatus(txHash) {
3417
- const txHashHex = toHex(toBN(txHash));
3418
- return this.fetchEndpoint("get_transaction_status", { transactionHash: txHashHex });
3419
- }
3420
- async getContractAddresses() {
3421
- return this.fetchEndpoint("get_contract_addresses");
3422
- }
3423
- async getTransactionTrace(txHash) {
3424
- const txHashHex = toHex(toBN(txHash));
3425
- return this.fetchEndpoint("get_transaction_trace", { transactionHash: txHashHex });
3426
- }
3427
- async estimateMessageFee({ from_address, to_address, entry_point_selector, payload }, blockIdentifier = this.blockIdentifier) {
3428
- const validCallL1Handler = {
3429
- from_address: getDecimalString(from_address),
3430
- to_address: getHexString(to_address),
3431
- entry_point_selector: getSelector(entry_point_selector),
3432
- payload: getHexStringArray(payload)
3433
- };
3434
- return this.fetchEndpoint("estimate_message_fee", { blockIdentifier }, validCallL1Handler);
3435
- }
3436
- };
3437
-
3438
- // src/provider/default.ts
3439
- var Provider = class {
3440
- constructor(providerOrOptions) {
3441
- if (providerOrOptions instanceof Provider) {
3442
- this.provider = providerOrOptions.provider;
3443
- } else if (providerOrOptions instanceof RpcProvider || providerOrOptions instanceof SequencerProvider) {
3444
- this.provider = providerOrOptions;
3445
- } else if (providerOrOptions && "rpc" in providerOrOptions) {
3446
- this.provider = new RpcProvider(providerOrOptions.rpc);
3447
- } else if (providerOrOptions && "sequencer" in providerOrOptions) {
3448
- this.provider = new SequencerProvider(providerOrOptions.sequencer);
3449
- } else {
3450
- this.provider = new SequencerProvider();
3451
- }
3452
- }
3453
- get chainId() {
3454
- return this.provider.chainId;
3455
- }
3456
- async getChainId() {
3457
- return this.provider.getChainId();
3458
- }
3459
- async getBlock(blockIdentifier) {
3460
- return this.provider.getBlock(blockIdentifier);
3461
- }
3462
- async getClassAt(contractAddress, blockIdentifier) {
3463
- return this.provider.getClassAt(contractAddress, blockIdentifier);
3464
- }
3465
- async getClassHashAt(contractAddress, blockIdentifier) {
3466
- return this.provider.getClassHashAt(contractAddress, blockIdentifier);
3467
- }
3468
- getClassByHash(classHash) {
3469
- return this.provider.getClassByHash(classHash);
3470
- }
3471
- async getEstimateFee(invocationWithTxType, invocationDetails, blockIdentifier) {
3472
- return this.provider.getEstimateFee(invocationWithTxType, invocationDetails, blockIdentifier);
3473
- }
3474
- async getInvokeEstimateFee(invocationWithTxType, invocationDetails, blockIdentifier) {
3475
- return this.provider.getInvokeEstimateFee(
3476
- invocationWithTxType,
3477
- invocationDetails,
3478
- blockIdentifier
3479
- );
3480
- }
3481
- async getNonceForAddress(contractAddress, blockIdentifier) {
3482
- return this.provider.getNonceForAddress(contractAddress, blockIdentifier);
3483
- }
3484
- async getStorageAt(contractAddress, key, blockIdentifier) {
3485
- return this.provider.getStorageAt(contractAddress, key, blockIdentifier);
3486
- }
3487
- async getTransaction(txHash) {
3488
- return this.provider.getTransaction(txHash);
3489
- }
3490
- async getTransactionReceipt(txHash) {
3491
- return this.provider.getTransactionReceipt(txHash);
3492
- }
3493
- async callContract(request, blockIdentifier) {
3494
- return this.provider.callContract(request, blockIdentifier);
3495
- }
3496
- async invokeFunction(functionInvocation, details) {
3497
- return this.provider.invokeFunction(functionInvocation, details);
3498
- }
3499
- async deployAccountContract(payload, details) {
3500
- return this.provider.deployAccountContract(payload, details);
3501
- }
3502
- async declareContract(transaction, details) {
3503
- return this.provider.declareContract(transaction, details);
3504
- }
3505
- async getDeclareEstimateFee(transaction, details, blockIdentifier) {
3506
- return this.provider.getDeclareEstimateFee(transaction, details, blockIdentifier);
3507
- }
3508
- getDeployAccountEstimateFee(transaction, details, blockIdentifier) {
3509
- return this.provider.getDeployAccountEstimateFee(transaction, details, blockIdentifier);
3510
- }
3511
- async getCode(contractAddress, blockIdentifier) {
3512
- return this.provider.getCode(contractAddress, blockIdentifier);
3513
- }
3514
- async waitForTransaction(txHash, retryInterval, successStates) {
3515
- return this.provider.waitForTransaction(txHash, retryInterval, successStates);
3516
- }
3517
- };
3518
-
3519
- // src/provider/interface.ts
3520
- var ProviderInterface = class {
3521
- };
3522
-
3523
- // src/provider/index.ts
3524
- var defaultProvider = new Provider();
3525
-
3526
- // src/utils/calldata.ts
3527
- var import_bn3 = __toESM(require("bn.js"));
3528
- var import_minimalistic_assert4 = __toESM(require("minimalistic-assert"));
3529
- var CheckCallData = class {
3530
- constructor(abi) {
3531
- this.abi = abi;
3532
- this.structs = abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3533
- (acc, abiEntry) => ({
3534
- ...acc,
3535
- [abiEntry.name]: abiEntry
3536
- }),
3537
- {}
3538
- );
3539
- }
3540
- compileCalldata(args, inputs) {
3541
- const argsIterator = args[Symbol.iterator]();
3542
- return inputs.reduce((acc, input) => {
3543
- if (/_len$/.test(input.name)) {
3544
- return acc;
3545
- }
3546
- const parsedData = this.parseCalldataField(argsIterator, input);
3547
- if (Array.isArray(parsedData)) {
3548
- acc.push(...parsedData);
3549
- } else {
3550
- acc.push(parsedData);
3551
- }
3552
- return acc;
3553
- }, []);
3554
- }
3555
- validateMethodAndArgs(type, method, args = []) {
3556
- if (type !== "DEPLOY") {
3557
- const invocableFunctionNames = this.abi.filter((abi) => {
3558
- if (abi.type !== "function")
3559
- return false;
3560
- const isView = abi.stateMutability === "view";
3561
- return type === "INVOKE" ? !isView : isView;
3562
- }).map((abi) => abi.name);
3563
- (0, import_minimalistic_assert4.default)(
3564
- invocableFunctionNames.includes(method),
3565
- `${type === "INVOKE" ? "invocable" : "viewable"} method not found in abi`
3566
- );
3567
- }
3568
- const methodAbi = this.abi.find(
3569
- (abi) => type === "DEPLOY" ? abi.name === method && abi.type === method : abi.name === method && abi.type === "function"
3570
- );
3571
- let argPosition = 0;
3572
- methodAbi.inputs.forEach((input) => {
3573
- if (/_len$/.test(input.name)) {
3574
- return;
3575
- }
3576
- if (input.type === "felt") {
3577
- (0, import_minimalistic_assert4.default)(
3578
- typeof args[argPosition] === "string" || typeof args[argPosition] === "number" || args[argPosition] instanceof import_bn3.default,
3579
- `arg ${input.name} should be a felt (string, number, BigNumber)`
3580
- );
3581
- argPosition += 1;
3582
- } else if (input.type in this.structs && typeof args[argPosition] === "object") {
3583
- if (Array.isArray(args[argPosition])) {
3584
- const structMembersLength = this.calculateStructMembers(input.type);
3585
- (0, import_minimalistic_assert4.default)(
3586
- args[argPosition].length === structMembersLength,
3587
- `arg should be of length ${structMembersLength}`
3588
- );
3589
- } else {
3590
- this.structs[input.type].members.forEach(({ name }) => {
3591
- (0, import_minimalistic_assert4.default)(
3592
- Object.keys(args[argPosition]).includes(name),
3593
- `arg should have a property ${name}`
3594
- );
3595
- });
3596
- }
3597
- argPosition += 1;
3598
- } else {
3599
- (0, import_minimalistic_assert4.default)(Array.isArray(args[argPosition]), `arg ${input.name} should be an Array`);
3600
- if (input.type === "felt*") {
3601
- args[argPosition].forEach((felt) => {
3602
- (0, import_minimalistic_assert4.default)(
3603
- typeof felt === "string" || typeof felt === "number" || felt instanceof import_bn3.default,
3604
- `arg ${input.name} should be an array of string, number or BigNumber`
3605
- );
3606
- });
3607
- argPosition += 1;
3608
- } else if (/\(felt/.test(input.type)) {
3609
- const tupleLength = input.type.split(",").length;
3610
- (0, import_minimalistic_assert4.default)(
3611
- args[argPosition].length === tupleLength,
3612
- `arg ${input.name} should have ${tupleLength} elements in tuple`
3613
- );
3614
- args[argPosition].forEach((felt) => {
3615
- (0, import_minimalistic_assert4.default)(
3616
- typeof felt === "string" || typeof felt === "number" || felt instanceof import_bn3.default,
3617
- `arg ${input.name} should be an array of string, number or BigNumber`
3618
- );
3619
- });
3620
- argPosition += 1;
3621
- } else {
3622
- const arrayType = input.type.replace("*", "");
3623
- args[argPosition].forEach((struct) => {
3624
- this.structs[arrayType].members.forEach(({ name }) => {
3625
- if (Array.isArray(struct)) {
3626
- const structMembersLength = this.calculateStructMembers(arrayType);
3627
- (0, import_minimalistic_assert4.default)(
3628
- struct.length === structMembersLength,
3629
- `arg should be of length ${structMembersLength}`
3630
- );
3631
- } else {
3632
- (0, import_minimalistic_assert4.default)(
3633
- Object.keys(struct).includes(name),
3634
- `arg ${input.name} should be an array of ${arrayType}`
3635
- );
3636
- }
3637
- });
3638
- });
3639
- argPosition += 1;
3640
- }
3641
- }
3642
- });
3643
- }
3644
- parseCalldataField(argsIterator, input) {
3645
- const { name, type } = input;
3646
- const { value } = argsIterator.next();
3647
- const parsedCalldata = [];
3648
- switch (true) {
3649
- case /\*/.test(type):
3650
- if (Array.isArray(value)) {
3651
- parsedCalldata.push(toFelt(value.length));
3652
- return value.reduce((acc, el) => {
3653
- if (/felt/.test(type)) {
3654
- acc.push(toFelt(el));
3655
- } else {
3656
- acc.push(...this.parseCalldataValue(el, type.replace("*", "")));
3657
- }
3658
- return acc;
3659
- }, parsedCalldata);
3660
- }
3661
- throw Error(`Expected ${name} to be array`);
3662
- case type in this.structs:
3663
- return this.parseCalldataValue(value, type);
3664
- case /\(felt/.test(type):
3665
- if (Array.isArray(value)) {
3666
- return value.map((el) => toFelt(el));
3667
- }
3668
- throw Error(`Expected ${name} to be array`);
3669
- default:
3670
- return toFelt(value);
3671
- }
3672
- }
3673
- parseCalldataValue(element, type) {
3674
- if (element === void 0) {
3675
- throw Error("Missing element in calldata");
3676
- }
3677
- if (Array.isArray(element)) {
3678
- const structMemberNum = this.calculateStructMembers(type);
3679
- if (element.length !== structMemberNum) {
3680
- throw Error("Missing element in calldata");
3681
- }
3682
- return element.map((el) => toFelt(el));
3683
- }
3684
- if (this.structs[type] && this.structs[type].members.length) {
3685
- return this.structs[type].members.reduce((acc, member) => {
3686
- const parsedData = this.parseCalldataValue(element[member.name], member.type);
3687
- if (typeof parsedData === "string") {
3688
- acc.push(parsedData);
3689
- } else {
3690
- acc.push(...parsedData);
3691
- }
3692
- return acc;
3693
- }, []);
3694
- }
3695
- return toFelt(element);
3696
- }
3697
- calculateStructMembers(struct) {
3698
- return this.structs[struct].members.reduce((acc, member) => {
3699
- if (member.type === "felt") {
3700
- return acc + 1;
3701
- }
3702
- return acc + this.calculateStructMembers(member.type);
3703
- }, 0);
3704
- }
3705
- };
3706
-
3707
- // src/contract/default.ts
3708
- function parseFelt(candidate) {
3709
- try {
3710
- return toBN(candidate);
3711
- } catch (e) {
3712
- throw Error("Could not parse felt");
3713
- }
3714
- }
3715
- function buildCall(contract, functionAbi) {
3716
- return async function(...args) {
3717
- let blockIdentifier = null;
3718
- args.forEach((arg) => {
3719
- if (arg.blockIdentifier) {
3720
- blockIdentifier = arg.blockIdentifier;
3721
- }
3722
- });
3723
- return contract.call(functionAbi.name, args, { blockIdentifier });
3724
- };
3725
- }
3726
- function buildInvoke(contract, functionAbi) {
3727
- return async function(...args) {
3728
- const { inputs } = functionAbi;
3729
- const inputsLength = inputs.reduce((acc, input) => {
3730
- if (!/_len$/.test(input.name)) {
3731
- return acc + 1;
3732
- }
3733
- return acc;
3734
- }, 0);
3735
- const options = {};
3736
- if (inputsLength + 1 === args.length && typeof args[args.length - 1] === "object") {
3737
- Object.assign(options, args.pop());
3738
- }
3739
- return contract.invoke(functionAbi.name, args, options);
3740
- };
3741
- }
3742
- function buildDefault(contract, functionAbi) {
3743
- if (functionAbi.stateMutability === "view") {
3744
- return buildCall(contract, functionAbi);
3745
- }
3746
- return buildInvoke(contract, functionAbi);
3747
- }
3748
- function buildPopulate(contract, functionAbi) {
3749
- return function(...args) {
3750
- return contract.populate(functionAbi.name, args);
3751
- };
3752
- }
3753
- function buildEstimate(contract, functionAbi) {
3754
- return function(...args) {
3755
- return contract.estimate(functionAbi.name, args);
3756
- };
3757
- }
3758
- var Contract = class {
3759
- constructor(abi, address, providerOrAccount = defaultProvider) {
3760
- this.address = address && address.toLowerCase();
3761
- this.providerOrAccount = providerOrAccount;
3762
- this.abi = abi;
3763
- this.structs = abi.filter((abiEntry) => abiEntry.type === "struct").reduce(
3764
- (acc, abiEntry) => ({
3765
- ...acc,
3766
- [abiEntry.name]: abiEntry
3767
- }),
3768
- {}
3769
- );
3770
- this.checkCalldata = new CheckCallData(abi);
3771
- Object.defineProperty(this, "functions", {
3772
- enumerable: true,
3773
- value: {},
3774
- writable: false
3775
- });
3776
- Object.defineProperty(this, "callStatic", {
3777
- enumerable: true,
3778
- value: {},
3779
- writable: false
3780
- });
3781
- Object.defineProperty(this, "populateTransaction", {
3782
- enumerable: true,
3783
- value: {},
3784
- writable: false
3785
- });
3786
- Object.defineProperty(this, "estimateFee", {
3787
- enumerable: true,
3788
- value: {},
3789
- writable: false
3790
- });
3791
- this.abi.forEach((abiElement) => {
3792
- if (abiElement.type !== "function") {
3793
- return;
3794
- }
3795
- const signature = abiElement.name;
3796
- if (!this[signature]) {
3797
- Object.defineProperty(this, signature, {
3798
- enumerable: true,
3799
- value: buildDefault(this, abiElement),
3800
- writable: false
3801
- });
3802
- }
3803
- if (!this.functions[signature]) {
3804
- Object.defineProperty(this.functions, signature, {
3805
- enumerable: true,
3806
- value: buildDefault(this, abiElement),
3807
- writable: false
3808
- });
3809
- }
3810
- if (!this.callStatic[signature]) {
3811
- Object.defineProperty(this.callStatic, signature, {
3812
- enumerable: true,
3813
- value: buildCall(this, abiElement),
3814
- writable: false
3815
- });
3816
- }
3817
- if (!this.populateTransaction[signature]) {
3818
- Object.defineProperty(this.populateTransaction, signature, {
3819
- enumerable: true,
3820
- value: buildPopulate(this, abiElement),
3821
- writable: false
3822
- });
3823
- }
3824
- if (!this.estimateFee[signature]) {
3825
- Object.defineProperty(this.estimateFee, signature, {
3826
- enumerable: true,
3827
- value: buildEstimate(this, abiElement),
3828
- writable: false
3829
- });
3830
- }
3831
- });
3832
- }
3833
- attach(address) {
3834
- this.address = address;
3835
- }
3836
- connect(providerOrAccount) {
3837
- this.providerOrAccount = providerOrAccount;
3838
- }
3839
- async deployed() {
3840
- if (this.deployTransactionHash) {
3841
- await this.providerOrAccount.waitForTransaction(this.deployTransactionHash);
3842
- this.deployTransactionHash = void 0;
3843
- }
3844
- return this;
3845
- }
3846
- async call(method, args = [], options = {}) {
3847
- const blockIdentifier = (options == null ? void 0 : options.blockIdentifier) || void 0;
3848
- (0, import_minimalistic_assert5.default)(this.address !== null, "contract is not connected to an address");
3849
- this.checkCalldata.validateMethodAndArgs("CALL", method, args);
3850
- const { inputs } = this.abi.find((abi) => abi.name === method);
3851
- const calldata = this.checkCalldata.compileCalldata(args, inputs);
3852
- return this.providerOrAccount.callContract(
3853
- {
3854
- contractAddress: this.address,
3855
- calldata,
3856
- entrypoint: method
3857
- },
3858
- blockIdentifier
3859
- ).then((x) => this.parseResponse(method, x.result));
3860
- }
3861
- invoke(method, args = [], options = {}) {
3862
- (0, import_minimalistic_assert5.default)(this.address !== null, "contract is not connected to an address");
3863
- this.checkCalldata.validateMethodAndArgs("INVOKE", method, args);
3864
- const { inputs } = this.abi.find((abi) => abi.name === method);
3865
- const inputsLength = inputs.reduce((acc, input) => {
3866
- if (!/_len$/.test(input.name)) {
3867
- return acc + 1;
3868
- }
3869
- return acc;
3870
- }, 0);
3871
- if (args.length !== inputsLength) {
3872
- throw Error(
3873
- `Invalid number of arguments, expected ${inputsLength} arguments, but got ${args.length}`
3874
- );
3875
- }
3876
- const calldata = this.checkCalldata.compileCalldata(args, inputs);
3877
- const invocation = {
3878
- contractAddress: this.address,
3879
- calldata,
3880
- entrypoint: method
3881
- };
3882
- if ("execute" in this.providerOrAccount) {
3883
- return this.providerOrAccount.execute(invocation, void 0, {
3884
- maxFee: options.maxFee,
3885
- nonce: options.nonce
3886
- });
3887
- }
3888
- if (!options.nonce) {
3889
- throw new Error(`Nonce is required when invoking a function without an account`);
3890
- }
3891
- console.warn(`Invoking ${method} without an account. This will not work on a public node.`);
3892
- return this.providerOrAccount.invokeFunction(
3893
- {
3894
- ...invocation,
3895
- signature: options.signature || []
3896
- },
3897
- {
3898
- nonce: options.nonce
3899
- }
3900
- );
3901
- }
3902
- async estimate(method, args = []) {
3903
- (0, import_minimalistic_assert5.default)(this.address !== null, "contract is not connected to an address");
3904
- this.checkCalldata.validateMethodAndArgs("INVOKE", method, args);
3905
- const invocation = this.populateTransaction[method](...args);
3906
- if ("estimateInvokeFee" in this.providerOrAccount) {
3907
- return this.providerOrAccount.estimateInvokeFee(invocation);
3908
- }
3909
- throw Error("Contract must be connected to the account contract to estimate");
3910
- }
3911
- populate(method, args = []) {
3912
- const { inputs } = this.abi.find((abi) => abi.name === method);
3913
- return {
3914
- contractAddress: this.address,
3915
- entrypoint: method,
3916
- calldata: this.checkCalldata.compileCalldata(args, inputs)
3917
- };
3918
- }
3919
- parseResponseStruct(responseIterator, type) {
3920
- if (type in this.structs && this.structs[type]) {
3921
- return this.structs[type].members.reduce((acc, el) => {
3922
- acc[el.name] = this.parseResponseStruct(responseIterator, el.type);
3923
- return acc;
3924
- }, {});
3925
- }
3926
- return parseFelt(responseIterator.next().value);
3927
- }
3928
- parseResponseField(responseIterator, output, parsedResult) {
3929
- const { name, type } = output;
3930
- const parsedDataArr = [];
3931
- switch (true) {
3932
- case /_len$/.test(name):
3933
- return parseFelt(responseIterator.next().value).toNumber();
3934
- case /\(felt/.test(type):
3935
- return type.split(",").reduce((acc) => {
3936
- acc.push(parseFelt(responseIterator.next().value));
3937
- return acc;
3938
- }, []);
3939
- case /\*/.test(type):
3940
- if (parsedResult && parsedResult[`${name}_len`]) {
3941
- const arrLen = parsedResult[`${name}_len`];
3942
- while (parsedDataArr.length < arrLen) {
3943
- parsedDataArr.push(
3944
- this.parseResponseStruct(responseIterator, output.type.replace("*", ""))
3945
- );
3946
- }
3947
- }
3948
- return parsedDataArr;
3949
- case type in this.structs:
3950
- return this.parseResponseStruct(responseIterator, type);
3951
- default:
3952
- return parseFelt(responseIterator.next().value);
3953
- }
3954
- }
3955
- parseResponse(method, response) {
3956
- const { outputs } = this.abi.find((abi) => abi.name === method);
3957
- const responseIterator = response.flat()[Symbol.iterator]();
3958
- const resultObject = outputs.flat().reduce((acc, output) => {
3959
- acc[output.name] = this.parseResponseField(responseIterator, output, acc);
3960
- if (acc[output.name] && acc[`${output.name}_len`]) {
3961
- delete acc[`${output.name}_len`];
3962
- }
3963
- return acc;
3964
- }, {});
3965
- return Object.entries(resultObject).reduce((acc, [key, value]) => {
3966
- acc.push(value);
3967
- acc[key] = value;
3968
- return acc;
3969
- }, []);
3970
- }
3971
- };
3972
-
3973
- // src/contract/interface.ts
3974
- var ContractInterface = class {
3975
- };
3976
-
3977
- // src/contract/contractFactory.ts
3978
- var import_minimalistic_assert6 = __toESM(require("minimalistic-assert"));
3979
- var ContractFactory = class {
3980
- constructor(compiledContract, classHash, account, abi = compiledContract.abi) {
3981
- this.abi = abi;
3982
- this.compiledContract = compiledContract;
3983
- this.account = account;
3984
- this.classHash = classHash;
3985
- this.checkCalldata = new CheckCallData(abi);
3986
- }
3987
- async deploy(args = [], addressSalt) {
3988
- this.checkCalldata.validateMethodAndArgs("DEPLOY", "constructor", args);
3989
- const { inputs } = this.abi.find((abi) => abi.type === "constructor");
3990
- const constructorCalldata = this.checkCalldata.compileCalldata(args, inputs);
3991
- const {
3992
- deploy: { contract_address, transaction_hash }
3993
- } = await this.account.declareDeploy({
3994
- contract: this.compiledContract,
3995
- classHash: this.classHash,
3996
- constructorCalldata,
3997
- salt: addressSalt
3998
- });
3999
- (0, import_minimalistic_assert6.default)(Boolean(contract_address), "Deployment of the contract failed");
4000
- const contractInstance = new Contract(
4001
- this.compiledContract.abi,
4002
- contract_address,
4003
- this.account
4004
- );
4005
- contractInstance.deployTransactionHash = transaction_hash;
4006
- return contractInstance;
4007
- }
4008
- connect(account) {
4009
- this.account = account;
4010
- return this;
4011
- }
4012
- attach(address) {
4013
- return new Contract(this.abi, address, this.account);
4014
- }
4015
- };
4016
-
4017
- // src/account/default.ts
4018
- var import_bn5 = require("bn.js");
4019
-
4020
- // src/signer/interface.ts
4021
- var SignerInterface = class {
4022
- };
4023
-
4024
- // src/utils/transaction.ts
4025
- var transaction_exports = {};
4026
- __export(transaction_exports, {
4027
- fromCallsToExecuteCalldata: () => fromCallsToExecuteCalldata,
4028
- fromCallsToExecuteCalldataWithNonce: () => fromCallsToExecuteCalldataWithNonce,
4029
- transformCallsToMulticallArrays: () => transformCallsToMulticallArrays
4030
- });
4031
- var transformCallsToMulticallArrays = (calls) => {
4032
- const callArray = [];
4033
- const calldata = [];
4034
- calls.forEach((call) => {
4035
- const data = call.calldata || [];
4036
- callArray.push({
4037
- to: toBN(call.contractAddress).toString(10),
4038
- selector: toBN(getSelectorFromName(call.entrypoint)).toString(10),
4039
- data_offset: calldata.length.toString(),
4040
- data_len: data.length.toString()
4041
- });
4042
- calldata.push(...data);
4043
- });
4044
- return {
4045
- callArray,
4046
- calldata: bigNumberishArrayToDecimalStringArray(calldata)
4047
- };
4048
- };
4049
- var fromCallsToExecuteCalldata = (calls) => {
4050
- const { callArray, calldata } = transformCallsToMulticallArrays(calls);
4051
- return [
4052
- callArray.length.toString(),
4053
- ...callArray.map(
4054
- ({ to, selector, data_offset, data_len }) => [to, selector, data_offset, data_len]
4055
- ).flat(),
4056
- calldata.length.toString(),
4057
- ...calldata
4058
- ];
4059
- };
4060
- var fromCallsToExecuteCalldataWithNonce = (calls, nonce) => {
4061
- return [...fromCallsToExecuteCalldata(calls), toBN(nonce).toString()];
4062
- };
4063
-
4064
- // src/utils/typedData/index.ts
4065
- var typedData_exports = {};
4066
- __export(typedData_exports, {
4067
- encodeData: () => encodeData,
4068
- encodeType: () => encodeType,
4069
- encodeValue: () => encodeValue,
4070
- getDependencies: () => getDependencies,
4071
- getMessageHash: () => getMessageHash,
4072
- getStructHash: () => getStructHash,
4073
- getTypeHash: () => getTypeHash,
4074
- isMerkleTreeType: () => isMerkleTreeType,
4075
- prepareSelector: () => prepareSelector
4076
- });
4077
-
4078
- // src/utils/merkle.ts
4079
- var merkle_exports = {};
4080
- __export(merkle_exports, {
4081
- MerkleTree: () => MerkleTree,
4082
- proofMerklePath: () => proofMerklePath
4083
- });
4084
- var MerkleTree = class {
4085
- constructor(leafHashes) {
4086
- this.branches = [];
4087
- this.leaves = leafHashes;
4088
- this.root = this.build(leafHashes);
4089
- }
4090
- build(leaves) {
4091
- if (leaves.length === 1) {
4092
- return leaves[0];
4093
- }
4094
- if (leaves.length !== this.leaves.length) {
4095
- this.branches.push(leaves);
4096
- }
4097
- const newLeaves = [];
4098
- for (let i = 0; i < leaves.length; i += 2) {
4099
- if (i + 1 === leaves.length) {
4100
- newLeaves.push(MerkleTree.hash(leaves[i], "0x0"));
4101
- } else {
4102
- newLeaves.push(MerkleTree.hash(leaves[i], leaves[i + 1]));
4103
- }
4104
- }
4105
- return this.build(newLeaves);
4106
- }
4107
- static hash(a, b) {
4108
- const [aSorted, bSorted] = [toBN(a), toBN(b)].sort((x, y) => x.gte(y) ? 1 : -1);
4109
- return pedersen([aSorted, bSorted]);
4110
- }
4111
- getProof(leaf, branch = this.leaves, hashPath = []) {
4112
- const index = branch.indexOf(leaf);
4113
- if (index === -1) {
4114
- throw new Error("leaf not found");
4115
- }
4116
- if (branch.length === 1) {
4117
- return hashPath;
4118
- }
4119
- const isLeft = index % 2 === 0;
4120
- const neededBranch = (isLeft ? branch[index + 1] : branch[index - 1]) ?? "0x0";
4121
- const newHashPath = [...hashPath, neededBranch];
4122
- const currentBranchLevelIndex = this.leaves.length === branch.length ? -1 : this.branches.findIndex((b) => b.length === branch.length);
4123
- const nextBranch = this.branches[currentBranchLevelIndex + 1] ?? [this.root];
4124
- return this.getProof(
4125
- MerkleTree.hash(isLeft ? leaf : neededBranch, isLeft ? neededBranch : leaf),
4126
- nextBranch,
4127
- newHashPath
4128
- );
4129
- }
4130
- };
4131
- function proofMerklePath(root, leaf, path) {
4132
- if (path.length === 0) {
4133
- return root === leaf;
4134
- }
4135
- const [next, ...rest] = path;
4136
- return proofMerklePath(root, MerkleTree.hash(leaf, next), rest);
4137
- }
4138
-
4139
- // src/utils/shortString.ts
4140
- var shortString_exports = {};
4141
- __export(shortString_exports, {
4142
- decodeShortString: () => decodeShortString,
4143
- encodeShortString: () => encodeShortString,
4144
- isASCII: () => isASCII,
4145
- isShortString: () => isShortString
4146
- });
4147
- function isASCII(str) {
4148
- return /^[\x00-\x7F]*$/.test(str);
4149
- }
4150
- function isShortString(str) {
4151
- return str.length <= 31;
4152
- }
4153
- function encodeShortString(str) {
4154
- if (!isASCII(str))
4155
- throw new Error(`${str} is not an ASCII string`);
4156
- if (!isShortString(str))
4157
- throw new Error(`${str} is too long`);
4158
- return addHexPrefix(str.replace(/./g, (char) => char.charCodeAt(0).toString(16)));
4159
- }
4160
- function decodeShortString(str) {
4161
- return removeHexPrefix(str).replace(/.{2}/g, (hex) => String.fromCharCode(parseInt(hex, 16)));
4162
- }
4163
-
4164
- // src/utils/typedData/utils.ts
4165
- var validateTypedData = (data) => {
4166
- const typedData = data;
4167
- const valid = Boolean(typedData.types && typedData.primaryType && typedData.message);
4168
- return valid;
4169
- };
4170
-
4171
- // src/utils/typedData/index.ts
4172
- function getHex(value) {
4173
- try {
4174
- return toHex(toBN(value));
4175
- } catch (e) {
4176
- if (typeof value === "string") {
4177
- return toHex(toBN(encodeShortString(value)));
4178
- }
4179
- throw new Error(`Invalid BigNumberish: ${value}`);
4180
- }
4181
- }
4182
- function prepareSelector(selector) {
4183
- return isHex(selector) ? selector : getSelectorFromName(selector);
4184
- }
4185
- function isMerkleTreeType(type) {
4186
- return type.type === "merkletree";
4187
- }
4188
- var getDependencies = (types, type, dependencies = []) => {
4189
- if (type[type.length - 1] === "*") {
4190
- type = type.slice(0, -1);
4191
- }
4192
- if (dependencies.includes(type)) {
4193
- return dependencies;
4194
- }
4195
- if (!types[type]) {
4196
- return dependencies;
4197
- }
4198
- return [
4199
- type,
4200
- ...types[type].reduce(
4201
- (previous, t) => [
4202
- ...previous,
4203
- ...getDependencies(types, t.type, previous).filter(
4204
- (dependency) => !previous.includes(dependency)
4205
- )
4206
- ],
4207
- []
4208
- )
4209
- ];
4210
- };
4211
- function getMerkleTreeType(types, ctx) {
4212
- if (ctx.parent && ctx.key) {
4213
- const parentType = types[ctx.parent];
4214
- const merkleType = parentType.find((t) => t.name === ctx.key);
4215
- const isMerkleTree = isMerkleTreeType(merkleType);
4216
- if (!isMerkleTree) {
4217
- throw new Error(`${ctx.key} is not a merkle tree`);
4218
- }
4219
- if (merkleType.contains.endsWith("*")) {
4220
- throw new Error(`Merkle tree contain property must not be an array but was given ${ctx.key}`);
4221
- }
4222
- return merkleType.contains;
4223
- }
4224
- return "raw";
4225
- }
4226
- var encodeType = (types, type) => {
4227
- const [primary, ...dependencies] = getDependencies(types, type);
4228
- const newTypes = !primary ? [] : [primary, ...dependencies.sort()];
4229
- return newTypes.map((dependency) => {
4230
- return `${dependency}(${types[dependency].map((t) => `${t.name}:${t.type}`)})`;
4231
- }).join("");
4232
- };
4233
- var getTypeHash = (types, type) => {
4234
- return getSelectorFromName(encodeType(types, type));
4235
- };
4236
- var encodeValue = (types, type, data, ctx = {}) => {
4237
- if (types[type]) {
4238
- return [type, getStructHash(types, type, data)];
4239
- }
4240
- if (Object.keys(types).map((x) => `${x}*`).includes(type)) {
4241
- const structHashes = data.map((struct) => {
4242
- return getStructHash(types, type.slice(0, -1), struct);
4243
- });
4244
- return [type, computeHashOnElements(structHashes)];
4245
- }
4246
- if (type === "merkletree") {
4247
- const merkleTreeType = getMerkleTreeType(types, ctx);
4248
- const structHashes = data.map((struct) => {
4249
- return encodeValue(types, merkleTreeType, struct)[1];
4250
- });
4251
- const { root } = new MerkleTree(structHashes);
4252
- return ["felt", root];
4253
- }
4254
- if (type === "felt*") {
4255
- return ["felt*", computeHashOnElements(data)];
4256
- }
4257
- if (type === "selector") {
4258
- return ["felt", prepareSelector(data)];
4259
- }
4260
- return [type, getHex(data)];
4261
- };
4262
- var encodeData = (types, type, data) => {
4263
- const [returnTypes, values] = types[type].reduce(
4264
- ([ts, vs], field) => {
4265
- if (data[field.name] === void 0 || data[field.name] === null) {
4266
- throw new Error(`Cannot encode data: missing data for '${field.name}'`);
4267
- }
4268
- const value = data[field.name];
4269
- const [t, encodedValue] = encodeValue(types, field.type, value, {
4270
- parent: type,
4271
- key: field.name
4272
- });
4273
- return [
4274
- [...ts, t],
4275
- [...vs, encodedValue]
4276
- ];
4277
- },
4278
- [["felt"], [getTypeHash(types, type)]]
4279
- );
4280
- return [returnTypes, values];
4281
- };
4282
- var getStructHash = (types, type, data) => {
4283
- return computeHashOnElements(encodeData(types, type, data)[1]);
4284
- };
4285
- var getMessageHash = (typedData, account) => {
4286
- if (!validateTypedData(typedData)) {
4287
- throw new Error("Typed data does not match JSON schema");
4288
- }
4289
- const message = [
4290
- encodeShortString("StarkNet Message"),
4291
- getStructHash(typedData.types, "StarkNetDomain", typedData.domain),
4292
- account,
4293
- getStructHash(typedData.types, typedData.primaryType, typedData.message)
4294
- ];
4295
- return computeHashOnElements(message);
4296
- };
4297
-
4298
- // src/signer/default.ts
4299
- var Signer = class {
4300
- constructor(keyPair = genKeyPair()) {
4301
- this.keyPair = keyPair;
4302
- }
4303
- async getPubKey() {
4304
- return getStarkKey(this.keyPair);
4305
- }
4306
- async signMessage(typedData, accountAddress) {
4307
- const msgHash = getMessageHash(typedData, accountAddress);
4308
- return sign(this.keyPair, msgHash);
4309
- }
4310
- async signTransaction(transactions, transactionsDetail, abis) {
4311
- if (abis && abis.length !== transactions.length) {
4312
- throw new Error("ABI must be provided for each transaction or no transaction");
4313
- }
4314
- const calldata = fromCallsToExecuteCalldata(transactions);
4315
- const msgHash = calculateTransactionHash(
4316
- transactionsDetail.walletAddress,
4317
- transactionsDetail.version,
4318
- calldata,
4319
- transactionsDetail.maxFee,
4320
- transactionsDetail.chainId,
4321
- transactionsDetail.nonce
4322
- );
4323
- return sign(this.keyPair, msgHash);
4324
- }
4325
- async signDeployAccountTransaction({
4326
- classHash,
4327
- contractAddress,
4328
- constructorCalldata,
4329
- addressSalt,
4330
- maxFee,
4331
- version,
4332
- chainId,
4333
- nonce
4334
- }) {
4335
- const msgHash = calculateDeployAccountTransactionHash(
4336
- contractAddress,
4337
- classHash,
4338
- constructorCalldata,
4339
- addressSalt,
4340
- version,
4341
- maxFee,
4342
- chainId,
4343
- nonce
4344
- );
4345
- return sign(this.keyPair, msgHash);
4346
- }
4347
- async signDeclareTransaction({ classHash, senderAddress, chainId, maxFee, version, nonce }) {
4348
- const msgHash = calculateDeclareTransactionHash(
4349
- classHash,
4350
- senderAddress,
4351
- version,
4352
- maxFee,
4353
- chainId,
4354
- nonce
4355
- );
4356
- return sign(this.keyPair, msgHash);
4357
- }
4358
- };
4359
-
4360
- // src/utils/events.ts
4361
- function parseUDCEvent(txReceipt) {
4362
- if (!txReceipt.events) {
4363
- throw new Error("UDC emited event is empty");
4364
- }
4365
- const event = txReceipt.events.find(
4366
- (it) => cleanHex(it.from_address) === cleanHex(UDC.ADDRESS)
4367
- ) || {
4368
- data: []
4369
- };
4370
- return {
4371
- transaction_hash: txReceipt.transaction_hash,
4372
- contract_address: event.data[0],
4373
- address: event.data[0],
4374
- deployer: event.data[1],
4375
- unique: event.data[2],
4376
- classHash: event.data[3],
4377
- calldata_len: event.data[4],
4378
- calldata: event.data.slice(5, 5 + parseInt(event.data[4], 16)),
4379
- salt: event.data[event.data.length - 1]
4380
- };
4381
- }
4382
-
4383
- // src/utils/starknetId.ts
4384
- var import_bn4 = __toESM(require("bn.js"));
4385
- var basicAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789-";
4386
- var basicSizePlusOne = new import_bn4.default(basicAlphabet.length + 1);
4387
- var bigAlphabet = "\u8FD9\u6765";
4388
- var basicAlphabetSize = new import_bn4.default(basicAlphabet.length);
4389
- var bigAlphabetSize = new import_bn4.default(bigAlphabet.length);
4390
- var bigAlphabetSizePlusOne = new import_bn4.default(bigAlphabet.length + 1);
4391
- function extractStars(str) {
4392
- let k = 0;
4393
- while (str.endsWith(bigAlphabet[bigAlphabet.length - 1])) {
4394
- str = str.substring(0, str.length - 1);
4395
- k += 1;
4396
- }
4397
- return [str, k];
4398
- }
4399
- function useDecoded(encoded) {
4400
- let decoded = "";
4401
- encoded.forEach((subdomain) => {
4402
- while (!subdomain.isZero()) {
4403
- const code = subdomain.mod(basicSizePlusOne).toNumber();
4404
- subdomain = subdomain.div(basicSizePlusOne);
4405
- if (code === basicAlphabet.length) {
4406
- const nextSubdomain = subdomain.div(bigAlphabetSizePlusOne);
4407
- if (nextSubdomain.isZero()) {
4408
- const code2 = subdomain.mod(bigAlphabetSizePlusOne).toNumber();
4409
- subdomain = nextSubdomain;
4410
- if (code2 === 0)
4411
- decoded += basicAlphabet[0];
4412
- else
4413
- decoded += bigAlphabet[code2 - 1];
4414
- } else {
4415
- const code2 = subdomain.mod(bigAlphabetSize).toNumber();
4416
- decoded += bigAlphabet[code2];
4417
- subdomain = subdomain.div(bigAlphabetSize);
4418
- }
4419
- } else
4420
- decoded += basicAlphabet[code];
4421
- }
4422
- const [str, k] = extractStars(decoded);
4423
- if (k)
4424
- decoded = str + (k % 2 === 0 ? bigAlphabet[bigAlphabet.length - 1].repeat(k / 2 - 1) + bigAlphabet[0] + basicAlphabet[1] : bigAlphabet[bigAlphabet.length - 1].repeat((k - 1) / 2 + 1));
4425
- decoded += ".";
4426
- });
4427
- return decoded.concat("stark");
4428
- }
4429
- function useEncoded(decoded) {
4430
- let encoded = new import_bn4.default(0);
4431
- let multiplier = new import_bn4.default(1);
4432
- if (decoded.endsWith(bigAlphabet[0] + basicAlphabet[1])) {
4433
- const [str, k] = extractStars(decoded.substring(0, decoded.length - 2));
4434
- decoded = str + bigAlphabet[bigAlphabet.length - 1].repeat(2 * (k + 1));
4435
- } else {
4436
- const [str, k] = extractStars(decoded);
4437
- if (k)
4438
- decoded = str + bigAlphabet[bigAlphabet.length - 1].repeat(1 + 2 * (k - 1));
4439
- }
4440
- for (let i = 0; i < decoded.length; i += 1) {
4441
- const char = decoded[i];
4442
- const index = basicAlphabet.indexOf(char);
4443
- const bnIndex = new import_bn4.default(basicAlphabet.indexOf(char));
4444
- if (index !== -1) {
4445
- if (i === decoded.length - 1 && decoded[i] === basicAlphabet[0]) {
4446
- encoded = encoded.add(multiplier.mul(basicAlphabetSize));
4447
- multiplier = multiplier.mul(basicSizePlusOne);
4448
- multiplier = multiplier.mul(basicSizePlusOne);
4449
- } else {
4450
- encoded = encoded.add(multiplier.mul(bnIndex));
4451
- multiplier = multiplier.mul(basicSizePlusOne);
4452
- }
4453
- } else if (bigAlphabet.indexOf(char) !== -1) {
4454
- encoded = encoded.add(multiplier.mul(basicAlphabetSize));
4455
- multiplier = multiplier.mul(basicSizePlusOne);
4456
- const newid = (i === decoded.length - 1 ? 1 : 0) + bigAlphabet.indexOf(char);
4457
- encoded = encoded.add(multiplier.mul(new import_bn4.default(newid)));
4458
- multiplier = multiplier.mul(bigAlphabetSize);
4459
- }
4460
- }
4461
- return encoded;
4462
- }
4463
- function getStarknetIdContract(chainId) {
4464
- const starknetIdMainnetContract = "0x6ac597f8116f886fa1c97a23fa4e08299975ecaf6b598873ca6792b9bbfb678";
4465
- const starknetIdTestnetContract = "0x05cf267a0af6101667013fc6bd3f6c11116a14cda9b8c4b1198520d59f900b17";
4466
- switch (chainId) {
4467
- case "0x534e5f4d41494e" /* MAINNET */:
4468
- return starknetIdMainnetContract;
4469
- case "0x534e5f474f45524c49" /* TESTNET */:
4470
- return starknetIdTestnetContract;
4471
- default:
4472
- throw new Error("Starknet.id is not yet deployed on this network");
4473
- }
4474
- }
4475
-
4476
- // src/account/default.ts
4477
- var Account = class extends Provider {
4478
- constructor(providerOrOptions, address, keyPairOrSigner) {
4479
- super(providerOrOptions);
4480
- this.address = address.toLowerCase();
4481
- this.signer = "getPubKey" in keyPairOrSigner ? keyPairOrSigner : new Signer(keyPairOrSigner);
4482
- }
4483
- async getNonce(blockIdentifier) {
4484
- return super.getNonceForAddress(this.address, blockIdentifier);
4485
- }
4486
- async getStarkName(StarknetIdContract) {
4487
- const chainId = await this.getChainId();
4488
- const contract = StarknetIdContract ?? getStarknetIdContract(chainId);
4489
- try {
4490
- const hexDomain = await this.callContract({
4491
- contractAddress: contract,
4492
- entrypoint: "address_to_domain",
4493
- calldata: compileCalldata({
4494
- address: this.address
4495
- })
4496
- });
4497
- const decimalDomain = hexDomain.result.map((element) => new import_bn5.BN(hexToDecimalString(element))).slice(1);
4498
- const stringDomain = useDecoded(decimalDomain);
4499
- return stringDomain;
4500
- } catch {
4501
- return Error("Could not get stark name");
4502
- }
4503
- }
4504
- async getAddressFromStarkName(name, StarknetIdContract) {
4505
- const chainId = await this.getChainId();
4506
- const contract = StarknetIdContract ?? getStarknetIdContract(chainId);
4507
- try {
4508
- const addressData = await this.callContract({
4509
- contractAddress: contract,
4510
- entrypoint: "domain_to_address",
4511
- calldata: compileCalldata({
4512
- domain: [useEncoded(name.replace(".stark", "")).toString(10)]
4513
- })
4514
- });
4515
- return addressData.result[0];
4516
- } catch {
4517
- return Error("Could not get address from stark name");
4518
- }
4519
- }
4520
- async estimateFee(calls, estimateFeeDetails) {
4521
- return this.estimateInvokeFee(calls, estimateFeeDetails);
4522
- }
4523
- async estimateInvokeFee(calls, { nonce: providedNonce, blockIdentifier } = {}) {
4524
- const transactions = Array.isArray(calls) ? calls : [calls];
4525
- const nonce = toBN(providedNonce ?? await this.getNonce());
4526
- const version = toBN(feeTransactionVersion);
4527
- const chainId = await this.getChainId();
4528
- const signerDetails = {
4529
- walletAddress: this.address,
4530
- nonce,
4531
- maxFee: ZERO,
4532
- version,
4533
- chainId
4534
- };
4535
- const signature = await this.signer.signTransaction(transactions, signerDetails);
4536
- const calldata = fromCallsToExecuteCalldata(transactions);
4537
- const response = await super.getInvokeEstimateFee(
4538
- { contractAddress: this.address, calldata, signature },
4539
- { version, nonce },
4540
- blockIdentifier
4541
- );
4542
- const suggestedMaxFee = estimatedFeeToMaxFee(response.overall_fee);
4543
- return {
4544
- ...response,
4545
- suggestedMaxFee
4546
- };
4547
- }
4548
- async estimateDeclareFee({ classHash, contract }, { blockIdentifier, nonce: providedNonce } = {}) {
4549
- const nonce = toBN(providedNonce ?? await this.getNonce());
4550
- const version = toBN(feeTransactionVersion);
4551
- const chainId = await this.getChainId();
4552
- const contractDefinition = parseContract(contract);
4553
- const signature = await this.signer.signDeclareTransaction({
4554
- classHash,
4555
- senderAddress: this.address,
4556
- chainId,
4557
- maxFee: ZERO,
4558
- version,
4559
- nonce
4560
- });
4561
- const response = await super.getDeclareEstimateFee(
4562
- { senderAddress: this.address, signature, contractDefinition },
4563
- { version, nonce },
4564
- blockIdentifier
4565
- );
4566
- const suggestedMaxFee = estimatedFeeToMaxFee(response.overall_fee);
4567
- return {
4568
- ...response,
4569
- suggestedMaxFee
4570
- };
4571
- }
4572
- async estimateAccountDeployFee({
4573
- classHash,
4574
- addressSalt = 0,
4575
- constructorCalldata = [],
4576
- contractAddress: providedContractAddress
4577
- }, { blockIdentifier, nonce: providedNonce } = {}) {
4578
- const nonce = toBN(providedNonce ?? await this.getNonce());
4579
- const version = toBN(feeTransactionVersion);
4580
- const chainId = await this.getChainId();
4581
- const contractAddress = providedContractAddress ?? calculateContractAddressFromHash(addressSalt, classHash, constructorCalldata, 0);
4582
- const signature = await this.signer.signDeployAccountTransaction({
4583
- classHash,
4584
- contractAddress,
4585
- chainId,
4586
- maxFee: ZERO,
4587
- version,
4588
- nonce,
4589
- addressSalt,
4590
- constructorCalldata
4591
- });
4592
- const response = await super.getDeployAccountEstimateFee(
4593
- { classHash, addressSalt, constructorCalldata, signature },
4594
- { version, nonce },
4595
- blockIdentifier
4596
- );
4597
- const suggestedMaxFee = estimatedFeeToMaxFee(response.overall_fee);
4598
- return {
4599
- ...response,
4600
- suggestedMaxFee
4601
- };
4602
- }
4603
- async estimateDeployFee(payload, transactionsDetail) {
4604
- const calls = [].concat(payload).map((it) => {
4605
- const {
4606
- classHash,
4607
- salt = "0",
4608
- unique = true,
4609
- constructorCalldata = []
4610
- } = it;
4611
- const compiledConstructorCallData = compileCalldata(constructorCalldata);
4612
- return {
4613
- contractAddress: UDC.ADDRESS,
4614
- entrypoint: UDC.ENTRYPOINT,
4615
- calldata: [
4616
- classHash,
4617
- salt,
4618
- toCairoBool(unique),
4619
- compiledConstructorCallData.length,
4620
- ...compiledConstructorCallData
4621
- ]
4622
- };
4623
- });
4624
- return this.estimateInvokeFee(calls, transactionsDetail);
4625
- }
4626
- async execute(calls, abis = void 0, transactionsDetail = {}) {
4627
- const transactions = Array.isArray(calls) ? calls : [calls];
4628
- const nonce = toBN(transactionsDetail.nonce ?? await this.getNonce());
4629
- const maxFee = transactionsDetail.maxFee ?? await this.getSuggestedMaxFee({ type: "INVOKE", payload: calls }, transactionsDetail);
4630
- const version = toBN(transactionVersion);
4631
- const chainId = await this.getChainId();
4632
- const signerDetails = {
4633
- walletAddress: this.address,
4634
- nonce,
4635
- maxFee,
4636
- version,
4637
- chainId
4638
- };
4639
- const signature = await this.signer.signTransaction(transactions, signerDetails, abis);
4640
- const calldata = fromCallsToExecuteCalldata(transactions);
4641
- return this.invokeFunction(
4642
- { contractAddress: this.address, calldata, signature },
4643
- {
4644
- nonce,
4645
- maxFee,
4646
- version
4647
- }
4648
- );
4649
- }
4650
- async declare({ classHash, contract }, transactionsDetail = {}) {
4651
- const nonce = toBN(transactionsDetail.nonce ?? await this.getNonce());
4652
- const maxFee = transactionsDetail.maxFee ?? await this.getSuggestedMaxFee(
4653
- { type: "DECLARE", payload: { classHash, contract } },
4654
- transactionsDetail
4655
- );
4656
- const version = toBN(transactionVersion);
4657
- const chainId = await this.getChainId();
4658
- const signature = await this.signer.signDeclareTransaction({
4659
- classHash,
4660
- senderAddress: this.address,
4661
- chainId,
4662
- maxFee,
4663
- version,
4664
- nonce
4665
- });
4666
- const contractDefinition = parseContract(contract);
4667
- return this.declareContract(
4668
- { contractDefinition, senderAddress: this.address, signature },
4669
- {
4670
- nonce,
4671
- maxFee,
4672
- version
4673
- }
4674
- );
4675
- }
4676
- async deploy(payload, details) {
4677
- const params = [].concat(payload).map((it) => {
4678
- const {
4679
- classHash,
4680
- salt,
4681
- unique = true,
4682
- constructorCalldata = []
4683
- } = it;
4684
- const compiledConstructorCallData = compileCalldata(constructorCalldata);
4685
- const deploySalt = salt ?? randomAddress();
4686
- return {
4687
- call: {
4688
- contractAddress: UDC.ADDRESS,
4689
- entrypoint: UDC.ENTRYPOINT,
4690
- calldata: [
4691
- classHash,
4692
- deploySalt,
4693
- toCairoBool(unique),
4694
- compiledConstructorCallData.length,
4695
- ...compiledConstructorCallData
4696
- ]
4697
- },
4698
- address: calculateContractAddressFromHash(
4699
- unique ? pedersen([this.address, deploySalt]) : deploySalt,
4700
- classHash,
4701
- compiledConstructorCallData,
4702
- unique ? UDC.ADDRESS : 0
4703
- )
4704
- };
4705
- });
4706
- const calls = params.map((it) => it.call);
4707
- const addresses = params.map((it) => it.address);
4708
- const invokeResponse = await this.execute(calls, void 0, details);
4709
- return {
4710
- ...invokeResponse,
4711
- contract_address: addresses
4712
- };
4713
- }
4714
- async deployContract(payload, details) {
4715
- const deployTx = await this.deploy(payload, details);
4716
- const txReceipt = await this.waitForTransaction(deployTx.transaction_hash, void 0, [
4717
- "ACCEPTED_ON_L2"
4718
- ]);
4719
- return parseUDCEvent(txReceipt);
4720
- }
4721
- async declareDeploy(payload, details) {
4722
- const { classHash, contract, constructorCalldata, salt, unique } = payload;
4723
- const { transaction_hash } = await this.declare({ contract, classHash }, details);
4724
- const declare = await this.waitForTransaction(transaction_hash, void 0, ["ACCEPTED_ON_L2"]);
4725
- const deploy = await this.deployContract(
4726
- { classHash, salt, unique, constructorCalldata },
4727
- details
4728
- );
4729
- return { declare: { ...declare, class_hash: classHash }, deploy };
4730
- }
4731
- async deployAccount({
4732
- classHash,
4733
- constructorCalldata = [],
4734
- addressSalt = 0,
4735
- contractAddress: providedContractAddress
4736
- }, transactionsDetail = {}) {
4737
- const nonce = toBN(transactionsDetail.nonce ?? await this.getNonce());
4738
- const version = toBN(transactionVersion);
4739
- const chainId = await this.getChainId();
4740
- const contractAddress = providedContractAddress ?? calculateContractAddressFromHash(addressSalt, classHash, constructorCalldata, 0);
4741
- const maxFee = transactionsDetail.maxFee ?? await this.getSuggestedMaxFee(
4742
- {
4743
- type: "DEPLOY_ACCOUNT",
4744
- payload: { classHash, constructorCalldata, addressSalt, contractAddress }
4745
- },
4746
- transactionsDetail
4747
- );
4748
- const signature = await this.signer.signDeployAccountTransaction({
4749
- classHash,
4750
- constructorCalldata,
4751
- contractAddress,
4752
- addressSalt,
4753
- chainId,
4754
- maxFee,
4755
- version,
4756
- nonce
4757
- });
4758
- return this.deployAccountContract(
4759
- { classHash, addressSalt, constructorCalldata, signature },
4760
- {
4761
- nonce,
4762
- maxFee,
4763
- version
4764
- }
4765
- );
4766
- }
4767
- async signMessage(typedData) {
4768
- return this.signer.signMessage(typedData, this.address);
4769
- }
4770
- async hashMessage(typedData) {
4771
- return getMessageHash(typedData, this.address);
4772
- }
4773
- async verifyMessageHash(hash, signature) {
4774
- try {
4775
- await this.callContract({
4776
- contractAddress: this.address,
4777
- entrypoint: "isValidSignature",
4778
- calldata: compileCalldata({
4779
- hash: toBN(hash).toString(),
4780
- signature: signature.map((x) => toBN(x).toString())
4781
- })
4782
- });
4783
- return true;
4784
- } catch {
4785
- return false;
4786
- }
4787
- }
4788
- async verifyMessage(typedData, signature) {
4789
- const hash = await this.hashMessage(typedData);
4790
- return this.verifyMessageHash(hash, signature);
4791
- }
4792
- async getSuggestedMaxFee({ type, payload }, details) {
4793
- let feeEstimate;
4794
- switch (type) {
4795
- case "INVOKE":
4796
- feeEstimate = await this.estimateInvokeFee(payload, details);
4797
- break;
4798
- case "DECLARE":
4799
- feeEstimate = await this.estimateDeclareFee(payload, details);
4800
- break;
4801
- case "DEPLOY_ACCOUNT":
4802
- feeEstimate = await this.estimateAccountDeployFee(payload, details);
4803
- break;
4804
- case "DEPLOY":
4805
- feeEstimate = await this.estimateDeployFee(payload, details);
4806
- break;
4807
- default:
4808
- feeEstimate = { suggestedMaxFee: ZERO, overall_fee: ZERO };
4809
- break;
4810
- }
4811
- return feeEstimate.suggestedMaxFee.toString();
4812
- }
4813
- };
4814
-
4815
- // src/account/interface.ts
4816
- var AccountInterface = class extends ProviderInterface {
4817
- };
4818
-
4819
- // src/utils/uint256.ts
4820
- var uint256_exports = {};
4821
- __export(uint256_exports, {
4822
- UINT_128_MAX: () => UINT_128_MAX,
4823
- UINT_256_MAX: () => UINT_256_MAX,
4824
- bnToUint256: () => bnToUint256,
4825
- isUint256: () => isUint256,
4826
- uint256ToBN: () => uint256ToBN
4827
- });
4828
- function uint256ToBN(uint256) {
4829
- return toBN(uint256.high).shln(128).add(toBN(uint256.low));
4830
- }
4831
- var UINT_128_MAX = toBN(1).shln(128).sub(toBN(1));
4832
- var UINT_256_MAX = toBN(1).shln(256).sub(toBN(1));
4833
- function isUint256(bn) {
4834
- return toBN(bn).lte(UINT_256_MAX);
4835
- }
4836
- function bnToUint256(bignumber) {
4837
- const bn = toBN(bignumber);
4838
- if (!isUint256(bn))
4839
- throw new Error("Number is too large");
4840
- return {
4841
- low: addHexPrefix(bn.maskn(128).toString(16)),
4842
- high: addHexPrefix(bn.shrn(128).toString(16))
4843
- };
4844
- }
4845
-
4846
- // src/utils/address.ts
4847
- var import_bytes = require("@ethersproject/bytes");
4848
- function addAddressPadding(address) {
4849
- return addHexPrefix(removeHexPrefix(toHex(toBN(address))).padStart(64, "0"));
4850
- }
4851
- function validateAndParseAddress(address) {
4852
- assertInRange(address, ZERO, MASK_251, "Starknet Address");
4853
- const result = addAddressPadding(address);
4854
- if (!result.match(/^(0x)?[0-9a-fA-F]{64}$/)) {
4855
- throw new Error("Invalid Address Format");
4856
- }
4857
- return result;
4858
- }
4859
- function getChecksumAddress(address) {
4860
- const chars = removeHexPrefix(validateAndParseAddress(address)).toLowerCase().split("");
4861
- const hashed = (0, import_bytes.arrayify)(keccakBn(address), { hexPad: "left" });
4862
- for (let i = 0; i < chars.length; i += 2) {
4863
- if (hashed[i >> 1] >> 4 >= 8) {
4864
- chars[i] = chars[i].toUpperCase();
4865
- }
4866
- if ((hashed[i >> 1] & 15) >= 8) {
4867
- chars[i + 1] = chars[i + 1].toUpperCase();
4868
- }
4869
- }
4870
- return addHexPrefix(chars.join(""));
4871
- }
4872
- function validateChecksumAddress(address) {
4873
- return getChecksumAddress(address) === address;
4874
- }
4875
- // Annotate the CommonJS export names for ESM import in node:
4876
- 0 && (module.exports = {
4877
- Account,
4878
- AccountInterface,
4879
- Contract,
4880
- ContractFactory,
4881
- ContractInterface,
4882
- GatewayError,
4883
- HttpError,
4884
- Provider,
4885
- ProviderInterface,
4886
- RpcProvider,
4887
- SequencerProvider,
4888
- Signer,
4889
- SignerInterface,
4890
- addAddressPadding,
4891
- buildUrl,
4892
- constants,
4893
- defaultProvider,
4894
- ec,
4895
- encode,
4896
- getChecksumAddress,
4897
- hash,
4898
- isUrl,
4899
- json,
4900
- merkle,
4901
- number,
4902
- shortString,
4903
- stark,
4904
- transaction,
4905
- typedData,
4906
- uint256,
4907
- validateAndParseAddress,
4908
- validateChecksumAddress
4909
- });
4910
- //# sourceMappingURL=index.js.map