@layerzerolabs/layerzero-v2-ton 3.0.19-ton.1 → 3.0.21-ton.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/AllStorages.compiled.json +1 -1
- package/build/AllStorages.test.compiled.json +1 -1
- package/build/BaseContract.test.compiled.json +1 -1
- package/build/Channel.compiled.json +1 -1
- package/build/Channel.permissions.test.compiled.json +1 -1
- package/build/ChannelBurn.test.compiled.json +1 -1
- package/build/ChannelCommitPacket.test.compiled.json +1 -1
- package/build/ChannelConfig.test.compiled.json +1 -1
- package/build/ChannelInitialize.test.compiled.json +1 -1
- package/build/ChannelMsglibIntegration.test.compiled.json +1 -1
- package/build/ChannelMsglibSendCallback.test.compiled.json +1 -1
- package/build/ChannelNilify.test.compiled.json +1 -1
- package/build/ChannelReceive.test.compiled.json +1 -1
- package/build/ChannelReceiveCallback.test.compiled.json +1 -1
- package/build/ChannelReceiveView.test.compiled.json +1 -1
- package/build/ChannelSend.test.compiled.json +1 -1
- package/build/Classlib.test.compiled.json +1 -1
- package/build/ComputeDataSizeGas.test.compiled.json +1 -1
- package/build/Connection.compiled.json +1 -1
- package/build/Controller.assertions.test.compiled.json +1 -1
- package/build/Controller.compiled.json +1 -1
- package/build/Controller.permissions.test.compiled.json +1 -1
- package/build/Controller.test.compiled.json +1 -1
- package/build/Counter.compiled.json +1 -1
- package/build/Counter.permissions.test.compiled.json +1 -1
- package/build/Counter.setters.test.compiled.json +1 -1
- package/build/Counter.test.compiled.json +1 -1
- package/build/Dvn.compiled.json +1 -1
- package/build/Dvn.test.compiled.json +1 -1
- package/build/DvnFeeLib.compiled.json +1 -1
- package/build/DvnPermissions.test.compiled.json +1 -1
- package/build/Endpoint.compiled.json +1 -1
- package/build/Endpoint.permissions.test.compiled.json +1 -1
- package/build/Endpoint.test.compiled.json +1 -1
- package/build/EndpointSetEpConfigDefaults.test.compiled.json +1 -1
- package/build/Executor.compiled.json +1 -1
- package/build/Executor.test.compiled.json +1 -1
- package/build/ExecutorFeeLib.compiled.json +1 -1
- package/build/ExecutorPermissions.test.compiled.json +1 -1
- package/build/LzClasses.test.compiled.json +1 -1
- package/build/LzUtil.test.compiled.json +1 -1
- package/build/MsgData.test.compiled.json +1 -1
- package/build/MsglibPacketCodec.test.compiled.json +1 -1
- package/build/PipelinedOutOfOrder.test.compiled.json +1 -1
- package/build/PriceFeedCache.compiled.json +1 -1
- package/build/PriceFeedCache.test.compiled.json +1 -1
- package/build/Proxy.compiled.json +1 -1
- package/build/Proxy.permissions.test.compiled.json +1 -1
- package/build/Proxy.test.compiled.json +1 -1
- package/build/SmlConnection.compiled.json +1 -1
- package/build/SmlConnection.permissions.test.compiled.json +1 -1
- package/build/SmlConnection.test.compiled.json +1 -1
- package/build/SmlManager.compiled.json +1 -1
- package/build/SmlManager.permissions.test.compiled.json +1 -1
- package/build/SmlManager.test.compiled.json +1 -1
- package/build/Uln.compiled.json +1 -1
- package/build/Uln.test.compiled.json +1 -1
- package/build/UlnConnection.compiled.json +1 -1
- package/build/UlnConnection.test.compiled.json +1 -1
- package/build/UlnConnectionPermissions.test.compiled.json +1 -1
- package/build/UlnManagement.test.compiled.json +1 -1
- package/build/UlnManager.compiled.json +1 -1
- package/build/UlnManager.test.compiled.json +1 -1
- package/build/UlnManagerPermissions.test.compiled.json +1 -1
- package/build/UlnManagerUtil.test.compiled.json +1 -1
- package/build/UlnPermissions.test.compiled.json +1 -1
- package/build/UlnReceiveConfig.test.compiled.json +1 -1
- package/build/UlnSend.test.compiled.json +1 -1
- package/build/UlnSendConfig.test.compiled.json +1 -1
- package/build/UlnSendWithDvnFeeLib.test.compiled.json +1 -1
- package/build/UlnSendWithExecFeeLib.test.compiled.json +1 -1
- package/build/UlnSendWorkerFactory.test.compiled.json +1 -1
- package/build/UlnUtil.test.compiled.json +1 -1
- package/build/WorkerCore.test.compiled.json +1 -1
- package/build/badFeeLib1.test.compiled.json +1 -1
- package/build/badFeeLib10.test.compiled.json +1 -1
- package/build/badFeeLib11.test.compiled.json +1 -1
- package/build/badFeeLib12.test.compiled.json +1 -1
- package/build/badFeeLib2.test.compiled.json +1 -1
- package/build/badFeeLib3.test.compiled.json +1 -1
- package/build/badFeeLib4.test.compiled.json +1 -1
- package/build/badFeeLib5.test.compiled.json +1 -1
- package/build/badFeeLib6.test.compiled.json +1 -1
- package/build/badFeeLib7.test.compiled.json +1 -1
- package/build/badFeeLib8.test.compiled.json +1 -1
- package/build/badFeeLib9.test.compiled.json +1 -1
- package/package.json +2 -2
- package/src/classes/lz/EpConfig.fc +1 -1
- package/src/funC++/actions/call.fc +2 -2
- package/src/funC++/actions/deploy.fc +2 -2
- package/src/funC++/actions/destroy.fc +1 -1
- package/src/funC++/actions/dispatch.fc +2 -2
- package/src/funC++/actions/event.fc +10 -4
- package/src/funC++/actions/payment.fc +2 -2
- package/src/funC++/actions/sendJettons.fc +2 -2
- package/src/funC++/classlib.fc +5 -1
- package/src/funC++/constants.fc +2 -2
- package/src/funC++/dataStructures/AddressList.fc +2 -1
- package/src/protocol/channel/handler.fc +26 -4
- package/src/protocol/channel/interface.fc +1 -0
- package/src/protocol/core/abstract/protocolHandler.fc +1 -1
- package/src/protocol/endpoint/interface.fc +8 -8
- package/src/protocol/msglibs/ultralightnode/feeLibInterface.fc +2 -2
- package/src/protocol/msglibs/ultralightnode/msgdata/Attestation.fc +4 -4
- package/src/protocol/msglibs/ultralightnode/msgdata/UlnReceiveConfig.fc +13 -13
- package/src/protocol/msglibs/ultralightnode/ulnConnection/utils.fc +2 -10
- package/src/workers/core/abstract/workerHandler.fc +1 -1
- package/CHANGELOG.md +0 -13
- package/build/PriceFeedCache.permissions.test.compiled.json +0 -1
|
@@ -20,7 +20,7 @@ const int action::deploy::md = 5;
|
|
|
20
20
|
const int action::deploy::outflowNanos = 6;
|
|
21
21
|
|
|
22
22
|
;; @terminal
|
|
23
|
-
tuple action::deploy::
|
|
23
|
+
tuple action::deploy::create(
|
|
24
24
|
cell code,
|
|
25
25
|
cell $storage,
|
|
26
26
|
int donationNanos,
|
|
@@ -61,7 +61,7 @@ tuple _newAction<deployAndCall>(
|
|
|
61
61
|
cell $md,
|
|
62
62
|
int outflowNanos
|
|
63
63
|
) inline {
|
|
64
|
-
return action::deploy::
|
|
64
|
+
return action::deploy::create(
|
|
65
65
|
code,
|
|
66
66
|
$storage,
|
|
67
67
|
donationNanos,
|
|
@@ -7,7 +7,7 @@ const int action::destroy::opcode = 2;
|
|
|
7
7
|
const int action::destroy::md = 3;
|
|
8
8
|
|
|
9
9
|
;; @terminal
|
|
10
|
-
tuple action::destroy::
|
|
10
|
+
tuple action::destroy::create(int to, int opcode, cell $md) inline {
|
|
11
11
|
return unsafeTuple([action::destroy::NAME, to, opcode, $md]);
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -12,7 +12,7 @@ const int action::dispatch::gasNanos = 4;
|
|
|
12
12
|
;; Call a method on the contract at address `to` with the given message data `md`
|
|
13
13
|
;; optionally provide value provisioned from this contract's balance
|
|
14
14
|
;; @terminal
|
|
15
|
-
tuple action::dispatch::
|
|
15
|
+
tuple action::dispatch::create(int to, int opcode, cell $md, int gasNanos) inline {
|
|
16
16
|
return unsafeTuple([action::dispatch::NAME, to, opcode, $md, gasNanos]);
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -32,7 +32,7 @@ int action::dispatch::equals(tuple self, tuple other) {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
tuple _newAction<dispatch>(int to, int opcode, cell $body, int gasNanos) inline {
|
|
35
|
-
return action::dispatch::
|
|
35
|
+
return action::dispatch::create(to, opcode, $body, gasNanos);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
;; overloaded when you want to pass 0 outflowNanos
|
|
@@ -15,8 +15,8 @@ int _getEventSink() impure inline;
|
|
|
15
15
|
;; @info Events in LZ contracts are internal messages to an event sink
|
|
16
16
|
;; where the resulting transaction always reverts
|
|
17
17
|
;; @non-terminal
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
cell action::event::New(int topic, cell $body, cell $initialStorage) inline method_id {
|
|
19
|
+
return cl::declare(
|
|
20
20
|
action::event::NAME,
|
|
21
21
|
unsafeTuple([
|
|
22
22
|
[cl::t::uint256, topic],
|
|
@@ -24,7 +24,13 @@ tuple action::event::New(int topic, cell $body, cell $initialStorage) inline met
|
|
|
24
24
|
[cl::t::objRef, $initialStorage]
|
|
25
25
|
])
|
|
26
26
|
);
|
|
27
|
-
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
tuple action::event::create(int topic, cell $body, cell $initialStorage) inline {
|
|
30
|
+
return unsafeTuple([
|
|
31
|
+
action::event::NAME,
|
|
32
|
+
action::event::New(topic, $body, $initialStorage)
|
|
33
|
+
]);
|
|
28
34
|
}
|
|
29
35
|
|
|
30
36
|
;; returns true if equals
|
|
@@ -42,7 +48,7 @@ int action::event::equals(tuple self, tuple other) {
|
|
|
42
48
|
|
|
43
49
|
;; interface this function because it requires passing the 'getInitialStorage' from the baseHandler
|
|
44
50
|
;; tuple _newAction<event>(int topic, cell $body) impure inline {
|
|
45
|
-
;; return action::event::
|
|
51
|
+
;; return action::event::create(topic, $body, getInitialStorage());
|
|
46
52
|
;; }
|
|
47
53
|
|
|
48
54
|
tuple _newAction<event>(int topic, cell $body) impure inline;
|
|
@@ -10,7 +10,7 @@ const int action::payment::amount = 2;
|
|
|
10
10
|
const int action::payment::outflowNanos = 3;
|
|
11
11
|
|
|
12
12
|
;; @non-terminal
|
|
13
|
-
tuple action::payment::
|
|
13
|
+
tuple action::payment::create(int toAddress, int amount, int outflowNanos) inline {
|
|
14
14
|
return unsafeTuple([action::payment::NAME, toAddress, amount, outflowNanos]);
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -25,7 +25,7 @@ int action::payment::equals(tuple self, tuple other) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
tuple _newAction<payment>(int toAddress, int amount, int outflowNanos) inline {
|
|
28
|
-
return action::payment::
|
|
28
|
+
return action::payment::create(toAddress, amount, outflowNanos);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
(tuple, ()) ~pushAction<payment>(tuple actions, int toAddress, int amount, int outflowNanos) inline {
|
|
@@ -20,7 +20,7 @@ const int Jetton::OP::TRANSFER_NOTIFICATION = 0x7362d09c;
|
|
|
20
20
|
const int Jetton::OP::TRANSFER = 0xf8a7ea5;
|
|
21
21
|
|
|
22
22
|
;; @terminal
|
|
23
|
-
tuple action::sendJettons::
|
|
23
|
+
tuple action::sendJettons::create(int walletAddress, int toAddress, int amount, int responseAddress) inline {
|
|
24
24
|
return unsafeTuple([action::sendJettons::NAME, walletAddress, toAddress, amount, responseAddress]);
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -36,7 +36,7 @@ int action::sendJettons::equals(tuple self, tuple other) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
tuple _newAction<sendJettons>(int walletAddress, int toAddress, int amount, int responseAddress) inline {
|
|
39
|
-
return action::sendJettons::
|
|
39
|
+
return action::sendJettons::create(walletAddress, toAddress, amount, responseAddress);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
(tuple, ()) ~pushAction<sendJettons>(
|
package/src/funC++/classlib.fc
CHANGED
|
@@ -589,7 +589,11 @@ cell cl::dict256::New() inline {
|
|
|
589
589
|
if (dict.cell_is_empty()) {
|
|
590
590
|
return (empty_cell(), false);
|
|
591
591
|
}
|
|
592
|
-
|
|
592
|
+
(cell ret, int exists) = dict.udict_get_ref?(DICT256_KEYLEN, key);
|
|
593
|
+
ifnot (exists) {
|
|
594
|
+
return (empty_cell(), false);
|
|
595
|
+
}
|
|
596
|
+
return (ret, true);
|
|
593
597
|
}
|
|
594
598
|
|
|
595
599
|
cell cl::dict256::setRef(cell dict, int key, cell val) inline method_id {
|
package/src/funC++/constants.fc
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const int ERRORCODE_MASK = 0x7ff;
|
|
2
|
-
const int CLASSLIB::ERROR::INVALID_FIELD_TYPE =
|
|
3
|
-
const int CLASSLIB::ERROR::WRONG_ORDER_CONSTRUCTOR =
|
|
2
|
+
const int CLASSLIB::ERROR::INVALID_FIELD_TYPE = 1059;
|
|
3
|
+
const int CLASSLIB::ERROR::WRONG_ORDER_CONSTRUCTOR = 1060;
|
|
4
4
|
|
|
5
5
|
const int MAX_U8 = 0xFF;
|
|
6
6
|
const int MAX_U16 = 0xFFFF;
|
|
@@ -44,7 +44,8 @@ int AddressList::isValid(cell addressList, int maxCount) {
|
|
|
44
44
|
int count = 0;
|
|
45
45
|
while (addressListSlice.slice_empty?() == false) {
|
|
46
46
|
(int bits, int refs) = addressListSlice.slice_bits_refs();
|
|
47
|
-
|
|
47
|
+
;; todo: more test coverage
|
|
48
|
+
if ((refs > 1) | ((bits % 256) != 0)) {
|
|
48
49
|
return false;
|
|
49
50
|
}
|
|
50
51
|
repeat (bits / 256) {
|
|
@@ -306,8 +306,9 @@ tuple channelSend(cell $mdObj) impure inline method_id {
|
|
|
306
306
|
cell $epConfigOApp = $storage.cl::get<objRef>(Channel::epConfigOApp);
|
|
307
307
|
int sendMsglib = $epConfigOApp.cl::get<address>(lz::EpConfig::sendMsglib);
|
|
308
308
|
int sendMsglibConnection = $epConfigOApp.cl::get<address>(lz::EpConfig::sendMsglibConnection);
|
|
309
|
+
cell $sendPath = $storage.cl::get<objRef>(Channel::path);
|
|
309
310
|
|
|
310
|
-
if ($epConfigOApp.cl::get<bool>(lz::EpConfig::
|
|
311
|
+
if ($epConfigOApp.cl::get<bool>(lz::EpConfig::isNull)) {
|
|
311
312
|
cell $defaultSendEpConfig = $mdObj.cl::get<objRef>(md::MdObj::obj);
|
|
312
313
|
|
|
313
314
|
sendMsglib = $defaultSendEpConfig.cl::get<address>(lz::SendEpConfig::sendMsglibAddress);
|
|
@@ -316,6 +317,23 @@ tuple channelSend(cell $mdObj) impure inline method_id {
|
|
|
316
317
|
.cl::get<address>(lz::SendEpConfig::sendMsglibConnectionAddress);
|
|
317
318
|
}
|
|
318
319
|
|
|
320
|
+
if ((sendMsglib == NULLADDRESS) | (sendMsglibConnection == NULLADDRESS)) {
|
|
321
|
+
actions~pushAction<call>(
|
|
322
|
+
$sendPath.cl::get<address>(lz::Path::srcOApp),
|
|
323
|
+
Layerzero::OP::CHANNEL_SEND_CALLBACK,
|
|
324
|
+
md::MdObj::New(
|
|
325
|
+
md::MessagingReceipt::New(
|
|
326
|
+
$lzSend,
|
|
327
|
+
0,
|
|
328
|
+
0,
|
|
329
|
+
Channel::ERROR::MsglibBlocked
|
|
330
|
+
),
|
|
331
|
+
getInitialStorage()
|
|
332
|
+
)
|
|
333
|
+
);
|
|
334
|
+
return actions;
|
|
335
|
+
}
|
|
336
|
+
|
|
319
337
|
;; Each send request is assigned a unique request ID, which is also used as the key into
|
|
320
338
|
;; the sendRequestQueue
|
|
321
339
|
int curRequestId = $storage.cl::get<uint64>(Channel::lastSendRequestId) + 1;
|
|
@@ -378,7 +396,11 @@ tuple msglibSendCallback(cell $mdAddress) impure inline method_id {
|
|
|
378
396
|
|
|
379
397
|
;; Read the requestId from the sendRequestQueue to ensure this send request is genuine
|
|
380
398
|
;; and is not being double-executed
|
|
381
|
-
(_, cell contents, _, int exists) = DeterministicInsertionCircularQueue::get(
|
|
399
|
+
(_, cell contents, _, int exists) = DeterministicInsertionCircularQueue::get(
|
|
400
|
+
sendRequestQueue,
|
|
401
|
+
requestId
|
|
402
|
+
);
|
|
403
|
+
|
|
382
404
|
if (exists) {
|
|
383
405
|
if (_readSendRequestQueueEntry(contents) == $lzSend.cl::hash()) {
|
|
384
406
|
$storage = $storage.cl::set(
|
|
@@ -548,7 +570,7 @@ tuple channelCommitPacket(cell $mdExtended) impure inline method_id {
|
|
|
548
570
|
lz::EpConfig::receiveMsglibConnection
|
|
549
571
|
);
|
|
550
572
|
|
|
551
|
-
int useDefaults = $epConfigOApp.cl::get<bool>(lz::EpConfig::
|
|
573
|
+
int useDefaults = $epConfigOApp.cl::get<bool>(lz::EpConfig::isNull);
|
|
552
574
|
|
|
553
575
|
if (useDefaults) {
|
|
554
576
|
cell $defaultConfig = $mdExtended.cl::get<objRef>(md::MdObj::obj);
|
|
@@ -796,7 +818,7 @@ tuple lzReceiveExecuteCallback(cell $lzReceiveStatus) impure inline method_id {
|
|
|
796
818
|
md::ExtendedMd::New(
|
|
797
819
|
$mockPacket,
|
|
798
820
|
$mockEpConfigDefaults, ;; this is completely ignored if useDefaults is false
|
|
799
|
-
$epConfigOApp.cl::get<bool>(lz::EpConfig::
|
|
821
|
+
$epConfigOApp.cl::get<bool>(lz::EpConfig::isNull)
|
|
800
822
|
? $mockEpConfigDefaults.cl::get<address>(lz::EpConfig::receiveMsglibConnection)
|
|
801
823
|
: $epConfigOApp.cl::get<address>(lz::EpConfig::receiveMsglibConnection)
|
|
802
824
|
)
|
|
@@ -43,6 +43,7 @@ const int Channel::ERROR::notCommittable = 140;
|
|
|
43
43
|
const int Channel::ERROR::notExecutable = 141;
|
|
44
44
|
const int Channel::ERROR::notExecuting = 142;
|
|
45
45
|
const int Channel::ERROR::wrongPath = 143;
|
|
46
|
+
const int Channel::ERROR::MsglibBlocked = 144;
|
|
46
47
|
const int Channel::NO_ERROR = 0;
|
|
47
48
|
|
|
48
49
|
;; States for view function and packet executability management
|
|
@@ -106,5 +106,5 @@ tuple initialize(cell $md) impure inline {
|
|
|
106
106
|
;; declared inside of the actions/event.fc
|
|
107
107
|
;; We declare it here because it saves the need for declaring initialStorage everytime we call event
|
|
108
108
|
tuple _newAction<event>(int topic, cell $body) impure inline {
|
|
109
|
-
return action::event::
|
|
109
|
+
return action::event::create(topic, $body, getInitialStorage());
|
|
110
110
|
}
|
|
@@ -10,11 +10,11 @@ const int Endpoint::OP::GET_MSGLIB_INFO_CALLBACK = "Endpoint::OP::GET_MSGLIB_INF
|
|
|
10
10
|
const int Endpoint::event::EP_CONFIG_DEFAULTS_SET = "EP_CONFIG_DEFAULTS_SET"u;
|
|
11
11
|
|
|
12
12
|
;; ERRORS
|
|
13
|
-
const int Endpoint::ERROR::notOApp =
|
|
14
|
-
const int Endpoint::ERROR::wrongPath =
|
|
15
|
-
const int Endpoint::ERROR::unauthorizedMsglib =
|
|
16
|
-
const int Endpoint::ERROR::invalidExpiry =
|
|
17
|
-
const int Endpoint::ERROR::unresolvedMsglib =
|
|
18
|
-
const int Endpoint::ERROR::msglibInfoExists =
|
|
19
|
-
const int Endpoint::ERROR::numMsglibsExceeded =
|
|
20
|
-
const int Endpoint::ERROR::sameTimeoutAndReceive =
|
|
13
|
+
const int Endpoint::ERROR::notOApp = 300;
|
|
14
|
+
const int Endpoint::ERROR::wrongPath = 301;
|
|
15
|
+
const int Endpoint::ERROR::unauthorizedMsglib = 302;
|
|
16
|
+
const int Endpoint::ERROR::invalidExpiry = 303;
|
|
17
|
+
const int Endpoint::ERROR::unresolvedMsglib = 304;
|
|
18
|
+
const int Endpoint::ERROR::msglibInfoExists = 305;
|
|
19
|
+
const int Endpoint::ERROR::numMsglibsExceeded = 306;
|
|
20
|
+
const int Endpoint::ERROR::sameTimeoutAndReceive = 307;
|
|
@@ -6,5 +6,5 @@ const int UlnWorkerInterface::quote = 107686; ;; ulnWorker::quote
|
|
|
6
6
|
;; tuple ulnWorker::setConfig(cell $storage, cell $md) method_id;
|
|
7
7
|
const int UlnWorkerInterface::setConfig = 95983; ;; ulnWorker::setConfig
|
|
8
8
|
|
|
9
|
-
const int UlnWorkerInterface::ERROR::UNKNOWN_OPTIONS =
|
|
10
|
-
const int UlnWorkerInterface::ERROR::ZERO_LZ_COMPOSE_GAS_PROVIDED =
|
|
9
|
+
const int UlnWorkerInterface::ERROR::UNKNOWN_OPTIONS = 2100;
|
|
10
|
+
const int UlnWorkerInterface::ERROR::ZERO_LZ_COMPOSE_GAS_PROVIDED = 2101;
|
|
@@ -7,8 +7,8 @@ const int lz::Attestation::NAME = "Attest"u;
|
|
|
7
7
|
const int lz::Attestation::hash = 0; ;; hash
|
|
8
8
|
const int lz::Attestation::confirmations = 1; ;; uint64
|
|
9
9
|
|
|
10
|
-
const int
|
|
11
|
-
const int
|
|
10
|
+
const int ULN_ATTESTATION_BITS = _HEADER_WIDTH + 256 + 64;
|
|
11
|
+
const int ULN_ATTESTATION_REFS = 0;
|
|
12
12
|
;; As long as the first 128 bits of the header match the below number,
|
|
13
13
|
;; the attestation is parseable by classlib
|
|
14
14
|
const int lz::Attestation::leading16Bytes = 0x417474657374815ED897BFFF;
|
|
@@ -29,8 +29,8 @@ cell lz::Attestation::New(int hash, int confirmations) inline method_id {
|
|
|
29
29
|
(int bits, int refs) = selfSlice.slice_bits_refs();
|
|
30
30
|
throw_unless(
|
|
31
31
|
cl::ERROR::MALFORMED_OBJECT,
|
|
32
|
-
(bits ==
|
|
33
|
-
& (refs ==
|
|
32
|
+
(bits == ULN_ATTESTATION_BITS)
|
|
33
|
+
& (refs == ULN_ATTESTATION_REFS)
|
|
34
34
|
& (selfSlice~load_uint(128) == lz::Attestation::leading16Bytes)
|
|
35
35
|
);
|
|
36
36
|
}
|
|
@@ -53,28 +53,28 @@ const int UlnReceiveConfig::ERROR::INVALID_MIN_COMMIT_PACKET_GAS = 388;
|
|
|
53
53
|
;; address[] optionalDVNs; // no duplicates. sorted an an ascending order. allowed overlap with requiredDVNs
|
|
54
54
|
|
|
55
55
|
cell UlnReceiveConfig::New(
|
|
56
|
-
int
|
|
56
|
+
int minCommitPacketGasNull,
|
|
57
57
|
int minCommitPacketGas,
|
|
58
|
-
int
|
|
58
|
+
int confirmationsNull,
|
|
59
59
|
int confirmations,
|
|
60
|
-
int
|
|
60
|
+
int requiredDVNsNull,
|
|
61
61
|
cell requiredDVNs,
|
|
62
|
-
int
|
|
62
|
+
int optionalDVNsNull,
|
|
63
63
|
cell optionalDVNs,
|
|
64
64
|
int optionalDVNThreshold
|
|
65
65
|
) impure method_id {
|
|
66
66
|
return cl::declare(
|
|
67
67
|
UlnReceiveConfig::NAME,
|
|
68
68
|
unsafeTuple([
|
|
69
|
-
[cl::t::bool,
|
|
70
|
-
[cl::t::uint32, minCommitPacketGas],
|
|
71
|
-
[cl::t::bool,
|
|
72
|
-
[cl::t::uint64, confirmations],
|
|
73
|
-
[cl::t::bool,
|
|
74
|
-
[cl::t::cellRef, requiredDVNs],
|
|
75
|
-
[cl::t::bool,
|
|
76
|
-
[cl::t::cellRef, optionalDVNs],
|
|
77
|
-
[cl::t::uint8, optionalDVNThreshold]
|
|
69
|
+
[cl::t::bool, minCommitPacketGasNull], ;; UlnReceiveConfig::minCommitPacketGasNull
|
|
70
|
+
[cl::t::uint32, minCommitPacketGas], ;; UlnReceiveConfig::minCommitPacketGas
|
|
71
|
+
[cl::t::bool, confirmationsNull], ;; UlnReceiveConfig::confirmationsNull
|
|
72
|
+
[cl::t::uint64, confirmations], ;; UlnReceiveConfig::confirmations
|
|
73
|
+
[cl::t::bool, requiredDVNsNull], ;; UlnReceiveConfig::requiredDVNsNull
|
|
74
|
+
[cl::t::cellRef, requiredDVNs], ;; UlnReceiveConfig::requiredDVNs
|
|
75
|
+
[cl::t::bool, optionalDVNsNull], ;; UlnReceiveConfig::optionalDVNsNull
|
|
76
|
+
[cl::t::cellRef, optionalDVNs], ;; UlnReceiveConfig::requiredDVNs
|
|
77
|
+
[cl::t::uint8, optionalDVNThreshold] ;; UlnReceiveConfig::optionalDVNThreshold
|
|
78
78
|
])
|
|
79
79
|
);
|
|
80
80
|
}
|
|
@@ -34,24 +34,16 @@ cell UlnConnection::utils::setHashLookup(
|
|
|
34
34
|
(cell addressLookup, _) = hashLookups.cl::dict256::get<cellRef>(nonce);
|
|
35
35
|
|
|
36
36
|
;; insert the attestation
|
|
37
|
-
addressLookup = addressLookup.cl::dict256::setRef(
|
|
38
|
-
dvnAddress,
|
|
39
|
-
$attestation
|
|
40
|
-
);
|
|
37
|
+
addressLookup = addressLookup.cl::dict256::setRef(dvnAddress, $attestation);
|
|
41
38
|
|
|
42
39
|
;; save the attestation hash
|
|
43
|
-
hashLookups = hashLookups.cl::dict256::setRef(nonce, addressLookup);
|
|
44
|
-
|
|
45
40
|
return $self.cl::set(
|
|
46
41
|
UlnConnection::hashLookups,
|
|
47
42
|
hashLookups.cl::dict256::setRef(nonce, addressLookup)
|
|
48
43
|
);
|
|
49
44
|
}
|
|
50
45
|
|
|
51
|
-
cell UlnConnection::utils::deleteNonceAttestations(
|
|
52
|
-
cell $self,
|
|
53
|
-
int nonce
|
|
54
|
-
) impure inline {
|
|
46
|
+
cell UlnConnection::utils::deleteNonceAttestations(cell $self, int nonce) impure inline {
|
|
55
47
|
cell hashLookups = $self.cl::get<dict256>(UlnConnection::hashLookups);
|
|
56
48
|
;; delete is safe to call on a non-existent key
|
|
57
49
|
hashLookups = hashLookups.cl::dict256::delete(nonce);
|
|
@@ -22,7 +22,7 @@ cell getInitialStorage() impure inline {
|
|
|
22
22
|
;; declared inside of the actions/event.fc
|
|
23
23
|
;; We declare it here because it saves the need for declaring initialStorage everytime we call event
|
|
24
24
|
tuple _newAction<event>(int topic, cell $body) impure inline {
|
|
25
|
-
return action::event::
|
|
25
|
+
return action::event::create(topic, $body, cl::nullObject());
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
;;; ==========================================
|
package/CHANGELOG.md
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"hash":"7e6ca9a2e13eb5b6a01f58b6799f8c109842441dd708629d47f4386ddc6e5d84","hashBase64":"fmypouE+tbagH1i2eZ+MEJhCRB3XCGKdR/Q4bdxuXYQ=","hex":"b5ee9c72420201bc000100004b7500000114ff00f4a413f4bcf2c80b0001020162000200e20202c7000300bd0201200004005c02012000050027020120000600110201480007000e0201200008000b01f1d106380492f82706d9e46834c4c2e6cabecae4e4dee4bedae6ce409c9ea840e6cae85c5c5c4107c317c20b789fc20b78cfc2080b8b7c2fc30f83b9037c429105f470badb838c18390c006646581e580e58465ffe5b0e4b87d80470e00b7c090378810b788fc310098784af6a2016d090176aa607f80f83df14000901f621d074d701700271b098317f028020d72159de7f20706d04fa40fa4031fa003171d721fa003101fa44315307c7008e326c33058020d7018040d701fa0020d74981010bbe9c3827800b8307d724d70bff08de20c702953625d74c06df081035443012df02fa003073a9b400107b50a9105810471046503305046f0c000a0004f861020120000c000d000158001943082102051c71fba92f068df8020158000f00100073401d001d021d74b22d74b5033bd5213bd12b1935f03708e2020c000935f037fe07f709322c2009d5340d7485341d748f00c12b001e8145f04e2800f54c000928015928014e2f8329a307f5470005470005300e1d020d749810250be9a307f5470005470005300e120d70b078100d1bd2181008878d724d70b078100debdb19a307f5470005470005300e0d3070130d33f0101d33f0101d33f0101d3070130d33f0101d33f0101d33f0101d33f0101d33f0101d33f013180201200012001f0201200013001602012000140015000765c1bc060091f10eba490eba4d040bf40de4718c684686c2dcdcdee840c6dedcc6c2e8cadcc2e8ca7440e6e8e4d2dcce40e8dede40d8dedccf0107f0a187c80c2055879786f642c678b00e78b64e840201200017001e0201200018001b0201200019001a00053c09e0007722c20870402640a2c4b63c09c068d63788700026600c3232c1f2743c09f7a4c870802384c85eaa42298c3232c1f274007c0a005eaa41007a0c7c0a20020120001c001d00053c0a60008d22c208700026600c3232c1f2743c09f7a4c87080238b086a4e00f042a7886a4e00e98c3232c1f274007c0a2384086a4e00e99069bdb232c1f274007c0a38806ac0c07a0c7c0a20001b64062c8e8823c0a007c0abf850c20201200020002403f7f906001cc1845abab4b73a1c4701060024c9845b3ab4b73a189b470106002cc9845b3ab4b73a19994701060034c9845b3ab4b73a1b1a4701060044d1845bbab4b73a191a9b470106003cc1845ab1b7b4b739c701060044d1845bb0b2323932b9b9c70106004cd1845bb234b1ba191a9b470106004f181106004f18140021002200230012308b66f626a52656680014308b763656c6c52656680026c000968b4626f6f6c8e08b7756e6b6e6f776e8020158002500260183521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba9130e0018307f45b30209993d0307f925b70f2ffda118e823088df801b7006f420f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba93307f6de08307f4866fa59101e05b7f6d8020120002800310201200029002e020120002a002b0071b243f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f7526b6fedbc003060fe8f8df4b2203c0b6fedb010df90b78890b788c002c02fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8026f1001006c002d000e6f10ba01c0ffb0020120002f0030003fb842de2042de217444de2244de23756044de2444de25756004de2602de277561009fb5db45dbf603a0e12a438e0180011c7843ae964184020380024552700f860161632abe08e1b663c1560f1c274803a7fe038000a64779632abe06e1b663c003c843ae9584012a03ae99a003bdd0be06ff0201200032004502012000330034005bb7da88e003a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c50201200035003b02012000360039010148003701bced447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f8416f1101d0003800a88e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d8f2e7df01e34f8416f112170830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20270830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2128003a003c20c2009a236f1021a014706f8503de82287061796d656e7455206f046f8c020120003c0041020120003d004003b50060ae15dbdc9ad95c8e8e995d995b9d0e8e905113525394d7d4d15508b6cf3b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c160136cf049c0076cf3b5520003e01b901b904f48882186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201b701ab01ae003f00046f8c02753b513b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c5600f6cf1c0076cf3b552001b901b901b942073802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2208210f851d3f5ba218210beea5b26bab1218210a91df8babab1018210217607d4bab1f2e7dd8004201e6ed447001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e271830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20170821009f047d982015018ed43d8db3c004301dc2070830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22173802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e202710044007a01d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2128240616374696f6e43616c6c55206f046f8c020120004600570201f400470048003d2341b50726963654665656443616368653a3a7065726d697373696f6e7382002f71bc024fc4043a342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3181bc09be324fc4043e342e636865636b5065726d697373696f6e733a3a75706461746550726963653a3a737563636573733a3a61646d696e3281bc09be324fc4044225bc0a00049004a0052636865636b5065726d697373696f6e733a3a75706461746550726963653a3a6e6f745570646174657201fc6f8c93f101118d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f101128d0d18da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9cdd58d8d95cdcce8e98591b5a5b8ca06f02004b02fe6f8c93f101138d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e9d5c19185d1953985d1a5d99541c9a58d94e8e9b9bdd155c19185d195ca06f026f8c93f101148d0bd8da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10115896f026f8c004c004d005e636865636b5065726d697373696f6e733a3a63616c6c56696150726f78793a3a737563636573733a3a61646d696e3204fc8a8d0a98da1958dad4195c9b5a5cdcda5bdb9cce8e98d85b1b159a58541c9bde1e4e8e9b9bdd155c19185d195ca06f026f8c93f101178d0ad8da1958dad4195c9b5a5cdcda5bdb9cce8e98db185a5b551bdb8e8e9cdd58d8d95cdcce8e98591b5a5b8c606f026f8c93f10118896f026f8c93f10119896f026f8c93f1011a004e004f005000510006f101160056636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a737563636573733a3a61646d696e320058636865636b5065726d697373696f6e733a3a636c61696d546f6e3a3a7265766572743a3a6e6f7441646d696e04fc896f026f8c93f1011b8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9cdd58d8d95cdcce8e98591b5a5b8ca06f026f8c93f1011c8d0b58da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d10591b5a5b9cce8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c93f1011d896f026f8c8a00520053005400550058636865636b5065726d697373696f6e733a3a73657441646d696e733a3a737563636573733a3a61646d696e310056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e310006f1011e0178896f026f8c93f1011f8d0b18da1958dad4195c9b5a5cdcda5bdb9cce8e9cd95d141c9bde1e4e8e9c995d995c9d0e8e9b9bdd10591b5a5ba06f026f8c00560056636865636b5065726d697373696f6e733a3a73657450726f78793a3a737563636573733a3a61646d696e320201200058005b0201580059005a00713c1da2c8e8823c0a3e10bc0a22c8e8823c0a087c0a3f850c3c1da2c8e8823c0a3e10bc0a22c8e8823c0a007c0a083f850c3e406102ac3cbc20000f00644c24bc1eb8a00037f49bfc584703846824e8cae6e87474e6d0deead8c884caa8e4eacb04020120005d008f020120005e007d020120005f007302012000600061004fb442de2042de217444de2244de23756044de2444de25756044de2644de27756004de2802de29756102012000620066010dd10b78910b7894006302fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1522006c006402fe6f158ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8236f10006c00650062236f10ba246f11f900246f11f900bab002c0ff12b0236f13236f13bab0236f14236f14bab001c0ffb0026f16016f16bab00201200067006a010d5216f13216f138006802fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006c006900326f10ba236f11236f11bab0036f12026f1212ba12b001c0ffb0010d5216f13216f138006b02fc8ef7eda2edfb2120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe22120f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe2bd20945f038010e30ed8226f1022006c007201962220f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe282104e554c4cba935f037fe0709320c1108ae85f047f006d0286533001d001a712a65074d724d70b0320c0098e8a20c109945b801001e30de30d208e1d135f038bf4d616c666f726d6564206669656c648fe143020fe2030db31e001a4006e007001f66c1220c10991ae923070e254731002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e254732102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2bd209131e30d006f00f88b56c68733a20854753202d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2f02d5d8b57268733a2080402d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e212f02d01c43031532001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900bd20e300007100c4533101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2f900fe2030003e6f10ba236f11236f11bab0236f12236f12bab001c0ffb0026f14016f14bab00201200074007702012000750076005bf4714f6d176fd90c108719dcc39dd48adc70c10c1087b2e74c45d49adf802cd10e00049aded98f0780371716c384000567c2720201200078007b0201580079007a00af1c3b507b50fb513b517b51e496dffb59fb597b593b58fb5865167c24cc3b507b7c407cbfe38b1c234287065726d697373696f6e7320636865636b2073686f756c64206e6f742068617665207468726f776e824dfe2c238a000ad1c3b507b50fb513b517b51e456fb59fb597b593b58fb585c5ffb44653c24cc1ffb507b7c407cbfe38a1c234247065726d697373696f6e7320636865636b2073686f756c642068617665207468726f776e824dfe2c238a001e9d4083dcc083dd3781643780b84b1137c429085cc71910b7c452a91037c0906798c183d04204de4f1800e437c61037c452a90837c0896f2998b7c080e5ff9137c4528811b7c280d2741818b7c6ca90b7c461004b80b7c68164ac667418e4b8787ac100e05af6a1ec76aa383780c083dcc083dd37814007c00b4c86f017096226f885210b98e32216f88a552206f8120cf318307a08409bc9e3001c86f8c206f88a552106f8112de53316f8101cbff226f88a510236f8501a4e830316f8d95216f88c20097016f8d02c958cce831c9f06c30ed44020158007e0084020158007f00820201200080008102dd208e1b5bd8dad4dd1bdc995e1400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001ab01ae011520196041f2e019a041f32000830115480668107cc80658107cb8008302e68210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200085008b0201200086008701275f0b5807c82284d657373616765c8cbffcb3fc9800890201200088008a015f3c2d601f0820bc13595cdcd859d94819dc99585d195c881d1a185b881b585e135cd9d09e5d195cf232fff2cff2cff260008902ea7082205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae012b3c2d601f208a13595cdcd859d97232fff2cff2600aa0008d020148008c008e01293c2da01f208a13595cdcd859d97232fff2cff25620008d02e882205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0009200abc2f20020120009000a802012000910094020158009200930009f6465ffe4c000bd3d6465ffe4c0201200095009e02012000960097042bf40324032ed9e6d9e785cc080646465ffe4ed9e382c40099009a010c009c0201480098009d042b2019201976cf36cf3c2ea040323232fff276cf1c16200099009a010c009c010c71728107cc73009b010c74758107cc76009b02f082384f7074696f6e7356317850056f027850046f027850036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae031cdb3c718107c1db3c728107c2db3c01b901b901b900071c3c34e0020120009f00a70283d785ded9e1037c45290600049b7c0e4c717106000cd18103788e480b7886664f02e37c090d2a91837c0c9916100cd015280e4ac662990b7c0f41998e480e664f100c00a000a501c8207001d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2217300a101d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2237100a201d8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2257200a301fa804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e271c8cb07cb3fcb1f14cbff13cb1f12cbffcbff6f01017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d093206eb38ae83000a400ec20d74ac201f2d4c1216f88a553206f8120cf31ab0223d749ab025ca0c07f25d749a93802c300f2d4c25321a06c12c27f8e22807f58a120aa025250d71913cf165415036f8501aa0213d72101a4c851336f8c41349131e22370d72112cf1644046f8521c702936c216d9b029501c86f8c01ded74cd0e202a4206f8820c0008e825b888e3dc871935302bb8e305320a152406f812173a908c0008e10206f11016f1003c9c8cc13cbff12cb3f9d206f11016f105003cbff12cb3fe201a4e8135f03c9e2717880518020806401b700a603f88240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e21089107870db3c01ab01ae0132001fd786ac100680691b7813780a198786c402012000a900b002014800aa00ad02015800ab00ac009d0c1bc0321be308a38bc0a9489be229548c1be073cc60c1e821026f2540b21be300b7889be229548c1be054c8680072ffc8dbe22944091be1791b085be365485be2308025c05be340b256333a0c726000211bc01c00e614c4a81be300a900b91b086002014800ae00af005132204134b232fff264c8f080238554c8e81632ffc8f000659484331484333780e9540cfa04d7c0f26000071c3c38a002012000b100b602012000b200b3000dd41006815f865c02012000b400b5001d57a800b800c800d8201a7fded43d880031482081c41cb82180861c468008103e880118201a7fded43d8802012000b700b8000df40855a80f871402012000b900bc02012000ba00bb000d20422dc07c38a0000d2042ed007c38a0000d48109b601f0e280201c700be00c302012000bf00c0003bb304061a810050e1020f74e0e4e1e1f8e0e4e1e1fce04f040265c7da87b10201f400c100c200330c2041ee7e10405c5be17e18608432027e843c3dbc6026b68ca000330c2041eebe10405c5be17e18608432027e843c3dbc6026b68ca002012000c400d302012000c500cc02012000c600c902012000c700c800330c2041edbe10405c5be17e18608432027e843c3dbc6026f68ca000330c2041ee7e10405c5be17e18608421dc003e7c3dbc6026b68ca002012000ca00cb00330c2041eebe10405c5be17e18608421dc003e7c3dbc6026b68ca000330c2041edbe10405c5be17e18608421dc003e7c3dbc6026f68ca002012000cd00d002012000ce00cf00330c2041ee7e10405c5be17e186084385013fabc3d7c6026b68ca000330c2041eebe10405c5be17e186084385013fabc3d7c6026b68ca002012000d100d200330c2041edbe10405c5be17e186084385013fabc3d7c6026f68ca001310c2041ee7e10405c5be17e186084085d81f5223c6026b68ca001b702012000d400db02012000d500d802012000d600d701310c2041eebe10405c5be17e186084085d81f5223c6026b68ca001b701310c2041edbe10405c5be17e186084085d81f5223c6026f68ca001b702012000d900da01310c2041ee7e10405c5be17e18608414f24b13a23c6026b68ca001b701310c2041eebe10405c5be17e18608414f24b13a23c6026b68ca001b702012000dc00df02012000dd00de01310c2041edbe10405c5be17e18608414f24b13a23c6026f68ca001b701310c2041ee7e10405c5be17e18608423aa7293e23c6026b68ca001b702012000e000e101310c2041eebe10405c5be17e18608423aa7293e23c6026b68ca001b701310c2041edbe10405c5be17e18608423aa7293e23c6026f68ca001b702012000e3014d02012000e4012102012000e5010402012000e600fb02012000e700f102012000e800e90114ab5f705433334403db3c018502012000ea00eb0133a6d5020f83020f85020f89020f8b020f8f020f91f0474c79b679018502012000ec00f001e3a0e89201fea422a8081601fea4108a01fea422a8080e01fea410234096a8088ea8094e06814d8681425ad82709fd4e16d826040fe2f2c7cb510cab000238c4cce4832021c35cc05f3c591c233c05c14492854c941040d9675cd04b3c5904133c048b5d2562848b5d28408f5ccb3c5b278c3a00ed02fe34366f00708ef25303ba534bbab08e565303ba8e20c8533970d730cf16546a91cf0123d749539aa0a124d74a2559d732cf16126f8c8e2e530aba8e20c8533670d730cf16546761cf0123d7495367a0a124d74a2559d732cf16126f8c97c823cf16126f8ce2e2e30d22d74ac2009502d74cd002de01a4530abee6195f09530100ee00ef0074532870d7305398a070538ba12ba153165530d73424d7495378a0a125d74a2659d732c85003cf16546cb1cf0101cf16546871cf0101cf16126f8c00266f81c99322c2009802a55c6f8113ccc9e86c2102e9a0b60841c185d1a1d54015bc09e14011bc09d5400dbc09e161bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02012000f200f702012000f300f40057a4bc03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c50201c700f500f60087ad887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a002f1a9208c155b1b911d9b919b1d94015bc09d94011bc09d1400dbc09dd61bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001ab01ae02012000f800f90075a62ee1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50207fd410103a6c900fa016c8240556c6e57726b496e666f7850086f027950076f027950066f027850056f027550046f027750036f0276706f027050036f02126f08019f02012000fc00fd02edad22412027b83a34b7b739a2bc3a3aa80237813aa801b7813cac37813781b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001ab01ae02012000fe010302012000ff0102020158010001010081bab830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e27074c8cb02ca07cbffc9d08006bbd320f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe28006ba553002005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502eca82f82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae020120010501120201200106010d0201480107010b0117a6e10440ead8dc9acee4f20d010804fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2166f027950056f027901b701ab01ae0109043450046f027850036f0275586f0279886f0279886f0279886f027901b701b701b7010a03c2886f0278706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae0103a445010c017c82206c7a53656e6476706f0278706f0278706f027950066f0277500a6f027750096f027950086f027950076f027950056f02487010561059443049906f09019f020120010e0111020120010f011002dda6450420a09e9e9eece2de04f39108139e8192de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0041a7cae1e01c2090be1104101e84816c135402e1f06d080f0407f602e1f0715403410224a9f77f707f217f887f8824820193afed43d801b701b70201200113011c0201200114011b0201200115011602d7a4b50480e6cae882c8c8e4cae6e6f0b0de04de02db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0201200117011a02039b880118011902e95824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae017f58240556c6e53656e6443666775500b6f0275500a6f027050096f027850086f027050076f027950066f027050056f027950046f027050036f0276586f026f0a8019f0065f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502f6aad182186576656e747850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e282186576656e74016f0201ab01ae0201c7011d011e02e7bb1823052637645704366677850046f027850036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae0103bd98011f01f6227101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d02370804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e25133a15123a1c8532370d730cf165214a113cf41840950030120023ca170d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b901b90201200122013c02012001230133020120012401250071aead917c8041784b514b69127942e33df749e187c51848abf86d51aee2dc3f2085bc318504e7e3dd4c360936894183fa0bca814183fa0bf1400201200126012702daab1982204d64416464727950036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200128012c011fa4230480c6dedcdccac6e8d2dedcf209012904fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027950036f02787001b701ab01ae012a04626f0278706f027850046f027982015d9fed43d86f02797f707f217f887f8824820193afed43d86f0279886f0276716f027901b701b701b7012b03c2886f02107810676f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae020158012d01310111b918208756c6e79048012e04fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027550036f02755801b701ab01ae012f04486f02797f707f217f887f8824820193afed43d86f027982015d9fed43d86f0279886f027901b701b701b7013003d2886f0274706f0274706f0274706f026f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201b701ab01ae0103b9780132018482306c6962536e64436277500c6f0277500b6f0279500a6f027950096f027950086f027450076f027350066f027450056f027350046f027950036f0273586f026f0b019f020120013401370201c90135013602f5b310480caf0cac6a0c2e4c2dae6f0a00ade04f2a008de04eca006de04eab0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c5001ab01ae002bb4a05a10202bdae43a7fe02b17403a67e0262b1776100201200138013b0201480139013a02eba1ee088141858dad95d1e54011bc09e5400dbc09d961bc09e1c1bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02d7a066086135913d89a9e5400dbc09e561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae0226a99f70207f217f887f887f25820132e3ed43d801b701b7020120013d0146020120013e0143020120013f014202012001400141016ba72c43f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f751d06b710e12e03060fe81edf43c501b702dfa76f0470e6cae8a6dad886ccceeea006de04eeb0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae02f0aa4a8228556c6e53656e647950056f027950046f027950036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae0201200144014502daabce82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae006ca8b5830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20201200147014802d5acd6411831b7b4b739a0b6ba3bac37813780b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001ab01ae0201200149014c020120014a014b02eda4dce10440a0c2c6d6cae8f2a008de04f2a006de04ecb0de04f0e0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501ab01ae0103a5eb01b902e0aa0a823853656e6445704366677850036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae020120014e018c020120014f01760201200150016a0201200151015e02012001520159020158015301560201620154015502d5f6090155b1b989e5d1958dbd91e561bc09bc05b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae011daf9fdc151c001c150cccd100f6cf2001850103a01a015701268238556c6e5665726966797650046f02027902015803de82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f026f0201ab01ae019f020120015a015d0201cb015b015c02f1fc11c27b83a34b7b739ab18bc2802b7813c280237813c2801b7813c2c3781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f1401ab01ae0067b6f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5006ba587060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c5020120015f01600150abdd8240556c6e457865637574727650066f027450056f027750046f027750036f0276586f026f05019f0104a827016102e05cdb3c24787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22571802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e226760162016601b67f227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2237701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e22474016302e67102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300e30004767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3009132e30d120164016500d23122747102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c00012b0227501d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25800d03321767102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c300c000b0017701d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25901e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e373124787802d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e201de2670016701e27102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e37302471802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2de5065016801ea21727102d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2c3008e363073804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2e30d103540440169006c3173804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2020120016b016c0179add7c1202ab6372932b1bb21b333b8280537813aa804b78138280437813b2803b78138280337813ca802b78138280237813ca801b78139ac37813784c0019f020158016d01740123a473020f8240eb9197ff93020f81e16be169016e03ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae016f02ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c42075c8cbffc98107c3f0b5f0b401b9017003ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae017102ea217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f9008107c72075c8cbffc98107c6f0b5f0b401b9017203ec82404d73676c6962496e666f7850046f027950036f0279586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2f0b501ab01ae017302d6217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f900f823a63cdb3c01b9018501e5a56a418201e5a90242e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a044e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c4a6417324be07c61d017502605122a171c85d70d730cf16cb00840958a1a51270d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c01b901b902012001770182020120017801810201200179017c020120017a017b0103a52b01850073a7e443f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f753062db060fe81cdf432e03060fe81cdf43c5020120017d017e0093a453e0c6e3060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c44180013861f0510017060fae49ae17ffbd020158017f018002edbbf8240536d6c4a6f6241737367788210deadbeef6f027750036f02126f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae02f1bfd823050464665656c69627750056f027650046f027550036f0277586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2801ab01ae0041aeaa01e86410c080af386b98678b09e59fe5ff8965ff80c081cf386b98e78b64c002012001830187020148018401860121a4a2fee0a826002046e0a866668807b6790185016682304570436f6e6669677050096f027850086f027850076f027850066f027850056f027850046f027850036f0276586f026f08019f0057a5ce03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c502012001880189006ca80d802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20104aa12018a01dc2173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22371018b00f8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e203c8cb3f13cb1f13cbffcb1fcbff71f90403020120018d01a1020120018e0198020120018f01910121ac5ac114383321b0b1b43281bcb8280240019003fa824077726b436f7253746f727950046f027850036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2126f0279586f026f0201ab01ae019f020120019201970201200193019400dda47642e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c54202e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a002e3ae49ae1601800302012001950196006da009c40b40069c4a9941729811cb5c935c2c05488a9819eb5c935c2c248700025cc48b5c90075c0e6d675d2341444b5c90075c0f8b0c0200efa0f3b511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b423867b68bb7ec835d2700026c831c0a4dc36cc7835d33437b4ffc0760c6002ea8b27021f03e309320c2ff985220f0413001a401e83031020120019901a0020148019a019b0011a731e0ee02df02de23020148019c019d004fbfdd020d74b0181029eba01c000b0018306d701308250417474657374815ed897bfffbab0f2e42280103b918019e0148823053657445704366677050066f027850056f027850046f027850036f0276586f026f05019f02b06dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e201ab01ae006dad294183016800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f14002012001a201b002012001a301a403efae4fc11c3130b9b2a9ba37b932bc2c378138383781383837813cc43781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f14001b701ab01ae02012001a501a902015801a601a801b5a26fb511c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d2389c00740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238b4201a700a28e4eeda2edfb8e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d89320c2008e2422ba945b7fdb31e08e19eda2edfb20d749c0009b20c7029370db31e0d74cd0ded3ff01d8e85f0370d80007a11fb51202014801aa01af02f9a0d60841413d3d3dd9c5bc09e721c73d01491a84573d0610254012844f3d03244dbc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a01ab01ae02fc53806f81206f102020c10991ae923070e25350a08409bc8e133507a4702a6f885220be950ac86f8c0ade5085de20c0008e1d24a427bc8e16343505a470742a6f885230be950ac86f8c0ade476604dede21c1098e2021c0099d026f1153a76f81cc541a076f859d026f1153a76f81cc541a076f85e2e30d5098cb0328c20001ac01ad0022026f11b60b53a86f8123cf01541a086f8500708e157327c00191709127e258cb015240cb09cb015038a08e1a38840925c00191709125e25009cb0118cb095210cb0101a44707e202a41067033e21cf32c0008f0788885003cc12cc8e8d21cf32c0018e848858cc01de01e20101b701b701b70057a10c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a02012001b101b301efaff6c77976d176fd9039c183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f110bac183816800d38953282e5302396b926b8580a91153033d6b926b858490e0004b98916b9200eb81cdaceba46828896b9200eb81f1013bec4001b200c8804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e222c00021c300b0955f038104038e2022c30001f823bbb0965b810402db31e020c30002bab095810401db31e0810455e202012001b401b802012001b501b6006ba6b7008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50105a6351101b7000001ceabf9217201d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e27158db3c017101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e276c8cb04ccccc9f90001b902f402d001a712a6505ca60472d724d70b01532174d724d70b035da6067ad724d70b095244a61072d724d70b012120c10991ae923070e223c0009125955353d748d0e221c300927433dec821d74927b60822d74a5250b6082359d730cf1624c0098e16323334505503cc7023d74a5006a1a54350d73213cf16e30e2201ba01bb006404c0098e1431345055cc7023d74a5006a1a54350d73213cf168e163206b60b541026cf015035a022d74a1023d73113cf16e20048c2008e1bc9c822d749546351d730cf16cc7022d74a5004a1a513d732cf16c9936c21c9e24e5d6972"}
|