@layerzerolabs/layerzero-v2-ton 3.0.12-ton.0 → 3.0.18-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/CHANGELOG.md +18 -0
- package/package.json +15 -4
- package/src/classes/lz/EpConfig.fc +3 -3
- package/src/classes/lz/Packet.fc +16 -3
- package/src/classes/lz/Path.fc +10 -1
- package/src/classes/msgdata/ChannelNonceInfo.fc +3 -3
- package/src/classes/msgdata/Deploy.fc +15 -3
- package/src/classes/msgdata/LzReceivePrepare.fc +18 -0
- package/src/classes/msgdata/LzSend.fc +1 -1
- package/src/classes/msgdata/OptionsV2.fc +7 -4
- package/src/funC++/abstract/contractMainAbstract.fc +12 -1
- package/src/funC++/abstract/handlerAbstract.fc +10 -2
- package/src/funC++/actions/call.fc +5 -3
- package/src/funC++/actions/dispatch.fc +10 -6
- package/src/funC++/baseInterface.fc +9 -8
- package/src/funC++/classlib.fc +30 -33
- package/src/funC++/constants.fc +2 -2
- package/src/funC++/contractMain.fc +2 -0
- package/src/funC++/dataStructures/AddressList.fc +89 -0
- package/src/funC++/dataStructures/DeterministicInsertionCircularQueue.fc +1 -1
- package/src/funC++/dataStructures/PipelinedOutOfOrder.fc +25 -1
- package/src/funC++/handlerCore.fc +2 -0
- package/src/funC++/stdlib.fc +1 -1
- package/src/funC++/testutils.fc +99 -0
- package/src/funC++/utils.fc +66 -2
- package/src/multisig/bocs/MultiSig.compiled.json +5 -0
- package/src/multisig/bocs/MultiSigOrder.compiled.json +5 -0
- package/tests/baseContractTest.fc +15 -12
- package/build/AllStorages.boc +0 -0
- package/build/AllStorages.compiled.json +0 -1
- package/build/AllStorages.fif +0 -4164
- package/build/AllStorages.test.boc +0 -0
- package/build/AllStorages.test.compiled.json +0 -1
- package/build/AllStorages.test.fif +0 -1831
- package/build/BaseContract.test.boc +0 -0
- package/build/BaseContract.test.compiled.json +0 -1
- package/build/BaseContract.test.fif +0 -3553
- package/build/Channel.boc +0 -0
- package/build/Channel.compiled.json +0 -1
- package/build/Channel.fif +0 -5001
- package/build/Channel.permissions.test.boc +0 -0
- package/build/Channel.permissions.test.compiled.json +0 -1
- package/build/Channel.permissions.test.fif +0 -7569
- package/build/ChannelBurn.test.boc +0 -0
- package/build/ChannelBurn.test.compiled.json +0 -1
- package/build/ChannelBurn.test.fif +0 -7454
- package/build/ChannelCommitPacket.test.boc +0 -0
- package/build/ChannelCommitPacket.test.compiled.json +0 -1
- package/build/ChannelCommitPacket.test.fif +0 -7981
- package/build/ChannelConfig.test.boc +0 -0
- package/build/ChannelConfig.test.compiled.json +0 -1
- package/build/ChannelConfig.test.fif +0 -7442
- package/build/ChannelInitialize.test.boc +0 -0
- package/build/ChannelInitialize.test.compiled.json +0 -1
- package/build/ChannelInitialize.test.fif +0 -7289
- package/build/ChannelMsglibIntegration.test.boc +0 -0
- package/build/ChannelMsglibIntegration.test.compiled.json +0 -1
- package/build/ChannelMsglibIntegration.test.fif +0 -7404
- package/build/ChannelMsglibSendCallback.test.boc +0 -0
- package/build/ChannelMsglibSendCallback.test.compiled.json +0 -1
- package/build/ChannelMsglibSendCallback.test.fif +0 -7711
- package/build/ChannelNilify.test.boc +0 -0
- package/build/ChannelNilify.test.compiled.json +0 -1
- package/build/ChannelNilify.test.fif +0 -7672
- package/build/ChannelReceive.test.boc +0 -0
- package/build/ChannelReceive.test.compiled.json +0 -1
- package/build/ChannelReceive.test.fif +0 -7702
- package/build/ChannelReceiveCallback.test.boc +0 -0
- package/build/ChannelReceiveCallback.test.compiled.json +0 -1
- package/build/ChannelReceiveCallback.test.fif +0 -7549
- package/build/ChannelReceiveView.test.boc +0 -0
- package/build/ChannelReceiveView.test.compiled.json +0 -1
- package/build/ChannelReceiveView.test.fif +0 -7352
- package/build/ChannelSend.test.boc +0 -0
- package/build/ChannelSend.test.compiled.json +0 -1
- package/build/ChannelSend.test.fif +0 -7658
- package/build/Classlib.test.boc +0 -0
- package/build/Classlib.test.compiled.json +0 -1
- package/build/Classlib.test.fif +0 -4728
- package/build/Connection.boc +0 -0
- package/build/Connection.compiled.json +0 -1
- package/build/Connection.fif +0 -3503
- package/build/Connection.test.boc +0 -0
- package/build/Connection.test.compiled.json +0 -1
- package/build/Connection.test.fif +0 -6575
- package/build/Controller.assertions.test.boc +0 -0
- package/build/Controller.assertions.test.compiled.json +0 -1
- package/build/Controller.assertions.test.fif +0 -6130
- package/build/Controller.boc +0 -0
- package/build/Controller.compiled.json +0 -1
- package/build/Controller.fif +0 -3195
- package/build/Controller.permissions.test.boc +0 -0
- package/build/Controller.permissions.test.compiled.json +0 -1
- package/build/Controller.permissions.test.fif +0 -6237
- package/build/Controller.test.boc +0 -0
- package/build/Controller.test.compiled.json +0 -1
- package/build/Controller.test.fif +0 -6400
- package/build/Counter.boc +0 -0
- package/build/Counter.compiled.json +0 -1
- package/build/Counter.fif +0 -4809
- package/build/Counter.permissions.test.boc +0 -0
- package/build/Counter.permissions.test.compiled.json +0 -1
- package/build/Counter.permissions.test.fif +0 -7106
- package/build/Counter.setters.test.boc +0 -0
- package/build/Counter.setters.test.compiled.json +0 -1
- package/build/Counter.setters.test.fif +0 -7083
- package/build/Counter.test.boc +0 -0
- package/build/Counter.test.compiled.json +0 -1
- package/build/Counter.test.fif +0 -7540
- package/build/Dvn.boc +0 -0
- package/build/Dvn.compiled.json +0 -1
- package/build/Dvn.fif +0 -2923
- package/build/Dvn.test.boc +0 -0
- package/build/Dvn.test.compiled.json +0 -1
- package/build/Dvn.test.fif +0 -5753
- package/build/Endpoint.boc +0 -0
- package/build/Endpoint.compiled.json +0 -1
- package/build/Endpoint.fif +0 -3694
- package/build/Endpoint.permissions.test.boc +0 -0
- package/build/Endpoint.permissions.test.compiled.json +0 -1
- package/build/Endpoint.permissions.test.fif +0 -6211
- package/build/Endpoint.test.boc +0 -0
- package/build/Endpoint.test.compiled.json +0 -1
- package/build/Endpoint.test.fif +0 -6899
- package/build/EndpointSetEpConfigDefaults.test.boc +0 -0
- package/build/EndpointSetEpConfigDefaults.test.compiled.json +0 -1
- package/build/EndpointSetEpConfigDefaults.test.fif +0 -6529
- package/build/Executor.boc +0 -0
- package/build/Executor.compiled.json +0 -1
- package/build/Executor.fif +0 -2731
- package/build/Executor.test.boc +0 -0
- package/build/Executor.test.compiled.json +0 -1
- package/build/Executor.test.fif +0 -5822
- package/build/LzClasses.test.boc +0 -0
- package/build/LzClasses.test.compiled.json +0 -1
- package/build/LzClasses.test.fif +0 -4457
- package/build/LzUtil.test.boc +0 -0
- package/build/LzUtil.test.compiled.json +0 -1
- package/build/LzUtil.test.fif +0 -1831
- package/build/MsgData.test.boc +0 -0
- package/build/MsgData.test.compiled.json +0 -1
- package/build/MsgData.test.fif +0 -4318
- package/build/MsglibPacketCodec.test.boc +0 -0
- package/build/MsglibPacketCodec.test.compiled.json +0 -1
- package/build/MsglibPacketCodec.test.fif +0 -4851
- package/build/MultiSig.boc +0 -0
- package/build/MultiSig.compiled.json +0 -1
- package/build/MultiSig.fif +0 -727
- package/build/MultiSigOrder.boc +0 -0
- package/build/MultiSigOrder.compiled.json +0 -1
- package/build/MultiSigOrder.fif +0 -650
- package/build/PipelinedOutOfOrder.test.boc +0 -0
- package/build/PipelinedOutOfOrder.test.compiled.json +0 -1
- package/build/PipelinedOutOfOrder.test.fif +0 -2188
- package/build/SmlConnection.boc +0 -0
- package/build/SmlConnection.compiled.json +0 -1
- package/build/SmlConnection.fif +0 -2517
- package/build/SmlConnection.permissions.test.boc +0 -0
- package/build/SmlConnection.permissions.test.compiled.json +0 -1
- package/build/SmlConnection.permissions.test.fif +0 -5497
- package/build/SmlConnection.test.boc +0 -0
- package/build/SmlConnection.test.compiled.json +0 -1
- package/build/SmlConnection.test.fif +0 -5494
- package/build/SmlManager.boc +0 -0
- package/build/SmlManager.compiled.json +0 -1
- package/build/SmlManager.fif +0 -3904
- package/build/SmlManager.permissions.test.boc +0 -0
- package/build/SmlManager.permissions.test.compiled.json +0 -1
- package/build/SmlManager.permissions.test.fif +0 -6018
- package/build/SmlManager.test.boc +0 -0
- package/build/SmlManager.test.compiled.json +0 -1
- package/build/SmlManager.test.fif +0 -6047
- package/build/Uln.boc +0 -0
- package/build/Uln.compiled.json +0 -1
- package/build/Uln.fif +0 -4841
- package/build/Uln.test.boc +0 -0
- package/build/Uln.test.compiled.json +0 -1
- package/build/Uln.test.fif +0 -7077
- package/build/UlnManager.boc +0 -0
- package/build/UlnManager.compiled.json +0 -1
- package/build/UlnManager.fif +0 -3851
- package/build/UlnManager.test.boc +0 -0
- package/build/UlnManager.test.compiled.json +0 -1
- package/build/UlnManager.test.fif +0 -6571
- package/build/UlnReceiveConfig.test.boc +0 -0
- package/build/UlnReceiveConfig.test.compiled.json +0 -1
- package/build/UlnReceiveConfig.test.fif +0 -4413
- package/build/UlnSend.test.boc +0 -0
- package/build/UlnSend.test.compiled.json +0 -1
- package/build/UlnSend.test.fif +0 -6576
- package/build/UlnSendConfig.test.boc +0 -0
- package/build/UlnSendConfig.test.compiled.json +0 -1
- package/build/UlnSendConfig.test.fif +0 -4431
- package/build/UlnSendWorkerFactory.test.boc +0 -0
- package/build/UlnSendWorkerFactory.test.compiled.json +0 -1
- package/build/UlnSendWorkerFactory.test.fif +0 -6683
- package/build/UlnUtil.test.boc +0 -0
- package/build/UlnUtil.test.compiled.json +0 -1
- package/build/UlnUtil.test.fif +0 -5873
- package/build/WorkerCore.test.boc +0 -0
- package/build/WorkerCore.test.compiled.json +0 -1
- package/build/WorkerCore.test.fif +0 -5630
- package/build/ZroMinter.boc +0 -0
- package/build/ZroMinter.compiled.json +0 -1
- package/build/ZroMinter.fif +0 -2300
- package/build/ZroWallet.boc +0 -0
- package/build/ZroWallet.compiled.json +0 -1
- package/build/ZroWallet.fif +0 -2471
- package/src/classes/lz/Attestation.fc +0 -23
- package/src/classes/msgdata/ClaimUnaccountedPoolFunds.fc +0 -0
- package/src/classes/msgdata/InitUlnConnection.fc +0 -18
|
@@ -9,7 +9,7 @@ const int DeterministicInsertionCircularQueue::keyBits = 64;
|
|
|
9
9
|
|
|
10
10
|
const int DeterministicInsertionCircularQueue::invalidKey = -1;
|
|
11
11
|
const int DeterministicInsertionCircularQueue::invalidStatus = -1;
|
|
12
|
-
const int DeterministicInsertionCircularQueue::ERROR::invalidObject =
|
|
12
|
+
const int DeterministicInsertionCircularQueue::ERROR::invalidObject = 1185;
|
|
13
13
|
|
|
14
14
|
cell DeterministicInsertionCircularQueue::_buildLevel(int level, cell initialContents) inline {
|
|
15
15
|
if (level == 0) {
|
|
@@ -10,7 +10,7 @@ const int POOO::NAME = "POOO"u;
|
|
|
10
10
|
const int POOO::nextEmpty = 0;
|
|
11
11
|
const int POOO::bitmap = 1;
|
|
12
12
|
|
|
13
|
-
const int POOO::ERROR::negativeIndex =
|
|
13
|
+
const int POOO::ERROR::negativeIndex = 1153;
|
|
14
14
|
|
|
15
15
|
;; Algorithm:
|
|
16
16
|
;; 1. Extract the first `index` bits from the original bitmap.
|
|
@@ -54,6 +54,30 @@ cell POOO::set(cell $self, int absoluteIndex) impure inline method_id {
|
|
|
54
54
|
.cl::set(POOO::nextEmpty, nextEmpty + leadingOnes);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
cell POOO::unsafeSetBits(cell $self, int start, int end) impure inline method_id {
|
|
58
|
+
slice bitmapSlice = $self.cl::get<cellRef>(POOO::bitmap).begin_parse();
|
|
59
|
+
int nextEmpty = $self.cl::get<uint64>(POOO::nextEmpty);
|
|
60
|
+
int startIndex = start - nextEmpty;
|
|
61
|
+
int endIndex = end - nextEmpty;
|
|
62
|
+
|
|
63
|
+
(int leadingOnes, slice remainingBitmap) = ldones(
|
|
64
|
+
begin_cell()
|
|
65
|
+
.store_slice(scutfirst(bitmapSlice, startIndex, 0))
|
|
66
|
+
.store_ones(endIndex - startIndex)
|
|
67
|
+
.store_slice(scutlast(bitmapSlice, MAX_CELL_BITS - endIndex, 0))
|
|
68
|
+
.as_slice()
|
|
69
|
+
);
|
|
70
|
+
return $self
|
|
71
|
+
.cl::set(
|
|
72
|
+
POOO::bitmap,
|
|
73
|
+
begin_cell()
|
|
74
|
+
.store_slice(remainingBitmap)
|
|
75
|
+
.store_zeroes(leadingOnes)
|
|
76
|
+
.end_cell()
|
|
77
|
+
)
|
|
78
|
+
.cl::set(POOO::nextEmpty, nextEmpty + leadingOnes);
|
|
79
|
+
}
|
|
80
|
+
|
|
57
81
|
cell POOO::New() inline method_id {
|
|
58
82
|
return cl::declare(
|
|
59
83
|
POOO::NAME,
|
package/src/funC++/stdlib.fc
CHANGED
|
@@ -182,7 +182,7 @@ int check_data_signature(slice data, slice signature, int public_key) asm "CHKSI
|
|
|
182
182
|
(int, int, int, int) compute_data_size?(cell c, int max_cells) asm "CDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
|
|
183
183
|
|
|
184
184
|
;;; A non-quiet version of [slice_compute_data_size?] that throws a cell overflow exception (8) on failure.
|
|
185
|
-
(int, int, int, int) slice_compute_data_size?(
|
|
185
|
+
(int, int, int, int) slice_compute_data_size?(slice s, int max_cells) asm "SDATASIZEQ NULLSWAPIFNOT2 NULLSWAPIFNOT";
|
|
186
186
|
|
|
187
187
|
;;; Throws an exception with exit_code excno if cond is not 0 (commented since implemented in compilator)
|
|
188
188
|
;; () throw_if(int excno, int cond) impure asm "THROWARGIF";
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#include "stdlib.fc";
|
|
2
|
+
#include "utils.fc";
|
|
3
|
+
|
|
4
|
+
cell _garbageFilledCell() {
|
|
5
|
+
cell garbage2 = begin_cell()
|
|
6
|
+
.store_uint256("garbage2"c)
|
|
7
|
+
.end_cell();
|
|
8
|
+
|
|
9
|
+
cell garbage3 = begin_cell()
|
|
10
|
+
.store_uint256("garbage3"c)
|
|
11
|
+
.end_cell();
|
|
12
|
+
|
|
13
|
+
return begin_cell()
|
|
14
|
+
.store_uint256("garbage"c)
|
|
15
|
+
.store_ref(garbage2)
|
|
16
|
+
.store_ref(garbage3)
|
|
17
|
+
.end_cell();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
cell _garbigify(cell $input, cell garbage) impure {
|
|
21
|
+
slice inputSlice = $input.begin_parse();
|
|
22
|
+
int numrefs = inputSlice.slice_refs();
|
|
23
|
+
|
|
24
|
+
if (numrefs <= 2) {
|
|
25
|
+
builder b = begin_cell().store_slice(inputSlice);
|
|
26
|
+
repeat (4 - numrefs) {
|
|
27
|
+
b = b.store_ref(garbage);
|
|
28
|
+
}
|
|
29
|
+
return b.end_cell();
|
|
30
|
+
} elseif (numrefs == 3) {
|
|
31
|
+
slice cutfirst = scutfirst(inputSlice, inputSlice.slice_bits(), 2);
|
|
32
|
+
builder b = begin_cell().store_slice(cutfirst);
|
|
33
|
+
slice s = inputSlice.preload_ref_at(2).begin_parse();
|
|
34
|
+
builder innerB = begin_cell().store_slice(s);
|
|
35
|
+
int innerNumRefs = s.slice_refs();
|
|
36
|
+
|
|
37
|
+
repeat (4 - innerNumRefs) {
|
|
38
|
+
innerB = innerB.store_ref(garbage);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return b.store_ref(innerB.end_cell()).store_ref(garbage).end_cell();
|
|
42
|
+
} elseif (numrefs == 4) {
|
|
43
|
+
builder b = begin_cell().store_slice(scutfirst(inputSlice, inputSlice.slice_bits(), 2));
|
|
44
|
+
slice s1 = inputSlice.preload_ref_at(2).begin_parse();
|
|
45
|
+
slice s2 = inputSlice.preload_ref_at(3).begin_parse();
|
|
46
|
+
builder innerb1 = begin_cell().store_slice(s1);
|
|
47
|
+
builder innerb2 = begin_cell().store_slice(s2);
|
|
48
|
+
int refs1 = s1.slice_refs();
|
|
49
|
+
int refs2 = s2.slice_refs();
|
|
50
|
+
|
|
51
|
+
repeat (4 - refs1) {
|
|
52
|
+
innerb1 = innerb1.store_ref(garbage);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
repeat (4 - refs2) {
|
|
56
|
+
innerb2 = innerb2.store_ref(garbage);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return b.store_ref(innerb1.end_cell()).store_ref(innerb2.end_cell()).end_cell();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
;; Should never happen as the above checks and returns from all cases
|
|
63
|
+
;; The compiler needs you to return from all possible control flows
|
|
64
|
+
;; and it isn't smart enough to know that this will never be reached.
|
|
65
|
+
~strdump("garbigify: this print should never happen");
|
|
66
|
+
return empty_cell();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
() profile_gas(var func, tuple args) {
|
|
70
|
+
int gas_consumed = get_gas_consumed();
|
|
71
|
+
int gas_consumed_consumed = get_gas_consumed();
|
|
72
|
+
int gas_consumed_of_gas_consumed = gas_consumed_consumed - gas_consumed;
|
|
73
|
+
int gas0 = get_gas_consumed();
|
|
74
|
+
var x = func(args);
|
|
75
|
+
int gas1 = get_gas_consumed();
|
|
76
|
+
~strdump("ignore this dump, this is to not optimize out");
|
|
77
|
+
~dump(x);
|
|
78
|
+
int final_gas = gas1 - gas0 - gas_consumed_of_gas_consumed;
|
|
79
|
+
~dump(final_gas);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
cell _dupWithGarbage(cell $input) {
|
|
83
|
+
return _garbigify($input, _garbageFilledCell());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
cell headerCellGarbage(cell $input) {
|
|
87
|
+
int ind = 0;
|
|
88
|
+
slice inputSlice = $input.begin_parse();
|
|
89
|
+
builder b = begin_cell();
|
|
90
|
+
while (ind < inputSlice.slice_refs()) {
|
|
91
|
+
b = b.store_ref(inputSlice.preload_ref_at(ind));
|
|
92
|
+
ind += 1;
|
|
93
|
+
}
|
|
94
|
+
b = b.store_slice(
|
|
95
|
+
inputSlice
|
|
96
|
+
.scutfirst(min(inputSlice.slice_bits(), 512), 0))
|
|
97
|
+
.store_uint256("garbage1"c);
|
|
98
|
+
return b.end_cell();
|
|
99
|
+
}
|
package/src/funC++/utils.fc
CHANGED
|
@@ -76,13 +76,14 @@ int _SDCNTLEAD0(slice x) asm "SDCNTLEAD0";
|
|
|
76
76
|
int POW2(int y) asm "POW2";
|
|
77
77
|
|
|
78
78
|
;; numCells, num_bits
|
|
79
|
-
(int, int) getContractStateSize(cell code, cell init_storage) inline {
|
|
79
|
+
(int, int) getContractStateSize(cell code, cell init_storage) impure inline {
|
|
80
80
|
cell stateInit = begin_cell()
|
|
81
81
|
.store_uint(6, 5)
|
|
82
82
|
.store_ref(code)
|
|
83
83
|
.store_ref(init_storage)
|
|
84
84
|
.end_cell();
|
|
85
|
-
(int cellsCount, int bitsCount,
|
|
85
|
+
(int cellsCount, int bitsCount, int success) = stateInit.compute_data_size(MAX_U16);
|
|
86
|
+
throw_unless(8, success);
|
|
86
87
|
return (cellsCount, bitsCount);
|
|
87
88
|
}
|
|
88
89
|
|
|
@@ -117,3 +118,66 @@ int treeShapeEqual(cell lhs, cell rhs) inline {
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
int _globvarIsNull(int idx) impure asm "GETGLOBVAR ISNULL";
|
|
121
|
+
|
|
122
|
+
int _gasToNanoton(int gas) inline {
|
|
123
|
+
return get_compute_fee(false, gas);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
(cell, int) getConfigParam(int idx) inline asm "CONFIGPARAM";
|
|
127
|
+
|
|
128
|
+
;; https://github.com/ton-blockchain/ton/blob/master/crypto/block/block.tlb
|
|
129
|
+
;; gas_prices#dd gas_price:uint64 gas_limit:uint64 gas_credit:uint64
|
|
130
|
+
;; block_gas_limit:uint64 freeze_due_limit:uint64 delete_due_limit:uint64
|
|
131
|
+
;; = GasLimitsPrices;
|
|
132
|
+
;;
|
|
133
|
+
;; gas_prices_ext#de gas_price:uint64 gas_limit:uint64 special_gas_limit:uint64 gas_credit:uint64
|
|
134
|
+
;; block_gas_limit:uint64 freeze_due_limit:uint64 delete_due_limit:uint64
|
|
135
|
+
;; = GasLimitsPrices;
|
|
136
|
+
;;
|
|
137
|
+
;; gas_flat_pfx#d1 flat_gas_limit:uint64 flat_gas_price:uint64 other:GasLimitsPrices
|
|
138
|
+
;; = GasLimitsPrices;
|
|
139
|
+
;;
|
|
140
|
+
;; config_mc_gas_prices#_ GasLimitsPrices = ConfigParam 20;
|
|
141
|
+
;; config_gas_prices#_ GasLimitsPrices = ConfigParam 21;
|
|
142
|
+
;; return -1 on any failure
|
|
143
|
+
(int, int, int, int, int, int, int, int, int) parseGasLimitsPrices(int workchainId) impure {
|
|
144
|
+
int configIdx = workchainId == BASECHAIN ? 21 : 20;
|
|
145
|
+
(cell cfg, int success) = getConfigParam(configIdx);
|
|
146
|
+
ifnot (success) {
|
|
147
|
+
return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
|
|
148
|
+
}
|
|
149
|
+
slice cfgSlice = cfg.begin_parse();
|
|
150
|
+
ifnot (cfgSlice.slice_bits() >= 592) {
|
|
151
|
+
return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
(cfgSlice.preload_uint(8) != 0xd1)
|
|
156
|
+
| (cfgSlice.preload_bits_offset(136, 8).preload_uint(8) != 0xde)
|
|
157
|
+
) {
|
|
158
|
+
return (-1, -1, -1, -1, -1, -1, -1, -1, -1);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
cfgSlice~load_uint8();
|
|
162
|
+
int specialGasLimit = cfgSlice~load_uint64();
|
|
163
|
+
int flatGasLimit = cfgSlice~load_uint64();
|
|
164
|
+
int flatGasPrice = cfgSlice~load_uint64();
|
|
165
|
+
cfgSlice~load_uint8();
|
|
166
|
+
int gasPrice = cfgSlice~load_uint64();
|
|
167
|
+
int gasLimit = cfgSlice~load_uint64();
|
|
168
|
+
int gasCredit = cfgSlice~load_uint64();
|
|
169
|
+
int blockGasLimit = cfgSlice~load_uint64();
|
|
170
|
+
int freezeDueLimit = cfgSlice~load_uint64();
|
|
171
|
+
int deleteDueLimit = cfgSlice~load_uint64();
|
|
172
|
+
return (
|
|
173
|
+
specialGasLimit,
|
|
174
|
+
flatGasLimit,
|
|
175
|
+
flatGasPrice,
|
|
176
|
+
gasPrice,
|
|
177
|
+
gasLimit,
|
|
178
|
+
gasCredit,
|
|
179
|
+
blockGasLimit,
|
|
180
|
+
freezeDueLimit,
|
|
181
|
+
deleteDueLimit
|
|
182
|
+
);
|
|
183
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hash": "1a9652b3a16a6fd12a1df3d44a9d24516bb82ae00306e758be7b53f8fa726261",
|
|
3
|
+
"hashBase64": "GpZSs6Fqb9EqHfPUSp0kUWu4KuADBudYvntT+PpyYmE=",
|
|
4
|
+
"hex": "b5ee9c7241021201000495000114ff00f4a413f4bcf2c80b01020162020b02cad033d0d3030171b0925f03e0fa403022d749c000925f03e002d31f0120c000925f04e001d33f01ed44d0d3ff0101d3070101d4d3070101f404d2000101d1288210f718510fbae30f054443c8500601cbff500401cb0712cc0101cb07f4000101ca00c9ed540307019e3806d3ff0128b38e122084ffba923024965305baf2e3f0e205a405de01d2000101d3070101d32f0101d4d1239126912ae2523078f40e6fa1f2e3ef1ec705f2e3ef20f823bef2e06f20f823a1546d700401d4f80703830cf94130038308f94130f8075006a18127f801a070f83681120670f836a0812bec70f836a0811d9870f836a022a60622a081053926a027a070f83823a481029827a070f838a003a60658a08106e05005a05005a0430370f83759a001a01cbef2e064f82850030502b8017002c858cf160101cbffc98822c8cb01f400f400cb00c97021f90074c8cb0212ca07cbffc9d0c882109c73fba2580a02cb1fcb3f2601cb075250cc500b01cb2f1bcc2a01ca000a951901cb07089130e2102470408980188050db3c110600928e45c85801cb055005cf165003fa0254712323ed44ed45ed479f5bc85003cf17c913775003cb6bcccced67ed65ed64747fed11987601cb6bcc01cf17ed41edf101f2ffc901fb00db06029a363826821075097f5dba8eba068210a32c59bfba8ea9f82818c705f2e06503d4d1103410364650f8007f8e8d2178f47c6fa5209132e30d01b3e65b10355034923436e2505413e30d4015503304090802e23604d3ff0101d32f0101d3070101d3ff0101d4d1f8285005017002c858cf160101cbffc98822c8cb01f400f400cb00c97001f90074c8cb0212ca07cbffc9d01bc705f2e06526f9001aba5193be19b0f2e06607f823bef2e06f44145056f8007f8e8d2178f47c6fa5209132e30d01b3e65b110901fa02d74cd0d31f01208210f1381e5bba8e6a82101d0cfbd3ba8e5e6c44d3070101d4217f708e17511278f47c6fa53221995302baf2e06702a402de01b312e66c2120c200f2e06e23c200f2e06d5330bbf2e06d01f404217f708e17511278f47c6fa53221995302baf2e06702a402de01b312e66c2130d155239130e2e30d0a001030d307d402fb00d10201200c0e0143bf74ff6a26869ff8080e9838080ea69838080fa0269000080e8881aaf8280fc11d0c0d00c2f80703830cf94130038308f94130f8075006a18127f801a070f83681120670f836a0812bec70f836a0811d9870f836a022a60622a081053926a027a070f83823a481029827a070f838a003a60658a08106e05005a05005a0430370f83759a001a00201660f1000f1b0cafb513434ffc04074c1c0407534c1c0407d01348000407448dfdc2385d4449e3d1f1be94c886654c0aebcb819c0a900b7806cc4b99b08548c2ebcb81b085fdc2385d4449e3d1f1be94c886654c0aebcb819c0a900b7806cc4b99b084c08b0803cb81b8930803cb81b5490eefcb81b40648cdfe440f880e00159b0c9fe0a00405c00b21633c5804072fff26208b232c07d003d0032c0325c007e401d3232c084b281f2fff27420110842024ebdec6e60259521d325e0baebe89b9a7901619805a4dfa624e5a3549349fcbf3e76e893"
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{
|
|
2
|
+
"hash": "4ebdec6e60259521d325e0baebe89b9a7901619805a4dfa624e5a3549349fcbf",
|
|
3
|
+
"hashBase64": "Tr3sbmAllSHTJeC66+ibmnkBYZgFpN+mJOWjVJNJ/L8=",
|
|
4
|
+
"hex": "b5ee9c7241020d01000372000114ff00f4a413f4bcf2c80b01020162020c04f8d03331d0d3030171b0915be0fa403001d31f01ed44d0fa4001f861d3ff01f86220d749c0008e13306df8636df8646df8656df8666df8676df8688e22d30701f863d20001f864d401f865d3ff01f866d30701f867d32f01f868d401f869d1e220c000e30201d33f012282109c73fba2bae302028210a762230fbae3020304060b01c83020d74ac0008e23c8708e1a22d7495230d71912cf1622d74a9402d74cd093317f58e2541220e63031c9d0df840f018b7617070726f76658c705f2f420707f8e19f84578f47c6fa5209b5243c70595317f327001de9132e201b3e632f2e06af82512db3c0702fe32f84113c705f2e068f8436e8ef101d30701f86370f864d401f86570f86670f867d32f01f868f848f823bef2e06fd401f869d200018e99d30701aef84621b0f2d06bf847a4f867f84601b1f86601db3c9131e2d1f849f846f845c8f841cf16f84201cbfff84301cb07f84401ca00cccbfff84701cb07f84801cb2fccc9ed540905018ce001d30701f843baf2e069d401f900f845f900baf2e069d32f01f848baf2e069d401f900f849f900baf2e069d20001f2e069d3070101d1f845521078f40e6fa1f2e06a58db3c070136d3070101d1f845521078f40e6fa1f2e06a5230c705f2e06a59db3c07026e8f335ced44ed45ed478e983170c88210afaf283e580402cb1fcb3fcb1f80108050db3ced67ed65ed64727fed118aed41edf101f2ffdb030a0802b4f844f2d07002aef84621b0f2d06bf847a4f867f84601b1f86670c8821082609bf62402cb1fcb3f80108050db3cdb3cf849f846f845c8f841cf16f84201cbfff84301cb07f84401ca00cccbfff84701cb07f84801cb2fccc9ed540a090180f847f843ba8eb6f84170f849c8821075097f5d580502cb1fcb3ff84201cbfff84801cb2ff84701cb07f845f90001cbff13cc128010810090db3c7ff8649130e20a00888e40c85801cb055004cf1658fa02547120ed44ed45ed479d5bc85003cf17c9127158cb6acced67ed65ed64737fed11977001cb6a01cf17ed41edf101f2ffc901fb00db05000c5f03840ff2f000c1a1c771da89a1f48003f0c3a7fe03f0c441ae9380011c2660dbf0c6dbf0c8dbf0cadbf0ccdbf0cedbf0d11c45a60e03f0c7a40003f0c9a803f0cba7fe03f0cda60e03f0cfa65e03f0d1a803f0d3a3c5f083f085f087f089f08bf08df08ff091f09326d3be81"
|
|
5
|
+
}
|
|
@@ -106,20 +106,23 @@ cell baseTest::prepare(tuple args) impure {
|
|
|
106
106
|
if (terminalIndices.tlen() > 1) {
|
|
107
107
|
test::throwError("Multiple terminal actions");
|
|
108
108
|
}
|
|
109
|
-
|
|
110
109
|
;; Check that the storage after running the handler matches the expected storage
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
110
|
+
if ($expectedStorage.cl::hash() != getContractStorage().cl::hash()) {
|
|
111
|
+
~strdump("Checking individual fields");
|
|
112
|
+
int wrongField = compareObjectFields(getContractStorage(), $expectedStorage);
|
|
113
|
+
if (wrongField == INVALID_CLASS_MEMBER) {
|
|
114
|
+
return (
|
|
115
|
+
TEST_FAILED,
|
|
116
|
+
"Storage and expected storage not of the same type"
|
|
117
|
+
);
|
|
118
|
+
} elseif (wrongField != -1) {
|
|
119
|
+
return (
|
|
120
|
+
TEST_FAILED,
|
|
121
|
+
"malformed field ".str::concatInt(wrongField)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
122
124
|
}
|
|
125
|
+
|
|
123
126
|
if (expectedTxnContext.tlen() != txnContext.tlen()) {
|
|
124
127
|
return (TEST_FAILED, "malformed txn context");
|
|
125
128
|
}
|
package/build/AllStorages.boc
DELETED
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"hash":"6d6d0eb607f83bff42fe6f29877b8ea8eb28c6fb8765d410a4e0426fae80ae70","hashBase64":"bW0Otgf4O/9C/m8ph3uOqOsoxvuHZdQQpOBCb66ArnA=","hex":"b5ee9c724202012c00010000375100000114ff00f4a413f4bcf2c80b00010201620002001c0202ca000300190201200004001302012000050008020120000600070001d400736807400740875d2c8b5d2d40cef5484ef44ac64d7c0dc238808300024d7c0dff81fdc24c8b0802754d035d214d075d23c0184ac007a0517c138a02012000090010020120000a000d020120000b000c00910875d24875d268205fa06f238c6342343616e6e6f7420636f6e636174656e6174653a20737472696e6720746f6f206c6f6e678083f850c3e406102ac3cbc37b21633c58073c5b2742000053c0220020120000e000f007722c20870402640a2c4b63c020068d63788700026600c3232c1f2743c0237a4c870802384c85eaa42298c3232c1f274007c02405eaa41007a0c7c026000053c02a002012000110012008d48b0821c000998030c8cb07c9d0f008de9321c2008e2c21a93803c10a9e21a93803a630c8cb07c9d001f0098e1021a93803a641a6f6c8cb07c9d001f009e201ab0301e831f0098001b4018b23a208f00901f00bfe1430802016e0014001803f7420c00398308b575696e74388e020c00499308b675696e7431368e020c00599308b675696e7433328e020c00699308b675696e7436348e020c0089a308b775696e743235368e020c00798308b5636f696e738e020c0089a308b7616464726573738e020c0099a308b7646963743235368e020c009e30220c009e30280015001600170012308b66f626a52656680014308b763656c6c52656680026c000968b4626f6f6c8e08b7756e6b6e6f776e80183521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba9130e0018307f45b30209993d0307f925b70f2ffda118e823088df801230201ce001a001b006f420f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba93307f6de08307f4866fa59101e05b7f6d80071521f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba935b7f6de0018307f47c6fa59101e05b7f6d8020120001d00b2020120001e0063020120001f0047020120002000340201200021002d020120002200230114ab5f705433334403db3c00de0201580024002c0201200025002901e3bba24807fa908aa0205807fa90422807fa908aa0203807fa90408d025aa0223aa025381a05361a05096b609c27f5385b6098103f8bcb1f2d27d2ac0008e31333920c80870d73017cf164708cf01705124a1532504103659d73412cf164104cf0122d74958a122d74a1023d732cf16c9e30e8002602fe34366f00708ef25303ba534bbab08e565303ba8e20c8533970d730cf16546a91cf0123d749539aa0a124d74a2559d732cf16126f8c8e2e530aba8e20c8533670d730cf16546761cf0123d7495367a0a124d74a2559d732cf16126f8c97c823cf16126f8ce2e2e30d22d74ac2009502d74cd002de01a4530abee6195f095301002700280074532870d7305398a070538ba12ba153165530d73424d7495378a0a125d74a2659d732c85003cf16546cb1cf0101cf16546871cf0101cf16126f8c00266f81c99322c2009802a55c6f8113ccc9e86c210117bbc8220736d6c4d677279088002a04fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2186f027550076f027301230118011c002b025c50066f0277706f0277706f0279886f027850086f027950076f027950066f027950056f0210374650103441306f0a0123011702e9a0b60841c185d1a1d54015bc09e14011bc09d5400dbc09e161bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c020120002e0033020120002f00300057a4bc03a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5020120003100320087a05887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a01e3a061640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be87888250075d30063a0cc620078a01230076a91770804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e28103fea00201200035003c020120003600390201200037003802e1a6f50480cecae89ae6ce98c486c4f0a006de04f2b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c02eba48904809ee0e8d2dedce68af0e8eaa008de04eaa006de04f2b0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c020148003a003b02e3a2220881cd95d1118dd1d94011bc09d9400dbc09e561bc09bc0db721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c02e5a3c608a10db541c985b5cde54011bc09e1400dbc09e161bc09bc0db721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c020120003d0042020120003e0041020158003f00400081bab830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e27074c8cb02ca07cbffc9d08006bbd320f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba973082104e554c4c94d0d70b4fe28006ba553002005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50201c70043004402ebb5f04809ae6ced8d2c492dcccdef0a008de04f2a006de04f2b0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c500118011c0119b7d0450e6dad886dedcdcf2070004504fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2136f0279586f02787001230118011c004602b86f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c0201200048005a02012000490050020120004a004f020120004b004d0103a621004c045c82384c7a526563765374737050036f0276586f0277706f0279886f0279886f0278706f0279886f0273706f026f0801230123012301170103a445004e017c82206c7a53656e6476706f0278706f0278706f027950066f0277500a6f027750096f027950086f027950076f027950056f02487010561059443049906f0901170166a81c532101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e201f01fdb3c01290201200051005902014800520056020120005300550103bf980054014a8238636f756e74496e63727550066f027350056f027950046f027750036f0277586f026f05011701cbba95d01d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e25922f90082f096a296d224f285c67bee93c30f8a309157f0daa35dc5b87e410b78630a09cfc7ba986c126d128307f41795028307f417e2db3c801290201200057005802ddba28210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e280118011c0009bdcd70bff80224a9f77f707f217f887f8824820193afed43d801230123020120005b0060020148005c005d02d7a4b50480e6cae882c8c8e4cae6e6f0b0de04de02db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c020120005e005f0103a38601160065f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50201200061006202eaa83182385263764d73676c69627850046f027850036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c02e6aa2982287365745172756d7650046f027650036f0276586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c0201200064008b02012000650074020120006600700201580067006f0201200068006e0103a0420069011682286368616e6e656c7904006a04fe82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2146f027950036f02785801230118011c006b033e6f02797f70547000705433334403db3c6f0276706f0279886f0276706f027900de0123006c03e08210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f02790118011c006d04f28210504f4f4f76716f0279c88409cf40c96f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e26f0279886f0277706f026f0b0118011c01230117006fa16c8be4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea61b049b44a0c1fd05e540a0c1fd05f8a02f5a5730480dae6cee4cac6cad2e0e8f2a00ade04eea008de04eea006de04e8b0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c0201200071007202daab1982204d64416464727950036f0278586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c0104ab970073018482306c6962536e64436277500c6f0277500b6f0279500a6f027950096f027950086f027450076f027350066f027450056f027350046f027950036f0273586f026f0b01170201200075007a020120007600790201580077007802d7a0f20901a5b9a5d14db5b10dbdb9e161bc09bc05b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c0097a0b0875d248b5d2b080486a4e00b0c02c64fcb15337882ac094c0afa596ea80b5c0406389944c75c0548d684135d33409208054cb3b50f604b2140133c0412a808533c07274006a80b5c0f8a02d0a86582204d644469637479586f026f016dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c020120007b008a020148007c007d02eba1ee088141858dad95d1e54011bc09e5400dbc09d961bc09e1c1bc09bc11b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c020120007e007f02d7b9982184d644f626a7950036f0279586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e280118011c0103bce80080019e01d07121d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e230780081019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e230740082019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200083019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201740084019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200085019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e20180200086019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2305530008703e88210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2010118011c0088039e20d74921d74ac10221a93802c000b0f2e5c720c0008e825b888eb221d74ac0009630c801cf16c9e06f009522d74ac2008ae86c21206f88a55c6f819321c2009901a501c953216f81cce86c21c9e258012300fc008902e882205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c0104a96f00a0020120008c00a4020120008d0099020120008e0098020120008f00920201200090009100dfa261640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a535c2ffdfe4cc1c1c38a016ba25887e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea3a0d6e21c25c060c1fd03dbe878a0123020120009300970103a386009401168228636f756e7465727907009504f882386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2176f024545790501230118011c00960438db3c126f0279886f0279886f0270706f027350056f02103441306f06009e01230123011702dfa2de08e1cd95d14db5b10d999ddd400dbc09dd61bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c00e6a8f52270830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e258ba0271804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e201bbb0020120009a009b02daabce82204174746573747850036f0276586f026f026dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c020120009c009d006ba56b060e05a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50103a7fd009e04708230626173654f41707078256f0275256f0279886f0277820186a06f0279886f0279886f0278706f0279500a6f027950096f020a7970500d012301230123009f03dadb3c1b6f021059104810374650104a103a102a6f0a6dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e200a00118011c01188230656e64706f696e74790200a104fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2126f027550046f027501230118011c00a2042a50036f0279886f0273706f0279886f0279886f027901230123012300a3042a886f0279886f0279886f0276706f0210ab109b6f0b012301230123011702015800a500a802012000a600a702eda4dce10440a0c2c6d6cae8f2a008de04f2a006de04ecb0de04f0e0de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c0103a5eb012902012000a900ad02015800aa00ac0103b8e800ab034a328220576f726b65727850046f0279886f0279886f027950046f027950056f024430126f0501230123011702e3b9c82206465706c6f797750046f027550036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e280118011c02014800ae00b102014800af00b002dfaaa08e14d95b99115c10d999de1400dbc09e161bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a00118011c03e3a9e08c195e1958dd5d1bdc80de40f6cf049bc09dd61bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a001160118011c02ebbec8240657874656e6465644d647950046f027950036f0278586f026f036dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e280118011c02012000b300ed02012000b400d302012000b500c602012000b600c302012000b700bc02012000b800b902dda6d704609c88e4e092e8cadaf0a006de04eeb0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c02012000ba00bb011da0f9fdc151c001c150cccd100f6cf200de02dfa0b608e185919135cd9d31a589e1400dbc09d561bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c02012000bd00c00201cb00be00bf02f1fc11c27b83a34b7b739ab18bc2802b7813c280237813c2801b7813c2c3781378236e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f140118011c0067b6f005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502012000c100c2006ba30e0c1c0b40069c4a9941729811cb5c935c2c05488a9819eb5c935c2c248700025cc48b5c90075c0e6d675d2341444b5c90075c0f8a02b3a139b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c02027300c400c5000dbe3c8cbffc9d080105bc6888012302012000c700cd02012000c800cb02015800c900ca02d7a09a0861c1add12591e5400dbc09d961bc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c0171a2be08a155b1b90dbdb999c14029bc09d54025bc09c14021bc09d9401dbc09c14019bc09e54015bc09c14011bc09e5400dbc09cd61bc09bc2601170104a8b400cc01648228706b7453656e747750096f027750086f027950076f027950066f027950056f027650046f027850036f0279586f026f08011702012000ce00d10104ab0900cf01f42480208e30eda2edfb01d0018e2220d74b20c0009c3031a93802c300f2d57adb31e0c301018103f8bdb1f2d57ad74cd0e430f2c57ad82380208e30eda2edfb01d0018e2220d74b20c0009c3031a93802c300f2d57adb31e0c301018103f8bdb1f2d57ad74cd0e430f2c57ad882384c7a5265637653747370500900d002fc6f027650086f027750076f027950066f027950056f027850046f027950036f0273586f026f086dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c01e6aab520c100f2d633217101d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2d02270804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e25320b9925f03e30e00d202605122a171c85d70d730cf16cb00840958a1a51270d732cf16c9d0d76171c858cf1622cf40c91024db3c017003a012db3c0129012902012000d400db02012000d500da02012000d600d902012000d700d80103a52b00de0073a7e443f20105e12d452da449e50b8cf7dd27861f146122afe1b546bb8b70fc8216f0c614139f8f753062db060fe81cdf432e03060fe81cdf43c502d0aa268220696e6974457079586f026f016dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c02cfaeda410c3737b731b2bb2c37813780b6e4378110b7c401e465a7b890394080af381049a984dcc5742f83361110b7889137c452906100f1804080af11e798d089e7a080e78b90e000c9b610e4c70c00e0014b80b7896480e664f010b789e48137896480e66664f1400118011c02012000dc00e202014800dd00df0121a4a2fee0a826002046e0a866668807b67900de016682304570436f6e6669677050096f027850086f027850076f027850066f027850056f027850046f027850036f0276586f026f08011702012000e000e10057a39c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a00cba299640740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d23880487e4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea60c5b60c1fd039be865c060c1fd039be878a02012000e300e602012000e400e5006ba41b004005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c502e9a66304709ac886d886e8e4c6e8f2a008de04f0a006de04eab0de04de06db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c02015800e700ea0103a04a00e801dc2173830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22272802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e2237100e900f8830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20470802002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e203c8cb3f13cb1f13cbffcb1fcbff71f90403011fa00609018dbdb9d1c9bdb1b195c9e41600eb04fc82386261736553746f726578586f0270706f0270706f0279886f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2156f027550046f027901230118011c00ec02d450036f0279586f0278706f0278706f026f066dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c02012000ee010702012000ef010102012000f000fe02012000f100f202eeaa108220436f6e6669677950056f027850046f027550036f0279586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c0104ab4700f3019cd07121d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2307800f4019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2017400f5019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000f6019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2017400f7019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000f8019a21d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e201802000f9019821d74922d74ac20121a93802c300b193f2c54cde20ab025302be965baa02d701018e265131d7015235a104d74cd0248201532ced43d812c85004cf0104aa0214cf01c9d001aa02d703e2553100fa03e88210706174687550056f027850046f027550036f0278586f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e2020118011c00fb03a020d74921d74ac10221a93802c000b0f2e5c720c0008e825b888eb221d74ac0009630c801cf16c9e06f009522d74ac2008ae86c21206f88a55c6f819321c2009901a501c953216f81cce86c21c9e25003012300fc00fd00d222d74cd020d7495303a08103f8bb9120958103f824a1e222d74ac2009a22d7498103f8bdf2d5c7de22d74ac10222c200b022a93802c000b0f2e5c7c8516570d73216cf16532570d730cf16136f8c21d74ac0005135a1c20013b09b20c80570d73114cf166f8c9133e203f082205061636b65747950046f027950036f0276586f0278706f026f046dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e27358db3c0118011c012902014800ff010000dda47642e1008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c54202e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c5a002e3ae49ae16018003006da404e205a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c58601020120010201040105ad48c001030148823053657445704366677050066f027850056f027850046f027850036f0276586f026f05011702012001050106006caa52830602d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20058ab7901d001a712a6505ca60472d724d70b015222a61072d724d70b0121c0009331d7489759d748d001d748e2020120010801130201200109010c020158010a010b03eda53f0470c4c2e6caa6e8dee4caf0b0de04e0e0de04e0e0de04f310de04de08db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c501230118011c02dba5d50450e6cae8a0cacae4eaa006de04f0b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c020120010d010e0008ab47ed44020120010f01120201200110011102f9a0d60841413d3d3dd9c5bc09e721c73d01491a84573d0610254012844f3d03244dbc09bc09b721bc0885be200f232d3dc481ca040579c0824d4c26e62ba17c19b08885bc4489be22948308078c020405788f3cc6844f3d04073c5c8700064db08726386007000a5c05bc4b240733278085bc4f2409bc4b24073333278a0118011c0057a10c0740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238a02dba5a30450e6cedcc8a4cae2f2a006de04f2b0de04de04db90de0442df100791969ee240e50202bce04126a6137315d0be0cd84442de2244df114a418403c6010202bc479e6342279e82039e2e43800326d843931c300380052e02de2592039993c042de279204de259203999993c50118011c0201200114011f0201200115011d034aa943820864766e037903db3c126f0276586f0279886f0276716f0276716f0276716f026f06011601230117025c824077726b436f7253746f727850036f0278706f0270706f0270706f0279886f027850066f021045103441306f060123011702b06dc86f02216f8803c8cb4f71207281015e7020935309b98ae85f066c22216f11226f88a520c201e30081015e23cf31a113cf4101cf1721c001936c21c98e1801c00297016f12c901ccc9e0216f13c9026f12c901ccccc9e20118011c03fc53806f81206f102020c10991ae923070e25350a08409bc8e133507a4702a6f885220be950ac86f8c0ade5085de24a427bc8e16343505a470742a6f885230be950ac86f8c0ade476604de21c1098e2021c0099d026f1153a76f81cc541a076f859d026f1153a76f81cc541a076f85e2e30d5098cb0328c200e30f02a410670119011a011b0022026f11b60b53a86f8123cf01541a086f85002a7327c00191709127e258cb015240cb09cb015038a0003438840925c00191709125e25009cb0118cb095210cb0101a44707033e21cf32c0008f0788885003cc12cc8e8d21cf32c0018e848858cc01de01e20101230123012301eeabed8ef2eda2edfb2073830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e22175830702d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e20277d8011e00c8804002d001a712a6505ca60472d724d70b015222a6067ad724d70b0921c000973122d72401d7039b59d748d05112d72401d703e222c00021c300b0955f0381072c8e2022c30001f823bbb0965b81027ddb31e020c30002bab0958103ebdb31e0810455e20201200120012402012001210122006ba6b7008005a0034e254ca0b94c08e5ae49ae1602a4454c0cf5ae49ae16124380012e6245ae4803ae0736b3ae91a0a225ae4803ae07c50105a63511012300000201580125012601f1a241740740069c4a9941729811cb5c935c2c05488a9841cb5c935c2c048700024cc75d225d675d2340075d238964826a535d24c1fe496dc3cbff684657232fff27437c8be4020bc25a8a5b4893ca1719efba4f0c3e28c2455fc36a8d7716e1f9042de18c28273f1eea58c9b60c1fd05a540a0c1fd05b8b6cf20129020158012701280005b7da1001cdb7242e403a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c4e2b1b67802e203a0034e254ca0b94c08e5ae49ae1602a4454c20e5ae49ae16024380012663ae912eb3ae91a003ae91c4ed919609999993f2010012902f402d001a712a6505ca60472d724d70b01532174d724d70b035da6067ad724d70b095244a61072d724d70b012120c10991ae923070e223c0009125955353d748d0e221c300927433dec821d74927b60822d74a5250b6082359d730cf1624c0098e16323334505503cc7023d74a5006a1a54350d73213cf16e30e22012a012b006404c0098e1431345055cc7023d74a5006a1a54350d73213cf168e163206b60b541026cf015035a022d74a1023d73113cf16e20048c2008e1bc9c822d749546351d730cf16cc7022d74a5004a1a513d732cf16c9936c21c9e2be784f5e"}
|