@beclab/olaresid 0.1.13 → 0.2.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 (181) hide show
  1. package/CLI-TREE.md +107 -0
  2. package/CLI.md +122 -1340
  3. package/README.md +30 -12
  4. package/SDK-TREE.md +151 -0
  5. package/TAG.md +95 -41
  6. package/config.json +6 -4
  7. package/dist/abi/TerminusDIDQueryABI.d.ts +397 -0
  8. package/dist/abi/TerminusDIDQueryABI.d.ts.map +1 -0
  9. package/dist/abi/TerminusDIDQueryABI.js +519 -0
  10. package/dist/abi/TerminusDIDQueryABI.js.map +1 -0
  11. package/dist/business/index.d.ts.map +1 -1
  12. package/dist/business/index.js +9 -23
  13. package/dist/business/index.js.map +1 -1
  14. package/dist/business/tag-context.d.ts +1 -0
  15. package/dist/business/tag-context.d.ts.map +1 -1
  16. package/dist/business/tag-context.js +13 -7
  17. package/dist/business/tag-context.js.map +1 -1
  18. package/dist/cli.js +177 -76
  19. package/dist/cli.js.map +1 -1
  20. package/dist/config/index.d.ts +16 -4
  21. package/dist/config/index.d.ts.map +1 -1
  22. package/dist/config/index.js +28 -14
  23. package/dist/config/index.js.map +1 -1
  24. package/dist/domain/core.d.ts +65 -0
  25. package/dist/domain/core.d.ts.map +1 -0
  26. package/dist/domain/core.js +317 -0
  27. package/dist/domain/core.js.map +1 -0
  28. package/dist/domain/index.d.ts +104 -57
  29. package/dist/domain/index.d.ts.map +1 -1
  30. package/dist/domain/index.js +188 -428
  31. package/dist/domain/index.js.map +1 -1
  32. package/dist/domain/types.d.ts +56 -0
  33. package/dist/domain/types.d.ts.map +1 -0
  34. package/dist/domain/types.js +3 -0
  35. package/dist/domain/types.js.map +1 -0
  36. package/dist/index.d.ts +80 -23
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +152 -143
  39. package/dist/index.js.map +1 -1
  40. package/dist/utils/crypto-utils.d.ts +110 -0
  41. package/dist/utils/crypto-utils.d.ts.map +1 -1
  42. package/dist/utils/crypto-utils.js +127 -8
  43. package/dist/utils/crypto-utils.js.map +1 -1
  44. package/dist/utils/error-parser.d.ts.map +1 -1
  45. package/dist/utils/error-parser.js +2 -1
  46. package/dist/utils/error-parser.js.map +1 -1
  47. package/dist/utils/event-parser.d.ts +161 -0
  48. package/dist/utils/event-parser.d.ts.map +1 -0
  49. package/dist/utils/event-parser.js +140 -0
  50. package/dist/utils/event-parser.js.map +1 -0
  51. package/dist/utils/tag-type-builder.d.ts +43 -0
  52. package/dist/utils/tag-type-builder.d.ts.map +1 -1
  53. package/dist/utils/tag-type-builder.js +122 -0
  54. package/dist/utils/tag-type-builder.js.map +1 -1
  55. package/dist/utils/tag-type-parser.d.ts +70 -0
  56. package/dist/utils/tag-type-parser.d.ts.map +1 -0
  57. package/dist/utils/tag-type-parser.js +190 -0
  58. package/dist/utils/tag-type-parser.js.map +1 -0
  59. package/examples/create-with-rpc-demo.ts +142 -0
  60. package/examples/fetch-all-flat-demo.ts +159 -0
  61. package/examples/fetch-by-indices-demo.ts +235 -0
  62. package/examples/fetch-domain-demo.ts +137 -0
  63. package/examples/fetch-domains-demo.ts +221 -0
  64. package/examples/frontend-demo/index.html +2 -2
  65. package/examples/frontend-demo/package-lock.json +4 -1
  66. package/examples/index.ts +3 -5
  67. package/jest.config.js +25 -0
  68. package/package.json +6 -2
  69. package/src/abi/TerminusDIDQueryABI.ts +516 -0
  70. package/src/business/index.ts +9 -33
  71. package/src/business/tag-context.ts +35 -7
  72. package/src/cli.ts +253 -90
  73. package/src/config/index.ts +34 -19
  74. package/src/domain/core.ts +382 -0
  75. package/src/domain/index.ts +271 -641
  76. package/src/domain/types.ts +59 -0
  77. package/src/index.ts +221 -207
  78. package/src/utils/crypto-utils.ts +205 -2
  79. package/src/utils/error-parser.ts +2 -1
  80. package/src/utils/event-parser.ts +353 -0
  81. package/src/utils/tag-type-builder.ts +138 -0
  82. package/src/utils/tag-type-parser.ts +246 -0
  83. package/tests/unit/crypto-utils.test.ts +338 -0
  84. package/tests/unit/ed25519-jwk.test.ts +201 -0
  85. package/tests/unit/event-parser.test.ts +690 -0
  86. package/tests/unit/generate-mnemonic.test.ts +268 -0
  87. package/tests/unit/olares-id-format.test.ts +321 -0
  88. package/tests/unit/tag-type-parser.test.ts +802 -0
  89. package/tests/unit/tag-types.test.ts +821 -0
  90. package/tsconfig.json +3 -2
  91. package/dist/abi/ABITypeABI.d.ts +0 -88
  92. package/dist/abi/ABITypeABI.d.ts.map +0 -1
  93. package/dist/abi/ABITypeABI.js +0 -382
  94. package/dist/abi/ABITypeABI.js.map +0 -1
  95. package/dist/abi/RegistryABI.d.ts +0 -77
  96. package/dist/abi/RegistryABI.d.ts.map +0 -1
  97. package/dist/abi/RegistryABI.js +0 -462
  98. package/dist/abi/RegistryABI.js.map +0 -1
  99. package/dist/tag/address.d.ts +0 -11
  100. package/dist/tag/address.d.ts.map +0 -1
  101. package/dist/tag/address.js +0 -44
  102. package/dist/tag/address.js.map +0 -1
  103. package/dist/tag/array.d.ts +0 -14
  104. package/dist/tag/array.d.ts.map +0 -1
  105. package/dist/tag/array.js +0 -72
  106. package/dist/tag/array.js.map +0 -1
  107. package/dist/tag/bool.d.ts +0 -11
  108. package/dist/tag/bool.d.ts.map +0 -1
  109. package/dist/tag/bool.js +0 -43
  110. package/dist/tag/bool.js.map +0 -1
  111. package/dist/tag/bytes.d.ts +0 -11
  112. package/dist/tag/bytes.d.ts.map +0 -1
  113. package/dist/tag/bytes.js +0 -37
  114. package/dist/tag/bytes.js.map +0 -1
  115. package/dist/tag/flarray.d.ts +0 -15
  116. package/dist/tag/flarray.d.ts.map +0 -1
  117. package/dist/tag/flarray.js +0 -81
  118. package/dist/tag/flarray.js.map +0 -1
  119. package/dist/tag/flbytes.d.ts +0 -11
  120. package/dist/tag/flbytes.d.ts.map +0 -1
  121. package/dist/tag/flbytes.js +0 -47
  122. package/dist/tag/flbytes.js.map +0 -1
  123. package/dist/tag/index.d.ts +0 -32
  124. package/dist/tag/index.d.ts.map +0 -1
  125. package/dist/tag/index.js +0 -121
  126. package/dist/tag/index.js.map +0 -1
  127. package/dist/tag/int.d.ts +0 -12
  128. package/dist/tag/int.d.ts.map +0 -1
  129. package/dist/tag/int.js +0 -49
  130. package/dist/tag/int.js.map +0 -1
  131. package/dist/tag/string.d.ts +0 -11
  132. package/dist/tag/string.d.ts.map +0 -1
  133. package/dist/tag/string.js +0 -37
  134. package/dist/tag/string.js.map +0 -1
  135. package/dist/tag/tag.d.ts +0 -67
  136. package/dist/tag/tag.d.ts.map +0 -1
  137. package/dist/tag/tag.js +0 -157
  138. package/dist/tag/tag.js.map +0 -1
  139. package/dist/tag/tuple.d.ts +0 -17
  140. package/dist/tag/tuple.d.ts.map +0 -1
  141. package/dist/tag/tuple.js +0 -162
  142. package/dist/tag/tuple.js.map +0 -1
  143. package/dist/tag/uint.d.ts +0 -12
  144. package/dist/tag/uint.d.ts.map +0 -1
  145. package/dist/tag/uint.js +0 -49
  146. package/dist/tag/uint.js.map +0 -1
  147. package/dist/test/did.d.ts +0 -2
  148. package/dist/test/did.d.ts.map +0 -1
  149. package/dist/test/did.js +0 -177
  150. package/dist/test/did.js.map +0 -1
  151. package/dist/utils/tag-abi-codec.d.ts +0 -69
  152. package/dist/utils/tag-abi-codec.d.ts.map +0 -1
  153. package/dist/utils/tag-abi-codec.js +0 -144
  154. package/dist/utils/tag-abi-codec.js.map +0 -1
  155. package/examples/crypto-utilities.ts +0 -140
  156. package/examples/ed25519-jwk.ts +0 -73
  157. package/examples/generate-mnemonic.ts +0 -149
  158. package/examples/legacy.ts +0 -33
  159. package/examples/olares-id-format.ts +0 -197
  160. package/examples/tag-builder.ts +0 -235
  161. package/examples/tag-nested-tuple.ts +0 -190
  162. package/examples/tag-simple.ts +0 -149
  163. package/examples/tag-tagger.ts +0 -217
  164. package/examples/test-nested-tuple-conversion.ts +0 -143
  165. package/examples/test-type-bytes-parser.ts +0 -70
  166. package/src/abi/ABITypeABI.ts +0 -379
  167. package/src/abi/RegistryABI.ts +0 -459
  168. package/src/tag/address.ts +0 -48
  169. package/src/tag/array.ts +0 -80
  170. package/src/tag/bool.ts +0 -43
  171. package/src/tag/bytes.ts +0 -38
  172. package/src/tag/flarray.ts +0 -99
  173. package/src/tag/flbytes.ts +0 -48
  174. package/src/tag/index.ts +0 -170
  175. package/src/tag/int.ts +0 -51
  176. package/src/tag/string.ts +0 -38
  177. package/src/tag/tag.ts +0 -229
  178. package/src/tag/tuple.ts +0 -193
  179. package/src/tag/uint.ts +0 -51
  180. package/src/test/did.ts +0 -346
  181. package/src/utils/tag-abi-codec.ts +0 -158
