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