-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexample.ts
724 lines (687 loc) · 133 KB
/
example.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
/* eslint-disable require-jsdoc */
import {LedgerLiquidWrapper, NetworkType, GetSignatureState, ProgressInfo, ResponseInfo, GetSignatureAddressResponse} from './src/ledger-liquid-lib';
process.on('unhandledRejection', console.dir);
const blindOpt = {blind1: true, blind2: true};
let networkType = NetworkType.LiquidV1;
let setAuthorization = false;
let authPubKey = ''; // 04b85b0e5f5b41f1a95bbf9a83edd95c741223c6d9dc5fe607de18f015684ff56ec359705fcf9bbeb1620fb458e15e3d99f23c6f5df5e91e016686371a65b16f0c
let setIssuanceToTop = 0;
let setReissuanceToTop = 0;
let peginTest = false;
let pegoutTest = false;
let pegoutTest2 = false;
let connectionTest = false;
let connectDevice = '';
// mnemonic = 'call node debug-console.js ledger hood festival pony outdoor always jeans page help symptom adapt obtain image bird duty damage find sense wasp box mail vapor plug general kingdom';
let waitCancelCount = 0;
let currentWaitCancelCount = 0;
let dumpPubkeyMode = false;
let debugMode = false;
let targetBip32Path = 'm/44h/0h/0h';
for (let i = 2; i < process.argv.length; i++) {
if (process.argv[i]) {
if (process.argv[i] === '-r') {
networkType = NetworkType.Regtest;
} else if (process.argv[i] === '-d') {
debugMode = true;
} else if (process.argv[i] === '-nb1') {
blindOpt.blind1 = false;
} else if (process.argv[i] === '-nb2') {
blindOpt.blind2 = false;
} else if (process.argv[i] === '-tc') {
connectionTest = true;
} else if (process.argv[i] === '-a') {
setAuthorization = true;
} else if (process.argv[i] === '-dp') {
dumpPubkeyMode = true;
} else if (process.argv[i] === '-tcwc') {
waitCancelCount = 30;
} else if (process.argv[i] === '-pegin') {
peginTest = true;
} else if (process.argv[i] === '-pegout') {
pegoutTest = true;
} else if (process.argv[i] === '-pegout2') {
pegoutTest2 = true;
} else if (process.argv[i] === '-it') {
setIssuanceToTop = 2;
if (setReissuanceToTop) {
setIssuanceToTop = 1;
}
} else if (process.argv[i] === '-rit') {
setReissuanceToTop = 2;
if (setIssuanceToTop) {
setReissuanceToTop = 1;
}
} else if (i+1 < process.argv.length) {
if (process.argv[i] === '-cd') {
++i;
connectDevice = process.argv[i];
} else if (process.argv[i] === '-path') {
++i;
targetBip32Path = process.argv[i];
} else if (process.argv[i] === '-apk') {
++i;
authPubKey = process.argv[i];
}
}
}
}
const sleep = (msec: number) => new Promise(
(resolve) => setTimeout(resolve, msec));
let isDumpSignature = false;
let lastState = '';
let pastAccessTime = 0;
async function dumpSignatureProgress(lib: LedgerLiquidWrapper) {
const result = lib.getSignatureState();
const cur = new Date();
const hour = (cur.getHours() > 9) ? cur.getHours() : ('0' + cur.getHours());
const min = (cur.getMinutes() > 9) ? cur.getMinutes() : ('0' + cur.getMinutes());
const sec = (cur.getSeconds() > 9) ? cur.getSeconds() : ('0' + cur.getSeconds());
const msec = (cur.getMilliseconds() > 99) ? cur.getMilliseconds() :
(cur.getMilliseconds() > 9) ? ('0' + cur.getMilliseconds()) :
('00' + cur.getMilliseconds());
const timeStr = `[${hour}:${min}:${sec}.${msec}]`;
if (result.success) {
let prog: ProgressInfo = {current: 0, total: 0};
switch (result.currentState) {
case GetSignatureState.AnalyzeUtxo:
prog = result.analyzeUtxo;
break;
case GetSignatureState.InputTx:
prog = result.inputTx;
break;
case GetSignatureState.GetSignature:
prog = result.getSignature;
break;
default:
break;
}
if (result.errorMessage === 'not execute.') {
if (lastState !== result.errorMessage) {
console.log(`${timeStr} getSignatureState:`, result);
lastState = result.errorMessage;
}
} else {
const state = `${result.currentState}: ${prog.current}/${prog.total}`;
if (lastState !== state) {
console.log(`${timeStr} getSignatureState(${state})`);
} else if (pastAccessTime !== result.lastAccessTime) {
console.log(`${timeStr} getSignatureState(${state}): time[${result.lastAccessTime}]`);
}
lastState = state;
pastAccessTime = result.lastAccessTime;
}
} else if (!isDumpSignature) {
console.log(`${timeStr} getSignatureState:`, result);
} else if (lastState !== result.errorMessage) {
console.log(`${timeStr} getSignatureState:`, result);
lastState = result.errorMessage;
}
if (isDumpSignature) {
setTimeout(async () => {
await dumpSignatureProgress(lib);
}, 500);
}
}
async function cancelWaiting(lib: LedgerLiquidWrapper) {
if (currentWaitCancelCount) {
--currentWaitCancelCount;
if (currentWaitCancelCount) {
setTimeout(async () => {
await cancelWaiting(lib);
}, 1000);
} else {
lib.cancelConnect();
console.log('cancel waiting.');
}
}
}
async function execConnectionTest() {
// connect wait test
const liquidLib = new LedgerLiquidWrapper(networkType);
if (waitCancelCount) {
currentWaitCancelCount = waitCancelCount;
setTimeout(async () => {
await cancelWaiting(liquidLib);
}, 1000);
}
const devListResult = await liquidLib.getDeviceList();
if (devListResult.success) {
for (const desc of devListResult.deviceList) {
console.log('connect device :', desc);
}
} else {
console.log('getDeviceList error. ', devListResult);
}
let connRet = await liquidLib.connect(60, connectDevice);
if (!connRet.success) {
console.log('connection fail.(1)', connRet);
return;
}
for (let connTestCount = 0; connTestCount < 120; ++connTestCount) {
const connCheckRet = await liquidLib.isConnected();
if (connCheckRet.success) {
console.log('10 sec wait start.');
await sleep(10000);
console.log('10 sec wait end.');
connTestCount += 10;
} else if (connCheckRet.errorMessage === 'connection fail.') {
console.log('disconnect. start reconnection.');
connRet = await liquidLib.connect(60, connectDevice);
if (!connRet.success) {
console.log('connection fail. ', connRet);
break;
}
console.log('reconnect success.');
} else {
console.log('isConnected fail.(2)', connCheckRet);
break;
}
await sleep(1000);
}
await liquidLib.disconnect();
}
async function execBip32PathTest() {
// connect wait test
const liquidLib = new LedgerLiquidWrapper(networkType);
const connRet = await liquidLib.connect(0, '');
if (!connRet.success) {
if (debugMode || (connRet.disconnect === false)) {
console.log('connection failed. ', connRet);
} else {
console.log(connRet.errorMessage);
}
return;
}
const pubkey = await liquidLib.getWalletPublicKey(targetBip32Path);
if (debugMode || (pubkey.success === false)) {
console.log('getWalletPublicKey =', pubkey);
}
if (pubkey.success) {
const xpub = await liquidLib.getXpubKey(targetBip32Path);
if (debugMode || (xpub.success === false)) {
console.log('getXpubKey =', xpub);
} else {
console.log(`xpub(${targetBip32Path}) = ${xpub.xpubKey}`);
console.log('PublicKey =', pubkey.publicKey);
}
}
await liquidLib.disconnect();
}
async function setAuthKeyTest() {
if (!authPubKey) {
console.log(' Please input authorization pubkey!');
console.log(' usage:');
console.log(' npm run setauthkey -- -apk <authrizationPubkey>');
console.log(' example(develop key):');
console.log(' npm run setauthkey -- -apk 04b85b0e5f5b41f1a95bbf9a83edd95c741223c6d9dc5fe607de18f015684ff56ec359705fcf9bbeb1620fb458e15e3d99f23c6f5df5e91e016686371a65b16f0c');
return;
}
if (authPubKey.length !== 130) {
console.log(' Authorization pubkey can only be used with uncompressed pubkey!');
return;
}
const liquidLib = new LedgerLiquidWrapper(networkType);
const connRet = await liquidLib.connect(0, '');
if (!connRet.success) {
if (debugMode || (connRet.disconnect === false)) {
console.log('connection failed. ', connRet);
} else {
console.log(connRet.errorMessage);
}
return;
}
console.log('authrizationPubkey:', authPubKey);
const setupRet = await liquidLib.setupHeadlessAuthorization(authPubKey);
console.log('--HEADLESS LIQUID SEND AUTHORIZATION PUBLIC KEY --');
if (debugMode) {
console.log(setupRet);
} else if (setupRet.success) {
console.log('Authorization pubkey register success.');
} else if (setupRet.errorCode === 0x6985) {
console.log('Authorization pubkey already registed.');
} else {
console.log(`Error!! error code = 0x${setupRet.errorCodeHex}`);
}
await liquidLib.disconnect();
}
async function execFixedTest() {
const proposalTx = '02000000010354cc5be98996fa6e7128922c65425652746d2b9fc57576e9c54cf73f9e245bb60400008000ffffffffacc35ae4c07c0d73110c97f4b6d7fef5464f3c98dd60b8b2f655c2e867fd60f1b1a2d523532697e23070d333db069339b3ae94a15a075ac7f8e4f25ce86d7892081a68eb432a7fb0f286bee1c2348fa2d84353b2d3b8350c1f518958a87e21ebd30054cc5be98996fa6e7128922c65425652746d2b9fc57576e9c54cf73f9e245bb60000000000ffffffff54cc5be98996fa6e7128922c65425652746d2b9fc57576e9c54cf73f9e245bb60100000000ffffffff050ad6f88035d77c23ae409242de725e8e10a889dac1c2b2a9b06354ae426e31d0b608fe2e688f7c5005d64cbb0639f9eefc79ad7749a243317c8b9db747bb94f50ec002862fe34b4b6607bfa362065965ff0e8da5936f5a4c640c49d0578a879746486117a9145147295169feb02e6de34f2443210318de96d146870b80b107e44529efaadec58dae4af49821bf943a1ff8eb6f9936ecd3fa6c8e93b0092f260068d35adb85e242270ef89d4921bcb09aede102d4a4da3cd4cc63c4e7dc03529f1d5af508318baea0c72cad85a78bd4f5c94f9be480de99e4942779a95ef617a914c89964d7512214d8cd4cd8a2c2c57e7f4238ce3e870ab06a2ef6f83003ceca11d177d1fcf6cedf57a166ff4da71bd97e6b10768e8b9908d415daecdfba9228eee863ad881b3448760d9e55d1475aae0e6517675362e86603af1b03fd752bbc05aa60fea1a235b368e5ffc9948955e23cb72f8f76a79e778a17a914cb25143d64243ea88502dbf8d761b7765d19f977870125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a01000000000000c35000000b3aaa8332392f4bfad1ffbfc1c00ef77999892efb089376c9bf31e3d444ef6fab09c125644453422d3411630a44405e0c67f1ef441dc284386cbea79bb91229686a0385f7b6c6de2bdaa307aae7a0085f80503b70d2cc01828910fa5cf359aaef6a5517a914f6d243bb579d8823d945b8415bf59c76400fd3658700000000fd4610403328cebf01bac61c8768beaf125ce55137cad91e320c58e3adaa284e4bba381c2934a428d517a99af681936c3634160b53b2b8b032fc102279fe9eccbe47c46c936424b89f0d2bcb096383620a254cf616d4d72679c1753b75b32bd35618a81c8c614dfe5977e511eb67bcd28f5c8bb651362ff982008705e90e191364d73d87b1da1a0cef4644a14c05001f8eb87a4f983a87a50777e0e4f11326dd1d49b8a8bb9042275dda9909a5c20ae37e2f70c5d6fbc1bf8f298212bef5ebd642708736c09a767f48e704ade2820e958b0b96af2390327c95db25f8e53f77e2260eec551e3865fba51e06259fdb2ec9ebe9dd60c982181f0670a073ade76ae86ba5750b0696ba61a0d06559c4fdc7f2270d7dfe7daeab07426175536ed64bfd9550289f7445aa2390ee58e9f0867201aca40c9d3f5b92a90eb5db4587b0c71e864e9392268a001e5bb18cb307c3c7b94e5ff15fe094fd112581472b7211ab979528242bc893975d86179a4954970a16f954baff0ef63970a0e1896348ce758de3c62e86811929f4fed2ba10df7b7769aecd45edfcbe50f57456e0da356672ca8f8b3580730261fc2c14123552c85714eaf12a3c93246de3c6eaa8214210759679f60322c24d94ff59667500be2abba8ba45038e0b32c231e00ad59116895d22a5a25fee2adf2bd48139ad5daddf032315a3e3d10515bb5bf6dc05bbaf9b08b1250423725cc7dd462b9d66bcc8496f9aad8b4c0a5565cb670963d716afafbe37f06b6be4d3d3569e206642f92a9e448f2087b82771a9920076a194363fc198456d7f073cb692d122f034d50c945064f20bca6f606c61a951638a2721471014edfa0c70d8b6ae23c13a7a5748c87bb75cb55344b6e0b06760b9e7843b055dafcfacade24dcdc62126a66082189d2a81f5449a33cd4c1fd621f3048aed28992a6dcc00a54e4f36c9cc0bf9575b1d2abf3e3a3c6ef970bdf634be39d2d765caaf9cccfb8827d26ae79a9a360f2cc3dfd020acc331b23dda5688dd60b69fecbccfd8d75835ad3aa8e66ee7015edf28bb57088549271f26ef24d4991e7ba3873590252bf23d1bd5315f23038d327ac0069697b91153f2225c60a6ed6b76b5e1956ba7450cece29dadc6329036f2ade41b5753b5afe0c967818d4a9f1c7c10a88e289db1996221e932e2e72a59fe4b5ec7f2af0d67887fb0a836508628e50ea7309bc13809141d59de26998836952cd5fb233a23f02abfa834bba926604b836707bd194e0aa76ae391c0ec8d1656b042e713e2b3b8584711ad219f3a682139a79c9d5cec32883972157c8e57748d367f4494ccc62871f39b5cb080a994e7b624f7b494e0e46c9b52ef39603a6fffd74129270e67eab6afa526df91cb5b6b8fdcbadd462923414ca003ab5b84b9d0633bd52c0cc7cf5cebede422ab481d85de75028b0873893cb747831e02f7c8e14e46dd3d49fff0a83f5dd16b254c5b68a01944538afab4fec21641963c350f79336be57ffa67664164e97b0f86849115f022820fe5e7f94911cd76596ed9d80cca25f30ca0ffc270d346be2d72521837b2cf5681244c5e0ac9d4165e50600f09d9ee066f40b1a25fdd93bfa2c62753903af5fbc240cee0f40eb84a8d583a46d4aa455e175d1450f082051ea3bd725c3ca8dd53c071e58c1f0ea3c29dc77a4ac3cb7b9116354a2e3c042e2968de826b757b132b5c84fd6e6bd2a4102927c7899301d1ed58a6f23517feb2fa4aaf5799cab3d61e6d3c36507b978771525e7ce8df4906ee47e1a70ac8dd5c076d9bf0a8c7b28ec6baf57048c8cb0bf8b98b531c6d39d66f324bb0a4817e684ef637b7f2458768ebcc5db012573ce3ec1beb49a9047d22cbe4749fd01fe0e9225b90d8bce7be09c12aa6f11addb67922ff51a72572dd90e739048a836bce388d397c5ca8ee00f4ae3a656211b183273c0356e05b5f30f241326d96044a8d2d9c413c75bdfb346d8e677930fa1ca90e966afa0f62d0a223e93b129ecf03a169cc2427ef22e96393b98c5eba39b7d7ca2d0cbe99599ee1c2ed5256b6e50d7eba8051f3622b837e55ef1c107ec0d610ff9498f73e93815226a6f4ac29c55f4bee906942b25797654d9144223f3da6cb04b96a2e67261c8d15e8a4990fc68026e35dc5205f474c15494c84ec59f4ebe5d11c11617410a65e84fdc0334c8eb36ced05e80e5992da59fea5cd860fc7a9c156eb5e6d1fc407e12d71566a13dcc53c8511bc2cdc61e4ff150fff6844a211df62f19fe67478c67175ea2ae49f7add986474ca67de9e46f8d75ca8f9146a17be7e2e40b9f73f524d7e811c01e158185b8ee380fc41270132b83276087edf5518479685fe89fa3e91bee4808ec4ff3a342fb7ceeb9628594fd610a26d8bd04ffd4fc06d89fbd3aad7b52c648cd02061d201f4ecf7717a68cad28a71da817e2b2b2d4a831d2a58ff9ecf0289fbcd0414a7fe4b4d1b11572731f22e2a4948b46b664a9d86fb1192d8267e48371df699701d061d463a2b73de36ae6b3f887fca698c3c067658980dd252ff4733be9e5aea5b7fb06dadb928b0fd9ffb8de58fb8dc8fba638e2193c0fcc58aa1a3d4d5c85bdcc0257596255034fa6fa1a6ed88e9dda75bff3935bd6e7aa11b32e7a6bb8ce728d577dbec61683ff5c5df7fea38275cd0b605263d493c3d1aa9f23882d46107d6439d654696a97521d7dc874ae717d956b50867f725eedec982184531e8596038fe9441ebbd5d3947465c8baa5b1bd9c1db6ab74d39e93f41317b0a4b7cdec46ca992f5a9bb4f26aa4c6034e4d729f8d65cd6d4357a35ee6fd18fd75c58d5a76787452caba2fc593792642cf5c589bcfadf80aebc44423146e3924065ed88a9966005628e24f5d55aa0e78b118674e24274789e30f90103c234d6c810d62be56f151ff1e5809b4f9e1ecdac13399dbd4cce1bcb9e8dfd5a2fe79ff7720ed03b21b6e54b26667543033a796b274a0a54e0b6af5e3b4a30e336d11bbb670df998cac780123788c73380c1c37806be2f9daf7dcac75a35449648490b14a06510a0d8c484424240edae720e2e19695f7357e2e079384caf3a2fdae0cfdc27eeb075d2d8e11d8fe7c0cc441aa6408fd00d9447ac17e0f2dff6491d3787e8b3f4d672fcb8886b4a8c34495767e422cc5988c07395ff472cb7f757e52138d75995c939411dd57c78b40193d03a3a15ac61b6b851e955efb34f1f0116b49ca010032ece14c3f0cc51e84d12ef854214c8a5ce26a8d939df17f7c6aac15f8268e0b700a11e16a4853fc8ad0298d1d3a3acae4195cc96c5f7298c0aca0b506ebd0c9f52b4aa557a55872371e782d1d45ca3acc3fceb5f7272da6fe4d76c9e93b98b60a12f88dda43c9055cf61132feaf91206f9da3c38bd6fa55ab26f146cac8e9eff84933aa897ed3797067af7470d2473e1fc15a0bdf816572900de1674e42b5f41fc968dd921b54b9b18adb1200c595040b05386d487df7b8fbe4646507dd7120bdf4083fc2e78c79f2f101697e2f8968ae454d07cdb7e496f7fb0e7a210ae20c004c500421200dde1f6b759907552b5d1b5d9375d9fb6f4e84a1ea834bcf4337d4d693520ed7a6eddac5bf0ca9f87bd1a7731be1bb28ec8283fdb26ba56e223c9c6dd904f3ea9c68d05e2a9d94abdbcbd11d95565272aa694c24350cdb1a261cd31519325a1601d2c0d716a2060cdb4d85ba69e2eb907e876b078c01dc1067256d02282eb1bc6d284093284cd50a8a7afef595106d0f9b91a1a0f86909fa4396f8b5b0591894ebc00b77396d78a1ad3d7971050427854a21d3a5e0c3afec2df83c46715538d6c5b157edbeb8863ca5e0249debb9437edc7a03a02d2b4db883dad9e1d3c2927b32500f70e6a7e81276e84a5ee72a4b174bcb74b30598bf0bd35a6d358b665ea3a6ad066e57f5bd733157e48d0677f2edeabce643fb87c7ce076bdac6af192b8c570ba1bea972fd032533bb3e908d9d910daa4f1c8d56d5809472bdc536b16d25f0240dfa1193ea333f4b911cc2287144e3cb84559d215686c032342f0b0ea7502fe80c13777aebc3cb0ca7f0883dc002749cfa196e52c339db4156ba81bdb507c000c4761cbc48ab725e7889ea64b3c53b7c5f4fe14bbf4219cf5f605299a606090bb1f2480131a85944ff8a19366ac81956db2f64d30fa8a373fb5428fb1dada3f4f33f1f266e76e56ccc49f56aac801b1499f0c5ae1141e8837e277f1c3954c244756798d1f3f5ac6b3984d7715a863df3079b90604f30aee0d25dd8f5f3492ff5cfacab3d1a56c4e6b12e9aaa51d878cf1b17308321508702c44c2f875efcb1c9720f106555d032ef715daa5bc0a940642566c6f1403eda4531cdb64ee9602d4b94ce05d22bbb63b1e49cbf25ba3b7819f0b89c61b7119bd54dec6a39dc418e69d82b31af65d0cd047b6a44092ffe2777d11b4a489ae3147493903810ff9a4f676db3861adb280a215187fdc9dd4ad7391cd84cd30608259e396e7e105691168e8c9ecfde00809d4048141362e39da874ac3c6dace9cc09e3b8a4a73da47017599df0c11cf0563980df259d04a1a6a68df0278074da62239bddf0327f93233e12971d56755e23be57c893e9ec293b402c86331c267484ac63dff794e83c9d69fd0e06f78bfc72948684925ea336236e99716c6749516003ed4976f84806e7c8006d67ce21a4e8ce8a0b6d204ebdb5cba72747cd4c3d6d42df958093385686e1b5feabdbc5d468f55daaa16c78e2720d5616b8af22f786b1612b43af8ded063601b60662bd3430bc7c8396dee51a7b1d5839c2a231100c123f595810829472f476b1174350ba13fcc0a45efd926e2bf5ee8b9f50f597d9c7b6c3fccd7098f33c418087a1b3a3a61a5cceb8d8cdcdf4f9d02cd2f7660972b0440ea04a4038e7d15fbb49a41d79e580de6173b8860d1a37c60e4c22a3a7f1b1c013aa5b4401abd3d8415c15bc59467ddb6fc6fd86d5743b266a06a91e8f7e59f6c68a8454c8931d34d0c42ff2698f3ada93a352b97f143ffaa19ed07ea2af5ef972c62279c57a2b63e87aa5934e23d6b6deb1191fd2a78aa22d6e3fb678da07b83d70b687a5eb7cb02013b658e4b69209890a44c45635e7020030a7dc080a30bfc277971279c438fc4f2b1634077eb2993b5a337ffc5619d401b553acc261db7b0368e8804cad7a46c9aa86f233dd2e4d6e9a7df1a9a76b01f27577ddff2cede7e16d292967bc5c9853885a05bfb7f80368cfdeec50c32fd33da57077fd12a813f8756a1b2b1bc2c5fbc21b61aa7d5685caef35d9259ea06973f429748f08578d09984c3693bdf205720c3d363fb05b755d58640d6cfc0008eb0928bce598e5918fd28294881819b53b6ff12af7a47f9f39df8d3b15c3a54088c2eb92720a698a08679b50ac062b1710c062f6c501d9a864f50b96b796c1ddb008ce15f09f7a74d0dfaa2fa3bf95e4acd8dc4bb488055f4bc12f9589c273f6057277f7fee43d3f10435e13e229b4cdd684d970f626739ca038aa7a74e69e768569d252a10db5896881c54a4678c78ab6c788277b5d1f6cdab11d8ed0250eb0620c415a53ede8e414267acd931b6774822daa156f210aa701c9c4dde9739f8479b84af44f471a934bb44d9eb071f6ae1deb377e5cb9ed28f326dd41bda9b3dae7b3e3e65f85a3a2ceb0324aa86606a268b124eb1b9dd5869a5eac7b142d6162a30c2653f87484b68449ba34cfd2d35d37996eed3d65bbbff5485b56cee74b05c2771b7e6b312ecf6c83568c20cf30fe1d0a718ba330f9a2de8160161f7ae97ae100e2a4710e4ffb7f702d12bfab852ef68f60bcea8f7da6abf27912b835e89dccb95a8f383fa0fe47899b110f36f2180c606f5eaa3df7b371da253d11a98f6fb00000000000000000000008304000733e12ac9c2761e92aaf8cd0818e871e4bac86546ee92102f927f30f5cb73d4d808dcc021963d841a601fe61a71a089e9baba699a6274cda2d5fd7f1a00010528a16ada0969a4df5016aff8832b1b678386f51ed3e4757caf8d0f233e4dcbe89b9ab8dcdb9188742c7a6a141c4282f1e0894012cad5c11f75aac073a314e17cc3fd4e1060330000000000000001696aa60122ff3bac63b6d0c00308ac85fd43c76039537b1c3e41f21964b46a917168261222883fd7f26642479921bdc40a27ae183380da7172035ec2a06f76275bed497318a0ba3865ddb02ac5cfe89d5e72ffe026aad9ff5b15a4bf95eb885504f3d28c48da2434bf4f506ac4e31f90599f873c66611dbee72dc0d210734894006519c7eb45a57cb7ca1d68520fb653396d885bb77957cb40170a030c21a03dc37d8cf9796c3f47384a31a911a2f2be347829188695c05e641ffbe89608865b0e239b480680d8ef6579baaa7c948ca338045982e695c0a2b95d574fce5d99f5309a39827373d0b43e2e51b5750a1b84a2f9576589fa0b56bcbd62088a99efb76f3a4d02d904dddf527c284fd1ca309ea9438cb3f38e3e1641771dbd086416012463b09f9cee9f2fd4af6c28bcdfed6be43ec197a89d22057b6efef44920bddb3d5052c4ca1e1687d3a9100a26a23583a4306adb9a0514373f138aec06e423695848ee88b31cd9a9c6257124e974914760146bae941d816dfc4128dfd6f600cdfd7e34e1417068e7a52d720147941aa52021fb6c71dfea28086ae9f11bd2c47c4137dac44a9913811320de45388fc8af63612068f9edb3b9207f79034f79a5372cb32c4224029b701230b468902322296562f8b60abf574f4ec11843533d6014f927ec9efc606a6d4e9a9c4e4b5403aa0c5c15c3b0ebfdd1baf59e9143d9ba6c17097fea3f03bb2e377eae45b96d6e0bdfc705e9cbc7dfadf4e53dd5b69b7c04f9022b8fe19b562bed08e59d64500db6606155cf317ef4904778f6e1a5e1a7c3a93e4dd74db5da334c03261247d5ec9b80ed38b67448e3ced60925ee251056b17747b225282784e6dbb716811d08a198fd4aa4f1f1043d4553feea9c58d531eac735c803c0846ef566244ffb35546ef80b185002425dac7c51f17abc8829d498cbedafe67f0e1be2392667bf4cfaa067d925b0633ac995b83f7d5f267ec800dd6cc91e5601dec23a104e4dcbe1b50b8f4024d5e6aed77eaa35a835d8d5758de8d8a819894b26cfd3d01c8dd5499fa40a5561b1c98df51d481965c1d33e9d76d2b8e5c39f8f947ee3e55ba8ad81c4e588af15e497303da5aa7ce73ca75e50541cc1a679dab32ff63345d566015cfae6ef4e6e69d737e3b0ff60d86ac667bff2c14c2bc85e0480f079a82ec463b6c6e5cd8d70e9a7d0dc48b5e02a646762361a8b01381089773f1b926308c9fd297573c6f92f9db23ae426ca48296cf39988cdcacca16d9e3952c88283d7446daf8664aa184b5c5aaa08ff2f9b1277972d4b7585ddb86a20566d37558e5cc561ab2627773ec86dd6e590f73354e031433810d37ffc4b6c644a5cd07eb96e84918009c79bc9597fd7b5a70fdae09066023e622712f78201182b0b312cbd149f1e0cdea866b52e6563a5aa01934a9adde430a05df4dfddfc06d994b11c9be3758c17f397e65c825c38c5bff9453aa29b5533918c2a4fc2364a116b489d89e52aadd338d0871bbd713f42788693c97a1e45a0fa0e0e1365ca9f8ac01822cf581e9b987dbbbd91d77b2cca4c64e32d1c4b8d6a1cda690d07cc8dab5f5cb6920b461509c3166c237eab176f9c922809dddf38714e3ddbf656a0805cee88a03967fea1317a70d391f1414c0bd178b53320b51a602a29909a387894d2809ac76ee77441b04afa16532a85a87cee61abf0b1a74e894ca26e984d09ed2b3d0499a619968b081c392635f553f7e1ef60d217684cc5ecde70a7a3592b18d1a6fd89f2a6d06d788fc200efadff3a27e1d2d589ae78243570ccce495de84cb8baa66c2f93de991bba46e32e4aa9d350d3a5341b2658841f828eebc925ba2a7789f8a7fba61bf47e7a230e2fccbb5ce586dac12a139d8b98dd93c59a0e4dc0463b5c5f066f07ccd04790448986889da78d85d5b3b822e1009708afb9e1cb40979af74c8400ce61dd7099560a35ea09e234f905ddde59aac5c238526e17172cb6b390a7aab9468dec7889d440bdd1005769cfb5557ff25e71dd1a9bff38ea1783cabd13bcabf7a96b7b54914ebd56c4f32afe08a8a9b583a3c90328d666d3d3775a8f90a17c02e197b807aed65b3dc63101758fcaf7fac2797dc18937fa744026b7595b326e6e221530924d785d8115721c7a2c56bb01eaad303a1f6764fc918b4c2bfe2e70a78dfca8194619f8a9e156acfb878783c4f9823dcf14a537e80a1771161cefbbf17c88bf495ab8c0de77817a99375cac265b0468415713acbf83a956e04e694ab56f220da3fa89afb63ba3c5d00b310e4419ed469f945de0f2ce5f04476fd2719cf5483052f73dec3556031f62a79253f5379b20271b42423cf6a59d9a7e86bc99f814306697066fdd47551b75be098de040f89a890a9bf7b302c48b7fb4e76cb42959f37a6fb883ee94dda3fd5c7c689c5d70ac4938f0a1621a1025f43d0418efc452eaf682923ad374a88d68d8bdd1d52a9b61754a35b014ac6dca73541476992a01201ecef86fe449ca9b185b8689a67cecb92c3051e5b0d3565ad52ff9b8bfd6f20404c1af7e8a05b50852e91365167895bd9124af6bd6495b93ec65cc31905db17904620c1c4085baefdb148100143087466d65bf0796d1fc8854cb028c8a7463aa1d87294cb2d6db611789d1c19182e2ef4905e38f0a2414a9a519f05468575d5c515654b14a860ec0f649e3ff2cdcae5b5b51318c1189c7fd887b606c0cf37259d0ebc30c1d5761bf4549e5ef64065404908ecc615cf51e7d9eb42c5b10a6d71675c8f5da6fb1d5a4625c22b55105586606b7d018b8caa90a0716bb0313992e7df9eb68d52e206bca307e34cd3135e3785b6a629e15fb0d8e1f2c913082dbd52b223d487aa2c8f66a33360b7694a5a374d51ab768533a878b39b65ec8b38506b96d53bcfb778ab9489edf2cdb3e2c6f5a3c1e14f6021f80a460ce73b8d70f1c5aec2937529980cb5ed753e9e79d5ca3bdf90b1a9380dd42a9765b6182d5a07f7589dc1041fa4aa37b25240615a73a7fd3c8342990d597e839a8a8f620a55a10a15c4de81f7cb758bfd94eadcaf06b938f92c986908bdd33883a002f2bf7a0e5fd76b596c092c89c070017644b813f854b7fed6ae6c5f6d25ee4643ab8505e2339f096a55836d93703ddc1a5d65c9388153540c51366692dc767b81bbdf0f403cccfbf324622cede2cc62e7b401dafa740a816790a89df5c1b7a1cc5f1f55b1455ab1809ed55ea9337fb9e64630e7bce22eb9b0365770563fcfdf1f84937772eb1e8307850fdfff3765085ce7951b98553081035be2db51353f85af34b82904bb85c1c95baadf2a9f3efb21df9918c9a779b9591d4812e24513813ed382d31f193e8a228999eb23aa6c8760224440633d9dcdc9449d6b83ee31e3a921b2b129abf93ca775064dde53f93cdb50343d239183133ccfa55ca06dfcbd78d2a424bc1154e868668fb8960e4ce9f6657f8f458ab0c3268706f8460f15237554ef028c4c9a616091301694721ea8403c5817e7bc736f1c61cbd2a80d0becc9cefc0244965a7500706b7e05288717823a06b80794bfc95ab5def7bf8a28e634300b6d94461d489be5ce08a63b4067930538653fef07519780051899d8c9d2cb790a1b2378c23c7d153210f57668e8be6e2a410d1a2419694183b71dcc4a803192354d8b20e7263f60c0fd49a1b33c800dc6f2056b447bd99dc43d7b471ef6ab9e5c1bcbb5dbeb01d6ab64a55404f4823b613f648c11056781561a1d90516a234f8df92580d7594e329ed5cb912cdb1cb3a9f65fe17eaf8c4f26321bd8bb14e8a3667ad41e9c2f4b4e440a1ba91027af4dc8565b18c017ee4f10d443120da838e1c5ec72a6175cd057c94af3d94c066c5fccd4a53e1f2801bf655fbbf12842f02f4344bf377b099e841fea8c472f3de25736368a990414180fc2a5febcf002e0073823432a5039be68975a25465f69d9572dabc833c5e5485651839cd7ac71fdb887ddf68e8dba1155ec6687aeb89a5438408c610d7d11a238d7aa55335ea6a018afc7b1f663d7bfd2ad5544ab7d5d5da110b51992441fff5ff41a8477491927c64bd3c80f0c31f06ab566e2804e348c861d6c2685b098e6cc37fcbfedb705f567f4c9e5a9a0626a4dcdcf2589b64edb551a6d589e01d01fc95e06090bc983fe1e2e9bd6dfeb6e487a1a8ea69fc614740e2480c74ebf4fa38e921aa6b2cdc58eccf5352ced192c2bea4fe17562132174bd7795d99b8bde487f7ac37715701b5a09172400bd2e41caa889a1e4d727e6b932b7a5c648546f735893d89ba11244973e32d58c2c8b7e05ce4f4fefd0ee6c8b5657ecaa6e02f1315bd2997259bfa001499d148a3d50c342eebee694ee4ab7ce296bc18c69ce78673e97b40b1b2da5b9ff0ea972368cc84513fd05ea856c8ad85818b7a7a552b86e2cbfacaeb7faf85a10930897f85d7e904ac05f2e8aabf68764f59e83da72688ee845800073eac72712000f66986ea7b4cf548a6b6e22e211e4b7768682345bae63fe857b19bf1b264dcb30e16cdc4d54783036b1e9605e841105f43595416b9f5a422abd45e537f15fbebd3b01bf9c72191bebf760ed252dd4c24daf2eaa02d93a8c3a3033842fabe746926e15856d58f1cab1b83439394eef3e74a18b6088622f41116caf8c3db51b02b5dc50f92915b215ac48529857ccfce468c0d003a12e231afaee79d84b01502f6dbe9dc58942e42c3806ce7b0c4db50cbf07aba375f251a1da3e5eec6b56dd54f919eca921b9b7ae37e2a9a3c41a83d486498e75cd8883cb1c3f698351c524896bd2790cc878be580982cebf92964d023134701f3241b1a169e1dcd4d72cabd46ea868e7ee9510ad9a0b4cc9d71a9f89b4e772489b8a9ca873c475cce30e7720636dd30b51ff852b93c4d0bbece8a994ecec7d601a1d6f71be2631a680f980327606cc85c19891d6fc1a9b1f3bced0b8be18bba62a5d9f936a6fd4db703959f543a1cde8f271ed6ad074d5771090cb2a2222bd107d8890549d33cdcaafe8676897ddab5687c250726690bd121afd41e52191ecadde5a2f263fb8c49144eef3ea044a3910fdd3710ebb777aa6ccd706de7b70e70076ae4d12e3ea0b68b40c77b7a7a0584b3e82f881a3bc3dd37ddd8dccd0ecb0e44ef48aa66d5a50ed95f7b3496ce34bc274a05e3a28df9d27f3b27742c1455ca1fb6704d8912357f0f9471111eb27c20db53e6a504e25d9af757211049ce25ab286e932d468b3f73d238478f8e3bd6cbde9cc3807023b7b83dfc833a761220b689979f6fe77682c6a994cc2d0143e1d07ffbd9426cc1d312a695e2a399621805675f4dcc3ace15e10c0015f3360afb71bb06d37bb2041cfebe116bb838c4dd5ab38824038f39af020046cefca2573cf297708271fc599deb48a53196491278641fb101d955fda6910f31c6873d269daf80e23f61e6a243b120461393d6f70a5be634399700c936adbb3b930077e194c6dfdf4ed6f653bbb64255a8fa47215a798f03f8aae9910423b019038b6b18848fb8f12070c72c081ae290e15c0a12016a4930e0762ae12bfa0f8864f707184b0a51069f0877c2e46636148b32d0edbdfb51e11b6dc770cf3b4d7ee95f780d7220490e3fb5855d42ea0286813a63fe9f97907ba8a73a19a9c8f3dffbf6f1de395361372cdf1b2acb6538054b46c4fbdbd07d92d3a52279b04f359b917b92e40f3c1e3714b43e1109902027235f503eb349b8c23a787f7989a08933fabafd4d870ad61e7da4fe90eaaa944d9f55e52e4184d0e79a271a956ee24aa0797829014256242ef113a9c213aef404e74c30a3997ff7ad6b6583066272844ffe5b422d982f79b4a9828dc5de3c2faff30d813c3fe464767e03f5d68304000e6a09de5ae7dd7c22ef82c7b7c946ae6830d00f8441188f81f9a4000aa290f2af61335768494c43ff4b443c7b32f914c7c5a2fa07cae2967751a59aa21101ad85bd83fae9dd1e45da6cf8ff5d021e6abef0295431dfeaf076e29b7546c8ae7cd225b3b92da38e505341b4737d4f1d9d513e69b61b2e7d2d14889109613a322285fd4e1060330000000000000001f2c748019d4f3c00569754c8f661e935dcc5d35a686187939fcc8e0a744bc91256e9e0f0a167615d1d1cf7a38aec618d5f09f4e0509b7e1963fe98a10ff315612ad60bd333f88436bc8b5f45439515316cd5dcb375277ba790477ddeb7e60844526d2ba83b1ef3e890ba1ab39a42b3bb33daa102d84aaab99fcd9574ea06c6bae2669107e0d526b79550b6f5d17d66cc0151c22c882245102d24ecebeedca2644ad2483d56285dc9bd29fd0caf369bda744edacf0dfb12116aaa21997e62c501d00c9beb26ebe6399719a0a618a02177ddb244171fc7f1d91b9a4ea14016e12a451c722f28d0abd88dbd6b63a05893f6e9417ca3e61751c6142be3d2f80f33bd640be8f8a7df907797e72cf00efd42aff6547fdcdc9141f0141c66fba670476e7cec6ce53bac46f46f978261f627a49dddf50a6c43b91e97536a3862ffd665be35e317b6f204acfdd83a6d01c0297af336b04024dd70536d6a1e9dcc6decb381a9ef91e25f6996e7689f43b3ab81d8ac2f2caa247663d8c58acbd3cc5354534349198b20eeaa38e11deec096b775e3519343a40519de7977288a266e2d478bf44ac0ef686192b6b57705e0aa20e81c7a687d6b4cba32fe4fb998c007c31f5d6b019ed97adef95902d5e402fb561f8a91f8b6a6383dc97d71579e8056e9f7aff8c530ac3bb1a47f4f69bfffa5e3433e6476bd4eca7db58b46d59f70dfc2d9d67f9247dcb1945dc8c29ebf28b5dea8642ff3da9a172513f6f65f9f0076a4fe5340163151896383b304cdd58147b21a4ed9a32bb2bc7793c9ec8353f91d98cd10f308c0e1887df9110473168db556098b39b318480a5ba31da45fcf0bbf8d28084d6fb3b2af1d72e9f134dcd21d343ab5afbd270f1f633230486073de7cf146afa09c51ce0a89dd841f18794d30d8bb50341fd47d73da390d25c4a7736d86cdfa22b3142774289809b32fbcc7955507bb9a340a5b45da00425da23dd8d565cfc7994704290e96a3e82125e195840aefaba3a9f6b7fd744ce5c13406e454e2b4fccdaff427aa06b27c753a076c163efe2a263171b3c5475b7bfaa383c9df080c22478a0d8b2fc4c4a9fc070f032d5dced9f9357d1621f5c5facd64f7ddfeaf5a4424522415f83bc193973848a06ee8339cbbf67c4442f52dab210e9480a8b59b3e69210e4b0d7cc6adbbd2b36e42cdf691ba88e34302e777766700e43abba4a035f8ae40068489ff01734535d57cf9519972db541d2611c20958d79fb55892c25d77b5c4ab6666b3daaf9d8c4ab4cb9fa4b3116d4eb6b22895fc2c512ab32b2800b6e07e05a23491a83367296c26d609b17de2c88abe1affea5dbe523ea9183a09fd6616b0ba8c74052e6be3d7da1f0a61478f9bd3d9c5e660727883150f02f1d002f87540c0448443b80b2df5467bf0208bad2513d56b0cf5489d8c1cc69c59c78ac55f64c5f15fdca0ab41d432341819a6967af62be6dbca689f7beed9b6c339ab435afdbcc22c910b6a07df6f9202fd40d90afbd8070d6dbaab3644699ee32cb224dc21ec84ab9af68e9d9535b6325e8f080e93a0b6fd4128a8107899ffbd6149707d51487a78794c45822ccfbf74ddce6db98482ec339a2ccd8d7375ef41322abc4d7f7f9ed65fe6200f49314402356b4eeff5000497b75ec0e935702a0c79a360b37db1dab933b5154622026c03e19e98e3b853ef0ca1fb910ffeff31635b294b066c1f6cf5378b4d8f6d88f4fea5dd18d4bfb39f6286b4d55b84973ed74cdc3260ce49debff60bc5fc6667aee2850ec60a2af8bb29d02e35241657b592211fd538e59ffddaaccf8ddca9cd579622374cec706aaf9bf45f861e4f62e5bf952c6abebee61ca8c5ce1e0bc667591f32c39df0e6d90b60f57d43b60efd13a16a37b59860067443ac482cb3a57fd7da90e902b7390236f2d7b4dd68844e2c53a2cf94094d925a52b7e3bfecb71fa34a05b7ee60dd43dd2bb922500f7d3c3a32e6fc40160413d63e3ccd1f6ab67aca281d86e8bb75604a3365981a9af20b82797304bdc01084ca4f890fb1190c49ef1871f32e86c54f0c7ec54b49178cac5b43bff7053bc373b4a5e235037b57547141f4eb88e227a0401c44e4cd56e95b45cdb42e5f255bb647544cebad5b2a7f0332a0376e5f7826cb20e64469a733f8a196e7b340ac29ba9aef92e0cc0634948d7946e5647b561e4b9799d8d3cc0033f04622b588b71ff590d4b6139fda38279ae41f53930cf710806e86eed854282bf243fe02ee157bbdcfe86fdc1e9be238f82c690fcecf9683c7074c57341d7e1ce8f21c6e6b09ae3cb654d000206d5b5b7b2519fc0b002658a2867ebd533e1ab139410e27f6e443af1df116b326f3d40c25eed5ef9313bdf18d04418dced1b48a2027c6a19640b6c764509725e3d9bcb5538540f511b5c88b4502037fea5a3cd5822a06e80e45ac5d3336f7539f0b8e03151d17b786d0c1bd0adafd41b0ca8877090725a79f02a66564620ddf8764dba32dacc7049bbcf2bf5902db85002402a8277692e6ffd32d6f6fdee1108cdcd336092ce1dd9daec5bf6b6170d8e5116dd37e9cbe52242af351247fc171aa8696a608f3b5730a5ae905fe00bc4f9e9c2f019be13e68dd27f695bbfb94e0e7f2fc459cb3f5e0303416d98c3349d91f720205e43ef412ddacd10b65097135420b63ad8054b48a2eb0b76dbb65d06814a271693355d2a06e55450928ac59fbb8b2855e125a64ad03101f28bdd2fb12e10ceda9feaeeaa52663e10d2e664bbb20aadd74a1d5e054162488dec6dc4373d9ac7ac3fd66443cd1cde2b805578fc287c7dfa83c67617b5609934bf2804ee3b8e1e4f56c048fc72c9e228ab687c4837e66080ec880e5dac3df55c2d8938b3367eb7f184c4346008a96e8c2a67e9460b3a1905c263aeb5b8db44bf2a082d771f4f0d320bbbf08226c496248ab834f4789b90d16d6d6f88bc3fdcda84ca23c7397a879c23b5b767b47e811304cd2df375094ca7fa61dfcc8947cbc22c973167e4cf6f5d6a853c59b769dbde3ff845b8c97fb38d6f15d69cc6edbb45540d04911aaf2b95df83491b03e61d6c5bad8fa2f4617924614944cd8d092d18d4039444b644834be9087719d7181080d59f1a54bb8e1f902d626ab6d648d8bcd22c273011156426972bd195847bbcfa9bb00124822325c18da5e352ad5a3d8db7fc0ebfd7f37138be2cc12b1ca15d2f075d975e9b26523876cdc0795480686cadd1ffee8c64496a8e02384f4a5bb012734ef37d4c59cc4772949876b093ff7dd6ed5d181858d238a79e8c19b5b44ff25d0c5c36e154885db0eecb7269ff25e89be5b50035662f1816a7b066b757be0ac3eb3b4d616ce11d6f2f0f8b010613c0392eb942051844275a024bf468ad26d096610eaa072ef64a44098891df0660c2ed1a608618710821b1575046ca29ac5c75705803ea8db3dd6495a5c2ad39222ae3a6dd6107cc9cf8a81d9019df40705227283a9df69a979b805a20986beff6723760d49f6539b73a515804ed49017c228a0dffa647f966b36b31a8e5a8ab5d640ac4cad1e6eb5776c36bd40443ed226afcc7c50ee23d86702538fee655c0bf69b48640fe555d854f244ff72bc56eb0ca24ccfd46813fe9e90f829fc170981875c3b7042217de239ac58ac57984f4b8828801bfdd35534f5edc1c562050454e33d6d29943cff7c9f2808056d646258187794afc2f11a7e701b4a5fc7f1270bfcf59344213cf17491756ad142b886720415e2268783e8ceb1e47edb8f6ae20319c9031119aa1c8cdaddc3573ee459bcea5c41088cb0203d7c60e54a36064ec6e757ec89b3917bf1883029ba067fb9d842c500d2bc2fb2ed4b64b7c5aa3176bceb00a9081bff10c2fefe6843becd609c321d0f8ef3c26f06ce32748cd7aa9227ac65a355ab9080e0d53f78d29fecffc5041fa64ecad54c06502eb8f0e7e1eed557ab3c9604535b62f6b0a683d9cbe2814fb6de2f12d531b52652764e0cc4a6811d6403eb43dc32306ae895170c494dee33b4be9b9ee7b29dad3431ad42db468958aef5f372bdac0f15d4cdddb14ba1fea9d7657fc344cd879afeb71844dba2ab9ff69abe55fc1f8a30ebaf3421e4eaad5389152578f90c193b1bb29876d948cf2092b5a8f0bbd4d0359e64be3b0d00b4a89c035ad2ce114beab01d0f573fdc254695c7d3fa5a8c835b10953216d820c7684ddc5258c85f5351e00f15650548c4cdf192100b769169421bd70cf918a20154a771bff5384daac43ad819f3da8ae27253fec9751764b77ec0e7a04d1b975132e4361deb18c06981ad6eb58a82eeab59e432ebe792ff56ed039f8914ba678eb30a8acde70627bbb36dd3891c4409f8fbb5359cdd974440fa6b15d3dfb72059e49e5a8619ade70c3046fb53f875aabcc7023795980ee078e7aa3299696ec51ae408e565da771c9eeaa8c53cffe07fd04cdc4f2e191bf8cea655267aef70aae172b86fa8eff2a9c4f5c9d9ca285a325010112b28e1eeda893a58a367920775d4abbbead18670387c05e97fd096e28c8f475087d78bd0493594dc5af131f26bc5042a1e2c219daf355ec0a38f17cd7cde9f80e242b9fd83dbba77deb0bab89e900b9be0a360b2cd4b8b121e452642682f186cf11b757c62373274dc4aa78d970b3a5bb1182098b80428fd614bbf3b1288c08041e74f9c1548b716ade180d3add50f193f6c013488f735956675802f30dbd302e627f91543d110bc2b5c7d5da94cfeb6d297a497995d0b5f3ee47e942b824d0a31d6371787f60c289487689788006cb6d027121199e0994bf8bdcdedb8d8e711b74b138846ce093018e490d71d02a7cdf8e187a740dc8fe465aff03a537564537e1428d6a58842d2ee17e295fa9caade6ba0717223475c665f0632d7d090ecb7e4f82a6db0db760dfaaccc84679b30fc32cc2505f0447b5179b32509c6c35823a1989d871122f2ffd12d0fcb6521dd57cf8d6faf88efad735a43ffadfc3faa18f5b5c3b57b2716adcdb24d9a69666866480beb1536e5e6c9b313e825e18209b62fb017ff3ea5be488b6eab114d12903d19046ad2a2830d4c5ca22d1d5b4472a70bc21f9ef898bd69bd5a75c1aca8c9ad52af1a710362a2833931c0138cc1385206b85d486e97463396e55e1776214746cdfc2c6b6a5a3390a016db903b772efc6ec9688e6d2d83387ecd30581eeba6f1cf52657cf9147a52c7750b3f4e86a72747c012e1d6acc9eb448b87f7a0d9706877f82bed0e76605a8bc64c141d8fe217c1969861616d10dac7f736513a6ecb7d2853fa7d206e507b4c34ab4ddcff8687c29a9a02229d37e09374b6ff89f294f3ede888d8e4e99cd16e602b26ff2575898ddd51a7ffe90d3bd60246d3dc25b9f0d28c72bfc53a5607dfe754ced1662b57b3201c433b264de94d9209a4c9d246323531f59299768206e757be6da55597ac7db29d9bc2cce21aa9d84a4aab53ebcb40ed8dbf6b46647c0e64db66f5301f4459631fbf2bef40c7b6b36cc56c8bcf079531c86de638e3ebaf906c73cb5d73b0d99f0e98d9c76fb871d0fd232cb8ed34f1d9c311857ff35d64b07c9640003594e499c76dd086ed6000cfc64cc158c195a18170c496592cd4718c4b3cf04e5b01fee8bf4d25ceb4c4041f560f0da14b99ed7c40c0c22722c0d5c0431a8dc17d5bfb23cf27645781ebd5d4cf64c2f800885144850e69f3bc40414cb1d404fd86231ce5995bdbd41696140ed1c46782a7893070fea4c66efc3201b97b95082e7fef5504a9ab34ad1b993a127d830d4c1f057550ee01b85e921fc15996fdff20f80690d4b1b97e1072a702ddaf0aa6aa27f584a8ca02c46b393b297db1e8a3f8ef53551310e2b7ac5092192866c598ac4fee8304000734cb048ba6b63b51ec017606705ad1c3789da191124aff0f5a6f3c22be9e1306b9462960f0271e12cb09bde69685793794f4a794a049ffa1c3ca50ba51cba14fa8a702889a2f5168a77b26e4ca84f82ca17da3bd00f75767ccf5b626d51fc70fa2c18531becbf2d2a8a11d106a921b58e3a9a23e20597a4e5cc1fd51b030a192fd4e1060330000000000000001bc465101206bff73890a12aa10f1b0fa36abd2a3aae6113a344a93abd55d2a9ff29a794f0692ae8e67b933321613735411b26ba81dbb7947dc319ed3d97093cc135fc8839998d85797a65a683a3812769df7a8ba069e39a20c261b9070c04c20df6ba04f2c6924c640003f4791b1367ef2e3d07c2e861093cb90dfedc4bbbd9d13207c6b2a22703563bff9e06b4a37faa0ec08ccad4d299cdbe0064eefdabce2878ed5e02e6d7bd23bc015206865065845d3ab1ef19c7f7c51916c254f7b6693395b27c3f7f708bd5a8bf7b9a45d48949bc78725f876361f3925b5a940e0a04fd487e65c92e0d7e17b8e0d3753a6b6878eeccd2f4e517983349613f44fe9e9d927a43799f713ec814a46e46cec2598eea6dbf5347c3af7a4520712bc93ca99ff14989237694bfd96493256fa378a10feabdd6037c89c9b50f64b145c66e479fac1aa9fc3dacb3f8709eb244fd3a3f66cff7a311ce99ef4b01f32d3a1f55840181ba870d21bbe6b7ba47123cd662c4a49a070c5890f9df3cab84c91a079638b6ce3c71804785a32b0f147cc75ee37efcf8971485c20f3d17a13fa14903d73783235714b445c44b28237f5375d111f6053322a52ce78a6f76e333874472a6d9fcc506ce10dd1c66b22aa4984a8ec6415617e5ccd6871e8c6bfe92e35d4396f94f1bdfe6dc989161bf4c5ae21493f820ff1cf0d6f44268fa66de3f666aa59ed1094f218ffc9b250586c0ec490479a169552d13f16220bc40b9aab6e692969cac82f113bfb8e968f2359c814f24066df9f85becd5f0a37efe01b31ea5e1996409d477b4e1905660e0c5e2024c50027e14d89bacdfcd6c350b7052f927e0909f967863070cc1ca3b2cc256488f2ed52a824efa9bf62e72c40caca46919486d2fbb74c92fb4039479085425af3c7100b0c5ad8da44ccebd0daa32abd29bd3e3f2bc82e0942e814bb8db78903fd73a4d9a4a842eda40280bb5e13b6334f971a1c5a2d043f3cabbcbc53c92e345f659bb6c09121e2c6e75295f5390540bef7b66e77e24f53588faa87a840bc7f6b44663262a1afbf766e80428817cef72a3edd76dfe32ca4048171fef1dda8d6013639cadd99f2f9c8f5da7a0c1a7adbe5558c5c19d2914a2613c0b18d5749898e15f4ac20e956d7a20573880fb53c392c1112c71fccbb93b8aba268ca3ddc056a65fbd21b76cc681fd417606a914a8056c9bc0f812a5e4ae8b8df856219cf9e116b30965807694d3ae8eca5fc66cf9fafe9fb2c701ca7b3456b5ccf4843411eb8f9e4ef6eef8c7953ef341e653e410f7885e94b2a0fb3ff08fd5078ccb726a153e6feda9890b3dc287f717d8a9d4f3251150ecd44bdd0bdcf744a86083c7ed27560130e5c714b01ea2e360abe43d65d16ee6e61af9955db68c047799c3642d8e70ce88995f818f5c27ef8cba8f62bf691d71299282053b113ee2ba993fd39d0592251ea85529bc3a3c7f51f5e6339101e1889a7d1b4c26b90c57926e01497ef1e58bfd5b358689eb65b2deda4dd290c014a284f0976f517e67d4f56d640744a3c5887bdbe2734b90374a089863280ed89d101843404bfa62ae6721c3985d31438ad812f9112f01f902078d126b995d96d31e889d9eb2beb6a67427cc1ad5ee113ea308359adc383708730de870bf54b4ffb891090a545ce5e90df29d90d6da5d102d27d746c07dd8ef252171665153f2d19bc25239a03c4809d569d2b7fdc3599473651a9430ffe35f9d0105a6cd85a6543c1ba5d6bb3f8a37b3e7fe8ab10906162952e280f4d288254adf239577d63edc1a4c2ab35ca37d31ec5f1a2671d9c3c8f306c67554e2b8ae51ce5d498b448eb13b572795e543972255813d8ea7f1b27f278abee9e480bf0171a58f9849c5dfdd708fcb75819ff604f37a2a5a2735dae1d619550553d4ce93900d15abd01e5410a3ddb02818ef3075332d4d8e42128d48b0079b9b6ade380b244506e1dca04c8d836082a7bf9f12c1220df4b3c33bb7182b7668a0837364c847477f0e24bed9402d5df53059f1f8307087ab9d943017cf996014ef0533b386fea55de964455721f1dc28c73172468a7c6642dc16c730db6137f94c8af637f45d6d83f61e12da78e1e577136a08acffab81ccf575c5ae14aac2485119987042cf7666857cdf6d90857b755dfceceff53ed85453e60427e9925e24fcca2c5c1dc8725fc2d4b9449a1bfec1cc7df92a322f164ad844b96417e74f6215a966800afd0a84f217e57f9fb930e536e7a4d9e3598c73c23f1d64f400354ea5e0db8b70a52a6187af137d2eb33b1a33b1464a675254e4aef3ee9add35734f1d9ea71fe983acac9765b1b8a57ef70ec591c02b5cfaddff2b7f2a22420a3c85024e72d651edc2b2a69c7d31dd20b4dfbe30425070b9f0a9a7bc2e6a4fd74fd4baf9772e54adb268780a7cb5b20ee8be5de24475f0e5f826d46ae24e3b213edb0da3d0027f46f2185ba7cf49e57d642ba5dd25edc0ec980d8014cafe52feaf6d88bf4428eca1ccdea28e31e04182f14ed2fc75923e91ce8fd5a7a4219e23303fc1f4ea98bd66c780e0152205e1780176793ef79c955b5005c40de8b4db30d3127a6769c13a09c3bb45f07c57f6f952de854d8feeba460bbc7f8119b8be9055a364e94a992763752da2e96f3eba7044e06eafda61b2699f14422970fb2d0ffdf9f7a80342da4f3387dbee3e8cf04ae9b707056efcae5bb74fd41fe954f133f4512dc967e4a413c02fd29d01714a18a1571c2c3943e77595057cd34f6cc44fae447ec961c8dc49eefcd0b0edd15ab9261dbb01e089c7ee347694614a166a97081757e941ac15cd1230717e926e51a2b6c25f8f83bbb3c6c9f7732f727846436cc4ea8c69a9527a26a8ba32047632836229be69c228b6155d63f362272e4fdf2cdd2d3c7f2f80350565aabc9e36a931e30216108588aeb901c61213e7906cc756cd8f43ed05211d136b1cad9e50897348caaf11da9bc7c3f4237f667c6e9082db00edc2771a056a215ee2f097a082a30f804f448123b6f90675e20137a914cb1b368579da1053766f3fda7997f5fd39ccaede40f2fd822f71131de065d72b5d838d1fa61f23143be8d5bd53f0d135535e28e753ea1c77708bef3241dc6560ac472c79bb1214cc8e95ac57820ff65d1fcfbfab5851fdcd9c5d67c0ce90b759f310f6bc1dec29b84dfba8e585e12497a3e547bec768878c320a7943f8f0248efc8147ac6634edc71a67421af209a00acd72b019bc338322a0da97d967d6b24f740c3ccda4aaab02f8b075dd97b06e4c4a3c494cf4e392932076c3ef09511a79b0d0e59776691e5d1b57a88c96da0471ff68ace378ce851f2c41d0176ba409e5eddd9c443148ab9736569c0e8aa18118c88efe3a49d0efa99e0a9d94c53402c8f10f6c56bc196b3849df4c2e65ab99aea84e066f552175d489edf0555f3fdb9cf046e92d421418d3cda02a00901fa59e973a2ea221741b3248e1f10b3085884221a2df712de5f2577f536d7a259ff381c654ed56263cf6ff5ed4a1ca15f97c3e30e872081c42eb8a79985567ea8f4f836df01e76a37acafa25cbfa2ce3d14284b65c1f51688be65084d663e3a24b8dd3a6c53515ba8b9f209642c803fda70baab6d7466371bf4586043f917452b886f81b369c9e31b152cf903f547259a20610983df2811317ad7dddf401ff028c3e98a9d618430411d22be8d95010eb5c012402e994aa72f5b4610ce18262345794c0fb44c03fdcd2ecc91a6e6cbfa6b2c4ab4d20390f651afc9b66471b383bb1b88af0dd93f7ed7f5eaf9dc996f01c2b26bbc0fea1012ee8a62eaa5d5576abce0a37826c78de8ac52d7be02031dc1ea5202900af551eabcc542285ea6c22682f29aa28f61f1362a225adde9a0437d5db3b5331333cf78c17601df31efe0f03a9cc1a4adab7cecbb422d9abc727940f1d5ab2a20839ad720e25bc5b2fc847588faf3ba2cea32b95e568cff1774742e2c18d45b9b6ac662c45345706253e58608dddaa815506b9e9a9c9469e29a3a0e398322819ecf74cc1f5db0a194063b1b224594698c0b38d4e8ed5c3bb8ed21649851bf0abb5a460168967976df003afb973cbb54ba2e000c418b78794ed88e0cb9783e746a9f3888fd567fd129aaf637166428c64022b1553328aaa3fd524449b5880da0fd94b4253e36b21e3270d5352e8fd3eeace5d526d5354368df424857c79d8cd39a9a85a86a99a7bebfcf272e5221a41396a460360db863fd6790a80d93af42ceb18d8cf4f33d0e6a8de08dedab8f07799ee6c9cd3985ef918cc7d6d8f0ce059e6ea6368994a22d678616ba123261bf62e71734fc6155556f7d12be94bc0c75163d5bab7505fa4b0a8b7102b0a9793025c63876b49a9872ddeef73c93b240cd8ee9bb6289f811e681149904de41129d2c7c923ffa427eb06e6a47e5cf622af755862b4ea1415193557f4a5b7c5ded51278a561bb45166bd1ea537ac618812b58ba1e68486b49ea7fc6d838c0551db27cf524d49bcac2b3cbd1f55f4cdccf1e7b0138edf0e77fca405f3ff2d1584ed9d6f4747e510e0b8194fc2f5e37688b90f87141bed3005f011494a5b866a17c5670f900723eefc4cdeada9f0690a07938e5111a213373ce5623d63a4c18fc2f0fc7d1ae618f4be90ea71bd227eb4fac6d05f9cad4bd92990d15a594cd16ea1668d15c5896feb2a77335ed6eceb3b69624b84a83a613e384cefcae32cb8d8797a688a2216b30efd62c2534116d9c18dbb19adc03f4df77fbe6f23c8d0aa71afe2b21a4e17f6cca97d2874cdc8f57e8a024096091fdcc11f6c573c81f32cfa0838f4267b534501136f8e9603b504bbf1637fa81cb34f0aeaa1013c579558ee2308898eb64c13d7d9844306da84a0d1f43ec3d1d158273d3075f1da3aa2b8f5db1749db75408150296e6f63b3503e21b0420a81f8092d4e7058e6025a8a5b8cce3e131b97dded447cb5eb87cf4a4ef6cdc10577d162d58a442831b07aed80d32eace2c8a85eff1afe1a05c18424562d069b0c57b97402e015d6b8e5598906292c09942f267b6f511d808f99d18fcc2ac83f9a0c0c5e24e2cb2453244fef227fb11093bfd68b1dc4ac1675fe45ca1363ecfed65d6bc94b5bf7f22eca626bcb75a2390023c6c0e2840aa572d85b2337b8a7ca4c58216082a4cc32e68cc129f0fb5def3d3d0a438a6a4bf81bcb6aa8e7c5c3ff866bb68c2b86400682248411978f9f247a3433cca781d0c6bf8da4c70ff564003e454409333ef1bb61d391d0e45cccdb41a6f3afab7fe99483fdf2598b6c2d9749ce7666207bfee75d51737f824e141d7aad8d31d10f368d0850924c753793f0ba02a24f6c084a4c73d6d28250d5332e4d2bb27ccdb95c8844c05948686a73b80be8d8d59a3e094b2076b4b2deedd00cd23a064f335409a89181ea5f9cd0302fb13f88dfa726d5c7039ff9bfed447cefdf283e943925d5a4ba9a7ee65a9e973b4e3ee56ad9740cf9ebe2be0536388ef3a84e1e17ed19d36591d2311120e7c59da1016d9ceec87d05bb73b04f87ff0b9ec6354a731c265d4d3bf5181bed5e3b9dee218a4840c56c60cd5382b12d35d22c62aaae90af4ab149f244cb0e21dfeae0bc21c2675b48249d340e6cf9b5ab7f80b2d5dfe69ef7acffe115ca0dc71a074e30531d4c39bfb313962375ac09f9deafe95d0251e6547c2f5fb831081f365e49711ff1da308f207bc888b2e14edb99fc06d567fa35525dd4cbc9105f565f9d7cc6baf9146ab5da76af8c77a5a08f318360616009cc907193e83dbc308a6dcb012a09173b8c038c5969ebd9f8ec9cb22c512de6fae2c22528b37dee61077c600e7e5859e2a59bc56cb76990981e91b112677eebc7233bcdc987e61b00008304000b8f969850764ddde29e5dc2d3bc64f3a3922eef846b8f41ee172ac5eb375658be34d651310ed0ae5baf4dd2e08d4f0d720bb7142c5ebc5e31cba7a10c64dd661e7ab5c592bd7b0cad789e49c274f2a5e8c7b30d8350bb43072ed09cd4afb66f8275cd5607a55d061f4fcbd18c70f3d1cf6c4cfa38bfdf50bf07c3b92f8239279cfd4e106033000000000000000117b96b009063e2a5083ea37b42389829404aac49bf57a9747405f0cdba1e98f0834d04ef48edfc8b3f763dbd15e1925bcd2d60cf1a9ae9aa90c059518e13877adce18833be3008d36f9d66824d22ba3b6cbe88790ee5440503b5cd8eb5c352966d36c3ebd88d824fc5b7bf62fcf599ac28e76e360c5bab6eabafa1911a048bb1410e1a8b76bfa0dd11276eaa109d447a7ed85c66412ae17804797970732187d63a67edc48845019cffb5635e9058e3b7dc36520b1b4ee35e66732c141703bb66ba12540d8b0a8356af623e8f97578f4e36d9cb3e1e40075b31a92fc6d71906aaef00b3f06cdf6c09ec40cc21c075766518b00938d3dd90b48115bc7c297ecd915f314c4f3dd84addf321d157690f7a559d1d24cf06c47c11d962526399e87c8d3443581b2071da5fe1f210d84c62ec8d9006e0600bcbce85bed8aaa1418c79dab3c4d28eebb74ed30fb6cbe6abe7629411d814fcaf11ac2ec84cdced52528da1093ebdb4350cb24adfb3b7bca2267418736d22cb1ae92fe064825ad749b13d559a4a82f3cba4a1ce56249554344cc13e076fa71cf1b6de2cc061d40ed56c41ece3755b3cf1354b67e065f49bd8bc76e074c5ad8f0d9858e92f70094eefdf83fa0f1232b8878707c8d17ac0ed347d66ee71fa7cba67079ee0b6d78e411bcc2909d90dfe7a2d8a0f5c4752a9fe9d66cff970730f6bf2cecc8e783d24bad48245cd1e28551eb5487066f80388571b5bc51b1a43d5c0ebdd4197c1cd1f07e0a711ce743ddc14840966f1e1c1207d7a6b659e8da9840a6c65696fcd38929b34844d36e69676ea79116748c23c8b355a079e0aad102dd09499fa7e208ef13f6264d6091f2df352b17bdbd182683239d0e300a91c1bbbf4cf9998fbab7c627804aa29ee9fc58affd736310beeb5cbd9ae29b327eac256f12818b948e45992cf89186baf3fd992717233d844fa7373bfcf8d0742a8a38fcd6b7258b47a2ab23281ff03c69ab68f336efa5e6a6ce7d9ca9a689333bb45662923b171777d7810c5d17fe8cb4f2cfd8ea0fde93e280dc17959e54a2580f88049c336959a3ee3d6fdd33283e906c3676ea1fc8c2645440f3ec6d753980d006f0481a3be84dbcb2de646024a2b9da93873957b486917bb07168da3b3d839ed11f0050a61ac3cff125382a439bb60ba5288babeb4a71aa957e2bbb3273c5e82a643f791e7ba2a8a93ed2736baee2e199cb5c8ab6e1053d730849809a412bc5dc1ded7e9d18b1ec2a33cdfed8c4b6c28a183155df8ff0ab0f1da0bbfce767f55e2525f731fdf05e88fbbc045c3ecfc23e3f6e1e7d57d619c88db95ac35652291d3b78fdc61e45f62ad226306f39a031c41d1ee3ed630f2cc52deada2b0d8dc5dc268f5dd0de062615ad28c879cbd1c94092c77d5cf92bc774a44901564433a1a6645ab31deb3902c8d459aaa18d4b6eba4e5c63a46751981bb8d3b51aff39e064c798cf4ebecb16dcfce8a5f3ceeaf91d7f62807417287c7de009eff2a85ba4a70972f40540e0739a443cd1552c47d2b780e3320d3c514321918dc33e4ecf596f7a344ae2241e044ff70d06e134e68219fd5ffcb7a12aef1f1f31766c301935ed667ee57376fa856b8fe3a499cdc7d33e6680e12ae8e6285bfc63a0325da883d30ffa0498e4fe2154ed843e1f180f2a058e6dcd0a1cdbd138c4eaf389636954454ffbe928805d0ae7a322c51a105641b3bda84d96cb3706f60ced4a2ef3a7cd63cc17c053d2ec9702bc7542d1e4db98db703604603f1dfe777b63454f4f239b15ec9458209c77b7e60c735f919ad9070fdf85891dd3296adb745305d3d215ea76e644a1dca72d3e1cbe199b0c11b18928beeaed410766c8f98e50bb44fc3b19b8d502c8ad61930b16004433cf0c322e9ab6c4faceb06e3ca25826883a67486ee1df89d0b8b2929ee351916b4aead312047d4320646a3ba368a3e886e1c6e7eada9087ef5a84e79b0ab0a3796f5ab0cf1217aa07d1ae1387c2dc6092cd02b6ab6b3c65ab761a8976e74b251128bff432d7ce6de00ccd711c30838978b0c4dc328502b5b42906d401f5b66fd175285ca7d59310084357a5915c43ba89c77971d6cb0db6354b2ecf14d03dd624073ef754149cdab8af01fb069394446b408b48b6a0bd2ec14562c73b4ee44fecec39b7ae26a8f8ab706706f030e2edf4a2235d11b798896b738e2441a6693d9f1dd8af39d9f95731fbc7aecfd056129a9bcfdeecb46581fac573c844e98e4f8ce74fe60da2cd8f19c48efb6da2521972a840bf38bd9ad57be2e68cb60adc0e859ae5505e230c82e51eecdf38e80ed5e73d1d9f7838aa14355f22bab25a91a3c60b3391b71d8995e3a082a37bdc5eca47790828bd269135715794bf34d4c05b686cc0c52d6e62fb274f564c69b0801906e07f7499a0865fd27db999f574292b6edffbf1abf678ef0ff2ca869b5c4f05c0d5a832362e9c7af91d5f4d81923c7232d1c2e4693433dac36b4ceb8d300ddf5493867965ca4e8feb8a5961952a76dc750d9ce733d318f43ffe02431493fe7e86a22a3d1a71cd86e8afc6f1e64be83ed0759249caf8cc3e05adb513760a1427abc90043b9662030530822662baca4febbbf034564168dba584f299acf7537ee4d8d6964ce5d96e858750cfb0c4eee87d483eb79237a8bab53a1081911cdd82d14979f26d33bfdcf5e19ef216dea8503c89f07dc579b572ec3a444017a787996325392f876417e83b2eebc525eca41277f2baf98255d1b70e75e3107057cfc66215e152889fc50aa31bf133d1fec7d24f215624e6357cf0ec0c9816393181693a14f9cca48504946f68277066685073cb9af8fea22fbee2a5570708ce2e6a44fcd68ad2222a8e03af33eb70a0f6fe871af8c5b688eecf290f757560abb6338bbb0f849ab39d0f26258ea17385d7ae59bafea0fc799d36197ac5aaed9b485e10c8bdf6f931ff7814b049731c24c16d508442d1c4fcc3d01d8dfb557e9c0e2afea87315969fb5ea07c4697d7368db25b2b2192461109a5b2fca89b7b63709fbb3327d2b00fc6d6f9e16c83b202dc8bd26c5bd1ca1693cb1256950ca7beacd2c61382e103d9510d1a5cddc7b285603920ab9fa6bcd77cab566b30d7454fe50aead926c9e5edb22bd9ae79f0bcef80db0b6fe1e43a00be0ca23b89d5cffa113200b4b4f3041cae7d9623f3b1e5a46f04fc95d33d6e931219dda120d72456ac753b0c02fc509ebb4f020363fe7901b82a01a14c9ee2c09f1342c031f0e74a7a939715bc725fc5896c5754e0a618bd50cdef2ffc2e65ce3f78da4fb6a7e3d07166d8bd14b42cd44136826b87732e837bb4ac5af23988be02961d78361fd07ffee65d19157cf9cfa659286d6415db5c05f0d8065f8e501fda8cb3a6a596cd36086d30fb6f7d6df8efd6e3160549b40194bea8a631d2906e713d9ee5798eac674887466b2b1fb63b8097d672ce62478b0e4c7f5a8ba85c0227b3d51ea0763116cc46e47aba225bc6d3e0ed7a66b6a98284c6fc24176998d467c3e44b2cc23984abd21aebf5520e4f7807ed03969b8827e39974da72c3993b09284102170836250efaea4b465c45ad3cfdf6c823cecbabe66697d0b8dd8f47863d6d9c9d64dc8d6495975479f330dd31ebc9bf1e9e05205e553287c6b378b8424caf9e4caad026f09556b1a9fa91d5740daae8a45de26a0ae836cfa6c05da141981e7ff35c1448bd0799381c88a3e8d6148c9bfb4d26aee441cd330800655ab078177389a40b7ee801848b463724094d09642332d5aaa234029155f5958284cbd3dd4a3cf8da286e49c896df6d8728e6e9ad6180051e75907c3450ec373021c4d784f3f62b49cfb1e47624ec69367260d97e7eea9e104ef76ccd12ccac80495c0af72b43789f4b814aad8b762460ccbfe0aa84591624dd9dbdce72c6e5d72f943305759c0baabc294f3c062a86d348bdb33bf5d6c40616ffa85cbf59930d505c6a0cb36b8af2b151dc8839d1957cb8de88de20ea6c3e78d12b88867efada2fb6f12df80638bff1e1594722fb0d667b58f4c6c17b7aafad4b59b625bbeeceaf29935d96126a8427642677dd5d0f6cec3c3de7b2d41f6425ed71d7d66f61c4b4ef4ab1c5c5f5695e0abad6f65266bb3a705e7b859d0d0ab6ae20131fdde6997e34f5a7b506b4bdbad724373faa4bbaab3a0e7ef51f62107cdb3b78f60693d0cd6554d8b45a059050d70875e6553cf6723e9a00506d26c66d5ff12cbd76fdf7290f28517f57dd3b18b1986287f035ef2847df56a2a31af96dbd3d97721e4a167cebbb665ae998fcc27da46f8deb5454158747e6fcd9a6defd894a4c1b7053258cc88c58b17a8d8091c07f8fd0cd9a90cc0a71b3ea4cfb75ccaeecb9761dfbccd58326af050b40b0af57d2f7f47dc84dcb41a9447c1a04cd887acd214397a80f15a9ebbb81cdf59bf06d90f4b2d60dfc7c76b63b140d5fc60b5a5d9bedea3f817a087c354db619c1e333347b7929a9ff95dfd1b891991878cb86f6fdf78781c697ea572bff23572f3fd22014955895cb52089215e79cee7df038a170e4bccd4027b049a9220b24da95cc31db9d59ea82ee0152998214de40b3143aab42519226ef1ea02536bbdbac8beccc7d7090ee5f62875925740ab4af5f5ae3da9e30ac90fc429a161b44cb316a6f12004b051fe7d308b5abb3eede0409054e641f468b40a93fff94c0e3d704f7d9666c337e7d61ae6255441b15be8c3fd68e461b0d15a72ad231aad3d65b7728f85815bf3f29fe1f382a38c675c4356cb4c848b6121d3c8c7a15747df094ae9e4a7396c5fa85926c6285258a277e3eccaf98aafb9e0c2b8940f1b49081353fafc155a888e4feb2e30d0939a50bb80d1188dd262d2c191175b7135cc13bffcca1d1253218156c5deaf31842e6a34f6b2736707a2ccfc181f31b19533b5f21c4987912ae7b8f76f253bef706a4c0d537f890cfb7578a24fac431853d5f6f046a3924c45866edfa5a4f33802ec1c57213abad755afc7ceeb69347d9381ed05641bec9eb7527774fd2053dffcef58f7e654da291ee2ff745d43fe096dd1ece2f07468e64e1fc188ae1ed046457e14dad92feafd1bad54e0f87bd59bcb6cd6160431067b9cde6d4f132a41e862fa925dd734f7241280e0efa59a6317df389b2ba770233bc2e506f6c5512a944ccca53a58985f3c4744f4bf8a3c52f7d7f4a5ebc077a0b0d48317f2c2c001c2dd3b206d261e3a1118a6d44945e34284a5e868bd7e4a1292c84b95dc91568fe96d3e09d155f81dbbd82e6a0eab6578c2068a30b048a945f6ae00a297d88e3b3af4ce60c133e101384b806d0b6b707c00d1284e9bd6ecabb10729a04adeacd145eb9a5b0431abb3594d1cb07edb8b7614b2a2e36361325f99df79375159c787f61a44fdbead5d48cc200b96ef0e8af4da218479885504ec9420f232747b9dde8f593c9096f3a407b22e22c9168294c2e0322519340084f51ab7aea1dd5027e3cb7cab7061b3fd573c61edccbd23775525cb17da9fe6c4de4665a62d83fa843eb567599210bc9e98d607572008de038770b3dab2533610a74a0358821ed0d0b6a05f6a2bcbe6c7fa07237bbf64ae66af64f78d44ee0743fe7a0b14b89ce1a9e5570d8c3b1ded22bdcd543b3a96b0e13ecd3e0663fbc7defeabf10bb224632cd219b963b7ce3ea42ae422d2318bfb4c4fb86bb640fc8c1f6ec2362560e20cb3ddbad2690596ab889ceec5c1609899fe6bcf7f83b3894674e52250bfd87bcf45c4c96080594b595881a1021bddfdddb1d04619a283bc95f5c5d476fcc5beafe2b78acb6713a0cb03fd2e12521e6c2d4f8d5d748feecfcf038bebb9aff49f753fa9db8c61cb52d25626f3864accf53be13e274af8';
const walletUtxoList = [
{
bip32Path: '44\'/0\'/0\'/0/0',
txid: 'b65b249e3ff74cc5e97675c59f2b6d74525642652c9228716efa9689e95bcc54',
vout: 0,
amount: BigInt(5000000),
valueCommitment: '0982fa3e72e46a902e7f022ff3c63339559b15bced82470660265f8998e614dedf',
redeemScript: '',
pubkey: '021a8cffee67e4a5d8e9cfe0e6dbcc86484b425e93508522224c32bbba96fb6d82',
},
{
bip32Path: '44\'/0\'/0\'/0/1',
txid: 'b65b249e3ff74cc5e97675c59f2b6d74525642652c9228716efa9689e95bcc54',
vout: 1,
amount: BigInt(5000000),
valueCommitment: '092de99d82734c97e8b87918b884e521f7ecc53a296d78c5f327e9ca3b4e105a82',
redeemScript: '',
pubkey: '0284077c532859caecd38c639369cabfe880dbfe3ec01b68a6e94242d4f580ba50',
},
{
bip32Path: '44\'/0\'/0\'/0/4',
txid: 'b65b249e3ff74cc5e97675c59f2b6d74525642652c9228716efa9689e95bcc54',
vout: 4,
amount: BigInt(5000000),
valueCommitment: '08e028ce0bb37cd23d8c4a7f2348db64f5042a9d3f8f030d881cb623b5861edf22',
redeemScript: '',
pubkey: '02bf9096fad22bf6aa4d55c18447f25e6bf0c79ca5bf7d3e7e191db3eb737b600c',
},
];
const authorizationSignature = '30430220307607146431862975de982412170cc9b45f3cfa2abbd351c634840b785f2785021f3c478b9de2cb55801fb924c5c219ebe71d58f8d09f6df32d8e17c105ded6a3';
try {
const ledgerLib = new LedgerLiquidWrapper(networkType);
let result: GetSignatureAddressResponse = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
signatureList: [],
};
try {
let connRet: ResponseInfo = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
};
let count = 0;
const accessingError = 0x9999;
const countLimit = 300;
do {
do {
if (connRet.errorCode == accessingError) {
await sleep(1000);
++count;
}
connRet = await ledgerLib.connect(0, undefined);
// console.log(connRet);
} while ((connRet.errorCode == accessingError) && (count < countLimit));
result.success = connRet.success;
result.errorCode = connRet.errorCode;
result.errorCodeHex = connRet.errorCodeHex;
result.disconnect = connRet.disconnect;
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
// clear
count = 0;
if (debugMode) {
isDumpSignature = true;
setTimeout(async () => {
await dumpSignatureProgress(ledgerLib);
}, 500);
}
for (const idx in walletUtxoList) {
if (idx) {
const pubkeyInfo1 = await ledgerLib.getWalletPublicKey(
walletUtxoList[idx].bip32Path);
if (!pubkeyInfo1.success) {
console.log('getWalletPublicKey failed. ', pubkeyInfo1);
} else {
walletUtxoList[idx].pubkey = pubkeyInfo1.publicKey;
}
}
}
const calcInfo = ledgerLib.calcSignatureProgress(
proposalTx, walletUtxoList);
if (calcInfo.success) {
console.log(`sign utxo count = ${calcInfo.analyzeUtxo.total}`);
console.log(`tx in/out/issuance count = ${calcInfo.inputTx.total}`);
} else {
console.log('calcSignatureProgress:', calcInfo);
}
do {
if (result.errorCode == accessingError) {
await sleep(1000);
++count;
}
result = await ledgerLib.getSignature(
proposalTx, walletUtxoList, authorizationSignature);
// console.log(result);
} while ((result.errorCode == accessingError) && (count < countLimit));
// Retry connection on disconnect
} while (result.disconnect);
await ledgerLib.disconnect();
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
} catch (e) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
const signatureResult = result;
console.log('signatureResult:', JSON.stringify(signatureResult, (key, value) =>
typeof value === 'bigint' ? value.toString() : value, ' '));
isDumpSignature = false;
} catch (e) {
console.log(e);
}
}
async function execPeginTest() {
const proposalTx = '020000000101cc416e87382223cfa9d82d9f465d81481f5c5d83a39276b4dfc36c641e8e99ba0100004000ffffffff030b249f7ca912b420cf9883b3c5074d4cc3998dfaff2400327eed94e730e812811209171a0c9a59265bcfa51531f5bb6063d2146fc6500364dd2d741812423aed111c032dc4c13adbdbaf233298b05519f76914242dc11714d863e9290b7f4eb4a9bd1f016a0125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a0100000000000002d100000be18f3ba66f211a9172bc62e19366807f739613973f811f27ab6030b1c10e59fe0812efd5b90d7223d7538ba60ccab8be4a3d6d4570efb14c6a73f4fc03a4833f1603743e3f89b60e8d1f8ae02ed6a9e84bb784330ab1dfb6b80bb74afc7842ca2b8216001445e45f6bf24481c8c1a23db851d4023875e1ba0300000000000000060800e87648170000002025b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f16001445e45f6bf24481c8c1a23db851d4023875e1ba03fdfe3802000000000162b16a9fd3c549ae37d932ed65ea08bd0666bf2bec297da32a3331c869a4a02d310000000000feffffff847ceb94b0c986bbb2b938904dc6999a57cbd54ca5785252aa6d9a49729f09290000000000feffffff5d3fef1a5595c8fcf44dd27ca01515c328884cd610abc93db5a93946e1c18be90000000000feffffffa481ffcfb2c7487e4d1d471726debeb7b5d73c922cb142f2c407e9744596c5780000000000feffffffa18bd7050edf28d9353061e2e8b8f10395e18a025cb72492763430e5f3961d000000000000feffffffd425af9d0057729ca39eefa4ed8eb6eb754f91192d14a5e73ca305f8cb7e6b090000000000feffffff87f80ab97bba4a1c09661a011d1fa4d3ad41e83991879c6b8e3d99c837f308830000000000feffffff3873860ba59d36336837b39e1d474bb62c479e4dde6f5d0dd6f3728a784738950000000000feffffff1624b9cd40b92d33f0ba60b0f71471b0d43e47a516ed58dc0bc173e7d75a69800000000000feffffff4222857f8b18c4af18225178a7fe62f351058fc42c9e44130f4495e6814b0bb80000000000feffffffa3bee4c9dd202bb60c8f67cc04b3778300d389410416b27d1455e9db10f35c3c0000000000feffffff831a865ad9dec7d46471e7449cf9a8fdc37a5ee81e65870f6894713f63e7063b0000000000feffffff7c1b847ea8ac74df10d018c6f335ee40aa9cb62718b5ceed1b700ce1633459ae0000000000feffffff43272aad102641e7855a8a3db2402e90ffb05bd4a25e0a7181395b6b601d71190000000000feffffff7a4dbb1b4f949a875f5717c283464f66bb3458ed207023af6281dca5a2f5c1bd0000000000feffffff1709ffeee289577553eb087270384e79596b81eb0234e377429a0cb6571b3a560000000000feffffffdb0ccc8e4a01ec3160a26e860383530f7cba046125839769bee3ba5f84f8450f0000000000feffffff53160180d58e23a1b4d450580971639c0a632bb1acac053fe69fbf2108cf645c0000000000feffffffabd98c794bd512a8a65bdfe8c411f4566e8a7844a0affd6b431507391db577ab0000000000feffffff4d1f4ae118020a0b4cea18986398b55d267cc1bcb403eb873a26e396213bed050000000000feffffff9ae758d4ae77f8ebbaba1431db0ab6e53b43f8e93a5d14fc2646d1fd4688edd30000000000feffffff6794e784b0ef5fbd6b2811fc9585364b3e379bc161c82c3ce6035693c1df11750000000000feffffffcfe24c4ee9e42922c8fadfabdfd3e21a5c91505fc4ec552c36f4444dac2e9ef20000000000feffffff707114ae61129c1f3daed73cddf1c40470fa9019102953173905792b9a3097980000000000feffffff9c135eecb7b7c50c5e84e1abe323e96078aa697a81ccf6b81d3b9f5d3369a6760000000000feffffff31cd4600b0c368e16cea0a4cd850788af7b78d3349a4fd101632b8867cd5a5c30000000000feffffff4753cdfb050fd633d7c7097c18bf2eda6446a075cfcfe619e167e351dcf87dd50000000000feffffff4dbd43a09fc8a78a1aceadf1ca0c42854c971c7b4b4773ee5afa41e6dec4721a0000000000feffffffa35c190ce245dcb0fac1ec614373f46e754d7e82fb640fec94730878eed3d5240000000000feffffff27061f65ca96d6426815eb0d7b563af4d1c69536fde1aeb23b5c078b1e537d320000000000feffffffa2f77bbccd69fc998eab99f0e46543124e93127e53ef422716d6929dc940a5ef0000000000feffffff134e7ee04bb5f74734fc10c0db199896106810950442269e0a5fefe8a2efd1f80000000000feffffff4217ca62c16731b47a14674dc149923e2c2a1df96203255501491b33d3f7eec60000000000feffffffb4f7f976c918222391d7311b9f8bcb3af06bfc66542c38c2984f2ff7ab6852b50000000000feffffffe16ab78cd2e7543834babf65f8e18cbf3dc9602b0b3eaa8c0ac9914e68c7e91c0000000000feffffff5bc2314a7897615a144601fcf71ed1022ad60e01e8a4ac3778f0a7cd858fb3110000000000feffffff0bca52b750d5978749c8dc2b0c76b293ac95249f2c060605fb980825cadfc0160000000000feffffff093a97a4112b015deba571a09a081096dcdafc0b8eb0add1548f34ffa741bbcc0000000000feffffff2fd702f440e333c0f6e9f2ee37f9fc3fb12a823b4421b6aba23b182bc25de5910000000000fefffffff50332ad5f8777b95a8c9b1e1b0e0f88f4535fcbae36f2bebcad97c0d99c5c650000000000feffffff3562afeec889c49aa1f5792bcbe922248e4fe3fed8e0098e0d6154ef40861e540000000000feffffff0631f1e9b3b1aaec654738c3bb92dd11432b66e8b58a6ea0cb2ca5a67f5a69520000000000feffffff6228e893505ff69ca408502bdc75c57bf45189afb7c397114e7e7562578406030000000000feffffffb3399ef340045fb658ebbfc60840f50b66740b0bd003c9813976a484275fce790000000000feffffff9b2b4977a1e62139fa9387b8fcbc563ac115760a9eaaeee786750ad9e721398b0000000000feffffff2c7d32ae96494bcec8773278a27ad2b5d870740f638891a4792b81577579ad2f0000000000feffffff1e28f65b2159944729ccc7baaa4ac3d05f041d9e5b997d6aa51d6183449f823b0000000000feffffff27b2ad888ed210de4c5769af6569be598959f5c1154adb8bf69712f8924014200000000000feffffffe8ae8bd5d46f0bf54fa725c3ac47b5d03b4b1f85213076399db34cecea68e2a70000000000feffffffb6e52b66a086fd55cf476e74cc985673eda611709f4c5cc590283c1d1424b8570000000000feffffffd069b7822b4f3d74586428cdcaeef03b4e5a522a7cc6995e75b4378cdaa630740000000000feffffff90631d49089e043c546af1c3da6eecd141d4888c5b84444f5484508a822052a70000000000fefffffffaaa882ee2d7efc0cd0098c2a726a1ae7a8b5d1a1e5256c18ba79cd0061554e20000000000feffffff487ca1e022fb485a879001f447f1e4694b450f6bcdc984c5d3e501a3f2f335160000000000feffffff236455e378c2c09d49735d54729955e32752a4c53d983cb09cf16b7054f6f18c0000000000feffffff2037d2e6fdc4a327d3347394d847064c82883c5555b0ef9ad15ee3005a999d190000000000feffffff129d7a1152c5935673123289069b767f60e43c48c73de6a660f9d688b8880f300000000000feffffff9262adf668182a241fb9e211fa9ffb7ab03164466a9408538e7abd2c584791300000000000feffffff59d19797bda557fafee11486810e2fefe62db96cffec48dd9cb65c224a7dd2ef0000000000feffffffcda0c46c1d27777d93c865d5b7e982a639f24a30102c6492c47e83eba2f5e79c0000000000feffffff20e6282a7553af9c0c3ca28623caff570608a997b668064d2c70a67867d64d8a0000000000feffffff61821c062a84394a235f6d450e5de7b8fdb693084ca18ae8f1bd44f670d8aa2f0000000000feffffffbc9ff373e8dd2887055802ca27f56382366121a44f03508bd04e5022c059b4700000000000feffffff47d59639cdef0f71d7a3c8a0755f832d28ad689d7abc1377309b533dccadf2c30000000000feffffff845377fcc3dc039e628688cd69353ce494136d73dce61d9e28aa46f8c87c19100000000000feffffff162d48866020989d7b5e992136a568d29c40e8e9e8506d08d314de485cf227440000000000feffffff90b438345cc611c3910791b0ceccf3aaa34db3917db0148774897cb5639833fe0000000000feffffff3336d09f5c5adf25575f1c9b633022fb177a940218f1042c0cdf0abf2c8bd84e0000000000feffffff43af6ee8005dd355b0fc0478c065b2a4fb55e0cddfed6feaeed89c4013a23a300000000000feffffffce561592a6f14fb84597e98ca02496e7bfae80676b86c5a3220f2bc19eac40290000000000feffffff3e60604e68703bce78eb099dc24402de123891a84d50991fc7a7392716897cae0000000000feffffffec318e6fbe30cf502cba1d970385661a98c15f2e369a20dce3e53436153c008a0000000000feffffffaf348daaa9c6eea99f2dc2c3f7bb2018ee0973723e5a041537c682fffb1ec7050000000000feffffffaffaf440ba55aee64f5f8d5bc56eae31e401c975d9ce977bc5434735621e86e00000000000feffffffb840fe9d8caeeb27caeb27cd24a70c9c7636da0075378ca6696c9697aab903980000000000feffffff399795d6d80bc0e468c58d263313bff72f0b5870a59578064d6ba484ca8b0a310000000000feffffff968e05f14b27bfd0adb5647bf5e03aef917362fcb14713e3b487a58cbb8143220000000000fefffffffaabbd488069b72994e2ecb11ffa0674ad041985001722ec80e5383c98a4510b0000000000feffffff07d246e1c260fa6871c0c98b3e3783b25ebb5d75a78aa42904e69e26829c86290000000000feffffff514a5afc6d2596a3a37bb3d26a5a5416ad3d35cb11287b687de88df9176df0a70000000000feffffffc18f88a1f11e2bc07a6d7ba430836f597b78e815f50212db6d3e5c0a4e2ec01e0000000000fefffffff88362aaba7db3f530642f1d438effb2965cbe31181173918585d5a3db4f57a70000000000feffffff3654bd3a76902c9dde575323e293e8299212c7afe2503474148d1d2e26b4e3120000000000fefffffff984e118391a4df87d9f245c2f135943d7369bb46faeaa65bc6a3d97e1ac653d0000000000fefffffffe8e60ed7bb7634c8d552cd8fcb207c63b03a57c0e07bc0d27d7bdbd264155410000000000feffffffa935591c956860b77b9be96114120c190d36a84ca87e5375a3dc18b0b3899d710000000000feffffffa9ea2eabf0475e66761b68da1e666d71097a9d3e37ff51c108995bb1c84461b50000000000fefffffffaa3e0215e5a62f1c170bb2db658de4b6a38e87fde8d84dddfb125e77c766ada0000000000feffffffa592eda7c19fb8637177357b012877c64260af8cf438b328913c7d228f1b52e60000000000feffffffc201f015dc3d1e8882aae20bdca4d62629cf36537e3b37ccc22632e434d9e0e40000000000feffffff917687e609fa8d6ee150e085f4e2dfd9989611a0195fec2df82c1e4bc3d68a360000000000feffffffab53347250aa09d2a7157cc128f158cfe644abb465dc461715804b349887671d0000000000feffffffc9f6a3eaa1fa71c8e0999e105bb898ce0d04b31c511fa1b34b51d9eee287e3310000000000feffffff6efd27df9bc90d1460d40197472d245fc8140862e246f59031502c7ef9f7ca650000000000feffffff78ba2f9fbad47d227ce806cb50f8a59f992bf404253b1fb1942790fa77e0adb00000000000feffffff9532520648e7ea16cc0224659d53919131694c64122817029943dee67e2db4670000000000feffffff838c779af18bc7cb30cb8f580690526097403e7ecd8fe104b2d0349f872c67210000000000feffffffb89ba942b83043fb31b7112dbb9a5c4fc5614650bdda0537af35ca23fb9bef450000000000feffffff02bad4930200000000160014f26b3cffd614c3a043e8f74bdd75b9b61b97e6f400e87648170000002200204ecb96526ed28b19f3ac2f5144893038d336dec0485536062260173a5e607caf02473044022042ccfebc3cbd79da84b04d1648b99b88d01ef0c431c6fabeadf75ee871f4cce3022002bfec08459a9c098e0dbb3155cea57be3c4e424c8ebd1029863dd96f53f0447012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022051fa247b80bf6a704f5ad5a507ec727c3ada16c56bce712492627270312f20c00220338777a3c516e16a935cba2cc638e394ddbedb0df7daa4b05c2e923d85d5810c012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402207beca300a153959b0be68d075efbd9d029dbb2c061b802437e6d9fe95bc721c40220352af21fa34b588f52d7b48602af39f050af369bc63e9b3559c4154e1725093d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220648aa550f66e67f26421e588e2ed4f16de883214cbd693acc33654bccbb12e6a02202465b1a506fc42bfcb81d2a70c0feb9876aa86f5ea60e9248aea68e7c7890aa2012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205c93a38cde8f23df779c192dc97804bb28bf9bc807d1d1fd1f2eb8541c9531d602206dfba0f58d2fe963f7d9b2a5f5e6b943c933ea563e3d5756484b8c51626a52d4012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204a3599e5e4ca4bd43dce118426efe023f27abeb939f3fabd009b6483719cbfa70220717946bfe65b85a98f969442c1eebedf65c759f524df62ecf9ad39097e519c68012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220057144283216bc3b61a1cb7ba94a38f285c6d54adaf00683d4eea48caffdb3d002207116d94d179e39b963dc8749de72ed3cc51700656e81a3e5ec44322d95e5af8d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022043bdbf1dc4f51638cb1d5b2f98a2ea31ba3767e9ef72c97771a0cb0b19cff920022005b190a09dab639a9c148fab2af52bffe306b10e0e16fccef389e9a5723cddc0012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220282f85459d37c7bc9803523b6199375618eb2a4d0e9efa872e00a20444a1e1ab02203cccaabc18b15d18df138c706d27c6986897ad5909d0bf0cad8c434144e2e899012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201c79faba96499422b93fc4d2bfd1a3f32089c96145f54429ba136d8d7df651130220434641b9de00a0c4062de0b66366e9859d5695e6e03eb7bc0528cadc34d4d45a012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204d3eebb30f3bc9a2205f2eef7134bef27ab1be85529b2eecd0fe784e09c8842c02204ba80ea18a38133aeab004ace9960b484d30a672c189c8d253db30b37cb6c145012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402207423c4fd88178d908d6c322fd18daab9a034131c7f16edc4fc15b0d0ba0547da022070bbfb2cf53e6dc5d40b955a3c73415d7446e9646285735737c6646f671599a4012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206237e3588c69f8de12b79efd272597085b0e249a5027a5f6f8a35975ae2f1e0502206eeb124fb9af7ae8808dca3303c1d72335f9b2adcccb8b0c73098ddc2ee03e4e012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201265c0b2b5744564dfb0ab21e603861f99a5ef41309ea397392c11dbe4a4368902201253b7a0bbc80724facab14d2cd43b442fe4d6c93e12c0563dfddc42f3d4f62a012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202644e7e92e3ba2f68df8d0ef55d91d98429ae6cb204cbf183f74c686ac7390b1022055f1bdfb164a6ef139430ecc222ac4809b8632d058a8db20984bfd8c4521570f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202882f4bb440b98c586d55f9f3efd81007a7dbf5d168480bb7adfcddaa7aad8bd022003e3a3fc3c3a42810ddac86683ec03d3fec880e9f1dc2c3c4a87c6c1ea333659012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402207f21e5ca6b105d4388a7d8f38ce8f4bd9a527fb95b8294d655e3d2ff8757bf3702200885e8bea564fc327a38d56b5751036e417a75a9edf1430ee9f478e4424bf934012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022062d2dff780fd4b0e0c3350cf2e3544ac5e98638275c58e98208544315cb51afd02204ced9e4b4d38fd6f798f73b71dc77d349d369f7611be5d36913414c899c62b9f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402207fb3e4ab71e6aab5d9a801db04fadfc19d1229c2dc0ce8b0f1c09cb14ec315c102205a3450db3ff8f6fa44e4949429b7812b67f8eaabdde3d49030626a85de308c7f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204803c5e4730769c1818071633f261876798df9ab352078b30ab85eda676036cd0220514b8b5970d5d55ff20a797c7a846ce3f948b309b16d05b8bf2ac949a8842b1d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220666bb16631cc9147f15da461ebb3059a3494a7bbfac6da24daa7abac4b50822302201331d8a2e4a723eeed2e53b6353aa4048886156b05e4417c6c40feb037fca34b012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204107c1de8139cf69528263dd3c0a878fb90382cf22a6c1c007436369cd9033dd02205e1a324dffce68eb7c49cc335cb3e0c54d67bb6eb77ddc8644e45627aba9155a012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220728d02e85c43618779df33cbacc89a92962ff7584218fcb54703ac6bcd8fe28b022033aeb438418a64f842be53725f65706c9db423557f8acaf07c18fd0186389665012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220649bc4a1056b61bacb95631f88d4afd8b65bc056cb81d7817daf8d2e4455cb34022008097f27886aef87e26d2595eaff17339e38d36d66575cd30f3186bde90f05f5012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022012ae0a82abe16f9bbfa3312340d5aaf0c0e26b1a6481963dbc4e50cb6e97e90a0220124d0c41499c432938fc914519213196d1a2922493c039532d8e46190f0ec11d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206127d5a2f456fa84da50e23a1d5b0a24c0965751db44e6ee20fbb4fe581b202e0220271214abf21fba202a7d3dc0fb8147660ca43439980ec20509e01ea0dee54570012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220733c06704f640c6487508a09a0dc27c794c40477e3353827095dcdccc977ef220220481aa03fa0a52b165b1587f8251920a3aa2351af233c3ebc079f067a908ca756012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202cc4a812b3b3e45fd426cc2280bce42a1e61bb0be3d9e3631980ad1872373a1a02200da0f871158ca628f9f80e5c8e2469a495333032a93a5424a5ed3fb36bba6d0b012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022018aaf940ca8e1aa5b7ccf720abf86c35ded6866237a4dbd6498e5760d39a440e02205584858e54cff36b20e47d46eae577859cb803a6f1167c3941bcd09b257960e3012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220601df606179e7cfc364eea676138ae480791ef51f9cd26239715ea3f79e9b582022007fd0cc9d6a11e00c59c0dd6c2e40327d0bcfb83f6384a91c5eb7d06ba39ce7d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205d777f1dbfda4a0da73df9daa75c1bd20676edb47242cccaa133079a935fdf3202203a7f4df9a5bb51dce704d12a09656e0c6bc32285e1c7aba2daff172539169192012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205e2a3c11279074fe2ddbb2d7fe197fc6dd1cc2d67dfabf0be55c2c7732a5d98d02206fa617e78d9c834f96819652f134799d3c0aaddaca05cc0942325d51284ac472012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022022bd5b4be7a6007b1b1350c5bc898dd732285e9aba4665b0da3cb141a0b963f0022021f02b51ec9a6f44451099727aa10d2cbb724feb44f7e2356d7349bec4d0cda3012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202cb28549b410fcbe9875c5d7c168603934d7efae352639b4d5f6fb6e7acef22e0220357012acdbf688ec758c9ec957f3556c98af17c678d0a8c71f72a5085d275d9c012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202cd332ba21692b0644e660738b3e86aba8cff894e62d50c8b639964120b004de022050e7d00c5c4d9981f6130c5c9da49d2244ddf01fdca8b852ef875a39e274b501012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022018be4a88ff79815769b23c93c4b967609a6652c78d1df3752a2c0d8aae6631160220366abadc590403d0f69a6c09821e26259e2730fdfbd47dd6861a651257e564e5012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202758e4b3605838a3828e38dfed24db9779b803459bfe765dd43b15962c09d6be0220476031823023245f90a951a1ed80bf73d654f7548fce74cbfd7c1a531217a9fb012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022055916d5349b70b447e1a357b8d05bad7f36f7f01f063321e46b949913186ca3e02205f886d6ca191d8c2fc1eef0e4f5e070a1283f14fc3b394c03ca5805a4e03ac86012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220490f5928c50d3160cb8a0925eb880aee43040d8c30343910ccfc5c29a448f5df022005020de940319d4435058bceb35b59db9c3de496157a6f5e55f4ea705ad58160012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220747d6998b9acf12bd8ee19900601ba8cdebd769a6d4a8ead51712e4e1e27e21f02201df4125bfa6e2ab1679e18f0240a4266413cf744052acf98bf15aedd8d1134a8012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201bc152260c1748dfaf1068ef0c58340952a2e3c84514c75f722981dd1d5bea7c022033d009aa41fb7b97353c0ab84c3840e749457aec7dca8b02a3047b70b6f57be5012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204c4799c9ace62721c6a820c169f8a08bd1f16f6b5f466c1bbed0c820153e60240220137d918d4c5e3b04ec90e15cd8b6a7c373805e9b1f99a1d70326486e22c2ee32012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205bf45a6533c7331f7aab7c0da6f16f1266065d99edbbb237441ff5bf3f26b798022042967ea0f82ae7721baff651cb603e632002102484cfdb68bd9c88d5ab761e5d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022002027ea793bfa421ca13b46c49d6516eadab71275b2ce814ff4f55750780195c0220666ffefefbf342235bd3f6711861536699aa6114b4ae4aa94005b1f89a5f6407012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022076d85602ec0cd9ee9a84d14cd09308f520a33d16573399cbd3fbbc60ed7d8e0002206295a01b22ce2a3ba8530ef71afd3f4261b1fc5f5c3226ea74a3a0d040d099c7012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204d26dd3dfcae6a118499db1ceee0753dc2d8e27b26c237aeec5fe51410479eb6022013b09312305f3da49fc7deda8f89cef52eafd497dab2bfbac9feee095b5964a4012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402200df0f1dcd3d6ea0bb9630f595ac21f4cffeec27b6bff92a9a54b9a8742c41a5c02207b3558ff6c7fb414114940a64392ab723b5d240cedbfbd7b40c25d1010d67a98012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204fc14777cb96ed989b29dfcc2aa9e64b511ccf9d397a79f6c998df7b1209f5e802207e4f914f6d1e4e517247ccaa86f256a6f7e95d4591639a3c531eb42753605650012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022028380f55676e8a878c6ec76c5650bc36ab838bf2913f6bc4e18dadded14a406e022050761b588b592a3f062aa9bd99b3107b555f8ce270829f146f10e750ba22a614012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204daae11215b7bb3586c369a7a0f7016251cc9e261ca2c813c59f8b00a2bf4026022070f6331a3c0e5e98d1f045375ed5431bbdde3afb1a586291ce8db983148ffcfe012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220534bb81545a8444355b8ac90eaba0641356d9cbb9780d3ea2c7e6bbfcabcbc2602203234da72442b0d454f571b1b4beb110ce7f6e558829d71d8973d8c3ce51c2532012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205b84bec4571438ba749daacad3e8aeabc8008c5d1fe4db6a4777e92e8c42ac0402205e578e7feda43aac1f0476b4a22ddeb2c7cc7b3b8e4272a2504cc56b244c6e96012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402200804db1e39b11ecf64b19de4de851b02e291edf92262fccd267d4f97c866e15202207940697c394aba7c188a06ace9df39d10669da1014aaa022653fc7581e5741aa012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022044f31b8af091aa907f1a00801f03858d579cf6df03773370c7adf2c2926693fe02201f6eb505cc662756b34fbcb781de8dd66f5c306ae08ef27916b893b2d575217e012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402203c2eed5901e224737f7c3460b56f36f4a9fa5078a15a3fd860ca01111961ff4b022027a74c1fa067da2fadbdfcdaa1516d05694d0c8c4adc45c25ba4c662713bcae8012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206c2123653e380685a7edc137043f53a176e8e29f2f286e76b0769c2c9cf7abde02203a7010a87d0330c7cbe5771e7e9c7cc356a2d62b121911359b4cb07d2cf958bb012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022055ffef633fb808cdb0bded0f255b490af9c82758e0987e33f3e100c8dee1011502201f116874729067c118d017ca623dafae326e23e28f7586f6cd6f869d39ef71c5012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220257b52a6fc98212663baf0bf3058260b47873655cbb59e65764dffacf80ed29902202a9a7eee05aee0fda4efffbb2bbf77289fcc03b90229ac8b886fa73801d2842f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022063e2e9456614933bdac0dcb215399d5fefe9cbfaf05543e8fe21b8ec0a4ace780220255abbbdcaa151f7146021c2c4e14239d9ed81aed111d797f2cda4d3428caa8a012103ee6187af51484254f6a0fa5b733ba68884798cb3d3bb7cd242f0bbb9831a998702473044022068aa9bb03aa4c8f766c05e93c8b7232d0bd730df1b19c8d0835301e072053f650220389ce3d23a41de7df2acb666908ff2e02c7e9a847d5ff6091f4e28be16b60a78012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022035d8a318acdfc1d6824b960c7d2ced33faf4976c65e7f0796e559ab4c0b2737802200323736a064aecfe24a68fc06282de56c0c863bdc52227d2c132e0f8cb3dc90d012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204b95e5b449a46332d4421eb8cc82f8f51835b0508c3a5826ad0045c30ab3ae99022039d294f1007c356dab38b3094f77155c521c3cbb371c043d7adb2c45376732d8012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022002e948701981438e6ac572b565548f2fabb85a6463deb6cbb29a78762c1676140220296f358f9c9461b53d6b3aaa354534b039e0ef1d07b5d5298755f7a9d9ecf0be012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202103f2c1bb12bd3e42113b81a80095cccd337f90b9b05b268194fb2b51a9d93f0220399dcc5f0b419f5a64a98339925cba88be0c73d8ae3a14ccc9bd14387e3f228a012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202ca1eee0f67713485bf7f6d5db772e729c8599eb6e9e446f4deb4aff05fbd874022005b886f7420abbbdcc7b4d2e3008d6e33ea19e8140b9145af809dfd17f6ca316012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204ca767fffba5d03dd5f35349b5ef2464764cdb6e46a0bbc8abf8f5234375805102200b469beb57ac1c6ebe8a0c9bc6f7a7d54063543c4b79a241f3ec451d5ca4c158012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022062787dc291e1b4633c338abb395854a3f93e451b2a5d225bac393f8258a5b29a0220766e62e7d530358181105cf88ed7f8018314118eb55e050ebf024462483de804012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022026a559d2c5f06a9be0c2bf0dd4cc964c4f11bcf3b8c43c5c91402e6a5ce495ee02204ff26aff133798b04c711fc60a82abe95cdc448385cd397160783373b693c4c2012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201924dfc28c03b1d4ae2353958e4550aa5a3084b24f8666e34b5a7be1e3ba12d5022013a197ca23121276b177a66dacd0bf723ecb91660d10a52ed7bdaf06d64568c1012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022069ccc1a42c0c92a8655778f5a8f4806c857e745b81ae4457e0c322d349f16ca802205dc7755702710d49d71b82d7a64cbafbe865af877ee68dfc1f73b3b5986cd731012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402205923e982cfa2888e21ef7552bf9dac256cc2d032e4c1168a89fab0352034741902207104b573c53c3fa123cc023d1d3d944fe2bbc5dea990a8453dcdeab53e4df402012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402207511eefcc5f1c4396ced98c794595f8e8fa5379f6b5aa37785217f857db3a49e0220310d33e73272080f704e90aa17eace06fb1e7adecd3220fd3c81582703fbb59f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206b098f20316df8180ed37ce6980ae641994405cce52078bdb2c004a01670752502201a8e67e6dfdd693b68cfbfa00b5bf04e9925265522f309c2249896ece5eb7246012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220012f2c1c185118d5c87868343d92c9d2627ebe42c18defbd4424c8676520b0c102204e011d69276c5069d94d32c0a74a279ade78d7749a7f3ac4ece4319980bc6a07012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022041133f637cd241e97762964f98ce0fd4b30e1d0dc0700c45ca04f35fe0fc50030220309ac634b15a2668557b64410d916510deddee16686921a665000505edb79eaa012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022047604511a60e2efc0aa3341cb6831a56e52feac45237fbff7021477fb04caddf02206ddfffc863d2af7accaefc66ea73150b776c566b1c7f49e985425124db374278012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202c8b15a60cdac4dcf91a8541bf0c8d756f7cfa993aeb2197a62ce4aefe31c60f02200262f5732d3dff96a0a7cfd31bbc201da8d99c9bf09453f493b9d11af45e2d10012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220575c4da0d284fb0fe29cf5e2b49c3f5874573e8874b0b0c952d393fd56ebc94d022008a359e192fde5cd53cbde9c8afd79dba1ad059056c0509185c907bce6d0a612012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206020810b639655677e89a4bb71b9026381bf2f2574c92273d44f46a3cf2c21ed02206196453e17bbe07fc2a9436debdadc621be4ca58f8951cbd75b8b28f38184dbd012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206f3fc1d1255b3f597eaf1b7765a6282a9bdf6d2e4a150a4f0190abaf6b90d490022011b6249cce77dc53cee06d79406ef6120f62bb90dcfe09ea56670e3f2e81c65f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402200b48b3347fb308d33384d8e8c30b65014984097e0d16a1817a84b1a7a5d57bcc022071661e86479df35d00ac124c4032a4eb81f9d99af6ba1f87d96784cdee40f4ce012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201eae865120d7a6505d2b2fc7a0ae2e673451e650cb7b09a2d533305a38be2ade0220655d15afb0f4c3cda02fa5bade5dcbf7cd560b4412dc0bee1ed2c0e8734d2e00012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022020130557421b8a5c43436b7879d76837ea5b4ceb63c7b0fe5e55c6db4655ec05022031ddb06a9307776d6f8b575f6538815291222e2c1f07f7e2b9b14c8651982e0b012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402206eed285915fb9917bbd834a0e7bab8abaf7c3507ee3fd9bce3ffbd07623d4a0b0220174b13d9748dbc1f36074c80bfae9a92d56accab9dd81883f07c99166c6387ff012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202cb776f03800a3e1694b8f07308f5c9529ac48e0bd897fdd3ed89786e225aa5402202797e754855f69e12f7d172ca982f1f53268eba382e734817ec48721b207aa1f012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402201df427531a57adcdd0c7731b8f5598afd8693e1db8d6be30889b9d8d49426c7702205dfe74be22c33b6e1a9b76f2171a28499fcb548bab7994705629062e306ac700012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220333a46ff45971c7adb9156ef29753c0ab491e6cc15188c6104b0e3c51a952a5f02204caada0c403e34e4cc7a8f6b907ee1e21702bb2d828badc7979b9372171e4066012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402204736003cfca3bfb3ff7c115c7f4a4f89dce89e80605e1fe9a8e33a67e1bf8149022035cb01160c5705b6ccfcaf7ce697d3cd129e02881c852a795c8cc3bf3caba1bf012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022032bf1ba4e5e6a51eadd5777e8e2170c62c61388f70cd40203efa7999f29e72ef02206df08ba37b2110e13d1e363f1e5f6d700b1a859fe1ecf498c61f07aa62074bf3012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402203fe38777e2486487742a29aae7be56927de7b7e9c0ba850f57cbd348705f6efb02203075cd30ac7c6f63ef8db3acc30cbe9617c0fd7328ea2029eea988fb85d6ba2e012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402200d33219eff8248000fa86efcfb4d3d8761bcc0abbbbd4efabd0a45b0b2a6cc4502201bc7ed67f53424998c9172b834139009a6737f1fbfeaf41ab73b1253628fe9d7012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202382a4d56e34a6607d37153c3d4863d27c9ec37a4b4abef754388c899b52083602207e8aa8cb740ff4b0310fda8b5d0887d0dbf71ca8c725b0adcb3bdb7c845dab0a012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402203063c98afd68771fedefc36308cd34a1da3cd2163253f0509acea8551ffb0851022024e018b1b95bd8529adabd899f12ebc3c1001e9c0eb01853ffdbce5f0f853aec012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8024730440220573eb0bc6c6bc61c0c585523ce024d50228b57c505091b20cebc5bf7d7094cca022066abc8234624834db1a8bbe252b407860419a527855c1f4b062e461e99e32324012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe80247304402202e2117e469e888054d2fe435b9ea2820f03ceccab9fb138426b55732db995e0602201dd2e0ecd12b93ae8af8ee15a4f9ae121632ede651ea2a0136296111125dd1d1012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022006c7b660af000ea132416d93e59c06479d2d5392ac91a48e8867fbb1b26723b202204b7c9883c728edbba6fb97c2d615e42eab64c3bc77055d50286589648fd4aa82012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022050882ce8774198a0fa10f95e7281593bd0e9abbb90a0a1fc4299d00a4d6211f20220285ae7a9b4e542a07d8985b04008cb36b58dcaf79d80cc98c5e8032caf813f7c012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe802473044022064e856fae64a9516e2fa1814b8c07466b8b6929e4da04eeb8146f0aaaf17a60d0220409c364ee7263420f7a598cdf344b1ff9b1cc7aa5da512dd8261248cb5863dee012102481af96b05f38e2ad6c8430eb9e27a00384c4b2ac9a8ef3d8932195ecc2abbe8000000009700000020e77fe209b8a51992ea64013315594cb3888b60f707a58e77e95abaa79d75d31bc5938789e01c71509512719b1bb697635ecbee4d754d59aa8274358624db509134acad61ffff7f20020000000200000002c5478d32402d0d9c5788d479ef2fe5f676118ebe04aa635818e7344c91125189cc416e87382223cfa9d82d9f465d81481f5c5d83a39276b4dfc36c641e8e99ba010543010001593af4f3dc72eba686423b79c7339c6e318a33ec0fd160a9d8dbf7264ea039b2f308e71dda0e71377aec6a354317e8d9196a905a3ecbfb53ce4c1b93b54b6404fd450b4023751c01dba9ccd67544834e42dadfb1e71f158a4128345da1d4d46f9cd70607608f2e45c1fe1bc10a3dce2ebb3cea5fcb54284aa34e0875d11c5cdc0456ff6acdfc01ce6400b8b3627d0c1a21459b07c743ef9d357018c7e6d11a9d2f729e7d327d014b0600dc43fda078d40f173b38b7e1576ec49b410b1bdd0ffc95876e93ad7ab680d7c0267f2a7544d50d3a0c9cf242413471a29b37710ed13e97d48163162736c4368d1c852495b57487ae7bf9627cef2df8d5d7fc59c7ae27aa1d293615f221e1b2b46afd6cd448626ca7a93588f10faf44b045103103923709dd2902b3705899fd02ddd7ebbe6ad702064c487844c7588a11cd9c348a4555b7fe11be3151bb786a9e427e03a3e08d9a25d04f73bf26116bbf3d520937325138bb4bc083c01b1fc096f13d066f34e6f8166f721b4955e5016a21c912bc3405c4ed18edf55c650be3f6f96c454a58cc6913321cc3ef044ce14d108af457f2a2b396b5e2f8b08cb857e1e9bb5b88ea3ec9ac11f4678ba57e0c103555b20f14c1b6acb39079671d5d953457f6a74b7999cc56cbbd535168aa06ed4d33d09c59b6c3532e9caddac0bf27687c7a17427d531ab6b98918332669a9035d750f54af0ea4031a705dc0602b5a1437ce4e4aef0687529aba56139096eef8b4740bdd4b7a124e5145a75bf97d0bef72044182be3535e3223d23d7e0c14ffec91a3ac09346c09706d56d290b0ed7ad1b8c42d401aa2386ae9aa30456f9087f2ffa26ae28e4a17ba1ebc1d5a3f64b11b36e180ba844897e256b0f28836f8dafae43720e696fff97b00c441b4ff6d3b42add9c3ebd9917eaf2bcff7794d5144ba39ae5a660ea97eac27565dd68042bbcc2f3445278dd786cc33b1d252a4a69db944c78ac9a394bc5cfdaffc4e5141c945575cdcc6c2b737811ccc2f8681ca3a491fcf42505cd6fb29533aaa715c466ea9d3b3e94b4a3eaf97502d877d282db9e44f7e825e80dfa430354a671b92f9190b5aed007fbfef5cdbf0d7544617885cea51656fb205a8ce2fbce662c3f01d7919b85cc2979b420cddc42119a501ffded1233b97941bbffb5489c0a593cddddb166b1fbd35ac32b8785d4bbb9ef9449edc665626edc8ecf7274c2bf445d4119747564d8c43c9dbd5e9cca84d9faae729a79dc916c498bd6bc4ae11f11bca4a356c98d356ad956785d0732be432a31ba1bbf74d5a1fa7df42ba9bd1f513862b3dcb76a76408048639c47f0cc8e608f57e3a2c1d019cfaf89118b9f1ac64575478425e880d133f9429f1b5a4bb578a06ad4ee17333b7069e1d80294bc794447e428ed0c49813cd221e30d1a58d3540c2749c69328aa9e6d3992246be415eeeecd180637c7811e185f909edc1c0f5f2514ef7211ce0b38f3c1c1f034a54790be9cbb2284669ff17bd98a12da51de79250c98880d6faf9eaba4d75885e03d0ee8f0c46152ff0307539c8c807778599c1c21015493f64fd1265527d83d58fbc97bb1c472ddce0b9ce03c6af0605e7d672f61c8833041907c3be299d921481d66c96de822ece6de4246fdfb7f4514d96a0d7c963461a8c9400a7f4692ba618156a58184b2739a1aff3e8c15b07998634a9c65cd3007f8fc2f8f593f41f7f4ecd654fec06aeb9a53a1fc0eba9c73511fc000a82b115ee7d182987ae6ea8de43356171cc51246c01c1ae92265eb74e1dfcef4583176f1cc271a3250d34e1a7037435d3fe39030e97d4b294fbe785ba99db5f77b8f2b82699400d1c665156114aae08ea6285c8bf7dbf06a8e6e949d0f6aba8df22f747d8bb414207a0a5cc7aca295c0beecb93fd0ae46e0de9579fa257603e014db97cee4236902faf335b6232f9fa133a60032cb55b16b64fd55a0f78c410de99a26b9db7e77b03b66a2fb9856c7cb361122dc04676eef30fc0fa4cb2e00703266b5e7016bb529aee7d3bed7e494faf9df43c2b2e28003958f7dfd614f72d237524828e44403df91d3bd81a48a156dcd0b69e0ed96779bc249213e4c7fba2d2b05b84bb035764cd8f5e3b520755e736ac2d25e0b4d2d4b44bcb4ae8dfe17b1f6eba8a11f9d06e5f97c77b24ff2efbb790fe15b5e25eafbd067717fdac899e2d18a6a2e0a0252b810f406fe20e67a865456ae343883a734b5b765785b573c757f650a6fa3db84454e2cbf2f94e5e6fcc259369baad4878cd40fe84d592397f875f3d932f6c39daa22bc72d3c6c94aeb07c91b44d34c0aac70efa50c1014e0e66a31a504cb22991dee171bed2d357a189b4280134a8abda8cb971899dc5909258aa02caa91ccc923d76babfd2730b590bc9016663a3daea149326b75973c6a97db62b69c54eaba4e8392137309d087bde608a30b25a054e8a997ff023d9d8a1c44e19b4696bebd15b723afd7bf80245d7fd4e69eecbc297a6c7a9f9dd1b280d2931920799cca97a0b14f115d4b94a9f24cb1537f2c8336a12720d19083f661c6b05f4ff972f4ff48a470e4e6c44b9a9c4c062ea1fc184155f40987997d6f23ae8003bbed91eca5300ba91f0de82b167dbf06b642718278bfd8b4ae8534442f3b6d05d0d1a896e629ea11cc63d49a06b884bcc599eb49aef90be60bcd4a9f6ec32d388b65ff7224d3082c651f80b33716e2d9e43a954551a6f077d8e29919a5e52b8b1232605fe3143073602dab1d30764b6c08e946de0710bfc1d370bca61b55165860fe00468d5e040229782e93c2fc94489126bfed37df6664860aa4f274d4fcb6bdaef0d3a34b06b3267531017dfbef4cecab3f4dbfb12be3f36170b5363d180526dd3431bf9906a2022ae2590a9fc158d6b4df796c49fd1022074c6c22e8667f5f86ae9e3d6cb997579ce37153ef0c15ef521d63c5ca14a25b414c53a625296f9a2165099a2a1b3bc711abbba396c08a9a12bd343665c5c5759f64f7e025bd9ed7e21ffba599e1d31a9c6024663b89669dcec1ccffb244a227d1e29cd18085713d1898299ae8b4fd666d12b9361cba8af0b80d0c7fc01c8e944035ff2342aae0136a769520102461abb5b04f6853e9e0db2a1c6fb4a89f6a428ca96ecf6db2e2c880fd710c72c17c542f3786d304e9b2382ec580b0b0087132a2448258de951ad966897d0f9dd9d07c52005aa5963edbf6aa033ad1d4e18d2f74a0f86587197a1d32916a567b274a85e3968fbe6af6e75e18178628cb645b6db8ea0e80e773f90203a3b510763100a11429cb36aef2c637386ed6834a96fcdefbed4f416d6d3faf09d52528070a2139de399a4df64ec6339aabd99f77c923a659617352c5decc08413f7fcfb5134628d078b27d8b9c681ad61f52281fd850d2c1d3709e6d81bec9509d61b54304f116ce4a481526bf4ca15b7329dd10596972f4e7aa0a85acd953f7a36b347d3afe2e607239852f696ebcd26c579d5a120bea4c99940dc43461f421aa0c04522fa4e240bcc2cf7293b862f27b45b6a557878a21ac1c7949a3a0551a34d887eaac5a501bdbba4e2e73648539f1108d2b5067f070cfba7809ac7a557ae23a614a1361d9eae76dc4c0c7e3d1a7a0bf24fbd4c5d0fef260ea11d0ccd4725774a1af4628ceba8c8bd89ec5ab4c11f1fff58eaf9d5a822ecdf90b1519fb9253e42502e3669e6686118830914227d0da4fea2b3425ca2098106ff731999e28f5f530fd39660744482bd77123105f807234415ec7cf2dd640444a683c4f47ec7ed19f90e786723877fb60c14adf39687c4f647cd7da225b636ae7733fb7663c8e76e3e2ab9d4b7fc3ac8fb1f3c0e8781634860a84da514dbc735d9a56de4c0e26d5068890d353784712d1c87143c8f511704e8d0bb69e05fa74e37321518d1c17eb208e00b7407c46f4d24be80fd4718840828e3201ca26622ff5d44061c63fd9d9f65d5c34d03ae75a082c31b6174fac3975e1d3d3c6c775c2cdbf302183ea958e9c002dd27856a592f5a6d2040e941ab261793cbc6b3592d32940b3977003f62cfa848085756047bea7550270db3c66a040f191b53fbc0cc5c3946d2691d4d34ee002e827d2ef265d6fcb0d1fd1a7a62b7b915f5df61a5a4fa23bb432fe606d0fcfc08c6673d9bac66a8c000043010001fa227bae1e9f2a9d2594bc8439e39e7f56c265167cae3790f9e5446f53145eb2d6ec06c555d966bb9b2169871eab8d89d33e0a4d98873ae4d1723b5054917ee3fdad0b60240000000000000001713f00ad59c8cfc29b52deb574351f9394999ffa4dbce9edc37901ed7d92c105302e9ad8eb8439c8a83942bf9ee2c7a0791669ee808332f9e40e300799b8ee77604ae94a3ecc8890c0ce3baae7d3d39faec82995d09ad9b9bfd6373cae3c9087a198169c2541a121567f9a82759700e22816c8cdedc3d144e9ee22b6b9aa6817b43c282e4bafe066cd432e1d9e558dbcaf32c24a3c0f34e0296ddbadb3631a4c2f252a358819b66d23c339eb69d6ecaf7972afab1de488cfcbee4a4d53472ce9025e9e7e18269096b0395a903fb87000308dc3a89cdd75ee01a3ab3eb6d88c9b42a0f66052582b93c9322b89c613c3a8a7c6a2917fe3c169e7d4ce020a8f58380b83e4383db8669804a49cd91918fd56b41edae66df64648677de7a8133bcbbf0096907d04c92b4cf6c389800f90a58e3af6350d310cff5096d52df4016d76804876431a212b31e0d90cbafc33e6803ee2db4dc485a4f20be94d9f27d9e824b2b9d67f852d78ec30e6a6559f001b3699ecb7265977fe0cfcdd02a4037b0655d972d819cbd250dba86348f93255061dba7409bccaf8a89bca08bf3b1a3fc206e78e48d87a9a7423f1e49445bb73bfbc4a91ea2b47f34ff55be9157b3d8a4639d24468359e2083a5b7c82ca1ebbcd9b777d50650ec8f92335de253a4e2a729f446cc8308f7d89341875db3e4b2aef038c13bfac1f78ee35f829ba7e1241e7d3ebaf7064a2c99b9ce2aaa10f526140d593c8b2255fd32d252a55487ad2ca5619c794036bf9911a244dd42666e4621eda0efc4beb998cf079af1116576bbda85afd6e1466faa59690eb218db890e9edf5df42a1adbfcf97150b279d4e23f5f4b7892a9faf6fe39f15f5356c437a269ec1fe9a49acc48d4a6e76c73e2078abf2ec091f81e640e503892422157050822856ffed87cc3f25a610963d89a910656363fab3e6940805a5afc7f83064eeb110dc19b76a6309345732fa5c55d33b20c97e5715a124358ce71cca0e8aba4a3390c6abb48db8f3b6737dada28d7bad58be50791f93d6ccaeb48cb15f41a370c5c3fecc0b809bed3f68f780a40d5dada80e60db91ab036ed8fe45f4cf1634ebabced3cce51f3d8cdef769e5fbdeadfd6e6832478e7f5b1f9c0417ad635981b331fc909abbceca5748c69bda26e35b96dd4d6085f63ae92f3e212129cf0fb705d87dd531f6e2ace94ace1ac1a0f0b15511f8147c958cab539776a542b2c7c534319239b5b0096f984c161043de0254d3c236bbf85163a2fe8ff2afc4efca87e02345941faac21b78dbbe577cbe5782748a6e3a45dff992794484afaac3580da570642d881a7c048eeaae81fa3bdbbe7ce8faeca26895358448d045bbe6ed21f6c193306846ad38ccce54b2f39aa4c9e012ac0b3e1c696a314ff85292e8c63a7cb3f418caed2dbed9c98042b23ada80c45fb8bff202807eae108d5e7c724f840777d8ced9b281fcaa61020bc360a6c9405206340e1243b587a6e18533e894af916c3af9e7e3ef995ada0ed92b67db0a7abf05bb4ed48e75d74ef2cfff01b44a9e2691fa3996abd9c7c3c3299efe901d09ede0299f03a62df7b9eb59169064adc7d8a50405cb66f741a08e8d1973a543544a5c6f546bfc6169a500f880a1f1854b80668f0f1f30447f2daa70639a9b301e0ce7b7c7412ae2460d0c35d3009a47f5dc587926ad579d9ca2e590c949b999c0e8554f8b1afd28c4b1efc5e705725682725766067dd05376052e396735dba37b9dcf242b8ee9f7d96eafcc68343892c2642dbf14221ce90e63aefb70c717fc67d00552bc408d74178dadfa19091a0ad68c0be7b18528d6f6002e59eee69722a43c98936fc8192ff7d16256af94fea7c668c6b06e6a21e25f1db78f2f6f9d21e3a3f9784392774feccbbcdbdc34c2345bfce119640aa74d9c7663a8459d3d2cfbf8f3139a0860f9b872a5b9419c0c268f3a890d3b0c274c43fca81ba4cafbe3fa8230432ec43ec6c7bec334074ac4d98fd6ab8a3012796c953dca244b7fd0cff0788797df171d28ce38e3d4f464bcd63dfaacdef2f2e39da4d111ed7e9ef9eda887e1da690a3b12f77db4c459a9ee8cfbf5ba2f5df2865c5c540c9789654a7fe3bf9d05df4e2dc4637e66e09208bcc79a3c05b6adb769336973773d39cfe4140b574fefb46acca6b6a9f4708c2379cad8364c7c06a6a55fded16fb704d88b0db9b9ef1a4d5a6c00b70978485c5816a7db4946c1979a0ce24c13bdfc5ba13dd715cbbb0611d200a66b78db7cc80d25a3be995afa4d20263b0b79d661f1a016ea98d0ecd17753033c91e70bb5b4786eb3748eba3f3d948e7d09e728366c61a46f2d6bcf595a9cce2c68808c22e319b9e11d085ceb27794fba0d26244267a23a7260f50b824cd7f69dd28c7bc5568eee72d70a482c249f10216fdf2fa764007555cdc447588c89bdcb228f0a8259667ae3f40d2ebd9567efde7d1c785077332c17afaf69317cd4e3b4ffc1401afaefac9ad2578204740c1f8b4f1b4e1e1ba6b68d43512867bdd73ead3c1ef7d1ca78825876f144fb8df5a6ff3d97d3efc8389e35c55e1d6707aabe9de76c79f9889600440b23fea2fe4f2849131cfb55e7759dec1c90f882eb2175297598dd8e0cfbc3fdb20a8a917d2aa2d5e22a28371083772571ba7a604ea8f64715b4a7fdf236537a81f93d0ee62b167e79e71dd6c883db3daaf28d940b945bcf6002dcf2dce7d48ee12989cc078b654210e2a566f740cf1fbf4c377a3412ff959c79c6eab392f823f8e3161ead08193cd426bb7ab2c327e2e8e77d810479ff6ebe289a51b1b0201f3b81a43b9d72fc24d0073113561ff7a6b22b3fff290715c6866e9d705c77440075886e6844da9718beca169d23fd37d7a3f742ecf153b8ad171ea5a11d7dba0f987a3c76b0a6e9b959596e314fea6ffc82742dcc5472322dd9ae31d41e82a15918581430ceb7088b5dcb4c6b4408245e41ac1b3ede0e41d482555582edcb50497cf50418cab630f75b4f652cbe99ce01d047141efc983a184235a9b05eafd43e00899eded8d0a7e828f47f648cc7b2b325e55d73087da808811f8bd6f69d3ca01b2f0a521c1dc9f5d1f34c78fa2f9d343c7a64ec7c2364facf25b1a971c61664c4080f63d136623d1c58eba09d656b8abd3b397a7c53a2f220cd95b356d86e2e7fb3d1d924245af81cbe3c30595b807c567a63db232ac648434264535608e76559fe1f5963d1015cef9755802144cbf9a13e89f405559f0ffe66d18418e5501038394320fa0d41271e505e65a87f805872a38e72707530b4912571aa22bec6bf885867535b007f92a758c38a0446ee0215bb7c9240b0102b5368291a66773cc3d471780c55b9a73792fc79ffaf6f00833d011054bff0601305dfc917b8755b27af4b1114e3a0a151772ddab8909e95ba506b8aa329a25c59fd2d6033ed3e76f43ed6c584a77e78e3f9b1d4cb21514618018334386477513408d02f65b31ebccacce6a79ad376214e4a34e305017f2b43d29aa78bd34018bd66b87e3cdc5b1deb8fe174ca8d3405d412d1cf07c6d5c47192e05d9c79446e7a37dc18ab998bab29619f2a031ba3adebadbd6c58c90be0c96a8daa9274a732a3c29a55802fe6892d0589565e38f55fae6ff3f816c75178e59e9e7c2b1e3543062d63e3308ec266bbd44eff409b4117486f6f355fbb5459e16981d7598945edd8dc18c6d164fcb4080a9cf3461d73dcfb36baf889f3d79f1c2f0c9969b5e1e4f34287fe61345a0f7c91e1bad1e9d02ad0ec4c3abfc0efd5b0c7af1757924197089959afd6d990ec23f6d3065c06e49a346144d3aad490e65e6a4a65685d01f91c443787d888d735b9cdeacc54885cf9a4d84f174e7548eca9f32cf7898ae872f8e432183870669b0ac9d541610eddc623a8e33fca46d72cdc502b4496c79e7d8a95fec791fa0f6949b2497acefff1272cedbb13080909a98bd06e0533a2637eaa59e6f0bdf5a59bb28a5b42571b6cc96a5adff4e0fd0024608e362f73f8b183720509461c312cb56e5978db2f24b1800654176268ac0f00e3c0c5247935decfaf0793761470adab21a634f7a6288ab8781644b513c49d4665a0baf0b7052acd0a01019438a366c3e1eaa4184d08abb49157c91c8804b7176aa81e1b63f8e5b63654bef79e00e548b4e23fe65a2d987162cf72826aeaf76678889aeb9aecfc7953d';
const walletUtxoList = [
{
bip32Path: 'm/44\'/1776\'/218\'/0/0',
txid: 'ba998e1e646cc3dfb47692a3835d5c1f48815d469f2dd8a9cf232238876e41cc',
vout: 1,
amount: BigInt(100000000000),
valueCommitment: '',
redeemScript: '',
pubkey: '03a6f9bfb75ef976308fe1996a26187fcb4b0aa3c2d506f7b6b44d0065cca98c80',
descriptor: '',
},
];
const authorizationSignature = '3044022040d127426a95dfe5a60ad958a1efe6aa14ac3d22ed3ecc5b4b59cb395e5aae4c022031aa9ee98dd9f96d560dfbaea68a8c85e15972db6ff210810040f30920cf73f1';
try {
const ledgerLib = new LedgerLiquidWrapper(networkType);
let result: GetSignatureAddressResponse = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
signatureList: [],
};
try {
let connRet: ResponseInfo = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
};
let count = 0;
const accessingError = 0x9999;
const countLimit = 300;
do {
do {
if (connRet.errorCode == accessingError) {
await sleep(1000);
++count;
}
connRet = await ledgerLib.connect(0, undefined);
// console.log(connRet);
} while ((connRet.errorCode == accessingError) && (count < countLimit));
result.success = connRet.success;
result.errorCode = connRet.errorCode;
result.errorCodeHex = connRet.errorCodeHex;
result.disconnect = connRet.disconnect;
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
// clear
count = 0;
if (debugMode) {
isDumpSignature = true;
setTimeout(async () => {
await dumpSignatureProgress(ledgerLib);
}, 500);
}
const pubkeyInfo1 = await ledgerLib.getWalletPublicKey(
walletUtxoList[0].bip32Path);
if (!pubkeyInfo1.success) {
console.log('getWalletPublicKey failed. ', pubkeyInfo1);
} else {
walletUtxoList[0].pubkey = pubkeyInfo1.publicKey;
}
const calcInfo = ledgerLib.calcSignatureProgress(
proposalTx, walletUtxoList);
if (calcInfo.success) {
console.log(`sign utxo count = ${calcInfo.analyzeUtxo.total}`);
console.log(`tx in/out/issuance count = ${calcInfo.inputTx.total}`);
} else {
console.log('calcSignatureProgress:', calcInfo);
}
do {
if (result.errorCode == accessingError) {
await sleep(1000);
++count;
}
result = await ledgerLib.getSignature(
proposalTx, walletUtxoList, authorizationSignature);
// console.log(result);
} while ((result.errorCode == accessingError) && (count < countLimit));
// Retry connection on disconnect
} while (result.disconnect);
await ledgerLib.disconnect();
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
} catch (e) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
const signatureResult = result;
console.log('signatureResult:', JSON.stringify(signatureResult, (key, value) =>
typeof value === 'bigint' ? value.toString() : value, ' '));
isDumpSignature = false;
} catch (e) {
console.log(e);
}
}
async function execPegoutTest() {
const proposalTx = '020000000101a38845c1a19b389f27217b91e2120273b447db3e595bba628f0be833f301a24a0000000000ffffffff030b33ee5dc5cebfcf70ffdb2957db56a111f60423806707d5734797b632f5264da909bb7074f6ee5ed0754601941aded3c7cbee9c3963bdf9dddeee9d756e2dc9b2b50299ab95f0094422481af5a03e0fbecd68fb9c02ffcccee12629e4b084b42c242b160014f5f67358a0c64ff9336be2e316f99b04b548521d0125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a01000000003b9aca0000fd62206a2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f1976a914844d3afb2081df687e6c0a83d2a5e0925c4fa01f88ac2102f6e02ce0c684096337672d7d72bc33c5129f9079c50447452aa7139ef3632f4e4d0120ff1f6812267a5600bb08104520b0c63003b7f674c2395a586ba052fcb5fb4346902a8d7f1014f920b8011119bdff1a1159c566b0961d4475e054aeb5bed098c023fd260ef73f838eb0f2794b86ac71cebb12882425be4c5ba7a145bcbff637aa4bbe26c53d486e4d4520b0a17a353a3fa758c080a2bb7cbc04d9bea4189487b80bf31aa26874035a8e6f5a7f7d1b414abb5da9adae630f2760505919954787a4fac4f58ac65b7706bd3828e09cff6881092024a69b844d9d74222d1cd902a3d699137c28456874e187f885364c1976e1ecff4363369fa2e3176f1b03130ff0164c809f3ec74729a4c26a5f2da3f202055e17d79c588e88c324181b2f022a1eaee47aada011176ebfa40d24d1158d2c2a214a61ddbafbf7894b21f1f17e6d64abb6ba5309b3de48a66782ba73dda0d5bf8e59323be2980e1078ef3925eb360a919bb3bbcd7d36d4f00b986f946cc30e0db1b3a4ee2178a517396ad12f4418c40e7579918c5a8bf4ae4e0ab1b4a748f7750cfd7fc86d92d699daff5777bf3d6278b525617196cd076538349043616d212918a02b1792b5932e3741b322c90e099db3976fda408999cb57a66b41e9e6efc158edd8ae95dabe77139f5f79c4cf6813e886d549aca9b372defcfbcfd0e5294b2a4efeb83e50d13869894188664df8b541b41bab6c58b36e003c64cdd1cb57dcc990344f2f37e37af28eb8b0888d86411eba1082069763f128c418d441a5266cb5aeb76d46671cf6f4a56f507af483b58f32223705e0e72b29398304b366296f51159143b56de93d4dfdfe5be186ae141ec4612d0ca1beee085622b78b9a91cc87abb49adab9609b34ebc9aa4447ee4c23d0db1fcccc97040cf06e38e4d1bb3d40e01465b1128a96a8a4f81fe96027d6225d1fd77af39bae6a5e63ab5b2588a23c45ce62012e8c808d659b5435de4cd7ff923146e41f5872a19beda531781973e03112fe5f7a4b4b65416540558a8a6b2c5e3ca6404e2887786aedc99f8b3b4bbe43890257cb6b4ae9779860efba82e30a270bb6d901427e1ac82e49e0dc7acb86b19e3922ac107143570e79c6b25a2234b13898e9e2b832af2bbe80a8065a2503994334b2b21d9a8043904cb5be8a0b5797715c8ddafb16df902f6c180625561a5ce187d5a266dd9198705c74892c59aab9eedfe168fec60b4faccef6c5dccc7bf42e5a6daca9453a969bb7ec9802e2511ff14f762db959611a4e9c433c8fec5caf73bd558ceee719318233adc5cd84b1c16c728da5480663b6d3df66c3b0fc6fe740147b00bc8a258142e23a3be5734883812e8ad0f79b58c3e1498b2e9c53a988ccf0d64af068f5e70d3033f8e4ae8ac9aa6cfd4183ddc521563685f8169dc087b2ff9e5f0fa73e718dcf79a0b10604d68038666045ea1d5b355136b2c7c8971b71377f0cb25173db3ba0d2c2c76ba5fb3ddc49c7463ed7947b700d589101a73ec8d4a5f34596fcfca5d8c251fd1f9783f84c67ba5fc8fb95fb97c6e2943455509fa9be9cb3cded7da368a9a8cbaf010c4b2cf3972726bc6163d5c90b84f8e19d11ad53f18284b1d046af68bc6f59ecd274eb6e50d3e00c315f961a3be955671326f675e77bebc348b6fad79d57f5a92cf2eda5be4f501e257d682f09f23ebc26b09d76e9df0faa13f1c0822351fc75e369c70890140a4b327e4fb7abec69ba38b4481bfa4cb727be160f197691f99a3f78e28a5f246ccadccda060cec40a1bc6004839d24bee98052a8c11cacf7727e09fb200f8fb4fd46dc755e6b9b3cc692c7fde3e6ed27a37ba8e7789eddb6e53a0c6b1b079ed41854bdd24d085c0ede394e8b70012f007fa580240af5622f4cf0a9159bb95c4bf2579a848f4f6bff179d5b4d3aabc481042391d139009f225597e557aeececc239dc1630b7249e48c6e98db8f835fbb3998fa7c81354a9b7187cafec62d1b1fd4aa0a03d3511f329f52292bb185829fe746512d68241e0ec5a0c5da33f4bedc577287fc2ede49607967d0f848d6c1611a2aaed70fe2689d0867b7c5526e53875642f567c3f102727c40c1ea4503297643299cd4a408bb07a17482b5911badb790d7fe9df62ad277d97e553d2f0f94dbf2e3fe34699cc8c39c0ffd77c17fbcc1f3c36c01b32465e917e033cf5856b42446840076dee08cd53447c9d96198201e91a02b893a5dab11fd2ee16a2161f86297d2290f5a0ba0e8d104fda4e73aac4011c8c0ffad3a15aa7be0c972f3dc1798316ba19e88be4cf4296ad634d377d0396aa93b8395529b70f3ab702647fdf69abdad61647272f02b8cf0406a06695fa1902409b59b1dba5c338df9c490e101283d7c25ece7cc8e9f7c2cb3eaf2a6d11e6a2415014b21d4f23b97ac12e8167bbc4c7d1827d9d66cd849fdbc53282f150562d56807b4da70ce32c3d436695adfba9ea1384014820a1758779701fbf8cd5bdf87267ce3b270112bce22a35eb080c4f7393a5e435e88d2b0d2e43085b698e00def8de76fddf1896b34cf1fc79e42266fe1412b1b168b4e81b8eeb9013e948576c2cf9ac2ee97aa1b85a6cd4f2205037ea3e7badece9bcc6e4271f5d7624f704c5e488391e215e4152d15f026417d3e73873ee641a534c4517caebe8f43e37892672d2944dc7ad5d0eaa98037a8a639a55f957dc0faae4689aff8d62f3da4eb3bca4ef75189699af1bf78a1b1d04a771db5a2944204d1ac88948721e902eef0dc43a2c3b95250a24444ae26b9c8c1c870c406757cb327bfe540b171c9f860a27d7321f117a246e83acdaa3de623fba9099f36384f359ca24535c01278b732b6e5d3eb5a3d755d909931b8e2589b1d30d29e48d3023c18e7dd2d06b4119cda61c0145eab406ebe82d10570ccb649acfc0d325f93257ce550695b8c9706c6c1da45e6fe874f91dae5a31389a9d760cc45895ec7e6b69fcc27023890368b298cf0299ccac7cc61f968f4bfda6965620122e9dc13e23611345dc79fd5e569ccc9093741645c6894b51d1b47ee221bcc5ed2834a9240277ec433a4ede0277374b404e8b42ab41b0c8a69a64a1ab8a68e5e5c140751e9e7612f734cfda02d29a55288a876b5f096cef17de0d26e47d2903015cc4690027364eb71ba9e76494a7042f3cbff3225ee7573e12c34f174baae7bf5fafc6c33f3c03b0682ec3a42ac83066c46aae508a4a0d26b136fb3c27fbfd5aefd74a0688d31f2aa93a3fcd167b24b70d4333643d7bdcd429bc8aaaf7507f718942a792d3a935a6f5308951863cda2ab153ad7b2fe384825d9171c56a5271013d4e6cb5cc94633aa8ea04798ed9a7d67ef073dd76afaae41ed2f8b16c079173be55e808e5a3d89a9770803f4472cdf9092ac01faa37005b6ccd2aad94e0e4f9b9a7c781715555be587e72217a8d1d1c84679dd588eef33ca318188910d0224f7ae59caf096832026fdaff10ee6176dd5c5f6d68fee475fcb1bc7a8ad71e5073769a9bb7bb21bf1ed286af2f9445da4ad01ab3a48cb8e8a5f16f7b90f4f57843fc1df96e17c607b86b2b55ca01c631f5c02deae467e711e1482b37d931f45ef16ead06cf9d99e64c9992a660e8441d11e4366a22c20926591947f9cb6c78e5b3aafb6d2f2d489fa4ceeff1ee96a9a313341696e26cb17b787f51ae9336c2b4ddcb4210317cb770adcffd7d021541a8c6619b0da72402898dd993472836663c6857f01b7b60bd9ce90c22727e1f8714063950211a8c7c1bd63f21a8615765d9955c6e0bf02de8b4e9729ab94fffca94b3c4bb161452f4ce6574a8a5bafc26ca3b2b3ddb5ec2d3df53d3c45cdf74975abae5558b381f93945b3e97ca8808d88f24e6fe21b12e7ab5ee9bac0b20fe463e5052418aa7c24f788bc3b0c50976b9450de9dc5614e25ca92f548e39ce38f3e9c2e952b8fbcaa47963f4cb01ec70548913414644ad022b9a52d40989ea811d3ec347562a2dba729f1b4990d1e1e4bdc9bce55c3f557d6b20b7cdb188a1470cf81136e6f5dd9b48ff56778aca4c2a06a90049eb6b26a880b68f60e340612211a87f80787f856dade8b424d88e2a809d44383b445fab9d621e31942a7e0af3e682bcf746bef52c2d14209bf6d949b4cc9f8898121f391716efc00cc52cfce79a5817cb4c6bfcbfb0961a0e6d303a25cf79bcc8c48abb9da34927026188d4dca6d9c26f1cbd1a09f528b2306a74fd1d25adf81d82acf7145609f00d8c54367eea31a7234a361cd72bdd47ebcf42d2a2a2abda30aeb947a5d6b6dafab66cd8609a2b197305b9cecc4abdb8d440e205c39945d638a58a2775906594ae44e312099da10e9b3a195f3fe58092cc56496fbf5e63db189e09ab5af121ec6dc5ff543009fc0586302ae93051bc33c217b77eadbb88a35475c5e1f920e48975333795bb78a1bba441cbac919635fcc3792989c693aae0caab9558a872e33a717688ec915437e46c62a0f80888bf5cbd8f67e6a5933373f50fa3bf841f1579439df9737ac623ce07de3011cdce16a1deae5a460354d611adf4fdc0b5dce7661477eb53498233fc83dd6333f6b4986ebdf407c4b960c5c972b31933973729a0b69b10d734f58387b1fc5737e17903ccaf8fcc65fa48282d91a01765602d243de7a8b8fd44458d74ce7e1da153f7d95861c93b62df00a73ba4148a032cdff2d51f5867ae20120f3bfbf9cdd8d0e297d10c6acf71d77b44b368a91b9bf06da4afcdb010d82616e0d683a11e4fa7d644dac2ab9bb65feecec5f2b013a74da0f0af3089f8bc2dbdfca82c805abd66e8fdec4b0ecf5319c71c5ae95698bac5ac629e0f7ed8c5120fe5ba4750a7de245d9abe131208978782e6c4be86931349ad8385085bb3a24fd28aaff56ebe61955832017e04662819528787454667ee64077c4b7883175b3b3be3224c6db1858e8aadfcba64b2f3c25f8b983a70493b42e4f1338329ff5aee6ed4be3508b62bbb445ea6d4f4ba027b39abecccd5bd9ec9cf38788069b337ddef42ab50c9eea01c6e4dca5ddb5bc932c22a7b8650fbfa5cd39f380db0dffe0deac51243a5887f868388ffc29032810342666b214c81d4ecc51bf3ab890555a5b1d607e8ce6795418b1f78e2a6b1bc0f69f86b0f92cfc7ed6006e313b01d5ce9eec82f5bdb6ffc8bf526a3a42f4846a77776b58490d16e992afe9221e78879728cc995923be8c1049cac6a90f7eee0d5706eca6fc3fe3cec0fc7fa717e4295dec105e327ad42191fad5bf42bdc8a070188eeef3b4729097476d219ae8a3d06eebbb12bfcfca780ba6f5b9b9b7b88c9bee2764c7c04b6c32a00be4312d3701ce5745be6eaf7be917c62c3c70b6c7dda0f08b25cc50950bace0185f21317811c9924e919fa6a7450692feaf5a35024fa39c9e8435b8815940c68cda2267e74abec203d2d9063a8d1fed908fc26d7d90c7deeab1e65cb6f5f0e2af246a3ee0163710c2a963fd047c2bce4021af09e44abf6180d08ab047dd5592e4ae347232c3f6cddaf14cdc0e6ec3e3c7f6fff0fd14ba66e0f881ecf753fe46250898162a796cbd87b59bbe423a3453157f343c93e29f4150e9c56d3edc6c748791a18d8dfee9599a22cbdc95d411486df729dc0738f82e8580307fb741d268e6885568f39f74dc57ca550cf318b20f510c6e25fc9f63a35c040e5916713765f6d15114dd26c5b636979f25b82679a96a8f1da62c5257e8a632a2fd3f928e32218e607b2121e38f4222000c5d188666b34d661d2253906ec1a181834379463341cf6172f169245bf3eb3734966c7af8912824599ee349a02277a80dffa401aa764b16a83c7f7138fbc8c577480fe4fc39008e2677feadc447f616766b9d56401a314ff9bed85953e3d6894a68b010474d2cc77f9980db498d7c4ebbfe11e866db19691a1dafeedab15d23e107dd5e62279c5bb7d4bbe60e4e1d09fc601a15e333ba238baeb7abfbc37facb394d138b53ed8698df70d05daad24c74d65b05829d8a713e41f3508c96f1712afb4145f60e9d71ac35ec132493ae91207865f2a21dcc37e8d300aa1a5b2be2e58ce0ce02ae4c5ec3a04715a2ea03cb4773d2318d3f42c5a43e02e2718f4d1a516ce40771355eadb427f5bc9fd3d097ef9d803b0edafd0beb3a62e651adb7d3e234485ae053bae8fabeffa3fcb7ab5e7dc7997f7a26b2a575035c675a57dd1dd021f49bc3cdeae6cc98bd877bf9ca8447b3799eb7a62f527bef21e48201ea61aae46bbefcc330d48f83ea567d5b6be3674a35098caad479f76d0648417bc34525a0d97c76a371bec9db2f3fb109f2eb38f890030b51ba802f2c027bddc78d82480ec4b52dc4ad45650ffb8c5428f3cafd88c17cd48b677bc35d0001c89bb8a377a7b970c5f31330cbd6a4d4ea6cc482c767bcc4cab52857a4203b0bc41105efe8287a100315bd717125e931e6a08c94982c297ef3535d7e813b6d1af0dc2d428eb69edbf904c03fd273123b8d599d43392fa3ae85b96bb1ffbd1a263ec4b8c0779433df263a2201fb1a31bc0188d8cefdb35d592413d312260df2a40d7c1ae9447f3d1fea868c66566d9350157c5922dca712966a9896c40168b01a66930e67ffbc64020ccc02ccd3f2f76698a9e58564c4d59ca8b610347cc7d844cbc4e2c36e08fe57df9fd7c65865c8260658d69bb4f84dfc82a1cdce1707828e5668d84c1c0eec4a6c54cea7db68763345a5240c457cc66a439d7c7721200126a03d7c2d7c3d843ebd3b8f0382e6e7fe7580689ab828e5c5775e45920627a64cd3ba8f1606c9e06be5c6171b13f1f84e8f7ccc9489def4933188c370f6d33225ed30c7df9f45c68fc38f8342b84547347af4dbe691fdfa80a4673cff414e9f322ecf38021aff63f47bed448be7f26abbda6f3e0c9051adc3f50888e33f40021e82a08a8df464d183f217920ab0f076b71be1d85319bb6a6cc17642722cd0b7c24f6f4a865d6ab0556ba0d3d1cb25159cf1b6d9287f74ac1a09a811b4f2f39ea3d61ca18c09c68fc3944bc51f3384b615370b0a729d8f16205eaac3a6025f1a55ee37b0400cb6e94100aec5732eb67d3b9a7dd783d0bc4838c95c85254151104061e25c878916047a0ace181b744771dcc78a3d70e268bbed9d9d2be23dea0020cb3cea2e11d3f6ffe2e9d6fd352db69e6dccf11459af45e99a4f307d9e5094c455fde8ca0bca1809d516ef9424350fc81c3263e243eecc8c0fc4e0220611dbdbe7601c18156f1e90d0fe6e8a59aca9d6dc9f9c58ecd9414d22df800abd83a0421eda67429050afad7cc6157af763e99e9e93c9ff36bf345405e69a2f3ccd8ce1544e072309ab1cbc65daf71fccda950eeae0f6f55c71381deda4d9773979657e446a6d67ba7a207d082c13eebad2fb97328dae64b1ba764b1dec5b0216a5a0e3874d810a0085635ceb8f87f9b198ed35360d5797478ac322782af36e62e8eb55cb41505463ae590432e8b302001894a261db07081bc4cc2e43dbcda454e12d7f60b4464546bca4d2ca731254554e7b6d29e9093e84e317e5a6de27c0116b048186357a0fc1d6afc5a3717d8727d01c568922c2df32c74ff070b95be1729c73f359d9bf61f10c7a0623e2a0bf77892404e83ae98efbf14550a53e966307c00457c063616fd381eb25d736daa32ef14241c529bb5c78bc9ef581a435cb4d3f73097c7918080f861c9beeab04b27b75ce15922393b82cab3edf1c9ec5e53f66bac8e375921c02ad7edadbf3bdf5a2f10f9934f2ddeca206beed4cf231e4132ab7196af7ee894652efb6f8d80dacb8e9b97172cc3f20ad3b135e84000b0673bc10161ec883f566ff917f6e1b74c1c818007528681a3735d1e38de429835c72b0ee2d4f567d8773df44926664378fb2ae6f90f9373eff73463e7795a1df4907387341ea7e27f7878b5d4922ec6e7ef6bcb54c07f1f4fa452f9356d4a095bbae5d9e6e93fb496acf112f18a0812822b6183c03a5229984374e80f8b01f6fe537cb3e4f141e5062e95ffd28a930c1080d2475a0c2f2f20625348c95d335cb0f732abd2adff1a8aa5e31c877d1689cfcc36f9722e5c54ac05078b44d13f728129bbad55bef37db0144d962eef458a6e974d41f0d02f68ed660714e8f8edd304ca23080b96b26985e69cda1869174e671b24ed78fbc6985c5f3a3f022628b538ef20badc26dbae29bd21562b02ac8da262d2dd2537e1f2594b88520ce375e90153d423fbcb33aae54a485620a030a20eb06cd898496c77067e768f4281ae4abceb0d6b278adac3c9ac8b1dec17c6a9a783e49d2c864ee2b3f5fa7155974c8e46c7bfd7ce25925c67422710b606bcc1962bd9f9d0e5783ece6e508f7f224d7de51cda2f4ae27f57926ca09b0e9336f67f4b77fc10662b66296cd60b75b59231ae3d6b6a5135cffe11aba067333ae20a7fd8fe4e96d4c2809dc6ed79f85e4d71edb29a94752581af739b89fa25130e2191c2e81f26fac62ff98254356d278f5d18076906b2b5125552c41d75e058720f6af0c269834a1d60589e0eb14542d50601fd875a2fe8c2e8a12c2ef2b38671eacaf8217beadd133e95c0c51b2231823ff48431244462bdb144bda4f5b0f115ed397deda7e711b6efb28b88a27dd02bf39ef4f2c511f99c5d656e61d866280103851a507c1119769ba448f2d51a782cb5518836a518af88def6eae2477fad34296f2cb2939ae6edcfd55513b604dc2c4ce3d78ba6bd34ff914597fd5ac8e60cacc813fc5684fea058ec0fd0b0aa6ed36a37c60b8c371352d889f2bf28a69a9a7069238e8c0eba38ce8dec4f1179a7ad254764db7580214da56c76372a0f75e1a6bb8345409dc9b461bf58146f6664a76f5dcf0b2cce04b673d5503d2c33e9f16e3e571ef2dcdc3b9443fc6272c6d0c9b95ad78b61a2de99d4029bb8408c9af5281bdd92dba380e0e38fff301b4adac207a80449b4124c348419f9d3cfea06f85e8138e755ddeb21c336260ea584a50eadf0d968772836363bb0ea0b764d38902db5446cf8293982f917e01e35d3bd55cd38b3bceb6549257e8e83622d46e7b8ce447fa4f478eb344f50ce0f76f9eb5814c972a1ec4066c201c95404fafa09e3506646bb440b1ecef1d1a2780c0a6af55aa96d39a05c8a94d78129fa44c4c4421f2caf8e3918ec85fc06e1fe66bd67ae58c08f9d73c064d595beee1cbdf623b890f5192d86d10b28714aa0102e548c31ea86d97226d9460e29fcb36881973c480ae9228c0a8d161648cc1dd40d5cf8fe50b148da6b5eeda1f665cee701ac7fad3655f6a69c2368112f8fe4ac0efdf77283a4ff07f21c807b175b00970e26791d064b2e808eed37a9ba827f4e5755e10003c8052fd6e2e9505716aebf6e4654ffc04c95fd890423b4c9e9fbe3e5720071393b07c0794658bc440ef555988f51de922c3cee5989733dda0435e3a70ae2374fc05728dfc33fc0cdaa1edb440815eb943339871cbebc4e5c862fb476ede5955d551141a21b0a53fab2a2cd1e2bb5fd875f98decb317b427314af6afc63079d68fefcc2f089567ec3ab78808b764d3308822786a25a2b43987c069bfd2a490d29c6bd8ffb3d599be03728c5cc915582fe93f4402a9ebd9b6041110c4ea9b91cb9a3e32a1e0c2b68d56a8c55e235a10e6e30ddfed75af6dce9fd4bc7f751e3c47f0e98fd5cd4ae35c0eea4092adc4aff790ae9c8537fa14fd5c8c12ac16d1f15ae2c6c5cf1555fded9a1eba38fc4c6c338f9205e0eb7f1e71b01784bfaf90b0cba5543fdc5fab435c91d71929ae05edcfc4934def06e1b18a28ceab12dd0e9541849d8c766222d76055b4f25e0d4994d65c16f448a8031f0b95e435c4ebdc7e377dc482133a679df5986139f4328025f7c291173c5af8cde1d41580b4ca92e120b796aaac9ac95ad9586b0a0b9fd5b20f6c324c3a798f9794ea1457e8b5783ec3937470abad17aa9126a3a0927a760c1d6c4142a68ae9f33b19401cd8fcaad4bbe0eecb798257ee8eb690a9d9eb660cebf957831b84fd2f42cdbfa8b318315eb219b3e71cd1b441417ad0844b17f80add5b9c9b7052b277648711b21e8a15a09e318c8c9de1cc81baf5e681c13542311e3a2bd26e3211375790dc981258db52c6faa73a6ceb9d8749c8e18adbfb9c33fcb5681001d36d0d398e7e6f92e3f5fe1d7d93bab560ce12460a46b906fd47b31aa7a96582151d84e675a3dedce76b154f9062e4c369c1d2b6c236a6ba244fa45b0cf28542e89a3f2ae0c711764a5f56bfb646c9ff2953e2d18774c347c617a8369d7881b1e0cf716c7065279cb320cb4585fec1430650913612ab878151796b35eaece428aa67e70017045be1530e629ec415523def8600a9ba279a242a92c48c225d882b660bd9d46f36bcc547c8171fca60bd024ebced972f0ba8250678bfaddf1ce1498cde478821725e4cfc97e0917433e154108996a37251b237092016fe29ac0ae280be2629b4d79cd20172ba6d0bb72d4feb36bdc424d47a3b965385e83b324a3d8d51dd07f1e63648bcddf3f521dd8758a8688f7af0dd124295dc029e5e9576c320571b4dea86892415af9a2bbf21b1449eab2ddca8ce70ee0deaff3ce02bade1c7f049711bc9f885902d133277c4261b05a622d4d567f437556d76e70d5bd428172dd6df90289c75d8bf59497e33452791494dbca0511b0497eb0cabc70cdd98f106546f02c9eb33d557c37141bed3d44a368e8b6563f1176562033e58806e053fe752d861a6783002adba755b35c00510a0036c9796901e4e11e8300ed474cf0310efd3f8a8efe2624e7d4fbd41edd2efd85e88a617d5cdbb75b2a023f4d1ae5d1f57286dd9743e9e46bad30e71054e7767b37115a45f6981b4e6fcd8d260c0494689890d949fc0a24f46ab5628495f915d837d68448cd587313bd859e8ae81279752be9a5609461905bf962de4f24351ba12ccd33bd495c9c1058a5483ee58a06ac9edc1a0fa92da2c370077bacc987c2c7b1b5d51c8ad3f7d2ccbb5f714a5d66e67cbbbc70e5964d60dceb9bde99c5fd145007637104674c89889af3656dafc4367d78757eb262c41adfdd17fc011cee10430fb5ebead4a20f264e6d329dfe59969228d39ea01a55474f94eacda5cdafd763b2d615fafb06bbf765c9770b0dee013319af3ab52dc06555f4108772a8ccc4db5a4c4bcbed94165647ca62e50e87563f963695750a7c24bae5ceda0be7d29b1001bcf2d582e33d4827bc692a6052f409d5870e2d5133d8753aba063f29eda2b7583417636e8eb5e79e159adc8f658061608440c44dcbfbf4131404450dd27139bec684d9f5a2397e76adbc123404777835466a9d442d5502e4f4089afd49845ae8daf1ea59c88ec2871984350aa1193ffb76814f92d90d89177a2b4634c05ad1b373fc88524942c24745684c2ece7411153c3f56ccfbc8785f219a1d37039ea6cfa76a694c0506b9a282d6aba168224608e7a7b8737478da697b96698ca46ab40035d06bb4952424a47390a5871e52343350cfd2efde7a718a94642e2c18cd5cd1544a444844fb34222f565bc81eaed2c7e78f3daf611a34fcfeae72578da982def60f98e3fe813421f4d81e5329ff45a006d35af991b39bcb954c0f190125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a010000000000000577000000000000000000004301000109d056e065bae0f1b3484492db483b8f89c02cdcfd8452a3b657a4ce5ce3f23dfeec2cddef3107074bedd0496d418002e1454928bc30ac29c765f6327c370392fd4d0b60230000000000000001552d00a55930afe3a8b85cf39e5eb217884051efca44750b08930e1f2ba4d5793670e366a4c72b0af3b8730f1d4cd85022db82a990272a5e94f13bb6d67f4a5c4bba3e95c67c9708ba4760b45b747ca337b75ea537ced0aadae8e2d709b81ebea64ce4aeeb3ab37516b588ad7647806e086a6b8a7e875f2f701537cabfb8229720f6d6a036783190e4220fc7b01114134cebb383acdc775f24349c2a817e9fab2e6938f0b3e812e9b3a0ac60f2e736bb5a283fac55689b094b792ac81cb6403e40cf11030f14ce3c6b4f1c30a0fb1e6eaa4e9cdc514dd9d3066ed0fb12161c0a40752cdd7adc50523a9e5b9a8f6a93bf2f5b12099b38097acd70d38153746cb82690c743f033c5d730d6dbb778c4637df80289214c018a5f76f072120d1069a03a159b055ccfe6e4a055585c9529c11693710f3a95a160c504fc1123e139fce36f02747c4702b87dfde86f16a871cca6e1461c53410e379ecb70ce7a7a758572926c62911cf7233147c1173f9e39e8d023a408fcd808373b8d6ddacb3c6cce7c27799a16e70d5c2084657ac78e2edbbc3c295423f99b307da3481275d9f3d46f89e27cd3723435e38f241eae19892150b65b872e60b01dcfcd623b3539d644709a50c241a6de68b524b2ebd55c68de38a1a1ec6434e17b70c21aa318bb13d484380786554ee3f1a272d110a719a5d6697f09ab4928473613c012d5a4bf6ff626a58eb32f72f5a5d18be667d679e3bca4bb342147b21f4a6d677afe936952aad5a87e5b04ee9e87a81d9f4f1d6447e174c5c34fea59a7c6e9c27cfc82d35c64d4936bbb09b43ecd012e71ac9a2d5a8c664e3e75231c87999666d277849bf266c5ce021c4139ebf22a306c2136065577b8bf8e4712f1531335b3669ccb733ad4d227d882e4dc90cb16eb5816cab265e53361db386d5b7274c5d46ebb24353c70af2974fb42854196cdc8ce94386e9cba4323d343595eac2862c9f98b400b4962d4e8f4038c1d5a2379b4bb4d284575f51ebedc8e4699a7382da2802ebe8586966a23fab9fc2680458527e5aa12151cd802a2dca28d5da4e1a9d0684e7f3780f65ec33292d9c7c98b5942d230d5242d339b8dc01881910dbcd5bcf58bb607cfaab22b6334fc8a72b7bf3452b5f2805176d243c706dbc1610e87374cf0286061c8149d2873148ce3594e94d581e7b075ad56aea6ceddd63c697404054b605c4b37ddfb825e7bc453df4191dad41322a00c0804960cc7028653d0c6ff623c3699b82e33ef2c91360fabd7b262ffec9df90379840ab96c80dbcbbedca0c4141a2cfbe079b71c45e474e41c7cbff7db43d8cd87a4195629fa6ec85b290ad1f8a9154ab7a17843f652ff9b4396cdeac17b1006cad45c4aba3c07a755be7612021e370e5078e3c769b65cb7646974de0b5330fcdd5a416d74aee5deebb2dfc7e77faf4a2d9e87e40a445ff1883ff5ed21bb8c21e47e6c20d180756638d1ad9e4481df20c7d5d72bb408f07cc8e148bc01ae8a41453200ceee01c3ae127d92c9911bcec71144b229703cb38abc67beee399420626237a0bd43ff6f4d00bbfb300f5e7eb1d1065cca627a272a4cfb8bacc0c676d0101234187f92fb573a175ab2ce66b4730613e5213c0c1c01b230d3b96f2b4a65554f0360d62c6113bbc019c48b51c244fcd46780003b4e6bcb74664239b199bf984457d5503a2bb065ac85e97b2868e8f1b15c63cf204bae49237dea4b5bc872fa3b56125904ebec0007c5580e2960acd6dd849514795bdcfe9f2522c5303da2a4f28af9d3cf6d6111a12bd9d7a8fc14a1f1e5d23c15ab4905498263461d6109aef96a2757a3e859c28ddc018cca849e2fe3b83e615baa9243ef0573bc1ecf5079824ba5a8689620629558298502282ddbb0beded382ac29c38cd597c8730f81c4f4037db31e228301bb7a5219f607da8e4a7037071a2cb910e70c8f53a1f319934412b1da9756e4d56c8280ca1d5da78f70b7612d72b982fa59f22d54c067367a18b8c7ed346acde803cf3b7ef9a7f10428ab0aedb2ff88441ab4ebdc860921fa9d4da97414a8056ee56ad17b39f41428fd06a6c4568d060ac9c9bbdf93b6f25c29228796284bd8c66c0f7b71566340045a9d35722426face4ead0d3132103e5a5ee87c512b3523f06a5dd78bf6eafa6615897a882b71a9918daec50a8b6cc7d862c1cc6d93ec0d4b2b09e6be6de65a4cce1b3f8ccc8becec3f244393b9c4f710056b85e530d9f603b27b170374c4c52bb49c7e06e971f357aa65f25b9d940998cd55327fe94447db6cf5634d95078bd9e9fbb0d9e050c502102095d45dd0f6db603dfe20bc629cc0ced7c078e8d68e35d098d30404bb134dde3979449bbbb1766a4ada53585e47be1c2ba6112d4d831456d0ec63ee538df68df4d50c17748f8d5378aba25ae285850f2daf711d035890c97d38e99d4483f39dc66257f08585bdc03343bcb17eb37ed8b660ccb58b408329b4fa0005d2073c0bd22540fd63f537512b9aac864dff5b38c65c1ebb2c024f1066e1aea0a45cb841853550fcb2fce3c57440a9f3afddeac4bade5677aac8b0482b5b734f5fc6c92beebae4fb18a6866094b93daf6f45815e8d93a54aafd585b93f1449f3fe71bc52d06fafa0209b78cb756a96e7b4a7d11090822cd5c02922b91351892855bf746e3fb88b9f2c023f8c52be3be9570bf29089dba91f56a5dbd7dd10facffb5ac653dfd32156124c71bb29afea2af494c175ac023a7f3e1022f36c634ee34976877ba6ffc0989a66b6859812a08b2d92329bbe2683b00ade513764a1c85659f47a94979c3403d829dd19be17f9c77eeddce34e82ed649b610d17b8ed37c6a4e482bf28f22e53b377571ec7a97142d801a8985c53c92f649b9e408fe96b5d85ca612f9ab45e2be9e4029b4e4b2998b4823341ef50d045cca95f8fa3eb13e8be4e234d2e3c6b5b7f8012229f77fea4aa8bbc4dfd7367da2fe6612fe1f340ff835b6d25696c1db5c8a3a0a2ccd6716c0af73708c71747dcde2b3427fc686afce724ea78d3da3730812c57d80ade75a0ee7919ba068b4bf47534983cb94b859d9e0268da6a0716aad218930a2b8262666c346a8cff24d2972617d1ef52d73dc928c3f97e3875076b3d70dd9576e4e923417042052c39d6a7f0df3aaee11af119a6440eae3d029bab4f781bfcc11389028e5fadf90de1708cc9e4975986014b95ead7ddfea867c4c3e123920f99b0d5f01feb65c0e97c21c6d6d0e9fa0dbc963fcb0d82ed2521070bca6df41bc343a9457d1a58863cc57a92616d4b93ffdc1615ce01f50717ee0bebc02cb731b6d4c59170d6ab919e48867e695a2b2ceb0a323f26f336c9c666e989a40665bd3f74d6a5b683a0133cae733abc44cbdcea7c088d03c1689e573a7f531c270b1231476a5b438230f3dd701c3d16f9cd49554087471624a4dd701e31ec06ea91c03b1941839ddd56c767c77628af5fd633a7692acc0d92e906ef95b5c73e01b4621e4fdf214a6485e20a15b5cfeac823ef576167d09637262b3c658041963064a72064b98385b7146d93db21bd68dafb09010892d61a108a11546d1693e6a3c41d559ce3d38eb39f1ea2424c733d58dff19a82689b6a97eba76343f8b883006aa3658d686555e23142339b3d766dcf4b98b364293b3465c8baa364fd7c8fbf96ec41b9e0e1ed9e1bfc7266ee9106245f99f4f163dcb503a23d73889d4091cef9d3f73bb21ae0b72beebc19fe69b317c5574e297220386be3d8785860c295954a53457e1ae7cb856efa82d51025d6ad89c2b02b8f1c8ba149e1dbd3440c4e879e979ef2f6787695f45d322e6a472fed998be344d99f0c6287772e5a0fe3a1b3ad6b633f74017b887b7e71be89d625d3840946ac2aba4f9d1377657df50096877c415d5eb6eefcd971a897201b3254cffe26379b89148792e51f74594adda09bbd76fad403fc649f9f4be465edcf20768742d35a703279ba845aab3075112ad5d48d80d2b6cbd451ef5b94c4866d8bd39340b72cef56053d33576f5f1733af62db1f0371d0aa91297d94c0fb2d9a39c6e824a31d00000000';
const walletUtxoList = [
{
bip32Path: 'm/44\'/1776\'/218\'/0/0',
txid: '4aa201f333e80b8f62ba5b593edb47b4730212e2917b21279f389ba1c14588a3',
vout: 0,
// amount: BigInt(100000000000),
valueCommitment: '08b760fd74cae28eaa41126b3c1129b2d708d893e17b4e61bd9d5a5b12a1c7643b',
redeemScript: '',
pubkey: '03a6f9bfb75ef976308fe1996a26187fcb4b0aa3c2d506f7b6b44d0065cca98c80',
descriptor: '',
},
];
const authorizationSignature = '304502210087ec8ed5b5c36151fef5fe02a086d6bdff795a57e8c19eb9e2be83b0dc0373d602206d9f368bcbb6cb46cbee191e0b64af7762c5c8d8eca65723b03b64b3e703d194';
try {
const ledgerLib = new LedgerLiquidWrapper(networkType);
let result: GetSignatureAddressResponse = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
signatureList: [],
};
try {
let connRet: ResponseInfo = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
};
let count = 0;
const accessingError = 0x9999;
const countLimit = 300;
do {
do {
if (connRet.errorCode == accessingError) {
await sleep(1000);
++count;
}
connRet = await ledgerLib.connect(0, undefined);
// console.log(connRet);
} while ((connRet.errorCode == accessingError) && (count < countLimit));
result.success = connRet.success;
result.errorCode = connRet.errorCode;
result.errorCodeHex = connRet.errorCodeHex;
result.disconnect = connRet.disconnect;
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
// clear
count = 0;
if (debugMode) {
isDumpSignature = true;
setTimeout(async () => {
await dumpSignatureProgress(ledgerLib);
}, 500);
}
const pubkeyInfo1 = await ledgerLib.getWalletPublicKey(
walletUtxoList[0].bip32Path);
if (!pubkeyInfo1.success) {
console.log('getWalletPublicKey failed. ', pubkeyInfo1);
} else {
walletUtxoList[0].pubkey = pubkeyInfo1.publicKey;
}
const calcInfo = ledgerLib.calcSignatureProgress(
proposalTx, walletUtxoList);
if (calcInfo.success) {
console.log(`sign utxo count = ${calcInfo.analyzeUtxo.total}`);
console.log(`tx in/out/issuance count = ${calcInfo.inputTx.total}`);
} else {
console.log('calcSignatureProgress:', calcInfo);
}
do {
if (result.errorCode == accessingError) {
await sleep(1000);
++count;
}
result = await ledgerLib.getSignature(
proposalTx, walletUtxoList, authorizationSignature);
// console.log(result);
} while ((result.errorCode == accessingError) && (count < countLimit));
// Retry connection on disconnect
} while (result.disconnect);
await ledgerLib.disconnect();
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
} catch (e) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
const signatureResult = result;
console.log('signatureResult:', JSON.stringify(signatureResult, (key, value) =>
typeof value === 'bigint' ? value.toString() : value, ' '));
isDumpSignature = false;
} catch (e) {
console.log(e);
}
}
async function execPegoutTest2() {
const proposalTx = '020000000101854b02c68f24ba640251b17f98c1230bb263ea781331eadcdac1cc32c2d4bf890000004000ffffffff030125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a010000000000079b440016001475f7cda67f3f421152d438573282f16e1ec394660125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a0100000000000001f400000125b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a0100038d7ea4bee2c8009e6a2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f17a914a722b257cabc3b8e7d46f8fb293f893f368219da872103700dcb030588ed828d85f645b48971de0d31e8c0244da46710d18681627f5a4a4101044e949dcf8ac2daac82a3e4999ee28e2711661793570c4daab34cd38d76a425d6bfe102f3fea8be12109925fad32c78b65afea4de1d17a826e7375d0e2d00660000000000000006080080c6a47e8d03002025b251070e29ca19043cf33ccd7324e2ddab03ecc4ae0b5e77c4fc0e5cf6c95a2006226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f160014ac15c9bd0ed1641999c41fef64fb3c9ff48ce29dc002000000000101424aeb8cd9e48964d693f0395d4c228064de9c878b0c758f4db3d5c0b33059980100000000ffffffff010080c6a47e8d030017a91472c44f957fc011d97e3406667dca5b1c930c4026870247304402206ad339157f0eacb080eb4f956253582adab6c6381a314d6f2a7b9d22aa10f21c0220422c64d1a4f7f1d70b409a4482bb9fa07aa206a8110eed7794f91f91430fd9d6012103a075171877c4e93df48a3f9a078b12863e1053c3f62315abe7b8f23333c1c108000000009700000020fe3b574c1ce6d5cb68fc518e86f7976e599fafc0a2e5754aace7ca16d97a7c78ef9325b8d4f0a4921e060fc5e71435f46a18fa339688142cd4b028c8488c9f8dd1495b5dffff7f200200000002000000024a180a6822abffc3b1080c49016899c6dac25083936df14af12f58db11958ef27926299350fdc2f4d0da1d4f0fbbd3789d29f9dc016358ae42463c0cebf393f30105000000000000';
const walletUtxoList = [
{
bip32Path: 'm/44\'/1776\'/218\'/0/0',
txid: '89bfd4c232ccc1dadcea311378ea63b20b23c1987fb1510264ba248fc6024b85',
vout: 0,
amount: BigInt(1000000000000000),
// valueCommitment: '08b760fd74cae28eaa41126b3c1129b2d708d893e17b4e61bd9d5a5b12a1c7643b',
redeemScript: '',
pubkey: '038c13c1aba918dfaaa94bceba7c60cfc237fb7a4c43925bc0d0849f3600690c4f',
descriptor: '',
},
];
const authorizationSignature = '304402205e1a6b3dbb17faa3b570ca8715f3fecf49bfb44ff7642301eca25e3447857b97022076eddc00822b2075af1c24d88af46aa609c7d208c35152bbb2d077f84f6d054f';
try {
const ledgerLib = new LedgerLiquidWrapper(networkType);
let result: GetSignatureAddressResponse = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
signatureList: [],
};
try {
let connRet: ResponseInfo = {
success: false,
errorCode: 0,
errorCodeHex: '',
errorMessage: '',
disconnect: false,
};
let count = 0;
const accessingError = 0x9999;
const countLimit = 300;
do {
do {
if (connRet.errorCode == accessingError) {
await sleep(1000);
++count;
}
connRet = await ledgerLib.connect(0, undefined);
// console.log(connRet);
} while ((connRet.errorCode == accessingError) && (count < countLimit));
result.success = connRet.success;
result.errorCode = connRet.errorCode;
result.errorCodeHex = connRet.errorCodeHex;
result.disconnect = connRet.disconnect;
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
// clear
count = 0;
if (debugMode) {
isDumpSignature = true;
setTimeout(async () => {
await dumpSignatureProgress(ledgerLib);
}, 500);
}
const pubkeyInfo1 = await ledgerLib.getWalletPublicKey(
walletUtxoList[0].bip32Path);
if (!pubkeyInfo1.success) {
console.log('getWalletPublicKey failed. ', pubkeyInfo1);
} else {
walletUtxoList[0].pubkey = pubkeyInfo1.publicKey;
}
const calcInfo = ledgerLib.calcSignatureProgress(
proposalTx, walletUtxoList);
if (calcInfo.success) {
console.log(`sign utxo count = ${calcInfo.analyzeUtxo.total}`);
console.log(`tx in/out/issuance count = ${calcInfo.inputTx.total}`);
} else {
console.log('calcSignatureProgress:', calcInfo);
}
do {
if (result.errorCode == accessingError) {
await sleep(1000);
++count;
}
result = await ledgerLib.getSignature(
proposalTx, walletUtxoList, authorizationSignature);
// console.log(result);
} while ((result.errorCode == accessingError) && (count < countLimit));
// Retry connection on disconnect
} while (result.disconnect);
await ledgerLib.disconnect();
if (!result.success) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
} catch (e) {
throw new Error(`getSignature ecode=${result.errorCodeHex} msg=${result.errorMessage}`);
}
const signatureResult = result;
console.log('signatureResult:', JSON.stringify(signatureResult, (key, value) =>
typeof value === 'bigint' ? value.toString() : value, ' '));
isDumpSignature = false;
} catch (e) {
console.log(e);
}
}
if (setAuthorization) {
setAuthKeyTest();
} else if (dumpPubkeyMode) {
execBip32PathTest();
} else if (connectionTest) {
execConnectionTest();
} else if (peginTest) {
execPeginTest();
} else if (pegoutTest) {
execPegoutTest();
} else if (pegoutTest2) {
execPegoutTest2();
} else {
execFixedTest();
}