@@ -0,0 +1,397 @@
1
+ declare const _default: readonly [{
2
+ readonly type: "constructor";
3
+ readonly inputs: readonly [{
4
+ readonly name: "_terminusDID";
5
+ readonly type: "address";
6
+ readonly internalType: "address";
7
+ }];
8
+ readonly stateMutability: "nonpayable";
9
+ }, {
10
+ readonly type: "function";
11
+ readonly name: "getAllDomains";
12
+ readonly inputs: readonly [{
13
+ readonly name: "offset";
14
+ readonly type: "uint256";
15
+ readonly internalType: "uint256";
16
+ }, {
17
+ readonly name: "limit";
18
+ readonly type: "uint256";
19
+ readonly internalType: "uint256";
20
+ }];
21
+ readonly outputs: readonly [{
22
+ readonly name: "domains";
23
+ readonly type: "tuple[]";
24
+ readonly internalType: "struct TerminusDIDQuery.DomainData[]";
25
+ readonly components: readonly [{
26
+ readonly name: "tokenId";
27
+ readonly type: "uint256";
28
+ readonly internalType: "uint256";
29
+ }, {
30
+ readonly name: "domain";
31
+ readonly type: "string";
32
+ readonly internalType: "string";
33
+ }, {
34
+ readonly name: "did";
35
+ readonly type: "string";
36
+ readonly internalType: "string";
37
+ }, {
38
+ readonly name: "notes";
39
+ readonly type: "string";
40
+ readonly internalType: "string";
41
+ }, {
42
+ readonly name: "allowSubdomain";
43
+ readonly type: "bool";
44
+ readonly internalType: "bool";
45
+ }, {
46
+ readonly name: "owner";
47
+ readonly type: "address";
48
+ readonly internalType: "address";
49
+ }, {
50
+ readonly name: "tags";
51
+ readonly type: "tuple[]";
52
+ readonly internalType: "struct TerminusDIDQuery.TagData[]";
53
+ readonly components: readonly [{
54
+ readonly name: "from";
55
+ readonly type: "string";
56
+ readonly internalType: "string";
57
+ }, {
58
+ readonly name: "name";
59
+ readonly type: "string";
60
+ readonly internalType: "string";
61
+ }, {
62
+ readonly name: "abiType";
63
+ readonly type: "bytes";
64
+ readonly internalType: "bytes";
65
+ }, {
66
+ readonly name: "value";
67
+ readonly type: "bytes";
68
+ readonly internalType: "bytes";
69
+ }, {
70
+ readonly name: "fieldNamesHash";
71
+ readonly type: "bytes32[]";
72
+ readonly internalType: "bytes32[]";
73
+ }];
74
+ }];
75
+ }];
76
+ readonly stateMutability: "view";
77
+ }, {
78
+ readonly type: "function";
79
+ readonly name: "getDomain";
80
+ readonly inputs: readonly [{
81
+ readonly name: "tokenId";
82
+ readonly type: "uint256";
83
+ readonly internalType: "uint256";
84
+ }];
85
+ readonly outputs: readonly [{
86
+ readonly name: "data";
87
+ readonly type: "tuple";
88
+ readonly internalType: "struct TerminusDIDQuery.DomainData";
89
+ readonly components: readonly [{
90
+ readonly name: "tokenId";
91
+ readonly type: "uint256";
92
+ readonly internalType: "uint256";
93
+ }, {
94
+ readonly name: "domain";
95
+ readonly type: "string";
96
+ readonly internalType: "string";
97
+ }, {
98
+ readonly name: "did";
99
+ readonly type: "string";
100
+ readonly internalType: "string";
101
+ }, {
102
+ readonly name: "notes";
103
+ readonly type: "string";
104
+ readonly internalType: "string";
105
+ }, {
106
+ readonly name: "allowSubdomain";
107
+ readonly type: "bool";
108
+ readonly internalType: "bool";
109
+ }, {
110
+ readonly name: "owner";
111
+ readonly type: "address";
112
+ readonly internalType: "address";
113
+ }, {
114
+ readonly name: "tags";
115
+ readonly type: "tuple[]";
116
+ readonly internalType: "struct TerminusDIDQuery.TagData[]";
117
+ readonly components: readonly [{
118
+ readonly name: "from";
119
+ readonly type: "string";
120
+ readonly internalType: "string";
121
+ }, {
122
+ readonly name: "name";
123
+ readonly type: "string";
124
+ readonly internalType: "string";
125
+ }, {
126
+ readonly name: "abiType";
127
+ readonly type: "bytes";
128
+ readonly internalType: "bytes";
129
+ }, {
130
+ readonly name: "value";
131
+ readonly type: "bytes";
132
+ readonly internalType: "bytes";
133
+ }, {
134
+ readonly name: "fieldNamesHash";
135
+ readonly type: "bytes32[]";
136
+ readonly internalType: "bytes32[]";
137
+ }];
138
+ }];
139
+ }];
140
+ readonly stateMutability: "view";
141
+ }, {
142
+ readonly type: "function";
143
+ readonly name: "getDomainByName";
144
+ readonly inputs: readonly [{
145
+ readonly name: "name";
146
+ readonly type: "string";
147
+ readonly internalType: "string";
148
+ }];
149
+ readonly outputs: readonly [{
150
+ readonly name: "data";
151
+ readonly type: "tuple";
152
+ readonly internalType: "struct TerminusDIDQuery.DomainData";
153
+ readonly components: readonly [{
154
+ readonly name: "tokenId";
155
+ readonly type: "uint256";
156
+ readonly internalType: "uint256";
157
+ }, {
158
+ readonly name: "domain";
159
+ readonly type: "string";
160
+ readonly internalType: "string";
161
+ }, {
162
+ readonly name: "did";
163
+ readonly type: "string";
164
+ readonly internalType: "string";
165
+ }, {
166
+ readonly name: "notes";
167
+ readonly type: "string";
168
+ readonly internalType: "string";
169
+ }, {
170
+ readonly name: "allowSubdomain";
171
+ readonly type: "bool";
172
+ readonly internalType: "bool";
173
+ }, {
174
+ readonly name: "owner";
175
+ readonly type: "address";
176
+ readonly internalType: "address";
177
+ }, {
178
+ readonly name: "tags";
179
+ readonly type: "tuple[]";
180
+ readonly internalType: "struct TerminusDIDQuery.TagData[]";
181
+ readonly components: readonly [{
182
+ readonly name: "from";
183
+ readonly type: "string";
184
+ readonly internalType: "string";
185
+ }, {
186
+ readonly name: "name";
187
+ readonly type: "string";
188
+ readonly internalType: "string";
189
+ }, {
190
+ readonly name: "abiType";
191
+ readonly type: "bytes";
192
+ readonly internalType: "bytes";
193
+ }, {
194
+ readonly name: "value";
195
+ readonly type: "bytes";
196
+ readonly internalType: "bytes";
197
+ }, {
198
+ readonly name: "fieldNamesHash";
199
+ readonly type: "bytes32[]";
200
+ readonly internalType: "bytes32[]";
201
+ }];
202
+ }];
203
+ }];
204
+ readonly stateMutability: "view";
205
+ }, {
206
+ readonly type: "function";
207
+ readonly name: "getDomains";
208
+ readonly inputs: readonly [{
209
+ readonly name: "tokenIds";
210
+ readonly type: "uint256[]";
211
+ readonly internalType: "uint256[]";
212
+ }];
213
+ readonly outputs: readonly [{
214
+ readonly name: "domains";
215
+ readonly type: "tuple[]";
216
+ readonly internalType: "struct TerminusDIDQuery.DomainData[]";
217
+ readonly components: readonly [{
218
+ readonly name: "tokenId";
219
+ readonly type: "uint256";
220
+ readonly internalType: "uint256";
221
+ }, {
222
+ readonly name: "domain";
223
+ readonly type: "string";
224
+ readonly internalType: "string";
225
+ }, {
226
+ readonly name: "did";
227
+ readonly type: "string";
228
+ readonly internalType: "string";
229
+ }, {
230
+ readonly name: "notes";
231
+ readonly type: "string";
232
+ readonly internalType: "string";
233
+ }, {
234
+ readonly name: "allowSubdomain";
235
+ readonly type: "bool";
236
+ readonly internalType: "bool";
237
+ }, {
238
+ readonly name: "owner";
239
+ readonly type: "address";
240
+ readonly internalType: "address";
241
+ }, {
242
+ readonly name: "tags";
243
+ readonly type: "tuple[]";
244
+ readonly internalType: "struct TerminusDIDQuery.TagData[]";
245
+ readonly components: readonly [{
246
+ readonly name: "from";
247
+ readonly type: "string";
248
+ readonly internalType: "string";
249
+ }, {
250
+ readonly name: "name";
251
+ readonly type: "string";
252
+ readonly internalType: "string";
253
+ }, {
254
+ readonly name: "abiType";
255
+ readonly type: "bytes";
256
+ readonly internalType: "bytes";
257
+ }, {
258
+ readonly name: "value";
259
+ readonly type: "bytes";
260
+ readonly internalType: "bytes";
261
+ }, {
262
+ readonly name: "fieldNamesHash";
263
+ readonly type: "bytes32[]";
264
+ readonly internalType: "bytes32[]";
265
+ }];
266
+ }];
267
+ }];
268
+ readonly stateMutability: "view";
269
+ }, {
270
+ readonly type: "function";
271
+ readonly name: "getDomainsByIndices";
272
+ readonly inputs: readonly [{
273
+ readonly name: "indices";
274
+ readonly type: "uint256[]";
275
+ readonly internalType: "uint256[]";
276
+ }];
277
+ readonly outputs: readonly [{
278
+ readonly name: "domains";
279
+ readonly type: "tuple[]";
280
+ readonly internalType: "struct TerminusDIDQuery.DomainData[]";
281
+ readonly components: readonly [{
282
+ readonly name: "tokenId";
283
+ readonly type: "uint256";
284
+ readonly internalType: "uint256";
285
+ }, {
286
+ readonly name: "domain";
287
+ readonly type: "string";
288
+ readonly internalType: "string";
289
+ }, {
290
+ readonly name: "did";
291
+ readonly type: "string";
292
+ readonly internalType: "string";
293
+ }, {
294
+ readonly name: "notes";
295
+ readonly type: "string";
296
+ readonly internalType: "string";
297
+ }, {
298
+ readonly name: "allowSubdomain";
299
+ readonly type: "bool";
300
+ readonly internalType: "bool";
301
+ }, {
302
+ readonly name: "owner";
303
+ readonly type: "address";
304
+ readonly internalType: "address";
305
+ }, {
306
+ readonly name: "tags";
307
+ readonly type: "tuple[]";
308
+ readonly internalType: "struct TerminusDIDQuery.TagData[]";
309
+ readonly components: readonly [{
310
+ readonly name: "from";
311
+ readonly type: "string";
312
+ readonly internalType: "string";
313
+ }, {
314
+ readonly name: "name";
315
+ readonly type: "string";
316
+ readonly internalType: "string";
317
+ }, {
318
+ readonly name: "abiType";
319
+ readonly type: "bytes";
320
+ readonly internalType: "bytes";
321
+ }, {
322
+ readonly name: "value";
323
+ readonly type: "bytes";
324
+ readonly internalType: "bytes";
325
+ }, {
326
+ readonly name: "fieldNamesHash";
327
+ readonly type: "bytes32[]";
328
+ readonly internalType: "bytes32[]";
329
+ }];
330
+ }];
331
+ }];
332
+ readonly stateMutability: "view";
333
+ }, {
334
+ readonly type: "function";
335
+ readonly name: "terminusDID";
336
+ readonly inputs: readonly [];
337
+ readonly outputs: readonly [{
338
+ readonly name: "";
339
+ readonly type: "address";
340
+ readonly internalType: "contract ITerminusDID";
341
+ }];
342
+ readonly stateMutability: "view";
343
+ }, {
344
+ readonly type: "function";
345
+ readonly name: "tokenByIndex";
346
+ readonly inputs: readonly [{
347
+ readonly name: "index";
348
+ readonly type: "uint256";
349
+ readonly internalType: "uint256";
350
+ }];
351
+ readonly outputs: readonly [{
352
+ readonly name: "";
353
+ readonly type: "uint256";
354
+ readonly internalType: "uint256";
355
+ }];
356
+ readonly stateMutability: "view";
357
+ }, {
358
+ readonly type: "function";
359
+ readonly name: "totalSupply";
360
+ readonly inputs: readonly [];
361
+ readonly outputs: readonly [{
362
+ readonly name: "";
363
+ readonly type: "uint256";
364
+ readonly internalType: "uint256";
365
+ }];
366
+ readonly stateMutability: "view";
367
+ }, {
368
+ readonly type: "error";
369
+ readonly name: "DomainNotExists";
370
+ readonly inputs: readonly [{
371
+ readonly name: "tokenId";
372
+ readonly type: "uint256";
373
+ readonly internalType: "uint256";
374
+ }];
375
+ }, {
376
+ readonly type: "error";
377
+ readonly name: "InvalidBatchSize";
378
+ readonly inputs: readonly [{
379
+ readonly name: "size";
380
+ readonly type: "uint256";
381
+ readonly internalType: "uint256";
382
+ }];
383
+ }, {
384
+ readonly type: "error";
385
+ readonly name: "InvalidPagination";
386
+ readonly inputs: readonly [{
387
+ readonly name: "offset";
388
+ readonly type: "uint256";
389
+ readonly internalType: "uint256";
390
+ }, {
391
+ readonly name: "limit";
392
+ readonly type: "uint256";
393
+ readonly internalType: "uint256";
394
+ }];
395
+ }];
396
+ export default _default;
397
+ //# sourceMappingURL=TerminusDIDQueryABI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminusDIDQueryABI.d.ts","sourceRoot":"","sources":["../../src/abi/TerminusDIDQueryABI.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAmgBW"}