diff --git a/.github/workflows/ci-cd-main-branch-docker-images.yml b/.github/workflows/ci-cd-main-branch-docker-images.yml
index 2fbb28b0d2a..fd40202ffff 100644
--- a/.github/workflows/ci-cd-main-branch-docker-images.yml
+++ b/.github/workflows/ci-cd-main-branch-docker-images.yml
@@ -20,19 +20,9 @@ on:
workflow_dispatch:
jobs:
- define_matrix:
- runs-on: ubuntu-latest
- outputs:
- os: ${{ steps.os.outputs.os }}
-
- steps:
- - name: Define os
- id: os
- run: echo 'os=ubuntu-latest' >> "$GITHUB_OUTPUT"
Build:
- needs: define_matrix
- runs-on: ${{ needs.define_matrix.outputs.os }}
+ runs-on: ubuntu-latest
timeout-minutes: 45
outputs:
docker_build_tag: ${{ steps.built_tag_export.outputs.docker_build_tag }}
@@ -167,11 +157,3 @@ jobs:
fi
echo "Done."
done
-
- run-kurtosis-assertoor:
- needs: [define_matrix, Build]
- uses: erigontech/erigon/.github/workflows/test-kurtosis-assertoor.yml@main
- with:
- checkout_ref: ${{ github.sha }}
- os: ${{ needs.define_matrix.outputs.os }}
- docker_build_tag: ${{ needs.Build.outputs.docker_build_tag }}
diff --git a/.github/workflows/qa-rpc-integration-tests.yml b/.github/workflows/qa-rpc-integration-tests.yml
index c762eaabeb2..953e6c41dac 100644
--- a/.github/workflows/qa-rpc-integration-tests.yml
+++ b/.github/workflows/qa-rpc-integration-tests.yml
@@ -32,7 +32,7 @@ jobs:
- name: Checkout RPC Tests Repository & Install Requirements
run: |
rm -rf ${{ runner.workspace }}/rpc-tests
- git -c advice.detachedHead=false clone --depth 1 --branch v1.20.0 https://github.com/erigontech/rpc-tests ${{runner.workspace}}/rpc-tests
+ git -c advice.detachedHead=false clone --depth 1 --branch v1.22.0 https://github.com/erigontech/rpc-tests ${{runner.workspace}}/rpc-tests
cd ${{ runner.workspace }}/rpc-tests
pip3 install -r requirements.txt
diff --git a/.github/workflows/scripts/run_rpc_tests.sh b/.github/workflows/scripts/run_rpc_tests.sh
index 5dadc6ee7d8..64dfe5d1975 100755
--- a/.github/workflows/scripts/run_rpc_tests.sh
+++ b/.github/workflows/scripts/run_rpc_tests.sh
@@ -8,20 +8,10 @@ disabled_tests=(
trace_rawTransaction
# Erigon bug https://github.com/erigontech/erigon/issues/12603
erigon_getLatestLogs
- # created task https://github.com/erigontech/erigon/issues/12668 is merged
- debug_traceCallMany/test_02.tar
- debug_traceCallMany/test_04.tar
- debug_traceCallMany/test_05.tar
- debug_traceCallMany/test_06.tar
- debug_traceCallMany/test_07.tar
- debug_traceCallMany/test_09.json
- debug_traceCallMany/test_10.tar
# to investigate
engine_exchangeCapabilities/test_1.json
engine_exchangeTransitionConfigurationV1/test_01.json
engine_getClientVersionV1/test_1.json
- # waiting PR https://github.com/erigontech/rpc-tests/pull/298 to be merged
- trace_replayBlockTransactions/test_29.tar
# these tests requires Erigon active
admin_nodeInfo/test_01.json
admin_peers/test_01.json
diff --git a/README.md b/README.md
index cc704e6a28f..65d6aa75c67 100644
--- a/README.md
+++ b/README.md
@@ -207,7 +207,7 @@ du -hsc /erigon/snapshots/*
- **Store most of data in immutable files (segments/snapshots):**
- can symlink/mount latest state to fast drive and history to cheap drive
- `chaindata` is less than `15gb`. It's ok to `rm -rf chaindata`. (to prevent grow: recommend `--batchSize <= 1G`)
-- **`--prune` flags changed**: see `--prune.mode` (default: `archive`, full: `full`, EIP-4444: `minimal`)
+- **`--prune` flags changed**: see `--prune.mode` (default: `full`, archive: `archive`, EIP-4444: `minimal`)
- **Other changes:**
- ExecutionStage included many E2 stages: stage_hash_state, stage_trie, log_index, history_index, trace_index
- Restart doesn't loose much partial progress: `--sync.loop.block.limit=5_000` enabled by default
diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go
index 667309affa4..3645d0cc824 100644
--- a/accounts/abi/bind/backends/simulated.go
+++ b/accounts/abi/bind/backends/simulated.go
@@ -207,7 +207,7 @@ func (b *SimulatedBackend) CodeAt(ctx context.Context, contract libcommon.Addres
}
defer tx.Rollback()
stateDB := b.stateByBlockNumber(tx, blockNumber)
- return stateDB.GetCode(contract), nil
+ return stateDB.GetCode(contract)
}
// BalanceAt returns the wei balance of a certain account in the blockchain.
@@ -220,7 +220,7 @@ func (b *SimulatedBackend) BalanceAt(ctx context.Context, contract libcommon.Add
}
defer tx.Rollback()
stateDB := b.stateByBlockNumber(tx, blockNumber)
- return stateDB.GetBalance(contract), nil
+ return stateDB.GetBalance(contract)
}
// NonceAt returns the nonce of a certain account in the blockchain.
@@ -234,7 +234,7 @@ func (b *SimulatedBackend) NonceAt(ctx context.Context, contract libcommon.Addre
defer tx.Rollback()
stateDB := b.stateByBlockNumber(tx, blockNumber)
- return stateDB.GetNonce(contract), nil
+ return stateDB.GetNonce(contract)
}
// StorageAt returns the value of key in the storage of an account in the blockchain.
@@ -518,7 +518,7 @@ func (b *SimulatedBackend) PendingCodeAt(ctx context.Context, contract libcommon
b.mu.Lock()
defer b.mu.Unlock()
- return b.pendingState.GetCode(contract), nil
+ return b.pendingState.GetCode(contract)
}
func newRevertError(result *evmtypes.ExecutionResult) *revertError {
@@ -600,7 +600,7 @@ func (b *SimulatedBackend) PendingNonceAt(ctx context.Context, account libcommon
b.mu.Lock()
defer b.mu.Unlock()
- return b.pendingState.GetNonce(account), nil
+ return b.pendingState.GetNonce(account)
}
// SuggestGasPrice implements ContractTransactor.SuggestGasPrice. Since the simulated
@@ -628,7 +628,10 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs
}
// Recap the highest gas allowance with account's balance.
if call.GasPrice != nil && !call.GasPrice.IsZero() {
- balance := b.pendingState.GetBalance(call.From) // from can't be nil
+ balance, err := b.pendingState.GetBalance(call.From) // from can't be nil
+ if err != nil {
+ return 0, err
+ }
available := balance.ToBig()
if call.Value != nil {
if call.Value.ToBig().Cmp(available) >= 0 {
@@ -724,7 +727,10 @@ func (b *SimulatedBackend) callContract(_ context.Context, call ethereum.CallMsg
call.Value = new(uint256.Int)
}
// Set infinite balance to the fake caller account.
- from := statedb.GetOrNewStateObject(call.From)
+ from, err := statedb.GetOrNewStateObject(call.From)
+ if err != nil {
+ return nil, err
+ }
from.SetBalance(uint256.NewInt(0).SetAllOne(), tracing.BalanceChangeUnspecified)
// Execute the call.
msg := callMsg{call}
@@ -752,7 +758,10 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, txn types.Transa
if senderErr != nil {
return fmt.Errorf("invalid transaction: %w", senderErr)
}
- nonce := b.pendingState.GetNonce(sender)
+ nonce, err := b.pendingState.GetNonce(sender)
+ if err != nil {
+ return err
+ }
if txn.GetNonce() != nonce {
return fmt.Errorf("invalid transaction nonce: got %d, want %d", txn.GetNonce(), nonce)
}
diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go
index aec8ebd32b9..252fc2f03cd 100644
--- a/accounts/abi/bind/backends/simulated_test.go
+++ b/accounts/abi/bind/backends/simulated_test.go
@@ -153,7 +153,10 @@ func TestNewSimulatedBackend(t *testing.T) {
}
statedb := sim.stateByBlockNumber(tx, new(big.Int).SetUint64(num+1))
- bal := statedb.GetBalance(testAddr)
+ bal, err := statedb.GetBalance(testAddr)
+ if err != nil {
+ t.Fatal(err)
+ }
if !bal.Eq(expectedBal) {
t.Errorf("expected balance for test address not received. expected: %v actual: %v", expectedBal, bal)
}
diff --git a/cl/beacon/handler/subscription.go b/cl/beacon/handler/subscription.go
index 63e187fd79c..caa4041f32c 100644
--- a/cl/beacon/handler/subscription.go
+++ b/cl/beacon/handler/subscription.go
@@ -84,6 +84,7 @@ func (a *ApiHandler) PostEthV1ValidatorSyncCommitteeSubscriptions(w http.Respons
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
+ //cn()
}
// subscribe to subnets
diff --git a/cl/phase1/forkchoice/on_attestation.go b/cl/phase1/forkchoice/on_attestation.go
index 7544509b311..deeb757442a 100644
--- a/cl/phase1/forkchoice/on_attestation.go
+++ b/cl/phase1/forkchoice/on_attestation.go
@@ -56,7 +56,6 @@ func (f *ForkChoiceStore) OnAttestation(
return err
}
}
-
var attestationIndicies []uint64
var err error
target := data.Target
diff --git a/cl/phase1/forkchoice/on_attester_slashing.go b/cl/phase1/forkchoice/on_attester_slashing.go
index 9879ffece91..38263819d06 100644
--- a/cl/phase1/forkchoice/on_attester_slashing.go
+++ b/cl/phase1/forkchoice/on_attester_slashing.go
@@ -60,7 +60,6 @@ func (f *ForkChoiceStore) onProcessAttesterSlashing(attesterSlashing *cltypes.At
if !cltypes.IsSlashableAttestationData(attestation1.Data, attestation2.Data) {
return errors.New("attestation data is not slashable")
}
-
attestation1PublicKeys, err := getIndexedAttestationPublicKeys(s, attestation1)
if err != nil {
return err
diff --git a/cl/phase1/network/services/block_service.go b/cl/phase1/network/services/block_service.go
index ea1fe2d6597..8808111805d 100644
--- a/cl/phase1/network/services/block_service.go
+++ b/cl/phase1/network/services/block_service.go
@@ -155,7 +155,6 @@ func (b *blockService) ProcessMessage(ctx context.Context, _ *uint64, msg *cltyp
if msg.Block.Body.BlobKzgCommitments.Len() > int(b.beaconCfg.MaxBlobsPerBlock) {
return ErrInvalidCommitmentsCount
}
-
b.publishBlockGossipEvent(msg)
// the rest of the validation is done in the forkchoice store
if err := b.processAndStoreBlock(ctx, msg); err != nil {
diff --git a/cmd/devnet/services/polygon/proofgenerator.go b/cmd/devnet/services/polygon/proofgenerator.go
index 1ce9317b941..15d64c5ae56 100644
--- a/cmd/devnet/services/polygon/proofgenerator.go
+++ b/cmd/devnet/services/polygon/proofgenerator.go
@@ -33,7 +33,6 @@ import (
"github.com/erigontech/erigon-lib/common/hexutility"
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/trie"
"github.com/erigontech/erigon/accounts/abi/bind"
"github.com/erigontech/erigon/cl/merkle_tree"
"github.com/erigontech/erigon/cmd/devnet/devnet"
@@ -42,6 +41,7 @@ import (
bortypes "github.com/erigontech/erigon/polygon/bor/types"
"github.com/erigontech/erigon/rpc"
"github.com/erigontech/erigon/turbo/jsonrpc"
+ "github.com/erigontech/erigon/turbo/trie"
)
var ErrTokenIndexOutOfRange = errors.New("index is grater than the number of tokens in transaction")
diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go
index f36d6b37c9a..321da4344eb 100644
--- a/cmd/evm/runner.go
+++ b/cmd/evm/runner.go
@@ -171,7 +171,7 @@ func runCmd(ctx *cli.Context) error {
} else {
genesisConfig = new(types.Genesis)
}
- agg, err := state2.NewAggregator(context.Background(), datadir.New(os.TempDir()), config3.HistoryV3AggregationStep, db, log.New())
+ agg, err := state2.NewAggregator(context.Background(), datadir.New(os.TempDir()), config3.DefaultStepSize, db, log.New())
if err != nil {
return err
}
diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go
index b11683b638d..6b2270207bc 100644
--- a/cmd/evm/staterunner.go
+++ b/cmd/evm/staterunner.go
@@ -141,7 +141,7 @@ func aggregateResultsFromStateTests(
MustOpen()
defer _db.Close()
- agg, err := libstate.NewAggregator(context.Background(), dirs, config3.HistoryV3AggregationStep, _db, log.New())
+ agg, err := libstate.NewAggregator(context.Background(), dirs, config3.DefaultStepSize, _db, log.New())
if err != nil {
return nil, err
}
diff --git a/cmd/integration/commands/stages.go b/cmd/integration/commands/stages.go
index 7498e34ff63..d94f33d7f24 100644
--- a/cmd/integration/commands/stages.go
+++ b/cmd/integration/commands/stages.go
@@ -1342,7 +1342,7 @@ func allSnapshots(ctx context.Context, db kv.RoDB, logger log.Logger) (*freezebl
blockReader := freezeblocks.NewBlockReader(_allSnapshotsSingleton, _allBorSnapshotsSingleton, _heimdallStoreSingleton, _bridgeStoreSingleton)
txNums := rawdbv3.TxNums.WithCustomReadTxNumFunc(freezeblocks.ReadTxNumFuncFromBlockReader(ctx, blockReader))
- _aggSingleton, err = libstate.NewAggregator(ctx, dirs, config3.HistoryV3AggregationStep, db, logger)
+ _aggSingleton, err = libstate.NewAggregator(ctx, dirs, config3.DefaultStepSize, db, logger)
if err != nil {
panic(err)
}
diff --git a/cmd/pics/state.go b/cmd/pics/state.go
index e3c75c30275..99364e97e6b 100644
--- a/cmd/pics/state.go
+++ b/cmd/pics/state.go
@@ -35,7 +35,6 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/memdb"
"github.com/erigontech/erigon-lib/log/v3"
- "github.com/erigontech/erigon-lib/trie"
"github.com/erigontech/erigon/accounts/abi/bind"
"github.com/erigontech/erigon/accounts/abi/bind/backends"
"github.com/erigontech/erigon/cmd/pics/contracts"
@@ -44,6 +43,7 @@ import (
"github.com/erigontech/erigon/core/types"
"github.com/erigontech/erigon/params"
"github.com/erigontech/erigon/turbo/stages/mock"
+ "github.com/erigontech/erigon/turbo/trie"
)
/*func statePicture(t *trie.Trie, number int, keyCompression int, codeCompressed bool, valCompressed bool,
diff --git a/cmd/prometheus/dashboards/erigon.json b/cmd/prometheus/dashboards/erigon.json
index 78dc8885059..732cbe2338a 100644
--- a/cmd/prometheus/dashboards/erigon.json
+++ b/cmd/prometheus/dashboards/erigon.json
@@ -1199,6 +1199,333 @@
"title": "Block consume delay",
"type": "row"
},
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"arrival_delay\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "arrival_delay: {{instance}}",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"execution_duration\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "execution_duration: {{instance}}",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "wiggle_duration{instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "wiggle_duration: {{instance}}",
+ "range": true,
+ "refId": "C"
+ }
+ ],
+ "title": "Update fork delays",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"fork_depth\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "fork_depth: {{instance}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Update fork depth",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "waypoint_length{type=\"checkpoint\",instance=~\"$instance\"}",
+ "hide": false,
+ "legendFormat": "checkpoint_length: {{instance}}",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "waypoint_length{type=\"milestone\",instance=~\"$instance\"}",
+ "hide": false,
+ "legendFormat": "milestone_length: {{instance}}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Block finalisation",
+ "type": "timeseries"
+ },
{
"datasource": {
"type": "prometheus",
diff --git a/cmd/prometheus/dashboards/erigon_internals.json b/cmd/prometheus/dashboards/erigon_internals.json
index a38fa3565d3..1eda9d39e20 100644
--- a/cmd/prometheus/dashboards/erigon_internals.json
+++ b/cmd/prometheus/dashboards/erigon_internals.json
@@ -1453,6 +1453,333 @@
"title": "Block execution delays",
"type": "timeseries"
},
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"arrival_delay\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "arrival_delay: {{instance}}",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"execution_duration\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "execution_duration: {{instance}}",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "wiggle_duration{instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "wiggle_duration: {{instance}}",
+ "range": true,
+ "refId": "C"
+ }
+ ],
+ "title": "Update fork delays",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "update_fork_choice{type=\"fork_depth\",instance=~\"$instance\",quantile=\"$quantile\"}",
+ "hide": false,
+ "legendFormat": "fork_depth: {{instance}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Update fork depth",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green"
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 5,
+ "w": 8,
+ "x": 16,
+ "y": 25
+ },
+ "id": 201,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "pluginVersion": "11.2.0-74515",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "waypoint_length{type=\"checkpoint\",instance=~\"$instance\"}",
+ "hide": false,
+ "legendFormat": "checkpoint_length: {{instance}}",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "${DS_PROMETHEUS}"
+ },
+ "editorMode": "code",
+ "expr": "waypoint_length{type=\"milestone\",instance=~\"$instance\"}",
+ "hide": false,
+ "legendFormat": "milestone_length: {{instance}}",
+ "range": true,
+ "refId": "B"
+ }
+ ],
+ "title": "Block finalisation",
+ "type": "timeseries"
+ },
{
"datasource": {
"type": "prometheus",
diff --git a/cmd/rpcdaemon/cli/config.go b/cmd/rpcdaemon/cli/config.go
index 9e468f6a2ca..ac99e4c341e 100644
--- a/cmd/rpcdaemon/cli/config.go
+++ b/cmd/rpcdaemon/cli/config.go
@@ -426,7 +426,7 @@ func RemoteServices(ctx context.Context, cfg *httpcfg.HttpCfg, logger log.Logger
blockReader = freezeblocks.NewBlockReader(allSnapshots, allBorSnapshots, heimdallStore, bridgeStore)
txNumsReader := rawdbv3.TxNums.WithCustomReadTxNumFunc(freezeblocks.ReadTxNumFuncFromBlockReader(ctx, blockReader))
- agg, err := libstate.NewAggregator(ctx, cfg.Dirs, config3.HistoryV3AggregationStep, db, logger)
+ agg, err := libstate.NewAggregator(ctx, cfg.Dirs, config3.DefaultStepSize, db, logger)
if err != nil {
return nil, nil, nil, nil, nil, nil, nil, ff, nil, nil, fmt.Errorf("create aggregator: %w", err)
}
diff --git a/cmd/rpcdaemon/test.http b/cmd/rpcdaemon/test.http
index 929031c4ead..3a676aaaf3a 100644
--- a/cmd/rpcdaemon/test.http
+++ b/cmd/rpcdaemon/test.http
@@ -105,7 +105,8 @@ Content-Type: application/json
###
-# curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber", "params": ["0x1b4", true], "id":1}' localhost:8545
+
+# curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber", "params": ["0x141F644", true], "id":1}' localhost:8545
POST localhost:8545
Content-Type: application/json
diff --git a/cmd/state/exec3/state.go b/cmd/state/exec3/state.go
index 75868c51130..43b12c7ea94 100644
--- a/cmd/state/exec3/state.go
+++ b/cmd/state/exec3/state.go
@@ -132,6 +132,7 @@ func (rw *Worker) ResetTx(chainTx kv.Tx) {
func (rw *Worker) Run() error {
for txTask, ok := rw.in.Next(rw.ctx); ok; txTask, ok = rw.in.Next(rw.ctx) {
+ //fmt.Println("RTX", txTask.BlockNum, txTask.TxIndex, txTask.TxNum, txTask.Final)
rw.RunTxTask(txTask, rw.isMining)
if err := rw.resultCh.Add(rw.ctx, txTask); err != nil {
return err
diff --git a/cmd/verkle/main.go b/cmd/verkle/main.go
index c4030d80ff4..c9f2aa49b85 100644
--- a/cmd/verkle/main.go
+++ b/cmd/verkle/main.go
@@ -36,8 +36,8 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/cmd/verkle/verkletrie"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/eth/stagedsync/stages"
)
diff --git a/cmd/verkle/verkletrie/incrementAccount.go b/cmd/verkle/verkletrie/incrementAccount.go
index d714a9a5420..6618691dc9c 100644
--- a/cmd/verkle/verkletrie/incrementAccount.go
+++ b/cmd/verkle/verkletrie/incrementAccount.go
@@ -29,7 +29,7 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/common/debug"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func IncrementAccount(vTx kv.RwTx, tx kv.Tx, workers uint64, verkleWriter *VerkleTreeWriter, from, to uint64, tmpdir string) error {
diff --git a/cmd/verkle/verkletrie/pedersen_hashstate.go b/cmd/verkle/verkletrie/pedersen_hashstate.go
index 00569d2f660..edfbebba9ee 100644
--- a/cmd/verkle/verkletrie/pedersen_hashstate.go
+++ b/cmd/verkle/verkletrie/pedersen_hashstate.go
@@ -31,7 +31,7 @@ import (
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/debug"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func RegeneratePedersenAccounts(outTx kv.RwTx, readTx kv.Tx, workers uint64, verkleWriter *VerkleTreeWriter) error {
diff --git a/cmd/verkle/verkletrie/verkle_tree_writer.go b/cmd/verkle/verkletrie/verkle_tree_writer.go
index f93c58db382..40f74b8e2b2 100644
--- a/cmd/verkle/verkletrie/verkle_tree_writer.go
+++ b/cmd/verkle/verkletrie/verkle_tree_writer.go
@@ -31,9 +31,9 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/trie/vtree"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/rawdb"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/trie/vtree"
)
func int256ToVerkleFormat(x *uint256.Int, buffer []byte) {
diff --git a/cmd/verkle/verkletrie/workers.go b/cmd/verkle/verkletrie/workers.go
index ed572faa36e..0bd66244225 100644
--- a/cmd/verkle/verkletrie/workers.go
+++ b/cmd/verkle/verkletrie/workers.go
@@ -22,8 +22,8 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/holiman/uint256"
- "github.com/erigontech/erigon-lib/trie/vtree"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/trie/vtree"
)
type regeneratePedersenAccountsJob struct {
diff --git a/common/u256/big.go b/common/u256/big.go
new file mode 100644
index 00000000000..f03cba28ef7
--- /dev/null
+++ b/common/u256/big.go
@@ -0,0 +1,36 @@
+// Copyright 2014 The go-ethereum Authors
+// (original work)
+// Copyright 2024 The Erigon Authors
+// (modifications)
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package u256
+
+import (
+ "github.com/holiman/uint256"
+)
+
+// Common big integers often used
+var (
+ Num0 = uint256.NewInt(0)
+ Num1 = uint256.NewInt(1)
+ Num2 = uint256.NewInt(2)
+ Num4 = uint256.NewInt(4)
+ Num8 = uint256.NewInt(8)
+ Num27 = uint256.NewInt(27)
+ Num32 = uint256.NewInt(32)
+ Num35 = uint256.NewInt(35)
+)
diff --git a/consensus/aura/aura_test.go b/consensus/aura/aura_test.go
index f95e5815693..b26c59a0c49 100644
--- a/consensus/aura/aura_test.go
+++ b/consensus/aura/aura_test.go
@@ -30,13 +30,13 @@ import (
"github.com/erigontech/erigon-lib/kv/memdb"
"github.com/erigontech/erigon-lib/log/v3"
- "github.com/erigontech/erigon-lib/trie"
"github.com/erigontech/erigon/accounts/abi"
"github.com/erigontech/erigon/consensus/aura"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
"github.com/erigontech/erigon/turbo/stages/mock"
+ "github.com/erigontech/erigon/turbo/trie"
)
// Check that the first block of Gnosis Chain, which doesn't have any transactions,
diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go
index c72202bb31b..413242b2415 100644
--- a/consensus/clique/clique.go
+++ b/consensus/clique/clique.go
@@ -44,11 +44,11 @@ import (
"github.com/erigontech/erigon-lib/kv/dbutils"
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/tracing"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm/evmtypes"
"github.com/erigontech/erigon/params"
"github.com/erigontech/erigon/rpc"
diff --git a/consensus/consensus.go b/consensus/consensus.go
index 0429f57e335..0ed3552cfbd 100644
--- a/consensus/consensus.go
+++ b/consensus/consensus.go
@@ -205,9 +205,12 @@ type PoW interface {
}
// Transfer subtracts amount from sender and adds amount to recipient using the given Db
-func Transfer(db evmtypes.IntraBlockState, sender, recipient libcommon.Address, amount *uint256.Int, bailout bool) {
+func Transfer(db evmtypes.IntraBlockState, sender, recipient libcommon.Address, amount *uint256.Int, bailout bool) error {
if !bailout {
- db.SubBalance(sender, amount, tracing.BalanceChangeTransfer)
+ err := db.SubBalance(sender, amount, tracing.BalanceChangeTransfer)
+ if err != nil {
+ return err
+ }
}
- db.AddBalance(recipient, amount, tracing.BalanceChangeTransfer)
+ return db.AddBalance(recipient, amount, tracing.BalanceChangeTransfer)
}
diff --git a/consensus/misc/dao.go b/consensus/misc/dao.go
index fd02f56bfdc..c5671bb08b6 100644
--- a/consensus/misc/dao.go
+++ b/consensus/misc/dao.go
@@ -73,15 +73,24 @@ func VerifyDAOHeaderExtraData(config *chain.Config, header *types.Header) error
// ApplyDAOHardFork modifies the state database according to the DAO hard-fork
// rules, transferring all balances of a set of DAO accounts to a single refund
// contract.
-func ApplyDAOHardFork(statedb *state.IntraBlockState) {
+func ApplyDAOHardFork(statedb *state.IntraBlockState) error {
// Retrieve the contract to refund balances into
- if !statedb.Exist(params.DAORefundContract) {
+ exist, err := statedb.Exist(params.DAORefundContract)
+ if err != nil {
+ return err
+ }
+ if !exist {
statedb.CreateAccount(params.DAORefundContract, false)
}
// Move every DAO account and extra-balance account funds into the refund contract
for _, addr := range params.DAODrainList() {
- statedb.AddBalance(params.DAORefundContract, statedb.GetBalance(addr), tracing.BalanceIncreaseDaoContract)
+ balance, err := statedb.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ statedb.AddBalance(params.DAORefundContract, balance, tracing.BalanceIncreaseDaoContract)
statedb.SetBalance(addr, new(uint256.Int), tracing.BalanceDecreaseDaoAccount)
}
+ return nil
}
diff --git a/consensus/misc/eip2935.go b/consensus/misc/eip2935.go
index 460c95f4b39..de3078e0a34 100644
--- a/consensus/misc/eip2935.go
+++ b/consensus/misc/eip2935.go
@@ -29,21 +29,25 @@ import (
"github.com/erigontech/erigon/params"
)
-func StoreBlockHashesEip2935(header *types.Header, state *state.IntraBlockState, config *chain.Config, headerReader consensus.ChainHeaderReader) {
- if state.GetCodeSize(params.HistoryStorageAddress) == 0 {
+func StoreBlockHashesEip2935(header *types.Header, state *state.IntraBlockState, config *chain.Config, headerReader consensus.ChainHeaderReader) error {
+ codeSize, err := state.GetCodeSize(params.HistoryStorageAddress)
+ if err != nil {
+ return err
+ }
+ if codeSize == 0 {
log.Debug("[EIP-2935] No code deployed to HistoryStorageAddress before call to store EIP-2935 history")
- return
+ return nil
}
headerNum := header.Number.Uint64()
if headerNum == 0 { // Activation of fork at Genesis
- return
+ return nil
}
- storeHash(headerNum-1, header.ParentHash, state)
+ return storeHash(headerNum-1, header.ParentHash, state)
}
-func storeHash(num uint64, hash libcommon.Hash, state *state.IntraBlockState) {
+func storeHash(num uint64, hash libcommon.Hash, state *state.IntraBlockState) error {
slotNum := num % params.BlockHashHistoryServeWindow
storageSlot := libcommon.BytesToHash(uint256.NewInt(slotNum).Bytes())
parentHashInt := uint256.NewInt(0).SetBytes32(hash.Bytes())
- state.SetState(params.HistoryStorageAddress, &storageSlot, *parentHashInt)
+ return state.SetState(params.HistoryStorageAddress, &storageSlot, *parentHashInt)
}
diff --git a/core/chain_makers.go b/core/chain_makers.go
index 3b31c8b6ff2..4ce7ea744cc 100644
--- a/core/chain_makers.go
+++ b/core/chain_makers.go
@@ -35,12 +35,12 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/rlp"
libstate "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/consensus/merge"
"github.com/erigontech/erigon/consensus/misc"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm"
"github.com/erigontech/erigon/params"
"github.com/erigontech/erigon/polygon/heimdall"
@@ -176,10 +176,18 @@ func (b *BlockGen) AddUncheckedReceipt(receipt *types.Receipt) {
// TxNonce returns the next valid transaction nonce for the
// account at addr. It panics if the account does not exist.
func (b *BlockGen) TxNonce(addr libcommon.Address) uint64 {
- if !b.ibs.Exist(addr) {
+ exist, err := b.ibs.Exist(addr)
+ if err != nil {
+ panic(fmt.Sprintf("can't get account: %s", err))
+ }
+ if !exist {
panic("account does not exist")
}
- return b.ibs.GetNonce(addr)
+ nonce, err := b.ibs.GetNonce(addr)
+ if err != nil {
+ panic(fmt.Sprintf("can't get account: %s", err))
+ }
+ return nonce
}
// AddUncle adds an uncle header to the generated block.
diff --git a/core/evm.go b/core/evm.go
index 34dcd500316..2f6dc320a5d 100644
--- a/core/evm.go
+++ b/core/evm.go
@@ -138,6 +138,10 @@ func GetHashFn(ref *types.Header, getHeader func(hash libcommon.Hash, number uin
// CanTransfer checks whether there are enough funds in the address' account to make a transfer.
// This does not take the necessary gas in to account to make the transfer valid.
-func CanTransfer(db evmtypes.IntraBlockState, addr libcommon.Address, amount *uint256.Int) bool {
- return !db.GetBalance(addr).Lt(amount)
+func CanTransfer(db evmtypes.IntraBlockState, addr libcommon.Address, amount *uint256.Int) (bool, error) {
+ balance, err := db.GetBalance(addr)
+ if err != nil {
+ return false, err
+ }
+ return !balance.Lt(amount), nil
}
diff --git a/core/genesis_test.go b/core/genesis_test.go
index 83c4820dfc9..413130ad026 100644
--- a/core/genesis_test.go
+++ b/core/genesis_test.go
@@ -155,9 +155,11 @@ func TestAllocConstructor(t *testing.T) {
reader, err := rpchelper.CreateHistoryStateReader(tx, rawdbv3.TxNums, 1, 0, genSpec.Config.ChainName)
require.NoError(err)
state := state.New(reader)
- balance := state.GetBalance(address)
+ balance, err := state.GetBalance(address)
+ assert.NoError(err)
assert.Equal(funds, balance.ToBig())
- code := state.GetCode(address)
+ code, err := state.GetCode(address)
+ assert.NoError(err)
assert.Equal(common.FromHex("5f355f55"), code)
key0 := libcommon.HexToHash("0000000000000000000000000000000000000000000000000000000000000000")
diff --git a/core/genesis_write.go b/core/genesis_write.go
index a7820b4aa61..02e5a3f81ce 100644
--- a/core/genesis_write.go
+++ b/core/genesis_write.go
@@ -506,7 +506,7 @@ func GenesisToBlock(g *types.Genesis, dirs datadir.Dirs, logger log.Logger) (*ty
genesisTmpDB := mdbx.New(kv.TemporaryDB, logger).InMem(dirs.DataDir).MapSize(2 * datasize.GB).GrowthStep(1 * datasize.MB).MustOpen()
defer genesisTmpDB.Close()
- agg, err := state2.NewAggregator(context.Background(), dirs, config3.HistoryV3AggregationStep, genesisTmpDB, logger)
+ agg, err := state2.NewAggregator(context.Background(), dirs, config3.DefaultStepSize, genesisTmpDB, logger)
if err != nil {
return err
}
diff --git a/core/rawdb/rawdbhelpers/rawdbhelpers.go b/core/rawdb/rawdbhelpers/rawdbhelpers.go
index e731db8a616..53a5970df75 100644
--- a/core/rawdb/rawdbhelpers/rawdbhelpers.go
+++ b/core/rawdb/rawdbhelpers/rawdbhelpers.go
@@ -30,7 +30,7 @@ func IdxStepsCountV3(tx kv.Tx) float64 {
fstTxNum := binary.BigEndian.Uint64(fst)
lstTxNum := binary.BigEndian.Uint64(lst)
- return float64(lstTxNum-fstTxNum) / float64(config3.HistoryV3AggregationStep)
+ return float64(lstTxNum-fstTxNum) / float64(config3.DefaultStepSize)
}
return 0
}
diff --git a/core/state/cached_reader.go b/core/state/cached_reader.go
index fba1496474b..629c1d0da09 100644
--- a/core/state/cached_reader.go
+++ b/core/state/cached_reader.go
@@ -19,7 +19,7 @@ package state
import (
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/turbo/shards"
)
diff --git a/core/state/cached_reader3.go b/core/state/cached_reader3.go
index b8ceec09f76..81f2e18a7d6 100644
--- a/core/state/cached_reader3.go
+++ b/core/state/cached_reader3.go
@@ -23,7 +23,7 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/kvcache"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
// CachedReader3 is a wrapper for an instance of type StateReader
diff --git a/core/state/cached_writer.go b/core/state/cached_writer.go
index b3b6850080d..db832e4475f 100644
--- a/core/state/cached_writer.go
+++ b/core/state/cached_writer.go
@@ -21,7 +21,7 @@ import (
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/turbo/shards"
)
diff --git a/core/state/database.go b/core/state/database.go
index eccdc195b2d..f99f7516451 100644
--- a/core/state/database.go
+++ b/core/state/database.go
@@ -25,7 +25,7 @@ import (
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
const (
diff --git a/core/state/database_test.go b/core/state/database_test.go
index 83d36886e5f..0e2b776c8bd 100644
--- a/core/state/database_test.go
+++ b/core/state/database_test.go
@@ -133,10 +133,14 @@ func TestCreate2Revive(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -150,7 +154,9 @@ func TestCreate2Revive(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
return nil
@@ -166,7 +172,9 @@ func TestCreate2Revive(t *testing.T) {
var check2 uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected create2address to exist at the block 2", create2address.String())
}
// We expect number 0x42 in the position [2], because it is the block number 2
@@ -185,7 +193,9 @@ func TestCreate2Revive(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected create2address to be self-destructed at the block 3", create2address.String())
}
return nil
@@ -198,7 +208,9 @@ func TestCreate2Revive(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected create2address to exist at the block 2", create2address.String())
}
// We expect number 0x42 in the position [4], because it is the block number 4
@@ -339,10 +351,14 @@ func TestCreate2Polymorth(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -355,9 +371,10 @@ func TestCreate2Polymorth(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
-
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
return nil
@@ -371,15 +388,25 @@ func TestCreate2Polymorth(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected create2address to exist at the block 2", create2address.String())
}
- if !bytes.Equal(st.GetCode(create2address), common.FromHex("6002ff")) {
- t.Errorf("Expected CREATE2 deployed code 6002ff, got %x", st.GetCode(create2address))
+ code, err := st.GetCode(create2address)
+ if err != nil {
+ return err
+ }
+ if !bytes.Equal(code, common.FromHex("6002ff")) {
+ t.Errorf("Expected CREATE2 deployed code 6002ff, got %x", code)
}
if !m.HistoryV3 { //AccountsDomain: has no "incarnation" concept
- if st.GetIncarnation(create2address) != 1 {
- t.Errorf("expected incarnation 1, got %d", st.GetIncarnation(create2address))
+ incarnation, err := st.GetIncarnation(create2address)
+ if err != nil {
+ return err
+ }
+ if incarnation != 1 {
+ t.Errorf("expected incarnation 1, got %d", incarnation)
}
}
return nil
@@ -392,7 +419,9 @@ func TestCreate2Polymorth(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected create2address to be self-destructed at the block 3", create2address.String())
}
return nil
@@ -405,15 +434,25 @@ func TestCreate2Polymorth(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected create2address to exist at the block 4", create2address.String())
}
- if !bytes.Equal(st.GetCode(create2address), common.FromHex("6004ff")) {
- t.Errorf("Expected CREATE2 deployed code 6004ff, got %x", st.GetCode(create2address))
+ code, err := st.GetCode(create2address)
+ if err != nil {
+ return err
+ }
+ if !bytes.Equal(code, common.FromHex("6004ff")) {
+ t.Errorf("Expected CREATE2 deployed code 6004ff, got %x", code)
}
if !m.HistoryV3 { //AccountsDomain: has no "incarnation" concept
- if st.GetIncarnation(create2address) != 2 {
- t.Errorf("expected incarnation 2, got %d", st.GetIncarnation(create2address))
+ incarnation, err := st.GetIncarnation(create2address)
+ if err != nil {
+ return err
+ }
+ if incarnation != 2 {
+ t.Errorf("expected incarnation 2, got %d", incarnation)
}
}
return nil
@@ -426,16 +465,26 @@ func TestCreate2Polymorth(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(create2address) {
+ if exist, err := st.Exist(create2address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected create2address to exist at the block 5", create2address.String())
}
- if !bytes.Equal(st.GetCode(create2address), common.FromHex("6005ff")) {
- t.Errorf("Expected CREATE2 deployed code 6005ff, got %x", st.GetCode(create2address))
+ code, err := st.GetCode(create2address)
+ if err != nil {
+ return err
+ }
+ if !bytes.Equal(code, common.FromHex("6005ff")) {
+ t.Errorf("Expected CREATE2 deployed code 6005ff, got %x", code)
}
if !m.HistoryV3 { //AccountsDomain: has no "incarnation" concept
- if st.GetIncarnation(create2address) != 4 {
- t.Errorf("expected incarnation 4 (two self-destructs and two-recreations within a block), got %d", st.GetIncarnation(create2address))
+ incarnation, err := st.GetIncarnation(create2address)
+ if err != nil {
+ return err
+ }
+ if incarnation != 4 {
+ t.Errorf("expected incarnation 4 (two self-destructs and two-recreations within a block), got %d", incarnation)
}
}
return nil
@@ -532,10 +581,14 @@ func TestReorgOverSelfDestruct(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -550,7 +603,10 @@ func TestReorgOverSelfDestruct(t *testing.T) {
var correctValueX uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
+
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
@@ -567,7 +623,9 @@ func TestReorgOverSelfDestruct(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist at the block 3", contractAddress.String())
}
return nil
@@ -579,7 +637,9 @@ func TestReorgOverSelfDestruct(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 4", contractAddress.String())
}
var valueX uint256.Int
@@ -672,10 +732,15 @@ func TestReorgOverStateChange(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
+
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -691,7 +756,10 @@ func TestReorgOverStateChange(t *testing.T) {
var correctValueX uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
+
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
@@ -712,7 +780,9 @@ func TestReorgOverStateChange(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 4", contractAddress.String())
}
@@ -802,7 +872,9 @@ func TestCreateOnExistingStorage(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
if contractAddress != contractAddr {
@@ -821,7 +893,9 @@ func TestCreateOnExistingStorage(t *testing.T) {
var check0 uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
@@ -948,14 +1022,18 @@ func TestEip2200Gas(t *testing.T) {
var balanceBefore *uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
- balanceBefore = st.GetBalance(address)
- return nil
+ balanceBefore, err = st.GetBalance(address)
+ return err
})
require.NoError(t, err)
@@ -966,10 +1044,15 @@ func TestEip2200Gas(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
- balanceAfter := st.GetBalance(address)
+ balanceAfter, err := st.GetBalance(address)
+ if err != nil {
+ return err
+ }
gasSpent := big.NewInt(0).Sub(balanceBefore.ToBig(), balanceAfter.ToBig())
expectedGasSpent := big.NewInt(190373) //(192245) // In the incorrect version, it is 179645
if gasSpent.Cmp(expectedGasSpent) != 0 {
@@ -1036,10 +1119,14 @@ func TestWrongIncarnation(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -1066,7 +1153,9 @@ func TestWrongIncarnation(t *testing.T) {
}
st := state.New(stateReader)
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
return nil
@@ -1186,7 +1275,9 @@ func TestWrongIncarnation2(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ if exist, err := st.Exist(address); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected account to exist")
}
return nil
@@ -1205,7 +1296,9 @@ func TestWrongIncarnation2(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(contractAddress) {
+ if exist, err := st.Exist(contractAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.String())
}
@@ -1533,7 +1626,9 @@ func TestRecreateAndRewind(t *testing.T) {
var check0 uint256.Int
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(phoenixAddress) {
+ if exist, err := st.Exist(phoenixAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Errorf("expected phoenix %x to exist after first insert", phoenixAddress)
}
@@ -1552,7 +1647,9 @@ func TestRecreateAndRewind(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(phoenixAddress) {
+ if exist, err := st.Exist(phoenixAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Errorf("expected phoenix %x to exist after second insert", phoenixAddress)
}
@@ -1570,7 +1667,9 @@ func TestRecreateAndRewind(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(phoenixAddress) {
+ if exist, err := st.Exist(phoenixAddress); err != nil {
+ t.Error(err)
+ } else if !exist {
t.Errorf("expected phoenix %x to exist after second insert", phoenixAddress)
}
diff --git a/core/state/dump.go b/core/state/dump.go
index aced41f6052..884a64d5f92 100644
--- a/core/state/dump.go
+++ b/core/state/dump.go
@@ -31,8 +31,8 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/order"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
- "github.com/erigontech/erigon-lib/trie"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/trie"
)
type Dumper struct {
diff --git a/core/state/history_reader_v3.go b/core/state/history_reader_v3.go
index 05db794cb5f..d404d1ba82d 100644
--- a/core/state/history_reader_v3.go
+++ b/core/state/history_reader_v3.go
@@ -22,7 +22,7 @@ import (
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
// HistoryReaderV3 Implements StateReader and StateWriter
diff --git a/core/state/intra_block_state.go b/core/state/intra_block_state.go
index 721bf2b574c..854d1a733d7 100644
--- a/core/state/intra_block_state.go
+++ b/core/state/intra_block_state.go
@@ -31,11 +31,11 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/u256"
"github.com/erigontech/erigon-lib/crypto"
- "github.com/erigontech/erigon-lib/trie"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/tracing"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm/evmtypes"
+ "github.com/erigontech/erigon/turbo/trie"
)
var _ evmtypes.IntraBlockState = new(IntraBlockState) // compile-time interface-check
@@ -126,12 +126,14 @@ func (sdb *IntraBlockState) SetTrace(trace bool) {
}
// setErrorUnsafe sets error but should be called in medhods that already have locks
+// Deprecated: The IBS api now returns errors directly
func (sdb *IntraBlockState) setErrorUnsafe(err error) {
if sdb.savedErr == nil {
sdb.savedErr = err
}
}
+// Deprecated: The IBS api now returns errors directly
func (sdb *IntraBlockState) Error() error {
return sdb.savedErr
}
@@ -230,36 +232,47 @@ func (sdb *IntraBlockState) SubRefund(gas uint64) {
// Exist reports whether the given account address exists in the state.
// Notably this also returns true for suicided accounts.
-func (sdb *IntraBlockState) Exist(addr libcommon.Address) bool {
- s := sdb.getStateObject(addr)
- return s != nil && !s.deleted
+func (sdb *IntraBlockState) Exist(addr libcommon.Address) (bool, error) {
+ s, err := sdb.getStateObject(addr)
+ if err != nil {
+ return false, err
+ }
+ return s != nil && !s.deleted, err
}
// Empty returns whether the state object is either non-existent
// or empty according to the EIP161 specification (balance = nonce = code = 0)
-func (sdb *IntraBlockState) Empty(addr libcommon.Address) bool {
- so := sdb.getStateObject(addr)
- return so == nil || so.deleted || so.empty()
+func (sdb *IntraBlockState) Empty(addr libcommon.Address) (bool, error) {
+ so, err := sdb.getStateObject(addr)
+ if err != nil {
+ return false, err
+ }
+ return so == nil || so.deleted || so.empty(), nil
}
// GetBalance retrieves the balance from the given address or 0 if object not found
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetBalance(addr libcommon.Address) *uint256.Int {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetBalance(addr libcommon.Address) (*uint256.Int, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return nil, err
+ }
if stateObject != nil && !stateObject.deleted {
- return stateObject.Balance()
+ return stateObject.Balance(), nil
}
- return u256.Num0
+ return u256.Num0, nil
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetNonce(addr libcommon.Address) uint64 {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetNonce(addr libcommon.Address) (uint64, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return 0, err
+ }
if stateObject != nil && !stateObject.deleted {
- return stateObject.Nonce()
+ return stateObject.Nonce(), nil
}
-
- return 0
+ return 0, nil
}
// TxIndex returns the current transaction index set by Prepare.
@@ -268,117 +281,157 @@ func (sdb *IntraBlockState) TxnIndex() int {
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetCode(addr libcommon.Address) []byte {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetCode(addr libcommon.Address) ([]byte, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return nil, err
+ }
if stateObject != nil && !stateObject.deleted {
if sdb.trace {
fmt.Printf("GetCode %x, returned %d\n", addr, len(stateObject.Code()))
}
- return stateObject.Code()
+ return stateObject.Code(), nil
}
if sdb.trace {
fmt.Printf("GetCode %x, returned nil\n", addr)
}
- return nil
+ return nil, nil
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetCodeSize(addr libcommon.Address) int {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetCodeSize(addr libcommon.Address) (int, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return 0, err
+ }
if stateObject == nil || stateObject.deleted {
- return 0
+ return 0, nil
}
if stateObject.code != nil {
- return len(stateObject.code)
+ return len(stateObject.code), nil
}
l, err := sdb.stateReader.ReadAccountCodeSize(addr, stateObject.data.Incarnation, stateObject.data.CodeHash)
if err != nil {
sdb.setErrorUnsafe(err)
+ return l, err
}
- return l
+ return l, err
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetCodeHash(addr libcommon.Address) libcommon.Hash {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetCodeHash(addr libcommon.Address) (libcommon.Hash, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return libcommon.Hash{}, err
+ }
if stateObject == nil || stateObject.deleted {
- return libcommon.Hash{}
+ return libcommon.Hash{}, nil
}
- return stateObject.data.CodeHash
+ return stateObject.data.CodeHash, nil
}
-func (sdb *IntraBlockState) ResolveCodeHash(addr libcommon.Address) libcommon.Hash {
+func (sdb *IntraBlockState) ResolveCodeHash(addr libcommon.Address) (libcommon.Hash, error) {
// eip-7702
- if dd, ok := sdb.GetDelegatedDesignation(addr); ok {
+ dd, ok, err := sdb.GetDelegatedDesignation(addr)
+
+ if ok {
return sdb.GetCodeHash(dd)
}
+ if err != nil {
+ return libcommon.Hash{}, err
+ }
+
return sdb.GetCodeHash(addr)
}
-func (sdb *IntraBlockState) ResolveCode(addr libcommon.Address) []byte {
+func (sdb *IntraBlockState) ResolveCode(addr libcommon.Address) ([]byte, error) {
// eip-7702
- if dd, ok := sdb.GetDelegatedDesignation(addr); ok {
+ dd, ok, err := sdb.GetDelegatedDesignation(addr)
+ if ok {
return sdb.GetCode(dd)
}
-
+ if err != nil {
+ return nil, err
+ }
return sdb.GetCode(addr)
}
-func (sdb *IntraBlockState) ResolveCodeSize(addr libcommon.Address) int {
+func (sdb *IntraBlockState) ResolveCodeSize(addr libcommon.Address) (int, error) {
// eip-7702
- size := sdb.GetCodeSize(addr)
+ size, err := sdb.GetCodeSize(addr)
+ if err != nil {
+ return 0, err
+ }
if size == types.DelegateDesignationCodeSize {
// might be delegated designation
- return len(sdb.ResolveCode(addr))
+ code, err := sdb.ResolveCode(addr)
+ if err != nil {
+ return 0, err
+ }
+ return len(code), nil
}
- return size
+ return size, nil
}
-func (sdb *IntraBlockState) GetDelegatedDesignation(addr libcommon.Address) (libcommon.Address, bool) {
+func (sdb *IntraBlockState) GetDelegatedDesignation(addr libcommon.Address) (libcommon.Address, bool, error) {
// eip-7702
- code := sdb.GetCode(addr)
+ code, err := sdb.GetCode(addr)
+ if err != nil {
+ return EmptyAddress, false, err
+ }
if delegation, ok := types.ParseDelegation(code); ok {
- return delegation, true
+ return delegation, true, nil
}
- return EmptyAddress, false
+ return EmptyAddress, false, nil
}
// GetState retrieves a value from the given account's storage trie.
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetState(addr libcommon.Address, key *libcommon.Hash, value *uint256.Int) {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetState(addr libcommon.Address, key *libcommon.Hash, value *uint256.Int) error {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil && !stateObject.deleted {
stateObject.GetState(key, value)
} else {
value.Clear()
}
+ return nil
}
// GetCommittedState retrieves a value from the given account's committed storage trie.
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) GetCommittedState(addr libcommon.Address, key *libcommon.Hash, value *uint256.Int) {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetCommittedState(addr libcommon.Address, key *libcommon.Hash, value *uint256.Int) error {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil && !stateObject.deleted {
stateObject.GetCommittedState(key, value)
} else {
value.Clear()
}
+ return nil
}
-func (sdb *IntraBlockState) HasSelfdestructed(addr libcommon.Address) bool {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) HasSelfdestructed(addr libcommon.Address) (bool, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return false, err
+ }
if stateObject == nil {
- return false
+ return false, nil
}
if stateObject.deleted {
- return false
+ return false, nil
}
if stateObject.createdContract {
- return false
+ return false, nil
}
- return stateObject.selfdestructed
+ return stateObject.selfdestructed, nil
}
/*
@@ -387,7 +440,7 @@ func (sdb *IntraBlockState) HasSelfdestructed(addr libcommon.Address) bool {
// AddBalance adds amount to the account associated with addr.
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) AddBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) {
+func (sdb *IntraBlockState) AddBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) error {
if sdb.trace {
fmt.Printf("AddBalance %x, %d\n", addr, amount)
}
@@ -424,82 +477,117 @@ func (sdb *IntraBlockState) AddBalance(addr libcommon.Address, amount *uint256.I
bi.increase.Add(&bi.increase, amount)
bi.count++
- return
+ return nil
}
- stateObject := sdb.GetOrNewStateObject(addr)
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
stateObject.AddBalance(amount, reason)
+ return nil
}
// SubBalance subtracts amount from the account associated with addr.
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) SubBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) {
+func (sdb *IntraBlockState) SubBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) error {
if sdb.trace {
fmt.Printf("SubBalance %x, %d\n", addr, amount)
}
- stateObject := sdb.GetOrNewStateObject(addr)
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SubBalance(amount, reason)
}
+ return nil
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) SetBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetBalance(addr libcommon.Address, amount *uint256.Int, reason tracing.BalanceChangeReason) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SetBalance(amount, reason)
}
+ return nil
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) SetNonce(addr libcommon.Address, nonce uint64) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetNonce(addr libcommon.Address, nonce uint64) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SetNonce(nonce)
}
+ return nil
}
// DESCRIBED: docs/programmers_guide/guide.md#code-hash
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) SetCode(addr libcommon.Address, code []byte) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetCode(addr libcommon.Address, code []byte) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SetCode(crypto.Keccak256Hash(code), code)
}
+ return nil
}
// DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account
-func (sdb *IntraBlockState) SetState(addr libcommon.Address, key *libcommon.Hash, value uint256.Int) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetState(addr libcommon.Address, key *libcommon.Hash, value uint256.Int) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SetState(key, value)
}
+ return nil
}
// SetStorage replaces the entire storage for the specified account with given
// storage. This function should only be used for debugging.
-func (sdb *IntraBlockState) SetStorage(addr libcommon.Address, storage Storage) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetStorage(addr libcommon.Address, storage Storage) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.SetStorage(storage)
}
+ return nil
}
// SetIncarnation sets incarnation for account if account exists
-func (sdb *IntraBlockState) SetIncarnation(addr libcommon.Address, incarnation uint64) {
- stateObject := sdb.GetOrNewStateObject(addr)
+func (sdb *IntraBlockState) SetIncarnation(addr libcommon.Address, incarnation uint64) error {
+ stateObject, err := sdb.GetOrNewStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject != nil {
stateObject.setIncarnation(incarnation)
}
+ return nil
}
-func (sdb *IntraBlockState) GetIncarnation(addr libcommon.Address) uint64 {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetIncarnation(addr libcommon.Address) (uint64, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return 0, err
+ }
if stateObject != nil {
- return stateObject.data.Incarnation
+ return stateObject.data.Incarnation, nil
}
- return 0
+ return 0, nil
}
// Selfdestruct marks the given account as suicided.
@@ -507,10 +595,13 @@ func (sdb *IntraBlockState) GetIncarnation(addr libcommon.Address) uint64 {
//
// The account's state object is still available until the state is committed,
// getStateObject will return a non-nil account after Suicide.
-func (sdb *IntraBlockState) Selfdestruct(addr libcommon.Address) bool {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) Selfdestruct(addr libcommon.Address) (bool, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return false, err
+ }
if stateObject == nil || stateObject.deleted {
- return false
+ return false, nil
}
prevBalance := *stateObject.Balance()
@@ -528,19 +619,27 @@ func (sdb *IntraBlockState) Selfdestruct(addr libcommon.Address) bool {
stateObject.createdContract = false
stateObject.data.Balance.Clear()
- return true
+ return true, nil
}
-func (sdb *IntraBlockState) Selfdestruct6780(addr libcommon.Address) {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) Selfdestruct6780(addr libcommon.Address) error {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return err
+ }
if stateObject == nil {
- return
+ return nil
}
if stateObject.newlyCreated {
- if _, ok := types.ParseDelegation(sdb.GetCode(addr)); !ok {
+ code, err := sdb.GetCode(addr)
+ if err != nil {
+ return err
+ }
+ if _, ok := types.ParseDelegation(code); !ok {
sdb.Selfdestruct(addr)
}
}
+ return nil
}
// SetTransientState sets transient storage for a given account. It
@@ -572,36 +671,36 @@ func (sdb *IntraBlockState) GetTransientState(addr libcommon.Address, key libcom
return sdb.transientStorage.Get(addr, key)
}
-func (sdb *IntraBlockState) getStateObject(addr libcommon.Address) (stateObject *stateObject) {
+func (sdb *IntraBlockState) getStateObject(addr libcommon.Address) (stateObject *stateObject, err error) {
// Prefer 'live' objects.
if obj := sdb.stateObjects[addr]; obj != nil {
- return obj
+ return obj, nil
}
// Load the object from the database.
if _, ok := sdb.nilAccounts[addr]; ok {
if bi, ok := sdb.balanceInc[addr]; ok && !bi.transferred {
- return sdb.createObject(addr, nil)
+ return sdb.createObject(addr, nil), nil
}
- return nil
+ return nil, nil
}
account, err := sdb.stateReader.ReadAccountData(addr)
if err != nil {
sdb.setErrorUnsafe(err)
- return nil
+ return nil, err
}
if account == nil {
sdb.nilAccounts[addr] = struct{}{}
if bi, ok := sdb.balanceInc[addr]; ok && !bi.transferred {
- return sdb.createObject(addr, nil)
+ return sdb.createObject(addr, nil), nil
}
- return nil
+ return nil, nil
}
// Insert into the live set.
obj := newObject(sdb, addr, account, account)
sdb.setStateObject(addr, obj)
- return obj
+ return obj, nil
}
func (sdb *IntraBlockState) setStateObject(addr libcommon.Address, object *stateObject) {
@@ -614,12 +713,15 @@ func (sdb *IntraBlockState) setStateObject(addr libcommon.Address, object *state
}
// Retrieve a state object or create a new state object if nil.
-func (sdb *IntraBlockState) GetOrNewStateObject(addr libcommon.Address) *stateObject {
- stateObject := sdb.getStateObject(addr)
+func (sdb *IntraBlockState) GetOrNewStateObject(addr libcommon.Address) (*stateObject, error) {
+ stateObject, err := sdb.getStateObject(addr)
+ if err != nil {
+ return nil, err
+ }
if stateObject == nil || stateObject.deleted {
stateObject = sdb.createObject(addr, stateObject /* previous */)
}
- return stateObject
+ return stateObject, nil
}
// createObject creates a new state object. If there is an existing account with
@@ -655,9 +757,12 @@ func (sdb *IntraBlockState) createObject(addr libcommon.Address, previous *state
// 2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1)
//
// Carrying over the balance ensures that Ether doesn't disappear.
-func (sdb *IntraBlockState) CreateAccount(addr libcommon.Address, contractCreation bool) {
+func (sdb *IntraBlockState) CreateAccount(addr libcommon.Address, contractCreation bool) error {
var prevInc uint64
- previous := sdb.getStateObject(addr)
+ previous, err := sdb.getStateObject(addr)
+ if err != nil {
+ return err
+ }
if previous != nil && previous.selfdestructed {
prevInc = previous.data.Incarnation
} else {
@@ -665,6 +770,7 @@ func (sdb *IntraBlockState) CreateAccount(addr libcommon.Address, contractCreati
prevInc = inc
} else {
sdb.savedErr = err
+ return err
}
}
if previous != nil && prevInc < previous.data.PrevIncarnation {
@@ -684,6 +790,7 @@ func (sdb *IntraBlockState) CreateAccount(addr libcommon.Address, contractCreati
} else {
newObj.selfdestructed = false
}
+ return nil
}
// Snapshot returns an identifier for the current revision of the state.
@@ -907,7 +1014,7 @@ func (sdb *IntraBlockState) clearJournalAndRefund() {
// - Add authorities to access list (EIP-7702)
// - Add delegated designation (if it exists for dst) to access list (EIP-7702)
func (sdb *IntraBlockState) Prepare(rules *chain.Rules, sender, coinbase libcommon.Address, dst *libcommon.Address,
- precompiles []libcommon.Address, list types.AccessList, authorities []libcommon.Address) {
+ precompiles []libcommon.Address, list types.AccessList, authorities []libcommon.Address) error {
if sdb.trace {
fmt.Printf("ibs.Prepare %x, %x, %x, %x, %v, %v, %v\n", sender, coinbase, dst, precompiles, list, rules, authorities)
}
@@ -942,13 +1049,18 @@ func (sdb *IntraBlockState) Prepare(rules *chain.Rules, sender, coinbase libcomm
}
if dst != nil {
- if dd, ok := sdb.GetDelegatedDesignation(*dst); ok {
+ dd, ok, err := sdb.GetDelegatedDesignation(*dst)
+ if err != nil {
+ return err
+ }
+ if ok {
sdb.AddAddressToAccessList(dd)
}
}
}
// Reset transient storage at the beginning of transaction execution
sdb.transientStorage = newTransientStorage()
+ return nil
}
// AddAddressToAccessList adds the given address to the access list
diff --git a/core/state/intra_block_state_logger_test.go b/core/state/intra_block_state_logger_test.go
index 11c5023c940..cc5fed21804 100644
--- a/core/state/intra_block_state_logger_test.go
+++ b/core/state/intra_block_state_logger_test.go
@@ -86,7 +86,8 @@ func TestStateLogger(t *testing.T) {
}
}
- so := stateDB.GetOrNewStateObject(libcommon.Address{})
+ so, err := stateDB.GetOrNewStateObject(libcommon.Address{})
+ require.NoError(t, err)
if !reflect.DeepEqual(so.Balance(), uint256.NewInt(3)) {
t.Errorf("Incorrect Balance for %s expectedBalance: %s, got:%s", libcommon.Address{}, uint256.NewInt(3), so.Balance())
}
@@ -103,7 +104,8 @@ func TestStateLogger(t *testing.T) {
state.SubBalance(libcommon.Address{}, uint256.NewInt(1), tracing.BalanceChangeUnspecified)
},
checker: func(t *testing.T, stateDB *IntraBlockState) {
- so := stateDB.GetOrNewStateObject(libcommon.Address{})
+ so, err := stateDB.GetOrNewStateObject(libcommon.Address{})
+ require.NoError(t, err)
if !reflect.DeepEqual(so.Balance(), uint256.NewInt(1)) {
t.Errorf("Incorrect Balance for %s expectedBalance: %s, got:%s", libcommon.Address{}, uint256.NewInt(1), so.Balance())
}
diff --git a/core/state/intra_block_state_test.go b/core/state/intra_block_state_test.go
index b2c1c5321e6..f7d0767015c 100644
--- a/core/state/intra_block_state_test.go
+++ b/core/state/intra_block_state_test.go
@@ -323,17 +323,77 @@ func (test *snapshotTest) checkEqual(state, checkstate *IntraBlockState) error {
return true
}
// Check basic accessor methods.
- if !checkeq("Exist", state.Exist(addr), checkstate.Exist(addr)) {
+ se, err := state.Exist(addr)
+ if err != nil {
return err
}
- checkeq("HasSelfdestructed", state.HasSelfdestructed(addr), checkstate.HasSelfdestructed(addr))
- checkeqBigInt("GetBalance", state.GetBalance(addr).ToBig(), checkstate.GetBalance(addr).ToBig())
- checkeq("GetNonce", state.GetNonce(addr), checkstate.GetNonce(addr))
- checkeq("GetCode", state.GetCode(addr), checkstate.GetCode(addr))
- checkeq("GetCodeHash", state.GetCodeHash(addr), checkstate.GetCodeHash(addr))
- checkeq("GetCodeSize", state.GetCodeSize(addr), checkstate.GetCodeSize(addr))
+ ce, err := checkstate.Exist(addr)
+ if err != nil {
+ return err
+ }
+ if !checkeq("Exist", se, ce) {
+ return err
+ }
+ ssd, err := state.HasSelfdestructed(addr)
+ if err != nil {
+ return err
+ }
+ csd, err := checkstate.HasSelfdestructed(addr)
+ if err != nil {
+ return err
+ }
+ checkeq("HasSelfdestructed", ssd, csd)
+ sb, err := state.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ cb, err := checkstate.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ checkeqBigInt("GetBalance", sb.ToBig(), cb.ToBig())
+ sn, err := state.GetNonce(addr)
+ if err != nil {
+ return err
+ }
+ cn, err := checkstate.GetNonce(addr)
+ if err != nil {
+ return err
+ }
+ checkeq("GetNonce", sn, cn)
+ sc, err := state.GetCode(addr)
+ if err != nil {
+ return err
+ }
+ cc, err := checkstate.GetCode(addr)
+ if err != nil {
+ return err
+ }
+ checkeq("GetCode", sc, cc)
+ sch, err := state.GetCodeHash(addr)
+ if err != nil {
+ return err
+ }
+ cch, err := checkstate.GetCodeHash(addr)
+ if err != nil {
+ return err
+ }
+ checkeq("GetCodeHash", sch, cch)
+ scs, err := state.GetCodeSize(addr)
+ if err != nil {
+ return err
+ }
+ ccs, err := checkstate.GetCodeSize(addr)
+ if err != nil {
+ return err
+ }
+ checkeq("GetCodeSize", scs, ccs)
// Check storage.
- if obj := state.getStateObject(addr); obj != nil {
+ obj, err := state.getStateObject(addr)
+ if err != nil {
+ return err
+ }
+ if obj != nil {
for key, value := range obj.dirtyStorage {
var out uint256.Int
checkstate.GetState(addr, &key, &out)
@@ -342,7 +402,11 @@ func (test *snapshotTest) checkEqual(state, checkstate *IntraBlockState) error {
}
}
}
- if obj := checkstate.getStateObject(addr); obj != nil {
+ obj, err = checkstate.getStateObject(addr)
+ if err != nil {
+ return err
+ }
+ if obj != nil {
for key, value := range obj.dirtyStorage {
var out uint256.Int
state.GetState(addr, &key, &out)
diff --git a/core/state/journal.go b/core/state/journal.go
index 663f70baeb9..fd7dc7fa13a 100644
--- a/core/state/journal.go
+++ b/core/state/journal.go
@@ -29,7 +29,7 @@ import (
// reverted on demand.
type journalEntry interface {
// revert undoes the changes introduced by this journal entry.
- revert(*IntraBlockState)
+ revert(*IntraBlockState) error
// dirtied returns the Ethereum address modified by this journal entry.
dirtied() *libcommon.Address
@@ -172,29 +172,35 @@ type (
// refundChange | addLogChange | touchChange | accessListAddAccountChange | accessListAddSlotChange | transientStorageChange
//}
-func (ch createObjectChange) revert(s *IntraBlockState) {
+func (ch createObjectChange) revert(s *IntraBlockState) error {
delete(s.stateObjects, *ch.account)
delete(s.stateObjectsDirty, *ch.account)
+ return nil
}
func (ch createObjectChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch resetObjectChange) revert(s *IntraBlockState) {
+func (ch resetObjectChange) revert(s *IntraBlockState) error {
s.setStateObject(*ch.account, ch.prev)
+ return nil
}
func (ch resetObjectChange) dirtied() *libcommon.Address {
return nil
}
-func (ch selfdestructChange) revert(s *IntraBlockState) {
- obj := s.getStateObject(*ch.account)
+func (ch selfdestructChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
if obj != nil {
obj.selfdestructed = ch.prev
obj.setBalance(&ch.prevbalance)
}
+ return nil
}
func (ch selfdestructChange) dirtied() *libcommon.Address {
@@ -203,22 +209,28 @@ func (ch selfdestructChange) dirtied() *libcommon.Address {
var ripemd = libcommon.HexToAddress("0000000000000000000000000000000000000003")
-func (ch touchChange) revert(s *IntraBlockState) {
+func (ch touchChange) revert(s *IntraBlockState) error {
+ return nil
}
func (ch touchChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch balanceChange) revert(s *IntraBlockState) {
- s.getStateObject(*ch.account).setBalance(&ch.prev)
+func (ch balanceChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
+ obj.setBalance(&ch.prev)
+ return nil
}
func (ch balanceChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch balanceIncrease) revert(s *IntraBlockState) {
+func (ch balanceIncrease) revert(s *IntraBlockState) error {
if bi, ok := s.balanceInc[*ch.account]; ok {
bi.increase.Sub(&bi.increase, &ch.increase)
bi.count--
@@ -226,6 +238,7 @@ func (ch balanceIncrease) revert(s *IntraBlockState) {
delete(s.balanceInc, *ch.account)
}
}
+ return nil
}
func (ch balanceIncrease) dirtied() *libcommon.Address {
@@ -236,71 +249,95 @@ func (ch balanceIncreaseTransfer) dirtied() *libcommon.Address {
return nil
}
-func (ch balanceIncreaseTransfer) revert(s *IntraBlockState) {
+func (ch balanceIncreaseTransfer) revert(s *IntraBlockState) error {
ch.bi.transferred = false
+ return nil
}
-func (ch nonceChange) revert(s *IntraBlockState) {
- s.getStateObject(*ch.account).setNonce(ch.prev)
+func (ch nonceChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
+ obj.setNonce(ch.prev)
+ return nil
}
func (ch nonceChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch codeChange) revert(s *IntraBlockState) {
- s.getStateObject(*ch.account).setCode(ch.prevhash, ch.prevcode)
+func (ch codeChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
+ obj.setCode(ch.prevhash, ch.prevcode)
+ return nil
}
func (ch codeChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch storageChange) revert(s *IntraBlockState) {
- s.getStateObject(*ch.account).setState(&ch.key, ch.prevalue)
+func (ch storageChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
+ obj.setState(&ch.key, ch.prevalue)
+ return nil
}
func (ch storageChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch fakeStorageChange) revert(s *IntraBlockState) {
- s.getStateObject(*ch.account).fakeStorage[ch.key] = ch.prevalue
+func (ch fakeStorageChange) revert(s *IntraBlockState) error {
+ obj, err := s.getStateObject(*ch.account)
+ if err != nil {
+ return err
+ }
+ obj.fakeStorage[ch.key] = ch.prevalue
+ return nil
}
func (ch fakeStorageChange) dirtied() *libcommon.Address {
return ch.account
}
-func (ch transientStorageChange) revert(s *IntraBlockState) {
+func (ch transientStorageChange) revert(s *IntraBlockState) error {
s.setTransientState(*ch.account, ch.key, ch.prevalue)
+ return nil
}
func (ch transientStorageChange) dirtied() *libcommon.Address {
return nil
}
-func (ch refundChange) revert(s *IntraBlockState) {
+func (ch refundChange) revert(s *IntraBlockState) error {
s.refund = ch.prev
+ return nil
}
func (ch refundChange) dirtied() *libcommon.Address {
return nil
}
-func (ch addLogChange) revert(s *IntraBlockState) {
+func (ch addLogChange) revert(s *IntraBlockState) error {
txnLogs := s.logs[ch.txIndex]
s.logs[ch.txIndex] = txnLogs[:len(txnLogs)-1] // revert 1 log
if len(s.logs[ch.txIndex]) == 0 {
s.logs = s.logs[:len(s.logs)-1] // revert txn
}
s.logSize--
+ return nil
}
func (ch addLogChange) dirtied() *libcommon.Address {
return nil
}
-func (ch accessListAddAccountChange) revert(s *IntraBlockState) {
+func (ch accessListAddAccountChange) revert(s *IntraBlockState) error {
/*
One important invariant here, is that whenever a (addr, slot) is added, if the
addr is not already present, the add causes two journal entries:
@@ -311,14 +348,16 @@ func (ch accessListAddAccountChange) revert(s *IntraBlockState) {
a single (addr) change.
*/
s.accessList.DeleteAddress(*ch.address)
+ return nil
}
func (ch accessListAddAccountChange) dirtied() *libcommon.Address {
return nil
}
-func (ch accessListAddSlotChange) revert(s *IntraBlockState) {
+func (ch accessListAddSlotChange) revert(s *IntraBlockState) error {
s.accessList.DeleteSlot(*ch.address, *ch.slot)
+ return nil
}
func (ch accessListAddSlotChange) dirtied() *libcommon.Address {
diff --git a/core/state/rw_v3.go b/core/state/rw_v3.go
index e691c6a0c20..56c438bc975 100644
--- a/core/state/rw_v3.go
+++ b/core/state/rw_v3.go
@@ -34,7 +34,7 @@ import (
"github.com/erigontech/erigon-lib/metrics"
"github.com/erigontech/erigon-lib/state"
libstate "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/turbo/shards"
)
diff --git a/core/state/state_object.go b/core/state/state_object.go
index b47058752f4..21a3a833e69 100644
--- a/core/state/state_object.go
+++ b/core/state/state_object.go
@@ -30,9 +30,9 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/trie"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/tracing"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/trie"
)
var emptyCodeHash = crypto.Keccak256(nil)
diff --git a/core/state/state_test.go b/core/state/state_test.go
index 3a5665b359b..cacb01edd41 100644
--- a/core/state/state_test.go
+++ b/core/state/state_test.go
@@ -39,8 +39,8 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/state"
stateLib "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/tracing"
+ "github.com/erigontech/erigon/core/types/accounts"
)
var toAddr = common.BytesToAddress
@@ -57,15 +57,18 @@ var _ = checker.Suite(&StateSuite{})
func (s *StateSuite) TestDump(c *checker.C) {
// generate a few entries
- obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))
+ obj1, err := s.state.GetOrNewStateObject(toAddr([]byte{0x01}))
+ c.Check(err, checker.IsNil)
obj1.AddBalance(uint256.NewInt(22), tracing.BalanceChangeUnspecified)
- obj2 := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
+ obj2, err := s.state.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
+ c.Check(err, checker.IsNil)
obj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3})
- obj3 := s.state.GetOrNewStateObject(toAddr([]byte{0x02}))
+ obj3, err := s.state.GetOrNewStateObject(toAddr([]byte{0x02}))
+ c.Check(err, checker.IsNil)
obj3.SetBalance(uint256.NewInt(44), tracing.BalanceChangeUnspecified)
// write some of them to the trie
- err := s.w.UpdateAccountData(obj1.address, &obj1.data, new(accounts.Account))
+ err = s.w.UpdateAccountData(obj1.address, &obj1.data, new(accounts.Account))
c.Check(err, checker.IsNil)
err = s.w.UpdateAccountData(obj2.address, &obj2.data, new(accounts.Account))
c.Check(err, checker.IsNil)
@@ -273,7 +276,10 @@ func TestSnapshot2(t *testing.T) {
state.SetState(stateobjaddr1, &storageaddr, *data1)
// db, trie are already non-empty values
- so0 := state.getStateObject(stateobjaddr0)
+ so0, err := state.getStateObject(stateobjaddr0)
+ if err != nil {
+ t.Fatal("getting state", err)
+ }
so0.SetBalance(uint256.NewInt(42), tracing.BalanceChangeUnspecified)
so0.SetNonce(43)
so0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'})
@@ -292,7 +298,10 @@ func TestSnapshot2(t *testing.T) {
}
// and one with deleted == true
- so1 := state.getStateObject(stateobjaddr1)
+ so1, err := state.getStateObject(stateobjaddr1)
+ if err != nil {
+ t.Fatal("getting state", err)
+ }
so1.SetBalance(uint256.NewInt(52), tracing.BalanceChangeUnspecified)
so1.SetNonce(53)
so1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'})
@@ -300,7 +309,10 @@ func TestSnapshot2(t *testing.T) {
so1.deleted = true
state.setStateObject(stateobjaddr1, so1)
- so1 = state.getStateObject(stateobjaddr1)
+ so1, err = state.getStateObject(stateobjaddr1)
+ if err != nil {
+ t.Fatal("getting state", err)
+ }
if so1 != nil && !so1.deleted {
t.Fatalf("deleted object not nil when getting")
}
@@ -308,7 +320,10 @@ func TestSnapshot2(t *testing.T) {
snapshot := state.Snapshot()
state.RevertToSnapshot(snapshot)
- so0Restored := state.getStateObject(stateobjaddr0)
+ so0Restored, err := state.getStateObject(stateobjaddr0)
+ if err != nil {
+ t.Fatal("getting restored state", err)
+ }
// Update lazily-loaded values before comparing.
var tmp uint256.Int
so0Restored.GetState(&storageaddr, &tmp)
@@ -317,7 +332,10 @@ func TestSnapshot2(t *testing.T) {
compareStateObjects(so0Restored, so0, t)
// deleted should be nil, both before and after restore of state copy
- so1Restored := state.getStateObject(stateobjaddr1)
+ so1Restored, err := state.getStateObject(stateobjaddr1)
+ if err != nil {
+ t.Fatal("getting restored state", err)
+ }
if so1Restored != nil && !so1Restored.deleted {
t.Fatalf("deleted object not nil after restoring snapshot: %+v", so1Restored)
}
@@ -410,12 +428,15 @@ func TestDump(t *testing.T) {
st := New(NewReaderV3(domains))
// generate a few entries
- obj1 := st.GetOrNewStateObject(toAddr([]byte{0x01}))
+ obj1, err := st.GetOrNewStateObject(toAddr([]byte{0x01}))
+ require.NoError(t, err)
obj1.AddBalance(uint256.NewInt(22), tracing.BalanceChangeUnspecified)
- obj2 := st.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
+ obj2, err := st.GetOrNewStateObject(toAddr([]byte{0x01, 0x02}))
+ require.NoError(t, err)
obj2.SetCode(crypto.Keccak256Hash([]byte{3, 3, 3, 3, 3, 3, 3}), []byte{3, 3, 3, 3, 3, 3, 3})
obj2.setIncarnation(1)
- obj3 := st.GetOrNewStateObject(toAddr([]byte{0x02}))
+ obj3, err := st.GetOrNewStateObject(toAddr([]byte{0x02}))
+ require.NoError(t, err)
obj3.SetBalance(uint256.NewInt(44), tracing.BalanceChangeUnspecified)
w := NewWriterV4(domains)
diff --git a/core/state/state_writer_v4.go b/core/state/state_writer_v4.go
index a6d11763e24..12654ea5298 100644
--- a/core/state/state_writer_v4.go
+++ b/core/state/state_writer_v4.go
@@ -23,7 +23,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
var _ StateWriter = (*WriterV4)(nil)
diff --git a/core/state/txtask.go b/core/state/txtask.go
index 8604c3a38d4..4fbb0819bbe 100644
--- a/core/state/txtask.go
+++ b/core/state/txtask.go
@@ -29,8 +29,8 @@ import (
"github.com/erigontech/erigon-lib/chain"
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm/evmtypes"
)
@@ -140,7 +140,7 @@ func (t *TxTask) createReceipt(cumulativeGasUsed uint64) *types.Receipt {
//}
return receipt
}
-func (t *TxTask) Reset() {
+func (t *TxTask) Reset() *TxTask {
t.BalanceIncreaseSet = nil
returnReadList(t.ReadLists)
t.ReadLists = nil
@@ -149,6 +149,9 @@ func (t *TxTask) Reset() {
t.Logs = nil
t.TraceFroms = nil
t.TraceTos = nil
+ t.Error = nil
+ t.Failed = false
+ return t
}
// TxTaskQueue non-thread-safe priority-queue
diff --git a/core/state_transition.go b/core/state_transition.go
index fdda38bd87c..feadff5e892 100644
--- a/core/state_transition.go
+++ b/core/state_transition.go
@@ -62,6 +62,9 @@ The state transitioning model does all the necessary work to work out a valid ne
5) Run Script section
6) Derive new state root
*/
+
+var ErrStateTransitionFailed = errors.New("state transitaion failed")
+
type StateTransition struct {
gp *GasPool
msg Message
@@ -209,7 +212,11 @@ func (st *StateTransition) buyGas(gasBailout bool) error {
}
}
}
- if have, want := st.state.GetBalance(st.msg.From()), balanceCheck; have.Cmp(want) < 0 {
+ balance, err := st.state.GetBalance(st.msg.From())
+ if err != nil {
+ return err
+ }
+ if have, want := balance, balanceCheck; have.Cmp(want) < 0 {
return fmt.Errorf("%w: address %v have %v want %v", ErrInsufficientFunds, st.msg.From().Hex(), have, want)
}
st.state.SubBalance(st.msg.From(), gasVal, tracing.BalanceDecreaseGasBuy)
@@ -241,7 +248,10 @@ func CheckEip1559TxGasFeeCap(from libcommon.Address, gasFeeCap, tip, baseFee *ui
func (st *StateTransition) preCheck(gasBailout bool) error {
// Make sure this transaction's nonce is correct.
if st.msg.CheckNonce() {
- stNonce := st.state.GetNonce(st.msg.From())
+ stNonce, err := st.state.GetNonce(st.msg.From())
+ if err != nil {
+ return fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
if msgNonce := st.msg.Nonce(); stNonce < msgNonce {
return fmt.Errorf("%w: address %v, tx: %d state: %d", ErrNonceTooHigh,
st.msg.From().Hex(), msgNonce, stNonce)
@@ -254,13 +264,21 @@ func (st *StateTransition) preCheck(gasBailout bool) error {
}
// Make sure the sender is an EOA (EIP-3607)
- if codeHash := st.state.GetCodeHash(st.msg.From()); codeHash != emptyCodeHash && codeHash != (libcommon.Hash{}) {
+ codeHash, err := st.state.GetCodeHash(st.msg.From())
+ if err != nil {
+ return fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if codeHash != emptyCodeHash && codeHash != (libcommon.Hash{}) {
// libcommon.Hash{} means that the sender is not in the state.
// Historically there were transactions with 0 gas price and non-existing sender,
// so we have to allow that.
// eip-7702 allows tx origination from accounts having delegated designation code.
- if _, ok := st.state.GetDelegatedDesignation(st.msg.From()); !ok {
+ _, ok, err := st.state.GetDelegatedDesignation(st.msg.From())
+ if err != nil {
+ return fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if ok {
return fmt.Errorf("%w: address %v, codehash: %s", ErrSenderNoEOA,
st.msg.From().Hex(), codeHash)
}
@@ -307,8 +325,16 @@ func (st *StateTransition) preCheck(gasBailout bool) error {
// nil evm execution result.
func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtypes.ExecutionResult, error) {
coinbase := st.evm.Context.Coinbase
- senderInitBalance := st.state.GetBalance(st.msg.From()).Clone()
- coinbaseInitBalance := st.state.GetBalance(coinbase).Clone()
+ senderInitBalance, err := st.state.GetBalance(st.msg.From())
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ senderInitBalance = senderInitBalance.Clone()
+ coinbaseInitBalance, err := st.state.GetBalance(coinbase)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ coinbaseInitBalance = coinbaseInitBalance.Clone()
// First check this message satisfies all consensus rules before
// applying the message. The rules include these clauses
@@ -341,7 +367,11 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype
if !contractCreation {
// Increment the nonce for the next transaction
- st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1)
+ nonce, err := st.state.GetNonce(sender.Address())
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ st.state.SetNonce(msg.From(), nonce+1)
}
// set code tx
@@ -375,37 +405,57 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype
// authority is added to accessed_address in prepare step
// 4. authority code should be empty or already delegated
- if codeHash := st.state.GetCodeHash(authority); codeHash != emptyCodeHash && codeHash != (libcommon.Hash{}) {
+ codeHash, err := st.state.GetCodeHash(authority)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if codeHash != emptyCodeHash && codeHash != (libcommon.Hash{}) {
// check for delegation
- if _, ok := st.state.GetDelegatedDesignation(authority); ok {
- // noop: has delegated designation
- } else {
+ _, ok, err := st.state.GetDelegatedDesignation(authority)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if !ok {
log.Debug("authority code is not empty or not delegated, skipping", "auth index", i)
continue
}
+ // noop: has delegated designation
}
// 5. nonce check
- authorityNonce := st.state.GetNonce(authority)
+ authorityNonce, err := st.state.GetNonce(authority)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
if authorityNonce != auth.Nonce {
log.Debug("invalid nonce, skipping", "auth index", i)
continue
}
// 6. Add PER_EMPTY_ACCOUNT_COST - PER_AUTH_BASE_COST gas to the global refund counter if authority exists in the trie.
- if st.state.Exist(authority) {
+ exists, err := st.state.Exist(authority)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if exists {
st.state.AddRefund(fixedgas.PerEmptyAccountCost - fixedgas.PerAuthBaseCost)
}
// 7. set authority code
if auth.Address == (libcommon.Address{}) {
- st.state.SetCode(authority, nil)
+ if err := st.state.SetCode(authority, nil); err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
} else {
- st.state.SetCode(authority, types.AddressToDelegation(auth.Address))
+ if err := st.state.SetCode(authority, types.AddressToDelegation(auth.Address)); err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
}
// 8. increase the nonce of authority
- st.state.SetNonce(authority, authorityNonce+1)
+ if err := st.state.SetNonce(authority, authorityNonce+1); err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
}
}
@@ -422,7 +472,11 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype
var bailout bool
// Gas bailout (for trace_call) should only be applied if there is not sufficient balance to perform value transfer
if gasBailout {
- if !msg.Value().IsZero() && !st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value()) {
+ canTransfer, err := st.evm.Context.CanTransfer(st.state, msg.From(), msg.Value())
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
+ if !msg.Value().IsZero() && !canTransfer {
bailout = true
}
}
@@ -435,8 +489,9 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype
// Execute the preparatory steps for state transition which includes:
// - prepare accessList(post-berlin; eip-7702)
// - reset transient storage(eip 1153)
- st.state.Prepare(rules, msg.From(), coinbase, msg.To(), vm.ActivePrecompiles(rules), accessTuples, verifiedAuthorities)
-
+ if err = st.state.Prepare(rules, msg.From(), coinbase, msg.To(), vm.ActivePrecompiles(rules), accessTuples, verifiedAuthorities); err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
var (
ret []byte
vmerr error // vm errors do not effect consensus and are therefore not assigned to err
@@ -469,7 +524,9 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*evmtype
}
amount := new(uint256.Int).SetUint64(st.gasUsed())
amount.Mul(amount, effectiveTip) // gasUsed * effectiveTip = how much goes to the block producer (miner, validator)
- st.state.AddBalance(coinbase, amount, tracing.BalanceIncreaseRewardTransactionFee)
+ if err := st.state.AddBalance(coinbase, amount, tracing.BalanceIncreaseRewardTransactionFee); err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrStateTransitionFailed, err)
+ }
if !msg.IsFree() && rules.IsLondon {
burntContractAddress := st.evm.ChainConfig().GetBurntContract(st.evm.Context.BlockNumber)
if burntContractAddress != nil {
diff --git a/core/test/domains_restart_test.go b/core/test/domains_restart_test.go
index 5fd7ea02572..10e3acf5226 100644
--- a/core/test/domains_restart_test.go
+++ b/core/test/domains_restart_test.go
@@ -44,11 +44,11 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/state"
types2 "github.com/erigontech/erigon-lib/types"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core"
reset2 "github.com/erigontech/erigon/core/rawdb/rawdbreset"
state2 "github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/params"
)
diff --git a/erigon-lib/types/accounts/account.go b/core/types/accounts/account.go
similarity index 99%
rename from erigon-lib/types/accounts/account.go
rename to core/types/accounts/account.go
index 0221af2a1bd..2c14bbb2b79 100644
--- a/erigon-lib/types/accounts/account.go
+++ b/core/types/accounts/account.go
@@ -157,21 +157,21 @@ func decodeLengthForHashing(buffer []byte, pos int) (length int, structure bool,
case firstByte < 192:
// Next byte is the length of the length + 183
lenEnd := pos + 1 + firstByte - 183
- length = 0
+ len := 0
for i := pos + 1; i < lenEnd; i++ {
- length = (length << 8) + int(buffer[i])
+ len = (len << 8) + int(buffer[i])
}
- return length, false, lenEnd
+ return len, false, lenEnd
case firstByte < 248:
return firstByte - 192, true, pos + 1
default:
// Next byte is the length of the length + 247
lenEnd := pos + 1 + firstByte - 247
- length = 0
+ len := 0
for i := pos + 1; i < lenEnd; i++ {
- length = (length << 8) + int(buffer[i])
+ len = (len << 8) + int(buffer[i])
}
- return length, true, lenEnd
+ return len, true, lenEnd
}
}
diff --git a/erigon-lib/types/accounts/account_benchmark_test.go b/core/types/accounts/account_benchmark_test.go
similarity index 100%
rename from erigon-lib/types/accounts/account_benchmark_test.go
rename to core/types/accounts/account_benchmark_test.go
diff --git a/erigon-lib/types/accounts/account_proof.go b/core/types/accounts/account_proof.go
similarity index 100%
rename from erigon-lib/types/accounts/account_proof.go
rename to core/types/accounts/account_proof.go
diff --git a/erigon-lib/types/accounts/account_test.go b/core/types/accounts/account_test.go
similarity index 99%
rename from erigon-lib/types/accounts/account_test.go
rename to core/types/accounts/account_test.go
index 4f8d5087583..25226d0d32a 100644
--- a/erigon-lib/types/accounts/account_test.go
+++ b/core/types/accounts/account_test.go
@@ -194,7 +194,6 @@ func TestEncodeAccountWithEmptyBalanceAndNotZeroIncarnation(t *testing.T) {
}
func isAccountsEqual(t *testing.T, src, dst Account) {
- t.Helper()
if dst.Initialised != src.Initialised {
t.Fatal("cant decode the account Initialised", src.Initialised, dst.Initialised)
}
@@ -326,7 +325,6 @@ func TestIncarnationWithInvalidEncodedAccount(t *testing.T) {
}
func isIncarnationEqual(t *testing.T, initialIncarnation uint64, decodedIncarnation uint64) {
- t.Helper()
if initialIncarnation != decodedIncarnation {
t.Fatal("Can't decode the incarnation", initialIncarnation, decodedIncarnation)
}
diff --git a/core/types/block_test.go b/core/types/block_test.go
index 69e62056374..3907b72bed0 100644
--- a/core/types/block_test.go
+++ b/core/types/block_test.go
@@ -606,5 +606,4 @@ func TestCopyTxs(t *testing.T) {
copies := CopyTxs(txs)
assert.Equal(t, txs, copies)
-
}
diff --git a/core/types/hashing.go b/core/types/hashing.go
index 6a632b2907d..3ad4261e8af 100644
--- a/core/types/hashing.go
+++ b/core/types/hashing.go
@@ -30,8 +30,8 @@ import (
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/crypto/cryptopool"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/rlphacks"
- "github.com/erigontech/erigon-lib/trie"
+ "github.com/erigontech/erigon/turbo/rlphacks"
+ "github.com/erigontech/erigon/turbo/trie"
)
type DerivableList interface {
diff --git a/core/types/hashing_test.go b/core/types/hashing_test.go
index dcd2e37c798..f40909cef43 100644
--- a/core/types/hashing_test.go
+++ b/core/types/hashing_test.go
@@ -26,7 +26,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/trie"
+ "github.com/erigontech/erigon/turbo/trie"
)
func genTransactions(n uint64) Transactions {
diff --git a/core/types/log.go b/core/types/log.go
index 5895578c509..f9433e9a422 100644
--- a/core/types/log.go
+++ b/core/types/log.go
@@ -21,6 +21,7 @@ package types
import (
"io"
+ "slices"
"github.com/erigontech/erigon-lib/common/hexutil"
@@ -79,6 +80,17 @@ type ErigonLogs []*ErigonLog
type Logs []*Log
+func (logs Logs) Copy() Logs {
+ if logs == nil {
+ return nil
+ }
+ logsCopy := make(Logs, len(logs))
+ for i, log := range logs {
+ logsCopy[i] = log.Copy()
+ }
+ return logsCopy
+}
+
func (logs Logs) Filter(addrMap map[libcommon.Address]struct{}, topics [][]libcommon.Hash, maxLogs uint64) Logs {
topicMap := make(map[int]map[libcommon.Hash]struct{}, 7)
@@ -251,19 +263,13 @@ func (l *Log) DecodeRLP(s *rlp.Stream) error {
// Copy creates a deep copy of the Log.
func (l *Log) Copy() *Log {
- topics := make([]libcommon.Hash, 0, len(l.Topics))
- for _, topic := range l.Topics {
- topicCopy := libcommon.BytesToHash(topic.Bytes())
- topics = append(topics, topicCopy)
+ if l == nil {
+ return nil
}
-
- data := make([]byte, len(l.Data))
- copy(data, l.Data)
-
return &Log{
Address: libcommon.BytesToAddress(l.Address.Bytes()),
- Topics: topics,
- Data: data,
+ Topics: slices.Clone(l.Topics),
+ Data: slices.Clone(l.Data),
BlockNumber: l.BlockNumber,
TxHash: libcommon.BytesToHash(l.TxHash.Bytes()),
TxIndex: l.TxIndex,
diff --git a/core/types/receipt.go b/core/types/receipt.go
index 38e987707d7..271b25507b8 100644
--- a/core/types/receipt.go
+++ b/core/types/receipt.go
@@ -26,6 +26,7 @@ import (
"fmt"
"io"
"math/big"
+ "slices"
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/hexutil"
@@ -272,33 +273,21 @@ func (r *Receipt) statusEncoding() []byte {
// Copy creates a deep copy of the Receipt.
func (r *Receipt) Copy() *Receipt {
- postState := make([]byte, len(r.PostState))
- copy(postState, r.PostState)
-
- bloom := BytesToBloom(r.Bloom.Bytes())
-
- logs := make(Logs, 0, len(r.Logs))
- for _, log := range r.Logs {
- logs = append(logs, log.Copy())
+ if r == nil {
+ return nil
}
-
- txHash := libcommon.BytesToHash(r.TxHash.Bytes())
- contractAddress := libcommon.BytesToAddress(r.ContractAddress.Bytes())
- blockHash := libcommon.BytesToHash(r.BlockHash.Bytes())
- blockNumber := big.NewInt(0).Set(r.BlockNumber)
-
return &Receipt{
Type: r.Type,
- PostState: postState,
+ PostState: slices.Clone(r.PostState),
Status: r.Status,
CumulativeGasUsed: r.CumulativeGasUsed,
- Bloom: bloom,
- Logs: logs,
- TxHash: txHash,
- ContractAddress: contractAddress,
+ Bloom: BytesToBloom(r.Bloom.Bytes()),
+ Logs: r.Logs.Copy(),
+ TxHash: libcommon.BytesToHash(r.TxHash.Bytes()),
+ ContractAddress: libcommon.BytesToAddress(r.ContractAddress.Bytes()),
GasUsed: r.GasUsed,
- BlockHash: blockHash,
- BlockNumber: blockNumber,
+ BlockHash: libcommon.BytesToHash(r.BlockHash.Bytes()),
+ BlockNumber: big.NewInt(0).Set(r.BlockNumber),
TransactionIndex: r.TransactionIndex,
}
}
@@ -352,6 +341,17 @@ type Receipts []*Receipt
// Len returns the number of receipts in this list.
func (rs Receipts) Len() int { return len(rs) }
+func (rs Receipts) Copy() Receipts {
+ if rs == nil {
+ return nil
+ }
+ rsCopy := make(Receipts, rs.Len())
+ for i, r := range rs {
+ rsCopy[i] = r.Copy()
+ }
+ return rsCopy
+}
+
// EncodeIndex encodes the i'th receipt to w.
func (rs Receipts) EncodeIndex(i int, w *bytes.Buffer) {
r := rs[i]
diff --git a/core/vm/eips.go b/core/vm/eips.go
index e2d17673e21..0625ba8a8d5 100644
--- a/core/vm/eips.go
+++ b/core/vm/eips.go
@@ -95,7 +95,10 @@ func enable1884(jt *JumpTable) {
}
func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) {
- balance := interpreter.evm.IntraBlockState().GetBalance(callContext.Contract.Address())
+ balance, err := interpreter.evm.IntraBlockState().GetBalance(callContext.Contract.Address())
+ if err != nil {
+ return nil, err
+ }
callContext.Stack.Push(balance)
return nil, nil
}
diff --git a/core/vm/errors.go b/core/vm/errors.go
index ce8ff51f1eb..b8fbee9adc8 100644
--- a/core/vm/errors.go
+++ b/core/vm/errors.go
@@ -49,6 +49,10 @@ var (
// errStopToken is an internal token indicating interpreter loop termination,
// never returned to outside callers.
errStopToken = errors.New("stop token")
+ //
+ // ErrIntraBlockStateFailed indicates a fatal error when processing IBS
+ // requests
+ ErrIntraBlockStateFailed = errors.New("ibs fatal error")
)
// ErrStackUnderflow wraps an evm error when the items on the stack less
diff --git a/core/vm/evm.go b/core/vm/evm.go
index a01a97d8a2a..7b09c92f98f 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -20,6 +20,7 @@
package vm
import (
+ "fmt"
"sync/atomic"
"github.com/holiman/uint256"
@@ -28,10 +29,10 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/u256"
"github.com/erigontech/erigon-lib/crypto"
- "github.com/erigontech/erigon-lib/trie"
"github.com/erigontech/erigon/core/tracing"
"github.com/erigontech/erigon/core/vm/evmtypes"
"github.com/erigontech/erigon/params"
+ "github.com/erigontech/erigon/turbo/trie"
)
var emptyHash = libcommon.Hash{}
@@ -189,7 +190,11 @@ func (evm *EVM) call(typ OpCode, caller ContractRef, addr libcommon.Address, inp
}
if typ == CALL || typ == CALLCODE {
// Fail if we're trying to transfer more than the available balance
- if !value.IsZero() && !evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value) {
+ canTransfer, err := evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value)
+ if err != nil {
+ return nil, 0, err
+ }
+ if !value.IsZero() && !canTransfer {
if !bailout {
return nil, gas, ErrInsufficientBalance
}
@@ -198,13 +203,20 @@ func (evm *EVM) call(typ OpCode, caller ContractRef, addr libcommon.Address, inp
p, isPrecompile := evm.precompile(addr)
var code []byte
if !isPrecompile {
- code = evm.intraBlockState.ResolveCode(addr)
+ code, err = evm.intraBlockState.ResolveCode(addr)
+ if err != nil {
+ return nil, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
}
snapshot := evm.intraBlockState.Snapshot()
if typ == CALL {
- if !evm.intraBlockState.Exist(addr) {
+ exist, err := evm.intraBlockState.Exist(addr)
+ if err != nil {
+ return nil, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ if !exist {
if !isPrecompile && evm.chainRules.IsSpuriousDragon && value.IsZero() {
if evm.config.Debug {
v := value
@@ -270,7 +282,11 @@ func (evm *EVM) call(typ OpCode, caller ContractRef, addr libcommon.Address, inp
addrCopy := addr
// Initialise a new contract and set the code that is to be used by the EVM.
// The contract is a scoped environment for this execution context only.
- codeHash := evm.intraBlockState.ResolveCodeHash(addrCopy)
+ var codeHash libcommon.Hash
+ codeHash, err = evm.intraBlockState.ResolveCodeHash(addrCopy)
+ if err != nil {
+ return nil, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
var contract *Contract
if typ == CALLCODE {
contract = NewContract(caller, caller.Address(), value, gas, evm.config.SkipAnalysis, evm.JumpDestCache)
@@ -385,14 +401,21 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gasRemainin
err = ErrDepth
return nil, libcommon.Address{}, gasRemaining, err
}
- if !evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value) {
+ canTransfer, err := evm.Context.CanTransfer(evm.intraBlockState, caller.Address(), value)
+ if err != nil {
+ return nil, libcommon.Address{}, 0, err
+ }
+ if !canTransfer {
if !bailout {
err = ErrInsufficientBalance
return nil, libcommon.Address{}, gasRemaining, err
}
}
if incrementNonce {
- nonce := evm.intraBlockState.GetNonce(caller.Address())
+ nonce, err := evm.intraBlockState.GetNonce(caller.Address())
+ if err != nil {
+ return nil, libcommon.Address{}, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
if nonce+1 < nonce {
err = ErrNonceUintOverflow
return nil, libcommon.Address{}, gasRemaining, err
@@ -405,8 +428,15 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gasRemainin
evm.intraBlockState.AddAddressToAccessList(address)
}
// Ensure there's no existing contract already at the designated address
- contractHash := evm.intraBlockState.ResolveCodeHash(address)
- if evm.intraBlockState.GetNonce(address) != 0 || (contractHash != (libcommon.Hash{}) && contractHash != trie.EmptyCodeHash) {
+ contractHash, err := evm.intraBlockState.ResolveCodeHash(address)
+ if err != nil {
+ return nil, libcommon.Address{}, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ nonce, err := evm.intraBlockState.GetNonce(address)
+ if err != nil {
+ return nil, libcommon.Address{}, 0, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ if nonce != 0 || (contractHash != (libcommon.Hash{}) && contractHash != trie.EmptyCodeHash) {
err = ErrContractAddressCollision
return nil, libcommon.Address{}, 0, err
}
@@ -481,7 +511,11 @@ func (evm *EVM) maxCodeSize() int {
// Create creates a new contract using code as deployment code.
// DESCRIBED: docs/programmers_guide/guide.md#nonce
func (evm *EVM) Create(caller ContractRef, code []byte, gasRemaining uint64, endowment *uint256.Int, bailout bool) (ret []byte, contractAddr libcommon.Address, leftOverGas uint64, err error) {
- contractAddr = crypto.CreateAddress(caller.Address(), evm.intraBlockState.GetNonce(caller.Address()))
+ nonce, err := evm.intraBlockState.GetNonce(caller.Address())
+ if err != nil {
+ return nil, libcommon.Address{}, 0, err
+ }
+ contractAddr = crypto.CreateAddress(caller.Address(), nonce)
return evm.create(caller, &codeAndHash{code: code}, gasRemaining, endowment, contractAddr, CREATE, true /* incrementNonce */, bailout)
}
diff --git a/core/vm/evmtypes/evmtypes.go b/core/vm/evmtypes/evmtypes.go
index 775c4600acd..8e1e46fd271 100644
--- a/core/vm/evmtypes/evmtypes.go
+++ b/core/vm/evmtypes/evmtypes.go
@@ -103,10 +103,10 @@ func (result *ExecutionResult) Revert() []byte {
type (
// CanTransferFunc is the signature of a transfer guard function
- CanTransferFunc func(IntraBlockState, common.Address, *uint256.Int) bool
+ CanTransferFunc func(IntraBlockState, common.Address, *uint256.Int) (bool, error)
// TransferFunc is the signature of a transfer function
- TransferFunc func(IntraBlockState, common.Address, common.Address, *uint256.Int, bool)
+ TransferFunc func(IntraBlockState, common.Address, common.Address, *uint256.Int, bool) error
// GetHashFunc returns the nth block hash in the blockchain
// and is used by the BLOCKHASH EVM op code.
@@ -119,50 +119,50 @@ type (
// IntraBlockState is an EVM database for full state querying.
type IntraBlockState interface {
- CreateAccount(common.Address, bool)
+ CreateAccount(common.Address, bool) error
- SubBalance(common.Address, *uint256.Int, tracing.BalanceChangeReason)
- AddBalance(common.Address, *uint256.Int, tracing.BalanceChangeReason)
- GetBalance(common.Address) *uint256.Int
+ SubBalance(common.Address, *uint256.Int, tracing.BalanceChangeReason) error
+ AddBalance(common.Address, *uint256.Int, tracing.BalanceChangeReason) error
+ GetBalance(common.Address) (*uint256.Int, error)
- GetNonce(common.Address) uint64
- SetNonce(common.Address, uint64)
+ GetNonce(common.Address) (uint64, error)
+ SetNonce(common.Address, uint64) error
- GetCodeHash(common.Address) common.Hash
- GetCode(common.Address) []byte
- SetCode(common.Address, []byte)
- GetCodeSize(common.Address) int
+ GetCodeHash(common.Address) (common.Hash, error)
+ GetCode(common.Address) ([]byte, error)
+ SetCode(common.Address, []byte) error
+ GetCodeSize(common.Address) (int, error)
// eip-7702; delegated designations
- ResolveCodeHash(common.Address) common.Hash
- ResolveCode(common.Address) []byte
- ResolveCodeSize(common.Address) int
- GetDelegatedDesignation(common.Address) (common.Address, bool)
+ ResolveCodeHash(common.Address) (common.Hash, error)
+ ResolveCode(common.Address) ([]byte, error)
+ ResolveCodeSize(common.Address) (int, error)
+ GetDelegatedDesignation(common.Address) (common.Address, bool, error)
AddRefund(uint64)
SubRefund(uint64)
GetRefund() uint64
- GetCommittedState(common.Address, *common.Hash, *uint256.Int)
- GetState(address common.Address, slot *common.Hash, outValue *uint256.Int)
- SetState(common.Address, *common.Hash, uint256.Int)
+ GetCommittedState(common.Address, *common.Hash, *uint256.Int) error
+ GetState(address common.Address, slot *common.Hash, outValue *uint256.Int) error
+ SetState(common.Address, *common.Hash, uint256.Int) error
GetTransientState(addr common.Address, key common.Hash) uint256.Int
SetTransientState(addr common.Address, key common.Hash, value uint256.Int)
- Selfdestruct(common.Address) bool
- HasSelfdestructed(common.Address) bool
- Selfdestruct6780(common.Address)
+ Selfdestruct(common.Address) (bool, error)
+ HasSelfdestructed(common.Address) (bool, error)
+ Selfdestruct6780(common.Address) error
// Exist reports whether the given account exists in state.
// Notably this should also return true for suicided accounts.
- Exist(common.Address) bool
+ Exist(common.Address) (bool, error)
// Empty returns whether the given account is empty. Empty
// is defined according to EIP161 (balance = nonce = code = 0).
- Empty(common.Address) bool
+ Empty(common.Address) (bool, error)
Prepare(rules *chain.Rules, sender, coinbase common.Address, dest *common.Address,
- precompiles []common.Address, txAccesses types.AccessList, authorities []common.Address)
+ precompiles []common.Address, txAccesses types.AccessList, authorities []common.Address) error
AddressInAccessList(addr common.Address) bool
// AddAddressToAccessList adds the given address to the access list. This operation is safe to perform
diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go
index ef38856ccfc..7d98f49529c 100644
--- a/core/vm/gas_table.go
+++ b/core/vm/gas_table.go
@@ -391,11 +391,21 @@ func gasCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memo
address = libcommon.Address(stack.Back(1).Bytes20())
)
if evm.ChainRules().IsSpuriousDragon {
- if transfersValue && evm.IntraBlockState().Empty(address) {
+ empty, err := evm.IntraBlockState().Empty(address)
+ if err != nil {
+ return 0, err
+ }
+ if transfersValue && empty {
+ gas += params.CallNewAccountGas
+ }
+ } else {
+ exists, err := evm.IntraBlockState().Exist(address)
+ if err != nil {
+ return 0, err
+ }
+ if !exists {
gas += params.CallNewAccountGas
}
- } else if !evm.IntraBlockState().Exist(address) {
- gas += params.CallNewAccountGas
}
if transfersValue {
gas += params.CallValueTransferGas
@@ -499,15 +509,33 @@ func gasSelfdestruct(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memo
if evm.ChainRules().IsSpuriousDragon {
// if empty and transfers value
- if evm.IntraBlockState().Empty(address) && !evm.IntraBlockState().GetBalance(contract.Address()).IsZero() {
+ empty, err := evm.IntraBlockState().Empty(address)
+ if err != nil {
+ return 0, err
+ }
+ balance, err := evm.IntraBlockState().GetBalance(contract.Address())
+ if err != nil {
+ return 0, err
+ }
+ if empty && !balance.IsZero() {
+ gas += params.CreateBySelfdestructGas
+ }
+ } else {
+ exist, err := evm.IntraBlockState().Exist(address)
+ if err != nil {
+ return 0, err
+ }
+ if !exist {
gas += params.CreateBySelfdestructGas
}
- } else if !evm.IntraBlockState().Exist(address) {
- gas += params.CreateBySelfdestructGas
}
}
- if !evm.IntraBlockState().HasSelfdestructed(contract.Address()) {
+ hasSelfdestructed, err := evm.IntraBlockState().HasSelfdestructed(contract.Address())
+ if err != nil {
+ return 0, err
+ }
+ if !hasSelfdestructed {
evm.IntraBlockState().AddRefund(params.SelfdestructRefundGas)
}
return gas, nil
diff --git a/core/vm/gas_table_test.go b/core/vm/gas_table_test.go
index 4703b81f87f..fc33308a2eb 100644
--- a/core/vm/gas_table_test.go
+++ b/core/vm/gas_table_test.go
@@ -144,8 +144,10 @@ func TestEIP2200(t *testing.T) {
_ = s.CommitBlock(params.AllProtocolChanges.Rules(0, 0), w)
vmctx := evmtypes.BlockContext{
- CanTransfer: func(evmtypes.IntraBlockState, libcommon.Address, *uint256.Int) bool { return true },
- Transfer: func(evmtypes.IntraBlockState, libcommon.Address, libcommon.Address, *uint256.Int, bool) {},
+ CanTransfer: func(evmtypes.IntraBlockState, libcommon.Address, *uint256.Int) (bool, error) { return true, nil },
+ Transfer: func(evmtypes.IntraBlockState, libcommon.Address, libcommon.Address, *uint256.Int, bool) error {
+ return nil
+ },
}
vmenv := vm.NewEVM(vmctx, evmtypes.TxContext{}, s, params.AllProtocolChanges, vm.Config{ExtraEips: []int{2200}})
@@ -207,8 +209,10 @@ func TestCreateGas(t *testing.T) {
_ = s.CommitBlock(params.TestChainConfig.Rules(0, 0), stateWriter)
vmctx := evmtypes.BlockContext{
- CanTransfer: func(evmtypes.IntraBlockState, libcommon.Address, *uint256.Int) bool { return true },
- Transfer: func(evmtypes.IntraBlockState, libcommon.Address, libcommon.Address, *uint256.Int, bool) {},
+ CanTransfer: func(evmtypes.IntraBlockState, libcommon.Address, *uint256.Int) (bool, error) { return true, nil },
+ Transfer: func(evmtypes.IntraBlockState, libcommon.Address, libcommon.Address, *uint256.Int, bool) error {
+ return nil
+ },
}
config := vm.Config{}
if tt.eip3860 {
diff --git a/core/vm/instructions.go b/core/vm/instructions.go
index 17ccb4ae4ef..a3bb8d7a316 100644
--- a/core/vm/instructions.go
+++ b/core/vm/instructions.go
@@ -288,7 +288,11 @@ func opAddress(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]
func opBalance(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
slot := scope.Stack.Peek()
address := libcommon.Address(slot.Bytes20())
- slot.Set(interpreter.evm.IntraBlockState().GetBalance(address))
+ balance, err := interpreter.evm.IntraBlockState().GetBalance(address)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ slot.Set(balance)
return nil, nil
}
@@ -372,7 +376,11 @@ func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeConte
func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
slot := scope.Stack.Peek()
- slot.SetUint64(uint64(interpreter.evm.IntraBlockState().ResolveCodeSize(slot.Bytes20())))
+ codeSize, err := interpreter.evm.IntraBlockState().ResolveCodeSize(slot.Bytes20())
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ slot.SetUint64(uint64(codeSize))
return nil, nil
}
@@ -409,7 +417,11 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext)
addr := libcommon.Address(a.Bytes20())
len64 := length.Uint64()
- codeCopy := getDataBig(interpreter.evm.IntraBlockState().ResolveCode(addr), &codeOffset, len64)
+ code, err := interpreter.evm.IntraBlockState().ResolveCode(addr)
+ if err != nil {
+ return nil, fmt.Errorf("%w: %w", ErrIntraBlockStateFailed, err)
+ }
+ codeCopy := getDataBig(code, &codeOffset, len64)
scope.Memory.Set(memOffset.Uint64(), len64, codeCopy)
return nil, nil
}
@@ -455,10 +467,18 @@ func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext)
slot := scope.Stack.Peek()
address := libcommon.Address(slot.Bytes20())
- if interpreter.evm.IntraBlockState().Empty(address) {
+ empty, err := interpreter.evm.IntraBlockState().Empty(address)
+ if err != nil {
+ return nil, err
+ }
+ if empty {
slot.Clear()
} else {
- slot.SetBytes(interpreter.evm.IntraBlockState().ResolveCodeHash(address).Bytes())
+ codeHash, err := interpreter.evm.IntraBlockState().ResolveCodeHash(address)
+ if err != nil {
+ return nil, err
+ }
+ slot.SetBytes(codeHash.Bytes())
}
return nil, nil
}
@@ -560,8 +580,7 @@ func opMstore8(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]
func opSload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
loc := scope.Stack.Peek()
interpreter.hasherBuf = loc.Bytes32()
- interpreter.evm.IntraBlockState().GetState(scope.Contract.Address(), &interpreter.hasherBuf, loc)
- return nil, nil
+ return nil, interpreter.evm.IntraBlockState().GetState(scope.Contract.Address(), &interpreter.hasherBuf, loc)
}
func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
@@ -571,8 +590,7 @@ func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]b
loc := scope.Stack.Pop()
val := scope.Stack.Pop()
interpreter.hasherBuf = loc.Bytes32()
- interpreter.evm.IntraBlockState().SetState(scope.Contract.Address(), &interpreter.hasherBuf, val)
- return nil, nil
+ return nil, interpreter.evm.IntraBlockState().SetState(scope.Contract.Address(), &interpreter.hasherBuf, val)
}
func opJump(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) {
@@ -880,7 +898,10 @@ func opSelfdestruct(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext
beneficiary := scope.Stack.Pop()
callerAddr := scope.Contract.Address()
beneficiaryAddr := libcommon.Address(beneficiary.Bytes20())
- balance := interpreter.evm.IntraBlockState().GetBalance(callerAddr)
+ balance, err := interpreter.evm.IntraBlockState().GetBalance(callerAddr)
+ if err != nil {
+ return nil, err
+ }
if interpreter.evm.Config().Debug {
if interpreter.cfg.Debug {
interpreter.cfg.Tracer.CaptureEnter(SELFDESTRUCT, callerAddr, beneficiaryAddr, false /* precompile */, false /* create */, []byte{}, 0, balance, nil /* code */)
@@ -899,7 +920,11 @@ func opSelfdestruct6780(pc *uint64, interpreter *EVMInterpreter, scope *ScopeCon
beneficiary := scope.Stack.Pop()
callerAddr := scope.Contract.Address()
beneficiaryAddr := libcommon.Address(beneficiary.Bytes20())
- balance := *interpreter.evm.IntraBlockState().GetBalance(callerAddr)
+ pbalance, err := interpreter.evm.IntraBlockState().GetBalance(callerAddr)
+ if err != nil {
+ return nil, err
+ }
+ balance := *pbalance
interpreter.evm.IntraBlockState().SubBalance(callerAddr, &balance, tracing.BalanceDecreaseSelfdestruct)
interpreter.evm.IntraBlockState().AddBalance(beneficiaryAddr, &balance, tracing.BalanceIncreaseSelfdestruct)
interpreter.evm.IntraBlockState().Selfdestruct6780(callerAddr)
diff --git a/core/vm/operations_acl.go b/core/vm/operations_acl.go
index a8c3fec9b33..fe1817e8013 100644
--- a/core/vm/operations_acl.go
+++ b/core/vm/operations_acl.go
@@ -231,10 +231,22 @@ func makeSelfdestructGasFn(refundsEnabled bool) gasFunc {
gas = params.ColdAccountAccessCostEIP2929
}
// if empty and transfers value
- if evm.IntraBlockState().Empty(address) && !evm.IntraBlockState().GetBalance(contract.Address()).IsZero() {
+ empty, err := evm.IntraBlockState().Empty(address)
+ if err != nil {
+ return 0, err
+ }
+ balance, err := evm.IntraBlockState().GetBalance(contract.Address())
+ if err != nil {
+ return 0, err
+ }
+ if empty && !balance.IsZero() {
gas += params.CreateBySelfdestructGas
}
- if refundsEnabled && !evm.IntraBlockState().HasSelfdestructed(contract.Address()) {
+ hasSelfdestructed, err := evm.IntraBlockState().HasSelfdestructed(contract.Address())
+ if err != nil {
+ return 0, err
+ }
+ if refundsEnabled && !hasSelfdestructed {
evm.IntraBlockState().AddRefund(params.SelfdestructRefundGas)
}
return gas, nil
@@ -266,7 +278,11 @@ func makeCallVariantGasCallEIP7702(oldCalculator gasFunc) gasFunc {
}
// Check if code is a delegation and if so, charge for resolution.
- if dd, ok := evm.intraBlockState.GetDelegatedDesignation(addr); ok {
+ dd, ok, err := evm.intraBlockState.GetDelegatedDesignation(addr)
+ if err != nil {
+ return 0, err
+ }
+ if ok {
var ddCost uint64
if evm.intraBlockState.AddAddressToAccessList(dd) {
ddCost = params.ColdAccountAccessCostEIP2929
@@ -311,8 +327,11 @@ func gasEip7702CodeCheck(evm *EVM, contract *Contract, stack *stack.Stack, mem *
// Check if code is a delegation and if so, charge for resolution
cost = params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929
}
-
- if dd, ok := evm.intraBlockState.GetDelegatedDesignation(addr); ok {
+ dd, ok, err := evm.intraBlockState.GetDelegatedDesignation(addr)
+ if err != nil {
+ return 0, err
+ }
+ if ok {
if evm.intraBlockState.AddAddressToAccessList(dd) {
cost += params.ColdAccountAccessCostEIP2929
} else {
@@ -340,7 +359,11 @@ func gasExtCodeCopyEIP7702(evm *EVM, contract *Contract, stack *stack.Stack, mem
}
// Check if addr has a delegation and if so, charge for resolution
- if dd, ok := evm.intraBlockState.GetDelegatedDesignation(addr); ok {
+ dd, ok, err := evm.intraBlockState.GetDelegatedDesignation(addr)
+ if err != nil {
+ return 0, err
+ }
+ if ok {
var overflow bool
if evm.intraBlockState.AddAddressToAccessList(dd) {
if gas, overflow = math.SafeAdd(gas, params.ColdAccountAccessCostEIP2929); overflow {
diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go
index c580b39b25a..77748306170 100644
--- a/core/vm/runtime/runtime.go
+++ b/core/vm/runtime/runtime.go
@@ -131,7 +131,7 @@ func Execute(code, input []byte, cfg *Config, tempdir string) ([]byte, *state.In
if !externalState {
db := memdb.NewStateDB(tempdir)
defer db.Close()
- agg, err := state3.NewAggregator(context.Background(), datadir.New(tempdir), config3.HistoryV3AggregationStep, db, log.New())
+ agg, err := state3.NewAggregator(context.Background(), datadir.New(tempdir), config3.DefaultStepSize, db, log.New())
if err != nil {
return nil, nil, err
}
@@ -193,7 +193,7 @@ func Create(input []byte, cfg *Config, blockNr uint64) ([]byte, libcommon.Addres
db := memdb.NewStateDB(tmp)
defer db.Close()
- agg, err := state3.NewAggregator(context.Background(), datadir.New(tmp), config3.HistoryV3AggregationStep, db, log.New())
+ agg, err := state3.NewAggregator(context.Background(), datadir.New(tmp), config3.DefaultStepSize, db, log.New())
if err != nil {
return nil, [20]byte{}, 0, err
}
@@ -244,7 +244,10 @@ func Call(address libcommon.Address, input []byte, cfg *Config) ([]byte, uint64,
vmenv := NewEnv(cfg)
- sender := cfg.State.GetOrNewStateObject(cfg.Origin)
+ sender, err := cfg.State.GetOrNewStateObject(cfg.Origin)
+ if err != nil {
+ return nil, 0, err
+ }
statedb := cfg.State
rules := vmenv.ChainRules()
statedb.Prepare(rules, cfg.Origin, cfg.Coinbase, &address, vm.ActivePrecompiles(rules), nil, nil)
diff --git a/erigon-lib/.golangci.yml b/erigon-lib/.golangci.yml
index 2e0ddf2d260..ef0658d69f6 100644
--- a/erigon-lib/.golangci.yml
+++ b/erigon-lib/.golangci.yml
@@ -96,15 +96,17 @@ linters-settings:
issues:
exclude-rules:
- - path: rlp
+ - path: rlp/.*\.go
linters:
- - errorlint
- - path: bitutil
- linters:
- - errorlint
+ - predeclared
+ - thelper
+ - all
- linters:
- golint
text: "should be"
+ - linters:
+ - recvcheck
+ text: "the methods of"
- linters:
- errcheck
text: "not checked"
diff --git a/erigon-lib/commitment/commitment.go b/erigon-lib/commitment/commitment.go
index 2d7e6c316c5..db7464ed17f 100644
--- a/erigon-lib/commitment/commitment.go
+++ b/erigon-lib/commitment/commitment.go
@@ -258,36 +258,31 @@ func (be *BranchEncoder) CollectUpdate(
return lastNibble, nil
}
+func (be *BranchEncoder) putUvarAndVal(size uint64, val []byte) error {
+ n := binary.PutUvarint(be.bitmapBuf[:], size)
+ if _, err := be.buf.Write(be.bitmapBuf[:n]); err != nil {
+ return err
+ }
+ if _, err := be.buf.Write(val); err != nil {
+ return err
+ }
+ return nil
+}
+
// Encoded result should be copied before next call to EncodeBranch, underlying slice is reused
func (be *BranchEncoder) EncodeBranch(bitmap, touchMap, afterMap uint16, readCell func(nibble int, skip bool) (*cell, error)) (BranchData, int, error) {
be.buf.Reset()
- if err := binary.Write(be.buf, binary.BigEndian, touchMap); err != nil {
+ var encoded [2]byte
+ binary.BigEndian.PutUint16(encoded[:], touchMap)
+ if _, err := be.buf.Write(encoded[:]); err != nil {
return nil, 0, err
}
- if err := binary.Write(be.buf, binary.BigEndian, afterMap); err != nil {
+ binary.BigEndian.PutUint16(encoded[:], afterMap)
+ if _, err := be.buf.Write(encoded[:]); err != nil {
return nil, 0, err
}
- putUvarAndVal := func(size uint64, val []byte) error {
- n := binary.PutUvarint(be.bitmapBuf[:], size)
- wn, err := be.buf.Write(be.bitmapBuf[:n])
- if err != nil {
- return err
- }
- if n != wn {
- return errors.New("n != wn size")
- }
- wn, err = be.buf.Write(val)
- if err != nil {
- return err
- }
- if len(val) != wn {
- return errors.New("wn != value size")
- }
- return nil
- }
-
var lastNibble int
for bitset, j := afterMap, 0; bitset != 0; j++ {
bit := bitset & -bitset
@@ -325,27 +320,27 @@ func (be *BranchEncoder) EncodeBranch(bitmap, touchMap, afterMap uint16, readCel
return nil, 0, err
}
if fields&fieldExtension != 0 {
- if err := putUvarAndVal(uint64(cell.extLen), cell.extension[:cell.extLen]); err != nil {
+ if err := be.putUvarAndVal(uint64(cell.extLen), cell.extension[:cell.extLen]); err != nil {
return nil, 0, err
}
}
if fields&fieldAccountAddr != 0 {
- if err := putUvarAndVal(uint64(cell.accountAddrLen), cell.accountAddr[:cell.accountAddrLen]); err != nil {
+ if err := be.putUvarAndVal(uint64(cell.accountAddrLen), cell.accountAddr[:cell.accountAddrLen]); err != nil {
return nil, 0, err
}
}
if fields&fieldStorageAddr != 0 {
- if err := putUvarAndVal(uint64(cell.storageAddrLen), cell.storageAddr[:cell.storageAddrLen]); err != nil {
+ if err := be.putUvarAndVal(uint64(cell.storageAddrLen), cell.storageAddr[:cell.storageAddrLen]); err != nil {
return nil, 0, err
}
}
if fields&fieldHash != 0 {
- if err := putUvarAndVal(uint64(cell.hashLen), cell.hash[:cell.hashLen]); err != nil {
+ if err := be.putUvarAndVal(uint64(cell.hashLen), cell.hash[:cell.hashLen]); err != nil {
return nil, 0, err
}
}
if fields&fieldStateHash != 0 {
- if err := putUvarAndVal(uint64(cell.stateHashLen), cell.stateHash[:cell.stateHashLen]); err != nil {
+ if err := be.putUvarAndVal(uint64(cell.stateHashLen), cell.stateHash[:cell.stateHashLen]); err != nil {
return nil, 0, err
}
}
diff --git a/erigon-lib/commitment/hex_patricia_hashed.go b/erigon-lib/commitment/hex_patricia_hashed.go
index 95765476930..faf9c68d6b3 100644
--- a/erigon-lib/commitment/hex_patricia_hashed.go
+++ b/erigon-lib/commitment/hex_patricia_hashed.go
@@ -117,6 +117,9 @@ type cell struct {
stateHashLen int // stateHash length, if > 0 can reuse
loaded loadFlags // folded Cell have only hash, unfolded have all fields
Update // state update
+
+ // temporary buffers
+ hashBuf [length.Hash]byte
}
type loadFlags uint8
@@ -163,6 +166,14 @@ var (
EmptyCodeHashArray = *(*[length.Hash]byte)(EmptyCodeHash)
)
+func (cell *cell) hashAccKey(keccak keccakState, depth int) error {
+ return hashKey(keccak, cell.accountAddr[:cell.accountAddrLen], cell.hashedExtension[:], depth, cell.hashBuf[:])
+}
+
+func (cell *cell) hashStorageKey(keccak keccakState, accountKeyLen, downOffset int, hashedKeyOffset int) error {
+ return hashKey(keccak, cell.storageAddr[accountKeyLen:cell.storageAddrLen], cell.hashedExtension[downOffset:], hashedKeyOffset, cell.hashBuf[:])
+}
+
func (cell *cell) reset() {
cell.accountAddrLen = 0
cell.storageAddrLen = 0
@@ -345,10 +356,9 @@ func (cell *cell) fillFromLowerCell(lowCell *cell, lowDepth int, preExtension []
cell.loaded = lowCell.loaded
}
-func hashKey(keccak keccakState, plainKey []byte, dest []byte, hashedKeyOffset int) error {
+func hashKey(keccak keccakState, plainKey []byte, dest []byte, hashedKeyOffset int, hashBuf []byte) error {
+ _, _ = hashBuf[length.Hash-1], dest[length.Hash*2-1] // bounds checks elimination
keccak.Reset()
- var hashBufBack [length.Hash]byte
- hashBuf := hashBufBack[:]
if _, err := keccak.Write(plainKey); err != nil {
return err
}
@@ -393,7 +403,7 @@ func (cell *cell) deriveHashedKeys(depth int, keccak keccakState, accountKeyLen
cell.hashedExtLen = min(extraLen+cell.hashedExtLen, len(cell.hashedExtension))
var hashedKeyOffset, downOffset int
if cell.accountAddrLen > 0 {
- if err := hashKey(keccak, cell.accountAddr[:cell.accountAddrLen], cell.hashedExtension[:], depth); err != nil {
+ if err := cell.hashAccKey(keccak, depth); err != nil {
return err
}
downOffset = 64 - depth
@@ -405,7 +415,7 @@ func (cell *cell) deriveHashedKeys(depth int, keccak keccakState, accountKeyLen
if depth == 0 {
accountKeyLen = 0
}
- if err := hashKey(keccak, cell.storageAddr[accountKeyLen:cell.storageAddrLen], cell.hashedExtension[downOffset:], hashedKeyOffset); err != nil {
+ if err := cell.hashStorageKey(keccak, accountKeyLen, downOffset, hashedKeyOffset); err != nil {
return err
}
}
@@ -759,72 +769,54 @@ func (hph *HexPatriciaHashed) computeCellHash(cell *cell, depth int, buf []byte)
// if account key is empty, then we need to hash storage key from the key beginning
koffset = 0
}
- if err = hashKey(hph.keccak, cell.storageAddr[koffset:cell.storageAddrLen], cell.hashedExtension[:], hashedKeyOffset); err != nil {
+ if err = cell.hashStorageKey(hph.keccak, koffset, 0, hashedKeyOffset); err != nil {
return nil, err
}
cell.hashedExtension[64-hashedKeyOffset] = 16 // Add terminator
if cell.stateHashLen > 0 {
- res := append([]byte{160}, cell.stateHash[:cell.stateHashLen]...)
hph.keccak.Reset()
if hph.trace {
- fmt.Printf("REUSED stateHash %x spk %x\n", res, cell.storageAddr[:cell.storageAddrLen])
+ fmt.Printf("REUSED stateHash %x spk %x\n", cell.stateHash[:cell.stateHashLen], cell.storageAddr[:cell.storageAddrLen])
}
mxTrieStateSkipRate.Inc()
skippedLoad.Add(1)
if !singleton {
- return res, nil
- } else {
- storageRootHashIsSet = true
- storageRootHash = *(*[length.Hash]byte)(res[1:])
- //copy(storageRootHash[:], res[1:])
- //cell.stateHashLen = 0
+ return append(append(buf[:0], byte(160)), cell.stateHash[:cell.stateHashLen]...), nil
}
+ storageRootHashIsSet = true
+ storageRootHash = *(*[length.Hash]byte)(cell.stateHash[:cell.stateHashLen])
} else {
if !cell.loaded.storage() {
- update, err := hph.ctx.Storage(cell.storageAddr[:cell.storageAddrLen])
- if err != nil {
- return nil, err
- }
- cell.setFromUpdate(update)
- fmt.Printf("Storage %x was not loaded\n", cell.storageAddr[:cell.storageAddrLen])
+ return nil, fmt.Errorf("storage %x was not loaded as expected: cell %v", cell.storageAddr[:cell.storageAddrLen], cell.String())
+ // update, err := hph.ctx.Storage(cell.storageAddr[:cell.storageAddrLen])
+ // if err != nil {
+ // return nil, err
+ // }
+ // cell.setFromUpdate(update)
}
- if singleton {
- if hph.trace {
- fmt.Printf("leafHashWithKeyVal(singleton) for [%x]=>[%x]\n", cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen])
- }
- aux := make([]byte, 0, 33)
- if aux, err = hph.leafHashWithKeyVal(aux, cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen], true); err != nil {
- return nil, err
- }
- if hph.trace {
- fmt.Printf("leafHashWithKeyVal(singleton) storage hash [%x]\n", aux)
- }
- storageRootHash = *(*[length.Hash]byte)(aux[1:])
- storageRootHashIsSet = true
- cell.stateHashLen = 0
- hadToReset.Add(1)
- } else {
- if hph.trace {
- fmt.Printf("leafHashWithKeyVal for [%x]=>[%x] %v\n", cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen], cell.String())
- }
- leafHash, err := hph.leafHashWithKeyVal(buf, cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen], false)
- if err != nil {
- return nil, err
- }
+ leafHash, err := hph.leafHashWithKeyVal(buf, cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen], singleton)
+ if err != nil {
+ return nil, err
+ }
+ if hph.trace {
+ fmt.Printf("leafHashWithKeyVal(singleton=%t) {%x} for [%x]=>[%x] %v\n",
+ singleton, leafHash, cell.hashedExtension[:64-hashedKeyOffset+1], cell.Storage[:cell.StorageLen], cell.String())
+ }
+ if !singleton {
copy(cell.stateHash[:], leafHash[1:])
cell.stateHashLen = len(leafHash) - 1
- if hph.trace {
- fmt.Printf("STATE HASH storage memoized %x spk %x\n", leafHash, cell.storageAddr[:cell.storageAddrLen])
- }
-
return leafHash, nil
}
+ storageRootHash = *(*[length.Hash]byte)(leafHash[1:])
+ storageRootHashIsSet = true
+ cell.stateHashLen = 0
+ hadToReset.Add(1)
}
}
if cell.accountAddrLen > 0 {
- if err := hashKey(hph.keccak, cell.accountAddr[:cell.accountAddrLen], cell.hashedExtension[:], depth); err != nil {
+ if err := cell.hashAccKey(hph.keccak, depth); err != nil {
return nil, err
}
cell.hashedExtension[64-depth] = 16 // Add terminator
@@ -852,15 +844,14 @@ func (hph *HexPatriciaHashed) computeCellHash(cell *cell, depth int, buf []byte)
}
if !cell.loaded.account() {
if cell.stateHashLen > 0 {
- res := append([]byte{160}, cell.stateHash[:cell.stateHashLen]...)
hph.keccak.Reset()
mxTrieStateSkipRate.Inc()
skippedLoad.Add(1)
if hph.trace {
- fmt.Printf("REUSED stateHash %x apk %x\n", res, cell.accountAddr[:cell.accountAddrLen])
+ fmt.Printf("REUSED stateHash %x apk %x\n", cell.stateHash[:cell.stateHashLen], cell.accountAddr[:cell.accountAddrLen])
}
- return res, nil
+ return append(append(buf[:0], byte(160)), cell.stateHash[:cell.stateHashLen]...), nil
}
// storage root update or extension update could invalidate older stateHash, so we need to reload state
update, err := hph.ctx.Account(cell.accountAddr[:cell.accountAddrLen])
@@ -872,19 +863,16 @@ func (hph *HexPatriciaHashed) computeCellHash(cell *cell, depth int, buf []byte)
var valBuf [128]byte
valLen := cell.accountForHashing(valBuf[:], storageRootHash)
- if hph.trace {
- fmt.Printf("accountLeafHashWithKey for [%x]=>[%x]\n", cell.hashedExtension[:65-depth], rlp.RlpEncodedBytes(valBuf[:valLen]))
- }
- leafHash, err := hph.accountLeafHashWithKey(buf, cell.hashedExtension[:65-depth], rlp.RlpEncodedBytes(valBuf[:valLen]))
+ buf, err = hph.accountLeafHashWithKey(buf, cell.hashedExtension[:65-depth], rlp.RlpEncodedBytes(valBuf[:valLen]))
if err != nil {
return nil, err
}
if hph.trace {
- fmt.Printf("STATE HASH account memoized %x\n", leafHash)
+ fmt.Printf("accountLeafHashWithKey {%x} (memorised) for [%x]=>[%x]\n", buf, cell.hashedExtension[:65-depth], rlp.RlpEncodedBytes(valBuf[:valLen]))
}
- copy(cell.stateHash[:], leafHash[1:])
- cell.stateHashLen = len(leafHash) - 1
- return leafHash, nil
+ copy(cell.stateHash[:], buf[1:])
+ cell.stateHashLen = len(buf) - 1
+ return buf, nil
}
buf = append(buf, 0x80+32)
@@ -893,11 +881,10 @@ func (hph *HexPatriciaHashed) computeCellHash(cell *cell, depth int, buf []byte)
if hph.trace {
fmt.Printf("extensionHash for [%x]=>[%x]\n", cell.extension[:cell.extLen], cell.hash[:cell.hashLen])
}
- var hash [length.Hash]byte
- if hash, err = hph.extensionHash(cell.extension[:cell.extLen], cell.hash[:cell.hashLen]); err != nil {
+ if storageRootHash, err = hph.extensionHash(cell.extension[:cell.extLen], cell.hash[:cell.hashLen]); err != nil {
return nil, err
}
- buf = append(buf, hash[:]...)
+ buf = append(buf, storageRootHash[:]...)
} else {
return nil, errors.New("computeCellHash extension without hash")
}
diff --git a/erigon-lib/common/address.go b/erigon-lib/common/address.go
index 0a6f6445613..258ea4729a0 100644
--- a/erigon-lib/common/address.go
+++ b/erigon-lib/common/address.go
@@ -22,17 +22,12 @@ import (
"encoding/hex"
"fmt"
"math/big"
- "reflect"
"github.com/erigontech/erigon-lib/common/hexutility"
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/crypto/cryptopool"
)
-var (
- addressT = reflect.TypeOf(Address{})
-)
-
// Address represents the 20 byte address of an Ethereum account.
type Address [length.Addr]byte
diff --git a/erigon-lib/common/big.go b/erigon-lib/common/big.go
index a05af330360..5f5467acafe 100644
--- a/erigon-lib/common/big.go
+++ b/erigon-lib/common/big.go
@@ -16,7 +16,11 @@
package common
-import "math/big"
+import (
+ "math/big"
+
+ "github.com/holiman/uint256"
+)
var (
Big0 = big.NewInt(0)
@@ -26,4 +30,12 @@ var (
Big32 = big.NewInt(32)
Big256 = big.NewInt(256)
Big257 = big.NewInt(257)
+ Num0 = uint256.NewInt(0)
+ Num1 = uint256.NewInt(1)
+ Num2 = uint256.NewInt(2)
+ Num4 = uint256.NewInt(4)
+ Num8 = uint256.NewInt(8)
+ Num27 = uint256.NewInt(27)
+ Num32 = uint256.NewInt(32)
+ Num35 = uint256.NewInt(35)
)
diff --git a/erigon-lib/common/bitutil/compress_test.go b/erigon-lib/common/bitutil/compress_test.go
index 0393b5380a7..b970aff6d00 100644
--- a/erigon-lib/common/bitutil/compress_test.go
+++ b/erigon-lib/common/bitutil/compress_test.go
@@ -21,6 +21,7 @@ package bitutil
import (
"bytes"
+ "errors"
"math/rand"
"testing"
@@ -107,7 +108,7 @@ func TestDecodingCycle(t *testing.T) {
data := hexutil.MustDecode(tt.input)
orig, err := bitsetDecodeBytes(data, tt.size)
- if err != tt.fail {
+ if !errors.Is(err, tt.fail) {
t.Errorf("test %d: failure mismatch: have %v, want %v", i, err, tt.fail)
}
if err != nil {
@@ -143,7 +144,7 @@ func TestCompression(t *testing.T) {
t.Errorf("decoding mismatch for dense data: have %x, want %x, error %v", data, in, err)
}
// Check that decompressing a longer input than the target fails
- if _, err := DecompressBytes([]byte{0xc0, 0x01, 0x01}, 2); err != errExceededTarget {
+ if _, err := DecompressBytes([]byte{0xc0, 0x01, 0x01}, 2); !errors.Is(err, errExceededTarget) {
t.Errorf("decoding error mismatch for long data: have %v, want %v", err, errExceededTarget)
}
}
diff --git a/erigon-lib/common/bytes.go b/erigon-lib/common/bytes.go
index 8d1de9c7f85..1e5d4cce608 100644
--- a/erigon-lib/common/bytes.go
+++ b/erigon-lib/common/bytes.go
@@ -93,11 +93,6 @@ func BytesToUint64(buf []byte) (x uint64) {
return
}
-// has0xPrefix validates str begins with '0x' or '0X'.
-func has0xPrefix(str string) bool { //nolint
- return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')
-}
-
// isHexCharacter returns bool of c being a valid hexadecimal.
func isHexCharacter(c byte) bool {
return ('0' <= c && c <= '9') || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F')
diff --git a/erigon-lib/common/test_utils.go b/erigon-lib/common/test_utils.go
index 0ed165919e5..e3081b06c33 100644
--- a/erigon-lib/common/test_utils.go
+++ b/erigon-lib/common/test_utils.go
@@ -21,6 +21,7 @@ package common
import (
"encoding/json"
+ "errors"
"fmt"
"os"
)
@@ -32,7 +33,8 @@ func LoadJSON(file string, val interface{}) error {
return err
}
if err := json.Unmarshal(content, val); err != nil {
- if syntaxerr, ok := err.(*json.SyntaxError); ok { //nolint:errorlint
+ var syntaxerr *json.SyntaxError
+ if ok := errors.As(err, &syntaxerr); ok {
line := findLine(content, syntaxerr.Offset)
return fmt.Errorf("JSON syntax error at %v:%v: %w", file, line, err)
}
diff --git a/erigon-lib/common/types.go b/erigon-lib/common/types.go
index 4f87da3ce6e..d4c32b80aeb 100644
--- a/erigon-lib/common/types.go
+++ b/erigon-lib/common/types.go
@@ -24,6 +24,7 @@ import (
"encoding/hex"
"encoding/json"
"errors"
+ "reflect"
"strings"
"github.com/erigontech/erigon-lib/common/hexutil"
@@ -52,6 +53,10 @@ func (h UnprefixedHash) MarshalText() ([]byte, error) {
return []byte(hex.EncodeToString(h[:])), nil
}
+/////////// Address
+
+var addressT = reflect.TypeOf(Address{})
+
// UnprefixedAddress allows marshaling an Address without 0x prefix.
type UnprefixedAddress Address
diff --git a/erigon-lib/config3/config3.go b/erigon-lib/config3/config3.go
index 43e089d9ede..791a689c4ef 100644
--- a/erigon-lib/config3/config3.go
+++ b/erigon-lib/config3/config3.go
@@ -16,9 +16,8 @@
package config3
-// AggregationStep number of transactions in smallest static file
-const HistoryV3AggregationStep = 1_562_500 // = 100M / 64. Dividers: 2, 5, 10, 20, 50, 100, 500
-// const HistoryV3AggregationStep = 1_562_500 / 10
+// Default number of transactions (txNums) in one "step". One static file can have [1, 64] steps.
+const DefaultStepSize = 1_562_500 // = 100M / 64. Dividers: 2, 5, 10, 20, 50, 100, 500
const EnableHistoryV4InTest = true
diff --git a/erigon-lib/debug/callers.go b/erigon-lib/debug/callers.go
new file mode 100644
index 00000000000..570f28550ff
--- /dev/null
+++ b/erigon-lib/debug/callers.go
@@ -0,0 +1,41 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package debug
+
+import (
+ "runtime"
+)
+
+// Callers returns given number of callers with packages
+func Callers(show int) []string {
+ fpcs := make([]uintptr, show)
+ n := runtime.Callers(2, fpcs)
+ if n == 0 {
+ return nil
+ }
+
+ callers := make([]string, 0, len(fpcs))
+ for _, p := range fpcs {
+ caller := runtime.FuncForPC(p - 1)
+ if caller == nil {
+ continue
+ }
+ callers = append(callers, caller.Name())
+ }
+
+ return callers
+}
diff --git a/erigon-lib/debug/log_panic.go b/erigon-lib/debug/log_panic.go
new file mode 100644
index 00000000000..e5bdb079b16
--- /dev/null
+++ b/erigon-lib/debug/log_panic.go
@@ -0,0 +1,45 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package debug
+
+import (
+ "os"
+ "sync/atomic"
+ "syscall"
+
+ "github.com/erigontech/erigon-lib/common/dbg"
+ "github.com/erigontech/erigon-lib/log/v3"
+)
+
+var sigc atomic.Value
+
+func GetSigC(sig *chan os.Signal) {
+ sigc.Store(*sig)
+}
+
+// LogPanic - does log panic to logger and to /crashreports then stops the process
+func LogPanic() {
+ panicResult := recover()
+ if panicResult == nil {
+ return
+ }
+
+ log.Error("catch panic", "err", panicResult, "stack", dbg.Stack())
+ if sl := sigc.Load(); sl != nil {
+ sl.(chan os.Signal) <- syscall.SIGINT
+ }
+}
diff --git a/erigon-lib/debug/pprof_cgo.go b/erigon-lib/debug/pprof_cgo.go
new file mode 100644
index 00000000000..7c120c4d846
--- /dev/null
+++ b/erigon-lib/debug/pprof_cgo.go
@@ -0,0 +1,24 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+//go:build debug
+// +build debug
+
+package debug
+
+import (
+ _ "github.com/benesch/cgosymbolizer"
+)
diff --git a/erigon-lib/downloader/README.md b/erigon-lib/downloader/README.md
index 0d1d9e2c95e..515fc0f6d21 100644
--- a/erigon-lib/downloader/README.md
+++ b/erigon-lib/downloader/README.md
@@ -8,7 +8,7 @@ The diagram below shows the components used to manage downloads between torrents
By default the downloader will try to use the underlying bittorrent library to download files from peers and web peers.
-However this can result in slow or stalled downloads. When this happens [rclone](https://rclone.org/) can be used as an auxiliary process to aid the download process. When it is availible the download library will pass downloads to rclone under the following circumstances:
+However this can result in slow or stalled downloads. When this happens [rclone](https://rclone.org/) can be used as an auxiliary process to aid the download process. When it is available the download library will pass downloads to rclone under the following circumstances:
* There are no torrent peers available for a file
* There is not torrent info available for a file, but a torrent file with a matching info hash can be found on the webseeds
@@ -43,13 +43,13 @@ the `well know` hash for a particular segment file in the following format.
Where multiple version of files exists there may be several likes per segment and the code in the released Erigon version will select the version that it is interesting.
-As this file is versioned as part of the Erigon release process the file to hash mapping can potentially change between releases. This can potentially cause an issue for running Erigon node which expect the downloads in the snapshots directory to remain constant, which is why a seperate file is used to record the hases used by the process when it originally downloaded its files.
+As this file is versioned as part of the Erigon release process the file to hash mapping can potentially change between releases. This can potentially cause an issue for running Erigon node which expect the downloads in the snapshots directory to remain constant, which is why a separate file is used to record the hases used by the process when it originally downloaded its files.
## snapshot-lock.json
This is a file which resides in the /snapshots directory for an Erigon node. It is created when the node performs its initial download. It contains the list of downloaded files and their respective hashes.
-When a `snapshot-lock` file exists it is used reather than the chain.toml file to determine which files should be downloaded. This means that the directory contents can be maintained even if Erigon is re-versioned and the chain.toml contents change.
+When a `snapshot-lock` file exists it is used rather than the chain.toml file to determine which files should be downloaded. This means that the directory contents can be maintained even if Erigon is re-versioned and the chain.toml contents change.
### Deleting snapshot-lock.json
diff --git a/erigon-lib/downloader/mdbx_piece_completion.go b/erigon-lib/downloader/mdbx_piece_completion.go
index 5325a74cb62..fe03cb207e8 100644
--- a/erigon-lib/downloader/mdbx_piece_completion.go
+++ b/erigon-lib/downloader/mdbx_piece_completion.go
@@ -129,7 +129,7 @@ func (m *mdbxPieceCompletion) Set(pk metainfo.PieceKey, b bool, awaitFlush bool)
}
// if we're awaiting flush update the DB immediately so it does not
- // intefere with the timing of the background commit - may not be
+ // interfere with the timing of the background commit - may not be
// necessary - in which case the batch can be used
if awaitFlush {
return m.db.Update(context.Background(), func(tx kv.RwTx) error {
diff --git a/erigon-lib/go.mod b/erigon-lib/go.mod
index 16f5c933bd7..3ce46c6cd86 100644
--- a/erigon-lib/go.mod
+++ b/erigon-lib/go.mod
@@ -19,13 +19,11 @@ require (
github.com/benesch/cgosymbolizer v0.0.0-20190515212042-bec6fe6e597b
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
github.com/containerd/cgroups/v3 v3.0.3
- github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc
github.com/crate-crypto/go-kzg-4844 v0.7.0
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0
github.com/edsrzf/mmap-go v1.1.0
github.com/elastic/go-freelru v0.13.0
github.com/erigontech/speedtest v0.0.2
- github.com/gballet/go-verkle v0.0.0-20221121182333-31427a1f2d35
github.com/go-stack/stack v1.8.1
github.com/gofrs/flock v0.12.1
github.com/google/btree v1.1.3
@@ -96,7 +94,7 @@ require (
github.com/consensys/bavard v0.1.13 // indirect
github.com/consensys/gnark-crypto v0.12.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
- github.com/davecgh/go-spew v1.1.1
+ github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/go-units v0.5.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/go-llsqlite/adapter v0.0.0-20230927005056-7f5ce7f0c916 // indirect
diff --git a/erigon-lib/go.sum b/erigon-lib/go.sum
index bab81db460a..9d3b2a639ef 100644
--- a/erigon-lib/go.sum
+++ b/erigon-lib/go.sum
@@ -118,8 +118,6 @@ github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGD
github.com/containerd/cgroups/v3 v3.0.3/go.mod h1:8HBe7V3aWGLFPd/k03swSIsGjZhHI2WzJmticMgVuz0=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc h1:mtR7MuscVeP/s0/ERWA2uSr5QOrRYy1pdvZqG1USfXI=
-github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc/go.mod h1:gFnFS95y8HstDP6P9pPwzrxOOC5TRDkwbM+ao15ChAI=
github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA=
github.com/crate-crypto/go-kzg-4844 v0.7.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -167,8 +165,6 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/gballet/go-verkle v0.0.0-20221121182333-31427a1f2d35 h1:I8QswD9gf3VEpr7bpepKKOm7ChxFITIG+oc1I5/S0no=
-github.com/gballet/go-verkle v0.0.0-20221121182333-31427a1f2d35/go.mod h1:DMDd04jjQgdynaAwbEgiRERIGpC8fDjx0+y06an7Psg=
github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE=
@@ -590,7 +586,6 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
diff --git a/erigon-lib/kv/tables.go b/erigon-lib/kv/tables.go
index 1920e06331a..505023cc39c 100644
--- a/erigon-lib/kv/tables.go
+++ b/erigon-lib/kv/tables.go
@@ -402,7 +402,7 @@ const (
// Erigon-CL Objects
- // [slot] => [signature + block without execution payload]
+ // [slot + block root] => [signature + block without execution payload]
BeaconBlocks = "BeaconBlock"
EffectiveBalancesDump = "EffectiveBalancesDump"
diff --git a/erigon-lib/kv/temporal/temporaltest/kv_temporal_testdb.go b/erigon-lib/kv/temporal/temporaltest/kv_temporal_testdb.go
index 5c2df633b9e..d8020599dd3 100644
--- a/erigon-lib/kv/temporal/temporaltest/kv_temporal_testdb.go
+++ b/erigon-lib/kv/temporal/temporaltest/kv_temporal_testdb.go
@@ -42,7 +42,7 @@ func NewTestDB(tb testing.TB, dirs datadir.Dirs) (db kv.RwDB, agg *state.Aggrega
}
var err error
- agg, err = state.NewAggregator(context.Background(), dirs, config3.HistoryV3AggregationStep, db, log.New())
+ agg, err = state.NewAggregator(context.Background(), dirs, config3.DefaultStepSize, db, log.New())
if err != nil {
panic(err)
}
diff --git a/erigon-lib/rlp/decode.go b/erigon-lib/rlp/decode.go
index 206291e86db..ef2e5c4e5b3 100644
--- a/erigon-lib/rlp/decode.go
+++ b/erigon-lib/rlp/decode.go
@@ -157,18 +157,18 @@ func (err *decodeError) Error() string {
}
func wrapStreamError(err error, typ reflect.Type) error {
- switch err {
- case ErrCanonInt:
+ switch {
+ case errors.Is(err, ErrCanonInt):
return &decodeError{msg: "non-canonical integer (leading zero bytes)", typ: typ}
- case ErrCanonSize:
+ case errors.Is(err, ErrCanonSize):
return &decodeError{msg: "non-canonical size information", typ: typ}
- case ErrExpectedList:
+ case errors.Is(err, ErrExpectedList):
return &decodeError{msg: "expected input list", typ: typ}
- case ErrExpectedString:
+ case errors.Is(err, ErrExpectedString):
return &decodeError{msg: "expected input string or byte", typ: typ}
- case errUintOverflow:
+ case errors.Is(err, errUintOverflow):
return &decodeError{msg: "input string too long", typ: typ}
- case errNotAtEOL:
+ case errors.Is(err, errNotAtEOL):
return &decodeError{msg: "input list has too many elements", typ: typ}
}
return err
@@ -179,7 +179,8 @@ func WrapStreamError(err error, typ reflect.Type) error {
}
func addErrorContext(err error, ctx string) error {
- if decErr, ok := err.(*decodeError); ok {
+ var decErr *decodeError
+ if errors.As(err, &decErr) {
decErr.ctx = append(decErr.ctx, ctx)
}
return err
@@ -368,7 +369,7 @@ func decodeSliceElems(s *Stream, val reflect.Value, elemdec decoder) error {
val.SetLen(i + 1)
}
// decode into element
- if err := elemdec(s, val.Index(i)); err == EOL {
+ if err := elemdec(s, val.Index(i)); errors.Is(err, EOL) {
break
} else if err != nil {
return addErrorContext(err, fmt.Sprint("[", i, "]"))
@@ -387,7 +388,7 @@ func decodeListArray(s *Stream, val reflect.Value, elemdec decoder) error {
vlen := val.Len()
i := 0
for ; i < vlen; i++ {
- if err := elemdec(s, val.Index(i)); err == EOL {
+ if err := elemdec(s, val.Index(i)); errors.Is(err, EOL) {
break
} else if err != nil {
return addErrorContext(err, fmt.Sprint("[", i, "]"))
@@ -461,7 +462,7 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) {
}
for i, f := range fields {
err := f.info.decoder(s, val.Field(f.index))
- if err == EOL {
+ if errors.Is(err, EOL) {
if f.optional {
// The field is optional, so reaching the end of the list before
// reaching the last field is acceptable. All remaining undecoded
@@ -667,11 +668,11 @@ func NewStream(r io.Reader, inputLimit uint64) *Stream {
// NewListStream creates a new stream that pretends to be positioned
// at an encoded list of the given length.
-func NewListStream(r io.Reader, _len uint64) *Stream {
+func NewListStream(r io.Reader, len uint64) *Stream {
s := new(Stream)
- s.Reset(r, _len)
+ s.Reset(r, len)
s.kind = List
- s.size = _len
+ s.size = len
return s
}
@@ -756,7 +757,7 @@ func (s *Stream) uint(maxbits int) (uint64, error) {
}
v, err := s.readUint(byte(size))
switch {
- case err == ErrCanonSize:
+ case errors.Is(err, ErrCanonSize):
// Adjust error because we're not reading a size right now.
return 0, ErrCanonInt
case err != nil:
@@ -904,7 +905,8 @@ func (s *Stream) Decode(val interface{}) error {
}
err = dcd(s, rval.Elem())
- if decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 {
+ var decErr *decodeError
+ if errors.As(err, &decErr) && len(decErr.ctx) > 0 {
// add decode target type to error so context has more meaning
decErr.ctx = append(decErr.ctx, fmt.Sprint("(", rtyp.Elem(), ")"))
}
@@ -1000,10 +1002,10 @@ func (s *Stream) readKind() (kind Kind, size uint64, err error) {
if len(s.stack) == 0 {
// At toplevel, Adjust the error to actual EOF. io.EOF is
// used by callers to determine when to stop decoding.
- switch err {
- case io.ErrUnexpectedEOF:
+ switch {
+ case errors.Is(err, io.ErrUnexpectedEOF):
err = io.EOF
- case ErrValueTooLarge:
+ case errors.Is(err, ErrValueTooLarge):
err = io.EOF
}
}
diff --git a/erigon-lib/rlp/decode_test.go b/erigon-lib/rlp/decode_test.go
index 85c94751288..55915dcdb05 100644
--- a/erigon-lib/rlp/decode_test.go
+++ b/erigon-lib/rlp/decode_test.go
@@ -56,7 +56,7 @@ func TestStreamKind(t *testing.T) {
for i, test := range tests {
// using plainReader to inhibit input limit errors.
s := NewStream(newPlainReader(unhex(test.input)), 0)
- kind, _len, err := s.Kind()
+ kind, len, err := s.Kind()
if err != nil {
t.Errorf("test %d: Kind returned error: %v", i, err)
continue
@@ -64,8 +64,8 @@ func TestStreamKind(t *testing.T) {
if kind != test.wantKind {
t.Errorf("test %d: kind mismatch: got %d, want %d", i, kind, test.wantKind)
}
- if _len != test.wantLen {
- t.Errorf("test %d: _len mismatch: got %d, want %d", i, _len, test.wantLen)
+ if len != test.wantLen {
+ t.Errorf("test %d: len mismatch: got %d, want %d", i, len, test.wantLen)
}
}
}
@@ -234,10 +234,10 @@ testfor:
func TestStreamList(t *testing.T) {
s := NewStream(bytes.NewReader(unhex("C80102030405060708")), 0)
- if _len, err := s.List(); err != nil {
+ if len, err := s.List(); err != nil {
t.Fatalf("List error: %v", err)
- } else if _len != 8 {
- t.Fatalf("List returned invalid length, got %d, want 8", _len)
+ } else if len != 8 {
+ t.Fatalf("List returned invalid length, got %d, want 8", len)
}
for i := uint64(1); i <= 8; i++ {
@@ -248,7 +248,7 @@ func TestStreamList(t *testing.T) {
}
}
- if _, err := s.Uint(); err != EOL {
+ if _, err := s.Uint(); !errors.Is(err, EOL) {
t.Errorf("Uint error mismatch, got %v, want %v", err, EOL)
}
if err := s.ListEnd(); err != nil {
@@ -290,16 +290,16 @@ func TestStreamRaw(t *testing.T) {
func TestDecodeErrors(t *testing.T) {
r := bytes.NewReader(nil)
- if err := Decode(r, nil); err != errDecodeIntoNil {
+ if err := Decode(r, nil); !errors.Is(err, errDecodeIntoNil) {
t.Errorf("Decode(r, nil) error mismatch, got %q, want %q", err, errDecodeIntoNil)
}
var nilptr *struct{}
- if err := Decode(r, nilptr); err != errDecodeIntoNil {
+ if err := Decode(r, nilptr); !errors.Is(err, errDecodeIntoNil) {
t.Errorf("Decode(r, nilptr) error mismatch, got %q, want %q", err, errDecodeIntoNil)
}
- if err := Decode(r, struct{}{}); err != errNoPointer {
+ if err := Decode(r, struct{}{}); !errors.Is(err, errNoPointer) {
t.Errorf("Decode(r, struct{}{}) error mismatch, got %q, want %q", err, errNoPointer)
}
@@ -308,7 +308,7 @@ func TestDecodeErrors(t *testing.T) {
t.Errorf("Decode(r, new(chan bool)) error mismatch, got %q, want %q", err, expectErr)
}
- if err := Decode(r, new(uint)); err != io.EOF {
+ if err := Decode(r, new(uint)); !errors.Is(err, io.EOF) {
t.Errorf("Decode(r, new(int)) error mismatch, got %q, want %q", err, io.EOF)
}
}
@@ -795,7 +795,6 @@ var decodeTests = []decodeTest{
func uintp(i uint) *uint { return &i }
func runTests(t *testing.T, decode func([]byte, interface{}) error) {
- t.Helper()
for i, test := range decodeTests {
input, err := hex.DecodeString(test.input)
if err != nil {
@@ -828,7 +827,6 @@ func TestDecodeWithByteReader(t *testing.T) {
}
func testDecodeWithEncReader(t *testing.T, n int) {
- t.Helper()
s := strings.Repeat("0", n)
_, r, _ := EncodeToReader(s)
var decoded string
diff --git a/erigon-lib/rlp/encode.go b/erigon-lib/rlp/encode.go
index 22b1b5b46fa..75c14a9913b 100644
--- a/erigon-lib/rlp/encode.go
+++ b/erigon-lib/rlp/encode.go
@@ -341,9 +341,9 @@ func writeNamedByteArray(val reflect.Value, w *encBuffer) error {
if !val.CanAddr() {
// Slice requires the value to be addressable.
// Make it addressable by copying.
- valCopy := reflect.New(val.Type()).Elem()
- valCopy.Set(val)
- val = valCopy
+ copy := reflect.New(val.Type()).Elem()
+ copy.Set(val)
+ val = copy
}
size := val.Len()
slice := val.Slice(0, size).Bytes()
diff --git a/erigon-lib/rlp/encode_test.go b/erigon-lib/rlp/encode_test.go
index 7926779f71a..a5118cbc408 100644
--- a/erigon-lib/rlp/encode_test.go
+++ b/erigon-lib/rlp/encode_test.go
@@ -384,7 +384,6 @@ var encTests = []encTest{
}
func runEncTests(t *testing.T, f func(val interface{}) ([]byte, error)) {
- t.Helper()
for i, test := range encTests {
output, err := f(test.val)
if err != nil && test.error == "" {
diff --git a/erigon-lib/rlp/raw_test.go b/erigon-lib/rlp/raw_test.go
index 6b606ce6c47..c5d71c3dcdc 100644
--- a/erigon-lib/rlp/raw_test.go
+++ b/erigon-lib/rlp/raw_test.go
@@ -65,13 +65,13 @@ func TestCountValues(t *testing.T) {
}
func TestSplitTypes(t *testing.T) {
- if _, _, err := SplitString(unhex("C100")); err != ErrExpectedString {
+ if _, _, err := SplitString(unhex("C100")); !errors.Is(err, ErrExpectedString) {
t.Errorf("SplitString returned %q, want %q", err, ErrExpectedString)
}
- if _, _, err := SplitList(unhex("01")); err != ErrExpectedList {
+ if _, _, err := SplitList(unhex("01")); !errors.Is(err, ErrExpectedList) {
t.Errorf("SplitString returned %q, want %q", err, ErrExpectedList)
}
- if _, _, err := SplitList(unhex("81FF")); err != ErrExpectedList {
+ if _, _, err := SplitList(unhex("81FF")); !errors.Is(err, ErrExpectedList) {
t.Errorf("SplitString returned %q, want %q", err, ErrExpectedList)
}
}
@@ -197,7 +197,7 @@ func TestSplit(t *testing.T) {
if !bytes.Equal(rest, unhex(test.rest)) {
t.Errorf("test %d: rest mismatch: got %x, want %s", i, rest, test.rest)
}
- if err != test.err {
+ if !errors.Is(err, test.err) {
t.Errorf("test %d: error mismatch: got %q, want %q", i, err, test.err)
}
}
@@ -235,7 +235,7 @@ func TestReadSize(t *testing.T) {
for _, test := range tests {
size, err := readSize(unhex(test.input), test.slen)
- if err != test.err {
+ if !errors.Is(err, test.err) {
t.Errorf("readSize(%s, %d): error mismatch: got %q, want %q", test.input, test.slen, err, test.err)
continue
}
diff --git a/erigon-lib/rlp2/decoder.go b/erigon-lib/rlp2/decoder.go
deleted file mode 100644
index 34b8e5821cd..00000000000
--- a/erigon-lib/rlp2/decoder.go
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp
-
-import (
- "errors"
- "fmt"
- "io"
-)
-
-type Decoder struct {
- buf *buf
-}
-
-func NewDecoder(buf []byte) *Decoder {
- return &Decoder{
- buf: newBuf(buf, 0),
- }
-}
-
-func (d *Decoder) String() string {
- return fmt.Sprintf(`left=%x pos=%d`, d.buf.Bytes(), d.buf.off)
-}
-
-func (d *Decoder) Consumed() []byte {
- return d.buf.u[:d.buf.off]
-}
-
-func (d *Decoder) Underlying() []byte {
- return d.buf.Underlying()
-}
-
-func (d *Decoder) Empty() bool {
- return d.buf.empty()
-}
-
-func (d *Decoder) Offset() int {
- return d.buf.Offset()
-}
-
-func (d *Decoder) Bytes() []byte {
- return d.buf.Bytes()
-}
-
-func (d *Decoder) ReadByte() (n byte, err error) {
- return d.buf.ReadByte()
-}
-
-func (d *Decoder) PeekByte() (n byte, err error) {
- return d.buf.PeekByte()
-}
-
-func (d *Decoder) Rebase() {
- d.buf.u = d.Bytes()
- d.buf.off = 0
-}
-func (d *Decoder) Fork() *Decoder {
- return &Decoder{
- buf: newBuf(d.buf.u, d.buf.off),
- }
-}
-
-func (d *Decoder) PeekToken() (Token, error) {
- prefix, err := d.PeekByte()
- if err != nil {
- return TokenUnknown, err
- }
- return identifyToken(prefix), nil
-}
-
-func (d *Decoder) ElemDec() (*Decoder, Token, error) {
- a, t, err := d.Elem()
- return NewDecoder(a), t, err
-}
-
-func (d *Decoder) RawElemDec() (*Decoder, Token, error) {
- a, t, err := d.RawElem()
- return NewDecoder(a), t, err
-}
-
-func (d *Decoder) RawElem() ([]byte, Token, error) {
- w := d.buf
- start := w.Offset()
- // figure out what we are reading
- prefix, err := w.ReadByte()
- if err != nil {
- return nil, TokenUnknown, err
- }
- token := identifyToken(prefix)
-
- var (
- sz int
- lenSz int
- )
- // switch on the token
- switch token {
- case TokenDecimal:
- // in this case, the value is just the byte itself
- case TokenShortList:
- sz = int(token.Diff(prefix))
- _, err = nextFull(w, sz)
- case TokenLongList:
- lenSz = int(token.Diff(prefix))
- sz, err = nextBeInt(w, lenSz)
- if err != nil {
- return nil, token, err
- }
- _, err = nextFull(w, sz)
- case TokenShortBlob:
- sz := int(token.Diff(prefix))
- _, err = nextFull(w, sz)
- case TokenLongBlob:
- lenSz := int(token.Diff(prefix))
- sz, err = nextBeInt(w, lenSz)
- if err != nil {
- return nil, token, err
- }
- _, err = nextFull(w, sz)
- default:
- return nil, token, fmt.Errorf("%w: unknown token", ErrDecode)
- }
- stop := w.Offset()
- //log.Printf("%x %s\n", buf, token)
- if err != nil {
- return nil, token, err
- }
- return w.Underlying()[start:stop], token, nil
-}
-
-func (d *Decoder) Elem() ([]byte, Token, error) {
- w := d.buf
- // figure out what we are reading
- prefix, err := w.ReadByte()
- if err != nil {
- return nil, TokenUnknown, err
- }
- token := identifyToken(prefix)
-
- var (
- buf []byte
- sz int
- lenSz int
- )
- // switch on the token
- switch token {
- case TokenDecimal:
- // in this case, the value is just the byte itself
- buf = []byte{prefix}
- case TokenShortList:
- sz = int(token.Diff(prefix))
- buf, err = nextFull(w, sz)
- case TokenLongList:
- lenSz = int(token.Diff(prefix))
- sz, err = nextBeInt(w, lenSz)
- if err != nil {
- return nil, token, err
- }
- buf, err = nextFull(w, sz)
- case TokenShortBlob:
- sz := int(token.Diff(prefix))
- buf, err = nextFull(w, sz)
- case TokenLongBlob:
- lenSz := int(token.Diff(prefix))
- sz, err = nextBeInt(w, lenSz)
- if err != nil {
- return nil, token, err
- }
- buf, err = nextFull(w, sz)
- default:
- return nil, token, fmt.Errorf("%w: unknown token", ErrDecode)
- }
- //log.Printf("%x %s\n", buf, token)
- if err != nil {
- return nil, token, fmt.Errorf("read data: %w", err)
- }
- return buf, token, nil
-}
-
-func ReadElem[T any](d *Decoder, fn func(*T, []byte) error, receiver *T) error {
- buf, token, err := d.Elem()
- if err != nil {
- return err
- }
- switch token {
- case TokenDecimal,
- TokenShortBlob,
- TokenLongBlob,
- TokenShortList,
- TokenLongList:
- return fn(receiver, buf)
- default:
- return fmt.Errorf("%w: ReadElem found unexpected token", ErrDecode)
- }
-}
-
-func (d *Decoder) ForList(fn func(*Decoder) error) error {
- // grab the list bytes
- buf, token, err := d.Elem()
- if err != nil {
- return err
- }
- switch token {
- case TokenShortList, TokenLongList:
- dec := NewDecoder(buf)
- for {
- if dec.buf.Len() == 0 {
- return nil
- }
- err := fn(dec)
- if errors.Is(err, io.EOF) {
- return nil
- }
- if err != nil {
- return err
- }
- // reset the byte
- dec = NewDecoder(dec.Bytes())
- }
- default:
- return fmt.Errorf("%w: ForList on non-list", ErrDecode)
- }
-}
-
-type buf struct {
- u []byte
- off int
-}
-
-func newBuf(u []byte, off int) *buf {
- return &buf{u: u, off: off}
-}
-
-func (b *buf) empty() bool { return len(b.u) <= b.off }
-
-func (b *buf) PeekByte() (n byte, err error) {
- if len(b.u) <= b.off {
- return 0, io.EOF
- }
- return b.u[b.off], nil
-}
-func (b *buf) ReadByte() (n byte, err error) {
- if len(b.u) <= b.off {
- return 0, io.EOF
- }
- b.off++
- return b.u[b.off-1], nil
-}
-
-func (b *buf) Next(n int) (xs []byte) {
- m := b.Len()
- if n > m {
- n = m
- }
- data := b.u[b.off : b.off+n]
- b.off += n
- return data
-}
-
-func (b *buf) Offset() int {
- return b.off
-}
-
-func (b *buf) Bytes() []byte {
- return b.u[b.off:]
-}
-
-func (b *buf) String() string {
- if b == nil {
- // Special case, useful in debugging.
- return ""
- }
- return string(b.u[b.off:])
-}
-
-func (b *buf) Len() int { return len(b.u) - b.off }
-
-func (b *buf) Underlying() []byte {
- return b.u
-}
diff --git a/erigon-lib/rlp2/encodel.go b/erigon-lib/rlp2/encode.go
similarity index 97%
rename from erigon-lib/rlp2/encodel.go
rename to erigon-lib/rlp2/encode.go
index 40090308aa4..93269debd4b 100644
--- a/erigon-lib/rlp2/encodel.go
+++ b/erigon-lib/rlp2/encode.go
@@ -186,7 +186,7 @@ func EncodeU64(i uint64, to []byte) int {
func StringLen(s []byte) int {
sLen := len(s)
switch {
- case sLen > 56:
+ case sLen >= 56:
beLen := common.BitLenToByteLen(bits.Len(uint(sLen)))
return 1 + beLen + sLen
case sLen == 0:
@@ -202,7 +202,7 @@ func StringLen(s []byte) int {
}
func EncodeString(s []byte, to []byte) int {
switch {
- case len(s) > 56:
+ case len(s) >= 56:
beLen := common.BitLenToByteLen(bits.Len(uint(len(s))))
binary.BigEndian.PutUint64(to[1:], uint64(len(s)))
_ = to[beLen+len(s)]
@@ -230,7 +230,15 @@ func EncodeString(s []byte, to []byte) int {
}
}
-// EncodeHash assumes that `to` buffer is already 32bytes long
+// EncodeAddress assumes that `to` buffer is already 21-bytes long
+func EncodeAddress(a, to []byte) int {
+ _ = to[20] // early bounds check to guarantee safety of writes below
+ to[0] = 128 + 20
+ copy(to[1:21], a[:20])
+ return 21
+}
+
+// EncodeHash assumes that `to` buffer is already 33-bytes long
func EncodeHash(h, to []byte) int {
_ = to[32] // early bounds check to guarantee safety of writes below
to[0] = 128 + 32
@@ -267,7 +275,7 @@ func AnnouncementsLen(types []byte, sizes []uint32, hashes []byte) int {
return ListPrefixLen(totalLen) + totalLen
}
-// EIP-5793: eth/68 - Add tx type to tx announcement
+// EIP-5793: eth/68 - Add txn type to txn announcement
func EncodeAnnouncements(types []byte, sizes []uint32, hashes []byte, encodeBuf []byte) int {
if len(types) == 0 {
encodeBuf[0] = 0xc3
@@ -296,11 +304,3 @@ func EncodeAnnouncements(types []byte, sizes []uint32, hashes []byte, encodeBuf
}
return pos
}
-
-// EncodeAddress assumes that `to` buffer is already 21-bytes long
-func EncodeAddress(a, to []byte) int {
- _ = to[20] // early bounds check to guarantee safety of writes below
- to[0] = 128 + 20
- copy(to[1:21], a[:20])
- return 21
-}
diff --git a/erigon-lib/rlp2/encode_test.go b/erigon-lib/rlp2/encode_test.go
new file mode 100644
index 00000000000..cdca78e2505
--- /dev/null
+++ b/erigon-lib/rlp2/encode_test.go
@@ -0,0 +1,44 @@
+// Copyright 2023 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package rlp
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/erigontech/erigon-lib/common/hexutility"
+)
+
+// Strings of length 56 are a boundary case.
+// See https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/#definition
+func TestStringLen56(t *testing.T) {
+ str := hexutility.MustDecodeHex("7907ca011864321def1e92a3021868f397516ce37c959f25f8dddd3161d7b8301152b35f135c814fae9f487206471b6b0d713cd51a2d3598")
+ require.Equal(t, 56, len(str))
+
+ strLen := StringLen(str)
+ assert.Equal(t, 56+2, strLen)
+
+ encoded := make([]byte, strLen)
+ EncodeString(str, encoded)
+
+ dataPos, dataLen, err := String(encoded, 0)
+ require.NoError(t, err)
+ assert.Equal(t, dataPos, 2)
+ assert.Equal(t, dataLen, 56)
+}
diff --git a/erigon-lib/rlp2/encoder.go b/erigon-lib/rlp2/encoder.go
deleted file mode 100644
index bb8a292c15c..00000000000
--- a/erigon-lib/rlp2/encoder.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp
-
-import (
- "golang.org/x/exp/constraints"
-)
-
-type EncoderFunc = func(i *Encoder) *Encoder
-
-type Encoder struct {
- buf []byte
-}
-
-func NewEncoder(buf []byte) *Encoder {
- return &Encoder{
- buf: buf,
- }
-}
-
-// Buffer returns the underlying buffer
-func (e *Encoder) Buffer() []byte {
- return e.buf
-}
-
-func (e *Encoder) Byte(p byte) *Encoder {
- e.buf = append(e.buf, p)
- return e
-}
-
-func (e *Encoder) Bytes(p []byte) *Encoder {
- e.buf = append(e.buf, p...)
- return e
-}
-
-// Str will write a string correctly
-func (e *Encoder) Str(str []byte) *Encoder {
- if len(str) > 55 {
- return e.LongString(str)
- }
- return e.ShortString(str)
-}
-
-// String will assume your string is less than 56 bytes long, and do no validation as such
-func (e *Encoder) ShortString(str []byte) *Encoder {
- return e.Byte(TokenShortBlob.Plus(byte(len(str)))).Bytes(str)
-}
-
-// String will assume your string is greater than 55 bytes long, and do no validation as such
-func (e *Encoder) LongString(str []byte) *Encoder {
- // write the indicator token
- e.Byte(byte(TokenLongBlob))
- // write the integer, knowing that we appended n bytes
- n := putUint(e, len(str))
- // so we knw the indicator token was n+1 bytes ago.
- e.buf[len(e.buf)-(int(n)+1)] += n
- // and now add the actual length
- e.buf = append(e.buf, str...)
- return e
-}
-
-// List will attempt to write the list of encoder funcs to the buf
-func (e *Encoder) List(items ...EncoderFunc) *Encoder {
- return e.writeList(true, items...)
-}
-
-// ShortList actually calls List
-func (e *Encoder) ShortList(items ...EncoderFunc) *Encoder {
- return e.writeList(true, items...)
-}
-
-// LongList will assume that your list payload is more than 55 bytes long, and do no validation as such
-func (e *Encoder) LongList(items ...EncoderFunc) *Encoder {
- return e.writeList(false, items...)
-}
-
-// writeList will first attempt to write a long list with the dat
-// if validate is false, it will just format it like the length is above 55
-// if validate is true, it will format it like it is a shrot list
-func (e *Encoder) writeList(validate bool, items ...EncoderFunc) *Encoder {
- // write the indicator token
- e = e.Byte(byte(TokenLongList))
- // now pad 8 bytes
- e = e.Bytes(make([]byte, 8))
- // record the length before encoding items
- startLength := len(e.buf)
- // now write all the items
- for _, v := range items {
- e = v(e)
- }
- // the size is the difference in the lengths now
- dataSize := len(e.buf) - startLength
- if dataSize <= 55 && validate {
- // oh it's actually a short string! awkward. let's set that then.
- e.buf[startLength-8-1] = TokenShortList.Plus(byte(dataSize))
- // and then copy the data over
- copy(e.buf[startLength-8:], e.buf[startLength:startLength+dataSize])
- // and now set the new size
- e.buf = e.buf[:startLength+dataSize-8]
- // we are done, return
- return e
- }
- // ok, so it's a long string.
- // create a new encoder centered at startLength - 8
- enc := NewEncoder(e.buf[startLength-8:])
- // now write using that encoder the size
- n := putUint(enc, dataSize)
- // and update the token, which we know is at startLength-8-1
- e.buf[startLength-8-1] += n
- // the shift to perform now is 8 - n.
- shift := int(8 - n)
- // if there is a positive shift, then we must perform the shift
- if shift > 0 {
- // copy the data
- copy(e.buf[startLength-shift:], e.buf[startLength:startLength+dataSize])
- // set the new length
- e.buf = e.buf[:startLength-shift+dataSize]
- }
- return e
-}
-
-func putUint[T constraints.Integer](e *Encoder, t T) (size byte) {
- i := uint64(t)
- switch {
- case i < (1 << 8):
- e.buf = append(e.buf, byte(i))
- return 1
- case i < (1 << 16):
- e.buf = append(e.buf,
- byte(i>>8),
- byte(i),
- )
- return 2
- case i < (1 << 24):
-
- e.buf = append(e.buf,
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 3
- case i < (1 << 32):
- e.buf = append(e.buf,
- byte(i>>24),
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 4
- case i < (1 << 40):
- e.buf = append(e.buf,
- byte(i>>32),
- byte(i>>24),
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 5
- case i < (1 << 48):
- e.buf = append(e.buf,
- byte(i>>40),
- byte(i>>32),
- byte(i>>24),
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 6
- case i < (1 << 56):
- e.buf = append(e.buf,
- byte(i>>48),
- byte(i>>40),
- byte(i>>32),
- byte(i>>24),
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 7
- default:
- e.buf = append(e.buf,
- byte(i>>56),
- byte(i>>48),
- byte(i>>40),
- byte(i>>32),
- byte(i>>24),
- byte(i>>16),
- byte(i>>8),
- byte(i),
- )
- return 8
- }
-}
diff --git a/erigon-lib/rlp2/parse.go b/erigon-lib/rlp2/parse.go
index bda7935e15a..09545f4347e 100644
--- a/erigon-lib/rlp2/parse.go
+++ b/erigon-lib/rlp2/parse.go
@@ -26,10 +26,9 @@ import (
)
var (
- ErrBase = errors.New("rlp")
- ErrParse = fmt.Errorf("%w parse", ErrBase)
- ErrDecode = fmt.Errorf("%w decode", ErrBase)
- ErrUnexpectedEOF = fmt.Errorf("%w EOF", ErrBase)
+ ErrBase = errors.New("rlp")
+ ErrParse = fmt.Errorf("%w parse", ErrBase)
+ ErrDecode = fmt.Errorf("%w decode", ErrBase)
)
func IsRLPError(err error) bool { return errors.Is(err, ErrBase) }
@@ -37,8 +36,8 @@ func IsRLPError(err error) bool { return errors.Is(err, ErrBase) }
// BeInt parses Big Endian representation of an integer from given payload at given position
func BeInt(payload []byte, pos, length int) (int, error) {
var r int
- if pos+length > len(payload) {
- return 0, ErrUnexpectedEOF
+ if pos+length >= len(payload) {
+ return 0, fmt.Errorf("%w: unexpected end of payload", ErrParse)
}
if length > 0 && payload[pos] == 0 {
return 0, fmt.Errorf("%w: integer encoding for RLP must not have leading zeros: %x", ErrParse, payload[pos:pos+length])
diff --git a/erigon-lib/rlp2/readme.md b/erigon-lib/rlp2/readme.md
deleted file mode 100644
index 74e9f96eeb4..00000000000
--- a/erigon-lib/rlp2/readme.md
+++ /dev/null
@@ -1,11 +0,0 @@
-## rlp
-
-
-TERMINOLOGY:
-
-```
-RLP string = "Blob" // this is so we don't conflict with existing go name for String
-RLP list = "List" // luckily we can keep using list name since go doesn't use it
-RLP single byte number = "Decimal" // for numbers from 1-127. a special case
-```
-
diff --git a/erigon-lib/rlp2/types.go b/erigon-lib/rlp2/types.go
deleted file mode 100644
index 2bf3c6438f3..00000000000
--- a/erigon-lib/rlp2/types.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp
-
-import (
- "fmt"
-
- "github.com/holiman/uint256"
-)
-
-func Bytes(dst *[]byte, src []byte) error {
- if len(*dst) < len(src) {
- (*dst) = make([]byte, len(src))
- }
- copy(*dst, src)
- return nil
-}
-func BytesExact(dst *[]byte, src []byte) error {
- if len(*dst) != len(src) {
- return fmt.Errorf("%w: BytesExact no match", ErrDecode)
- }
- copy(*dst, src)
- return nil
-}
-
-func Uint256(dst *uint256.Int, src []byte) error {
- if len(src) > 32 {
- return fmt.Errorf("%w: uint256 must not be more than 32 bytes long, got %d", ErrParse, len(src))
- }
- if len(src) > 0 && src[0] == 0 {
- return fmt.Errorf("%w: integer encoding for RLP must not have leading zeros: %x", ErrParse, src)
- }
- dst.SetBytes(src)
- return nil
-}
-
-func Uint64(dst *uint64, src []byte) error {
- var r uint64
- for _, b := range src {
- r = (r << 8) | uint64(b)
- }
- (*dst) = r
- return nil
-}
-
-func IsEmpty(dst *bool, src []byte) error {
- if len(src) == 0 {
- (*dst) = true
- } else {
- (*dst) = false
- }
- return nil
-}
-func BlobLength(dst *int, src []byte) error {
- (*dst) = len(src)
- return nil
-}
-
-func Skip(dst *int, src []byte) error {
- return nil
-}
diff --git a/erigon-lib/rlp2/unmarshaler.go b/erigon-lib/rlp2/unmarshaler.go
deleted file mode 100644
index 7bcb547e28e..00000000000
--- a/erigon-lib/rlp2/unmarshaler.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp
-
-import (
- "fmt"
- "reflect"
-)
-
-type Unmarshaler interface {
- UnmarshalRLP(data []byte) error
-}
-
-func Unmarshal(data []byte, val any) error {
- buf := newBuf(data, 0)
- return unmarshal(buf, val)
-}
-
-func unmarshal(buf *buf, val any) error {
- rv := reflect.ValueOf(val)
- if rv.Kind() != reflect.Pointer || rv.IsNil() {
- return fmt.Errorf("%w: v must be ptr", ErrDecode)
- }
- v := rv.Elem()
- err := reflectAny(buf, v, rv)
- if err != nil {
- return fmt.Errorf("%w: %w", ErrDecode, err)
- }
- return nil
-}
-
-func reflectAny(w *buf, v reflect.Value, rv reflect.Value) error {
- if um, ok := rv.Interface().(Unmarshaler); ok {
- return um.UnmarshalRLP(w.Bytes())
- }
- // figure out what we are reading
- prefix, err := w.ReadByte()
- if err != nil {
- return err
- }
- token := identifyToken(prefix)
- // switch
- switch token {
- case TokenDecimal:
- // in this case, the value is just the byte itself
- switch v.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- v.SetInt(int64(prefix))
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- v.SetUint(uint64(prefix))
- case reflect.Invalid:
- // do nothing
- default:
- return fmt.Errorf("%w: decimal must be unmarshal into integer type", ErrDecode)
- }
- case TokenShortBlob:
- sz := int(token.Diff(prefix))
- str, err := nextFull(w, sz)
- if err != nil {
- return err
- }
- return putBlob(str, v, rv)
- case TokenLongBlob:
- lenSz := int(token.Diff(prefix))
- sz, err := nextBeInt(w, lenSz)
- if err != nil {
- return err
- }
- str, err := nextFull(w, sz)
- if err != nil {
- return err
- }
- return putBlob(str, v, rv)
- case TokenShortList:
- sz := int(token.Diff(prefix))
- buf, err := nextFull(w, sz)
- if err != nil {
- return err
- }
- return reflectList(newBuf(buf, 0), v, rv)
- case TokenLongList:
- lenSz := int(token.Diff(prefix))
- sz, err := nextBeInt(w, lenSz)
- if err != nil {
- return err
- }
- buf, err := nextFull(w, sz)
- if err != nil {
- return err
- }
- return reflectList(newBuf(buf, 0), v, rv)
- case TokenUnknown:
- return fmt.Errorf("%w: unknown token", ErrDecode)
- }
- return nil
-}
-
-func putBlob(w []byte, v reflect.Value, rv reflect.Value) error {
- switch v.Kind() {
- case reflect.String:
- v.SetString(string(w))
- case reflect.Slice:
- if v.Type().Elem().Kind() != reflect.Uint8 {
- return fmt.Errorf("%w: need to use uint8 as underlying if want slice output from longstring", ErrDecode)
- }
- v.SetBytes(w)
- case reflect.Array:
- if v.Type().Elem().Kind() != reflect.Uint8 {
- return fmt.Errorf("%w: need to use uint8 as underlying if want array output from longstring", ErrDecode)
- }
- reflect.Copy(v, reflect.ValueOf(w))
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- val, err := BeInt(w, 0, len(w))
- if err != nil {
- return err
- }
- v.SetInt(int64(val))
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- val, err := BeInt(w, 0, len(w))
- if err != nil {
- return err
- }
- v.SetUint(uint64(val))
- case reflect.Invalid:
- // do nothing
- return nil
- }
- return nil
-}
-
-func reflectList(w *buf, v reflect.Value, rv reflect.Value) error {
- switch v.Kind() {
- case reflect.Invalid:
- // do nothing
- return nil
- case reflect.Map:
- rv1 := reflect.New(v.Type().Key())
- v1 := rv1.Elem()
- err := reflectAny(w, v1, rv1)
- if err != nil {
- return err
- }
- rv2 := reflect.New(v.Type().Elem())
- v2 := rv2.Elem()
- err = reflectAny(w, v2, rv2)
- if err != nil {
- return err
- }
- v.SetMapIndex(rv1, rv2)
- case reflect.Struct:
- for idx := 0; idx < v.NumField(); idx++ {
- // Decode into element.
- rv1 := v.Field(idx).Addr()
- rt1 := v.Type().Field(idx)
- v1 := rv1.Elem()
- shouldSet := rt1.IsExported()
- if shouldSet {
- err := reflectAny(w, v1, rv1)
- if err != nil {
- return err
- }
- }
- }
- case reflect.Array, reflect.Slice:
- idx := 0
- for {
- if idx >= v.Cap() {
- v.Grow(1)
- }
- if idx >= v.Len() {
- v.SetLen(idx + 1)
- }
- if idx < v.Len() {
- // Decode into element.
- rv1 := v.Index(idx)
- v1 := rv1.Elem()
- err := reflectAny(w, v1, rv1)
- if err != nil {
- return err
- }
- } else {
- // Ran out of fixed array: skip.
- rv1 := reflect.Value{}
- err := reflectAny(w, rv1, rv1)
- if err != nil {
- return err
- }
- }
- idx++
- }
- }
- return nil
-}
diff --git a/erigon-lib/rlp2/unmarshaler_test.go b/erigon-lib/rlp2/unmarshaler_test.go
deleted file mode 100644
index 3887f93d011..00000000000
--- a/erigon-lib/rlp2/unmarshaler_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp_test
-
-import (
- "testing"
-
- rlp "github.com/erigontech/erigon-lib/rlp2"
- "github.com/stretchr/testify/require"
-)
-
-type plusOne int
-
-func (p *plusOne) UnmarshalRLP(data []byte) error {
- var s int
- err := rlp.Unmarshal(data, &s)
- if err != nil {
- return err
- }
- (*p) = plusOne(s + 1)
- return nil
-}
-
-func TestDecoder(t *testing.T) {
-
- type simple struct {
- Key string
- Value string
- }
-
- t.Run("ShortString", func(t *testing.T) {
- t.Run("ToString", func(t *testing.T) {
- bts := []byte{0x83, 'd', 'o', 'g'}
- var s string
- err := rlp.Unmarshal(bts, &s)
- require.NoError(t, err)
- require.EqualValues(t, "dog", s)
- })
- t.Run("ToBytes", func(t *testing.T) {
- bts := []byte{0x83, 'd', 'o', 'g'}
- var s []byte
- err := rlp.Unmarshal(bts, &s)
- require.NoError(t, err)
- require.EqualValues(t, []byte("dog"), s)
- })
- t.Run("ToInt", func(t *testing.T) {
- bts := []byte{0x82, 0x04, 0x00}
- var s int
- err := rlp.Unmarshal(bts, &s)
- require.NoError(t, err)
- require.EqualValues(t, 1024, s)
- })
- t.Run("ToIntUnmarshaler", func(t *testing.T) {
- bts := []byte{0x82, 0x04, 0x00}
- var s plusOne
- err := rlp.Unmarshal(bts, &s)
- require.NoError(t, err)
- require.EqualValues(t, plusOne(1025), s)
- })
- t.Run("ToSimpleStruct", func(t *testing.T) {
- bts := []byte{0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g'}
- var s simple
- err := rlp.Unmarshal(bts, &s)
- require.NoError(t, err)
- require.EqualValues(t, simple{Key: "cat", Value: "dog"}, s)
- })
- })
-}
diff --git a/erigon-lib/rlp2/util.go b/erigon-lib/rlp2/util.go
deleted file mode 100644
index c3d1de93d81..00000000000
--- a/erigon-lib/rlp2/util.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package rlp
-
-type Token int32
-
-func (T Token) String() string {
- switch T {
- case TokenDecimal:
- return "decimal"
- case TokenShortBlob:
- return "short_blob"
- case TokenLongBlob:
- return "long_blob"
- case TokenShortList:
- return "short_list"
- case TokenLongList:
- return "long_list"
- case TokenEOF:
- return "eof"
- case TokenUnknown:
- return "unknown"
- default:
- return "nan"
- }
-}
-
-func (T Token) Plus(n byte) byte {
- return byte(T) + n
-}
-
-func (T Token) Diff(n byte) byte {
- return n - byte(T)
-}
-
-func (T Token) IsListType() bool {
- return T == TokenLongList || T == TokenShortList
-}
-
-func (T Token) IsBlobType() bool {
- return T == TokenLongBlob || T == TokenShortBlob
-}
-
-const (
- TokenDecimal Token = 0x00
- TokenShortBlob Token = 0x80
- TokenLongBlob Token = 0xb7
- TokenShortList Token = 0xc0
- TokenLongList Token = 0xf7
-
- TokenUnknown Token = 0xff01
- TokenEOF Token = 0xdead
-)
-
-func identifyToken(b byte) Token {
- switch {
- case b <= 127:
- return TokenDecimal
- case b >= 128 && b <= 183:
- return TokenShortBlob
- case b >= 184 && b <= 191:
- return TokenLongBlob
- case b >= 192 && b <= 247:
- return TokenShortList
- case b >= 248:
- return TokenLongList
- }
- return TokenUnknown
-}
-
-// BeInt parses Big Endian representation of an integer from given payload at given position
-func nextBeInt(w *buf, length int) (int, error) {
- dat, err := nextFull(w, length)
- if err != nil {
- return 0, ErrUnexpectedEOF
- }
- return BeInt(dat, 0, length)
-}
-
-func nextFull(dat *buf, size int) ([]byte, error) {
- d := dat.Next(size)
- if len(d) != size {
- return nil, ErrUnexpectedEOF
- }
- return d, nil
-}
diff --git a/erigon-lib/state/domain_shared.go b/erigon-lib/state/domain_shared.go
index 251c8eaa0da..9af26644f0c 100644
--- a/erigon-lib/state/domain_shared.go
+++ b/erigon-lib/state/domain_shared.go
@@ -155,17 +155,17 @@ func (sd *SharedDomains) SavePastChangesetAccumulator(blockHash common.Hash, blo
if sd.pastChangesAccumulator == nil {
sd.pastChangesAccumulator = make(map[string]*StateChangeSet)
}
- var key [40]byte
+ key := make([]byte, 40)
binary.BigEndian.PutUint64(key[:8], blockNumber)
copy(key[8:], blockHash[:])
- sd.pastChangesAccumulator[string(key[:])] = acc
+ sd.pastChangesAccumulator[toStringZeroCopy(key)] = acc
}
func (sd *SharedDomains) GetDiffset(tx kv.RwTx, blockHash common.Hash, blockNumber uint64) ([kv.DomainLen][]DomainEntryDiff, bool, error) {
var key [40]byte
binary.BigEndian.PutUint64(key[:8], blockNumber)
copy(key[8:], blockHash[:])
- if changeset, ok := sd.pastChangesAccumulator[string(key[:])]; ok {
+ if changeset, ok := sd.pastChangesAccumulator[toStringZeroCopy(key[:])]; ok {
return [kv.DomainLen][]DomainEntryDiff{
changeset.Diffs[kv.AccountsDomain].GetDiffSet(),
changeset.Diffs[kv.StorageDomain].GetDiffSet(),
@@ -410,9 +410,8 @@ func (sd *SharedDomains) put(domain kv.Domain, key string, val []byte) {
// get returns cached value by key. Cache is invalidated when associated WAL is flushed
func (sd *SharedDomains) get(table kv.Domain, key []byte) (v []byte, prevStep uint64, ok bool) {
//sd.muMaps.RLock()
- keyS := *(*string)(unsafe.Pointer(&key))
+ keyS := toStringZeroCopy(key)
var dataWithPrevStep dataWithPrevStep
- //keyS := string(key)
if table == kv.StorageDomain {
dataWithPrevStep, ok = sd.storage.Get(keyS)
return dataWithPrevStep.data, dataWithPrevStep.prevStep, ok
@@ -619,9 +618,9 @@ func (sd *SharedDomains) updateAccountCode(addr, code, prevCode []byte, prevStep
return sd.domainWriters[kv.CodeDomain].PutWithPrev(addr, nil, code, prevCode, prevStep)
}
-func (sd *SharedDomains) updateCommitmentData(prefix []byte, data, prev []byte, prevStep uint64) error {
- sd.put(kv.CommitmentDomain, string(prefix), data)
- return sd.domainWriters[kv.CommitmentDomain].PutWithPrev(prefix, nil, data, prev, prevStep)
+func (sd *SharedDomains) updateCommitmentData(prefix string, data, prev []byte, prevStep uint64) error {
+ sd.put(kv.CommitmentDomain, prefix, data)
+ return sd.domainWriters[kv.CommitmentDomain].PutWithPrev(toBytesZeroCopy(prefix), nil, data, prev, prevStep)
}
func (sd *SharedDomains) deleteAccount(addr, prev []byte, prevStep uint64) error {
@@ -819,7 +818,7 @@ func (sd *SharedDomains) IterateStoragePrefix(prefix []byte, it func(k []byte, v
switch ci1.t {
case RAM_CURSOR:
if ci1.iter.Next() {
- k = []byte(ci1.iter.Key())
+ k = toBytesZeroCopy(ci1.iter.Key())
if k != nil && bytes.HasPrefix(k, prefix) {
ci1.key = common.Copy(k)
ci1.val = common.Copy(ci1.iter.Value().data)
@@ -907,8 +906,8 @@ func (sd *SharedDomains) Close() {
func (sd *SharedDomains) Flush(ctx context.Context, tx kv.RwTx) error {
for key, changeset := range sd.pastChangesAccumulator {
- blockNum := binary.BigEndian.Uint64([]byte(key[:8]))
- blockHash := common.BytesToHash([]byte(key[8:]))
+ blockNum := binary.BigEndian.Uint64(toBytesZeroCopy(key[:8]))
+ blockHash := common.BytesToHash(toBytesZeroCopy(key[8:]))
if err := WriteDiffSet(tx, blockNum, blockHash, changeset); err != nil {
return err
}
@@ -1064,7 +1063,7 @@ func (sd *SharedDomains) DomainDel(domain kv.Domain, k1, k2 []byte, prevVal []by
}
return sd.updateAccountCode(k1, nil, prevVal, prevStep)
case kv.CommitmentDomain:
- return sd.updateCommitmentData(k1, nil, prevVal, prevStep)
+ return sd.updateCommitmentData(toStringZeroCopy(k1), nil, prevVal, prevStep)
default:
sd.put(domain, string(append(k1, k2...)), nil)
return sd.domainWriters[domain].DeleteWithPrev(k1, k2, prevVal, prevStep)
@@ -1153,7 +1152,8 @@ func (sdc *SharedDomainsCommitmentContext) ResetBranchCache() {
}
func (sdc *SharedDomainsCommitmentContext) Branch(pref []byte) ([]byte, uint64, error) {
- cached, ok := sdc.branches[string(pref)]
+ prefixS := string(pref)
+ cached, ok := sdc.branches[prefixS]
if ok {
// cached value is already transformed/clean to read.
// Cache should ResetBranchCache after each commitment computation
@@ -1169,7 +1169,7 @@ func (sdc *SharedDomainsCommitmentContext) Branch(pref []byte) ([]byte, uint64,
}
// Trie reads prefix during unfold and after everything is ready reads it again to Merge update, if any, so
// cache branch until ResetBranchCache called
- sdc.branches[string(pref)] = cachedBranch{data: v, step: step}
+ sdc.branches[prefixS] = cachedBranch{data: v, step: step}
if len(v) == 0 {
return nil, 0, nil
@@ -1178,12 +1178,13 @@ func (sdc *SharedDomainsCommitmentContext) Branch(pref []byte) ([]byte, uint64,
}
func (sdc *SharedDomainsCommitmentContext) PutBranch(prefix []byte, data []byte, prevData []byte, prevStep uint64) error {
+ prefixS := toStringZeroCopy(prefix)
if sdc.sharedDomains.trace {
fmt.Printf("[SDC] PutBranch: %x: %x\n", prefix, data)
}
- sdc.branches[string(prefix)] = cachedBranch{data: data, step: prevStep}
+ sdc.branches[prefixS] = cachedBranch{data: data, step: prevStep}
- return sdc.sharedDomains.updateCommitmentData(prefix, data, prevData, prevStep)
+ return sdc.sharedDomains.updateCommitmentData(prefixS, data, prevData, prevStep)
}
func (sdc *SharedDomainsCommitmentContext) Account(plainKey []byte) (u *commitment.Update, err error) {
@@ -1466,3 +1467,6 @@ func (sdc *SharedDomainsCommitmentContext) restorePatriciaState(value []byte) (u
}
return cs.blockNum, cs.txNum, nil
}
+
+func toStringZeroCopy(v []byte) string { return unsafe.String(&v[0], len(v)) }
+func toBytesZeroCopy(s string) []byte { return unsafe.Slice(unsafe.StringData(s), len(s)) }
diff --git a/erigon-lib/state/files_item.go b/erigon-lib/state/files_item.go
index 237f2f0a775..fbdc399a6b4 100644
--- a/erigon-lib/state/files_item.go
+++ b/erigon-lib/state/files_item.go
@@ -336,7 +336,7 @@ func (files visibleFiles) LatestMergedRange() MergeRange {
return MergeRange{}
}
for i := len(files) - 1; i >= 0; i-- {
- shardSize := (files[i].endTxNum - files[i].startTxNum) / config3.HistoryV3AggregationStep
+ shardSize := (files[i].endTxNum - files[i].startTxNum) / config3.DefaultStepSize
if shardSize > 2 {
return MergeRange{from: files[i].startTxNum, to: files[i].endTxNum}
}
diff --git a/erigon-lib/state/state_changeset.go b/erigon-lib/state/state_changeset.go
index 7b0d9b4838c..439f1f6f4ff 100644
--- a/erigon-lib/state/state_changeset.go
+++ b/erigon-lib/state/state_changeset.go
@@ -19,6 +19,7 @@ package state
import (
"bytes"
"encoding/binary"
+ "maps"
"math"
"sort"
@@ -54,16 +55,7 @@ type StateDiffDomain struct {
}
func (d *StateDiffDomain) Copy() *StateDiffDomain {
- res := &StateDiffDomain{}
- res.keys = make(map[string][]byte)
- res.prevValues = make(map[string][]byte)
- for k, v := range d.keys {
- res.keys[k] = v
- }
- for k, v := range d.prevValues {
- res.prevValues[k] = v
- }
- return res
+ return &StateDiffDomain{keys: maps.Clone(d.keys), prevValues: maps.Clone(d.prevValues)}
}
// RecordDelta records a state change.
@@ -77,20 +69,24 @@ func (d *StateDiffDomain) DomainUpdate(key1, key2, prevValue, stepBytes []byte,
prevStepBytes := make([]byte, 8)
binary.BigEndian.PutUint64(prevStepBytes, ^prevStep)
- key := append(common.Copy(key1), key2...)
+ key := make([]byte, len(key1)+len(key2))
+ copy(key, key1)
+ copy(key[len(key1):], key2)
- if _, ok := d.keys[string(key)]; !ok {
- d.keys[string(key)] = prevStepBytes
+ keyS := toStringZeroCopy(key)
+ if _, ok := d.keys[keyS]; !ok {
+ d.keys[keyS] = prevStepBytes
}
- prevValue = common.Copy(prevValue)
-
- valsKey := string(append(common.Copy(key), stepBytes...))
- if _, ok := d.prevValues[valsKey]; !ok {
+ valsKey := make([]byte, len(key)+len(stepBytes))
+ copy(valsKey, key)
+ copy(valsKey[len(key):], stepBytes)
+ valsKeyS := toStringZeroCopy(valsKey)
+ if _, ok := d.prevValues[valsKeyS]; !ok {
if bytes.Equal(stepBytes, prevStepBytes) {
- d.prevValues[valsKey] = prevValue
+ d.prevValues[valsKeyS] = common.Copy(prevValue)
} else {
- d.prevValues[valsKey] = []byte{} // We need to delete the current step but restore the previous one
+ d.prevValues[valsKeyS] = []byte{} // We need to delete the current step but restore the previous one
}
d.prevValsSlice = nil
}
@@ -109,7 +105,7 @@ func (d *StateDiffDomain) GetDiffSet() (keysToValue []DomainEntryDiff) {
})
}
sort.Slice(d.prevValsSlice, func(i, j int) bool {
- return string(d.prevValsSlice[i].Key) < string(d.prevValsSlice[j].Key)
+ return bytes.Compare(d.prevValsSlice[i].Key, d.prevValsSlice[j].Key) < 0
})
return d.prevValsSlice
@@ -121,10 +117,11 @@ func SerializeDiffSet(diffSet []DomainEntryDiff, out []byte) []byte {
dict := make(map[string]byte)
id := byte(0x00)
for _, diff := range diffSet {
- if _, ok := dict[string(diff.PrevStepBytes)]; ok {
+ prevStepS := toStringZeroCopy(diff.PrevStepBytes)
+ if _, ok := dict[prevStepS]; ok {
continue
}
- dict[string(diff.PrevStepBytes)] = id
+ dict[prevStepS] = id
id++
}
// Write the dictionary
@@ -145,7 +142,7 @@ func SerializeDiffSet(diffSet []DomainEntryDiff, out []byte) []byte {
binary.BigEndian.PutUint32(tmp, uint32(len(diff.Value)))
ret = append(ret, tmp...)
ret = append(ret, diff.Value...)
- ret = append(ret, dict[string(diff.PrevStepBytes)])
+ ret = append(ret, dict[toStringZeroCopy(diff.PrevStepBytes)])
}
return ret
}
@@ -155,10 +152,11 @@ func SerializeDiffSetBufLen(diffSet []DomainEntryDiff) int {
dict := make(map[string]byte)
id := byte(0x00)
for _, diff := range diffSet {
- if _, ok := dict[string(diff.PrevStepBytes)]; ok {
+ prevStepS := toStringZeroCopy(diff.PrevStepBytes)
+ if _, ok := dict[prevStepS]; ok {
continue
}
- dict[string(diff.PrevStepBytes)] = id
+ dict[prevStepS] = id
id++
}
// Write the dictionary
diff --git a/erigon-lib/tools/golangci_lint.sh b/erigon-lib/tools/golangci_lint.sh
index 1ff8b402e4c..4c812bc72b9 100755
--- a/erigon-lib/tools/golangci_lint.sh
+++ b/erigon-lib/tools/golangci_lint.sh
@@ -2,7 +2,7 @@
scriptDir=$(dirname "${BASH_SOURCE[0]}")
scriptName=$(basename "${BASH_SOURCE[0]}")
-version="v1.60.3"
+version="v1.60.0"
if [[ "$1" == "--install-deps" ]]
then
diff --git a/erigon-lib/trie/hack.go b/erigon-lib/trie/hack.go
deleted file mode 100644
index ab95af40fe8..00000000000
--- a/erigon-lib/trie/hack.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2024 The Erigon Authors
-// This file is part of Erigon.
-//
-// Erigon is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// Erigon is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with Erigon. If not, see .
-
-package trie
-
-import (
- "fmt"
-
- libcommon "github.com/erigontech/erigon-lib/common"
-
- "github.com/erigontech/erigon-lib/rlp"
-)
-
-func FullNode1() {
- f := &fullNode{}
- b, err := rlp.EncodeToBytes(f)
- if err != nil {
- panic(err)
- }
- fmt.Printf("FullNode1 %x\n", b)
-}
-
-func FullNode2() {
- f := &fullNode{}
- f.Children[0] = valueNode(nil)
- b, err := rlp.EncodeToBytes(f)
- if err != nil {
- panic(err)
- }
- fmt.Printf("FullNode2 %x\n", b)
-}
-
-func FullNode3() {
- f := &fullNode{}
- f.Children[0] = valueNode(nil)
- h := libcommon.Hash{}
- f.Children[1] = hashNode{hash: h[:]}
- b, err := rlp.EncodeToBytes(f)
- if err != nil {
- panic(err)
- }
- fmt.Printf("FullNode3 %x\n", b)
-}
-
-func FullNode4() {
- f := &fullNode{}
- h := libcommon.Hash{}
- for i := 0; i < 17; i++ {
- f.Children[i] = hashNode{hash: h[:]}
- }
- b, err := rlp.EncodeToBytes(f)
- if err != nil {
- panic(err)
- }
- fmt.Printf("FullNode4 %x\n", b)
-}
-
-func ShortNode1() {
- s := NewShortNode([]byte("1"), valueNode("2"))
- b, err := rlp.EncodeToBytes(s)
- if err != nil {
- panic(err)
- }
- fmt.Printf("ShortNode1 %x\n", b)
-}
-
-func ShortNode2() {
- s := NewShortNode([]byte("1"), valueNode("123456789012345678901234567890123456789012345678901234567890"))
- b, err := rlp.EncodeToBytes(s)
- if err != nil {
- panic(err)
- }
- fmt.Printf("ShortNode2 %x\n", b)
-}
-
-func hashRoot(n node, title string) {
- h := newHasher(false)
- h1 := newHasher(true)
- defer returnHasherToPool(h)
- defer returnHasherToPool(h1)
- var hash libcommon.Hash
- hLen, _ := h.hash(n, true, hash[:])
- if hLen < 32 {
- panic("expected hashNode")
- }
- fmt.Printf("%s noencode: %x\n", title, hash[:])
- hLen, _ = h1.hash(n, true, hash[:])
- if hLen < 32 {
- panic("expected hashNode")
- }
- fmt.Printf("%s encode: %x\n", title, hash[:])
-}
-
-func Hash1() {
- f := &fullNode{}
- hashRoot(f, "Hash1")
-}
-
-func Hash2() {
- f := &fullNode{}
- f.Children[0] = &fullNode{}
- hashRoot(f, "Hash2")
-}
-
-func Hash3() {
- s := NewShortNode([]byte("12"), valueNode("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012"))
- hashRoot(s, "Hash3")
-}
-
-func Hash4() {
- s := NewShortNode([]byte("12345678901234567890123456789012"), valueNode("12345678901234567890"))
- hashRoot(s, "Hash4")
-}
-
-func Hash5() {
- s := NewShortNode([]byte("1234567890123456789012345678901"), valueNode("1"))
- hashRoot(s, "Hash5")
-}
-
-func Hash6() {
- s := NewShortNode(libcommon.FromHex("080010"), valueNode(libcommon.FromHex("f90129a0bc7bbe9ce39e604900ca736606290650c4c630501a97745a3f21fae5261623df830362c0b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0")))
- hashRoot(s, "Hash6")
-}
-
-func Hash7() {
- d := &duoNode{}
- d.child1 = NewShortNode(libcommon.FromHex("0110"), valueNode(libcommon.FromHex("f871820ba5850ba43b7400830186a0942eb08efb9e10d9f56e46938f28c13ecb33f67b158a085c1bad4187cfe90000801ba0a7e45cf38e44d2c39a4b94bae2e14fccde41e3280c57b611d9cb6494fde12fc7a00858adac2ba2381c591978b8404c22981f7141f0aef9c3cab8f93a55efc40acc")))
- d.child2 = NewShortNode(libcommon.FromHex("0010"), valueNode(libcommon.FromHex("fa02368e820276850ba43b7400830f4240947fd85d1fc04087b3d9d1e610410989191c09b97380ba023624847b07e7000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000011af74000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000008b0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000008b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b10000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000dd000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000d50000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000f30000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000c90000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000f10000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000bf0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000003d00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000840000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000007500000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000810000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000eb0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000dd0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009f0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000009d0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000b30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007500000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000009d0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000ef0000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000b10000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000be0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000f20000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000ed0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a50000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000ec0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000870000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000b80000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ac0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a90000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000c90000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d50000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a10000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000ec0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000b50000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000cb0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000fc0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000eb000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000a80000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000dc000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000009f0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000a20000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000e20000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000a70000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000fb0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000dc000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000fc0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000ac0000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000bf0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000e20000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000cf0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000a70000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003b00000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000a40000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004d0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a40000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fd0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000a20000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000eb000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000f60000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000001ba05d4d29b6f1b101809f9b43edea6e227828ed7df55663b482cff3d9d7a14ec20aa023db82ed86dd399e73aee94f0f0f8854d352c413e64c4b7f8d8a9bf5cb198d4b")))
- d.mask |= uint32(1) << 0
- d.mask |= uint32(1) << 8
- hashRoot(d, "Hash7")
-}
diff --git a/eth/backend.go b/eth/backend.go
index 7ed0895c9d6..02f9e085c8c 100644
--- a/eth/backend.go
+++ b/eth/backend.go
@@ -1504,7 +1504,7 @@ func setUpBlockReader(ctx context.Context, db kv.RwDB, dirs datadir.Dirs, snConf
}
}
blockReader := freezeblocks.NewBlockReader(allSnapshots, allBorSnapshots, heimdallStore, bridgeStore)
- agg, err := libstate.NewAggregator(ctx, dirs, config3.HistoryV3AggregationStep, db, logger)
+ agg, err := libstate.NewAggregator(ctx, dirs, config3.DefaultStepSize, db, logger)
if err != nil {
return nil, nil, nil, nil, nil, nil, nil, err
}
diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go
index e605f88be1c..d461f921575 100644
--- a/eth/protocols/eth/handler_test.go
+++ b/eth/protocols/eth/handler_test.go
@@ -91,7 +91,7 @@ func TestGetBlockReceipts(t *testing.T) {
}
// Assemble the test environment
m := mockWithGenerator(t, 4, generator)
- receiptsGetter := receipts.NewGenerator(32, m.BlockReader, m.Engine)
+ receiptsGetter := receipts.NewGenerator(m.BlockReader, m.Engine)
// Collect the hashes to request, and the response to expect
var (
hashes []libcommon.Hash
diff --git a/eth/stagedsync/exec3.go b/eth/stagedsync/exec3.go
index c5d0b840f53..2303490f3f4 100644
--- a/eth/stagedsync/exec3.go
+++ b/eth/stagedsync/exec3.go
@@ -37,7 +37,6 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/metrics"
state2 "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon-lib/wrap"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb"
@@ -45,6 +44,7 @@ import (
"github.com/erigontech/erigon/core/rawdb/rawtemporaldb"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/eth/ethconfig/estimate"
"github.com/erigontech/erigon/eth/stagedsync/stages"
"github.com/erigontech/erigon/turbo/services"
@@ -120,7 +120,7 @@ func (p *Progress) Log(suffix string, rs *state.StateV3, in *state.QueueWithRetr
//"workers", p.workersCount,
"buf", fmt.Sprintf("%s/%s", common.ByteCount(sizeEstimate), common.ByteCount(p.commitThreshold)),
"stepsInDB", fmt.Sprintf("%.2f", idxStepsAmountInDB),
- "step", fmt.Sprintf("%.1f", float64(outTxNum)/float64(config3.HistoryV3AggregationStep)),
+ "step", fmt.Sprintf("%.1f", float64(outTxNum)/float64(config3.DefaultStepSize)),
"inMem", inMemExec,
"alloc", common.ByteCount(m.Alloc), "sys", common.ByteCount(m.Sys),
)
@@ -132,6 +132,71 @@ func (p *Progress) Log(suffix string, rs *state.StateV3, in *state.QueueWithRetr
p.prevRepeatCount = repeatCount
}
+// Cases:
+// 1. Snapshots > ExecutionStage: snapshots can have half-block data `10.4`. Get right txNum from SharedDomains (after SeekCommitment)
+// 2. ExecutionStage > Snapshots: no half-block data possible. Rely on DB.
+func restoreTxNum(ctx context.Context, cfg *ExecuteBlockCfg, applyTx kv.Tx, doms *state2.SharedDomains, maxBlockNum uint64) (
+ inputTxNum uint64, maxTxNum uint64, offsetFromBlockBeginning uint64, err error) {
+
+ txNumsReader := rawdbv3.TxNums.WithCustomReadTxNumFunc(freezeblocks.ReadTxNumFuncFromBlockReader(ctx, cfg.blockReader))
+
+ inputTxNum = doms.TxNum()
+
+ if nothing, err := nothingToExec(applyTx, txNumsReader, inputTxNum); err != nil {
+ return 0, 0, 0, err
+ } else if nothing {
+ return 0, 0, 0, err
+ }
+
+ maxTxNum, err = txNumsReader.Max(applyTx, maxBlockNum)
+ if err != nil {
+ return 0, 0, 0, err
+ }
+
+ ok, _blockNum, err := txNumsReader.FindBlockNum(applyTx, doms.TxNum())
+ if err != nil {
+ return 0, 0, 0, err
+ }
+ if !ok {
+ _lb, _lt, _ := txNumsReader.Last(applyTx)
+ _fb, _ft, _ := txNumsReader.First(applyTx)
+ return 0, 0, 0, fmt.Errorf("seems broken TxNums index not filled. can't find blockNum of txNum=%d; in db: (%d-%d, %d-%d)", inputTxNum, _fb, _lb, _ft, _lt)
+ }
+ {
+ _max, _ := txNumsReader.Max(applyTx, _blockNum)
+ if doms.TxNum() == _max {
+ _blockNum++
+ }
+ }
+
+ _min, err := txNumsReader.Min(applyTx, _blockNum)
+ if err != nil {
+ return 0, 0, 0, err
+ }
+
+ if doms.TxNum() > _min {
+ // if stopped in the middle of the block: start from beginning of block.
+ // first part will be executed in HistoryExecution mode
+ offsetFromBlockBeginning = doms.TxNum() - _min
+ }
+
+ inputTxNum = _min
+
+ //_max, _ := txNumsReader.Max(applyTx, blockNum)
+ //fmt.Printf("[commitment] found domain.txn %d, inputTxn %d, offset %d. DB found block %d {%d, %d}\n", doms.TxNum(), inputTxNum, offsetFromBlockBeginning, blockNum, _min, _max)
+ doms.SetBlockNum(_blockNum)
+ doms.SetTxNum(inputTxNum)
+ return inputTxNum, maxTxNum, offsetFromBlockBeginning, nil
+}
+
+func nothingToExec(applyTx kv.Tx, txNumsReader rawdbv3.TxNumsReader, inputTxNum uint64) (bool, error) {
+ _, lastTxNum, err := txNumsReader.Last(applyTx)
+ if err != nil {
+ return false, err
+ }
+ return lastTxNum == inputTxNum, nil
+}
+
func ExecV3(ctx context.Context,
execStage *StageState, u Unwinder, workerCount int, cfg ExecuteBlockCfg, txc wrap.TxContainer,
parallel bool, //nolint
@@ -198,100 +263,17 @@ func ExecV3(ctx context.Context,
}
txNumInDB := doms.TxNum()
- txNumsReader := rawdbv3.TxNums.WithCustomReadTxNumFunc(freezeblocks.ReadTxNumFuncFromBlockReader(ctx, cfg.blockReader))
-
var (
- inputTxNum = doms.TxNum()
- stageProgress = execStage.BlockNumber
- outputTxNum = atomic.Uint64{}
- blockComplete = atomic.Bool{}
-
+ inputTxNum = doms.TxNum()
+ stageProgress = execStage.BlockNumber
+ outputTxNum = atomic.Uint64{}
+ blockComplete = atomic.Bool{}
+ outputBlockNum = stages.SyncMetrics[stages.Execution]
+ inputBlockNum = &atomic.Uint64{}
offsetFromBlockBeginning uint64
blockNum, maxTxNum uint64
)
- blockComplete.Store(true)
- nothingToExec := func(applyTx kv.Tx) (bool, error) {
- _, lastTxNum, err := txNumsReader.Last(applyTx)
- if err != nil {
- return false, err
- }
- return lastTxNum == inputTxNum, nil
- }
- // Cases:
- // 1. Snapshots > ExecutionStage: snapshots can have half-block data `10.4`. Get right txNum from SharedDomains (after SeekCommitment)
- // 2. ExecutionStage > Snapshots: no half-block data possible. Rely on DB.
- restoreTxNum := func(applyTx kv.Tx) error {
- var err error
- maxTxNum, err = txNumsReader.Max(applyTx, maxBlockNum)
- if err != nil {
- return err
- }
- ok, _blockNum, err := txNumsReader.FindBlockNum(applyTx, doms.TxNum())
- if err != nil {
- return err
- }
- if !ok {
- _lb, _lt, _ := txNumsReader.Last(applyTx)
- _fb, _ft, _ := txNumsReader.First(applyTx)
- return fmt.Errorf("seems broken TxNums index not filled. can't find blockNum of txNum=%d; in db: (%d-%d, %d-%d)", inputTxNum, _fb, _lb, _ft, _lt)
- }
- {
- _max, _ := txNumsReader.Max(applyTx, _blockNum)
- if doms.TxNum() == _max {
- _blockNum++
- }
- }
-
- _min, err := txNumsReader.Min(applyTx, _blockNum)
- if err != nil {
- return err
- }
-
- if doms.TxNum() > _min {
- // if stopped in the middle of the block: start from beginning of block.
- // first part will be executed in HistoryExecution mode
- offsetFromBlockBeginning = doms.TxNum() - _min
- }
-
- inputTxNum = _min
- outputTxNum.Store(inputTxNum)
-
- //_max, _ := txNumsReader.Max(applyTx, blockNum)
- //fmt.Printf("[commitment] found domain.txn %d, inputTxn %d, offset %d. DB found block %d {%d, %d}\n", doms.TxNum(), inputTxNum, offsetFromBlockBeginning, blockNum, _min, _max)
- doms.SetBlockNum(_blockNum)
- doms.SetTxNum(inputTxNum)
- return nil
- }
- if applyTx != nil {
- if _nothing, err := nothingToExec(applyTx); err != nil {
- return err
- } else if _nothing {
- return nil
- }
-
- if err := restoreTxNum(applyTx); err != nil {
- return err
- }
- } else {
- var _nothing bool
- if err := cfg.db.View(ctx, func(tx kv.Tx) (err error) {
- if _nothing, err = nothingToExec(applyTx); err != nil {
- return err
- } else if _nothing {
- return nil
- }
-
- return restoreTxNum(applyTx)
- }); err != nil {
- return err
- }
- if _nothing {
- return nil
- }
- }
-
- ts := time.Duration(0)
blockNum = doms.BlockNum()
outputTxNum.Store(doms.TxNum())
@@ -311,8 +293,6 @@ func ExecV3(ctx context.Context,
agg.BuildFilesInBackground(outputTxNum.Load())
- var outputBlockNum = stages.SyncMetrics[stages.Execution]
- inputBlockNum := &atomic.Uint64{}
var count uint64
shouldReportToTxPool := cfg.notifications != nil && !isMining && maxBlockNum <= blockNum+64
@@ -329,22 +309,37 @@ func ExecV3(ctx context.Context,
// Now rwLoop closing both (because applyLoop we completely restart)
// Maybe need split channels? Maybe don't exit from ApplyLoop? Maybe current way is also ok?
- // input queue
- in := state.NewQueueWithRetry(100_000)
- defer in.Close()
+ if applyTx != nil {
+ if inputTxNum, maxTxNum, offsetFromBlockBeginning, err = restoreTxNum(ctx, &cfg, applyTx, doms, maxBlockNum); err != nil {
+ return err
+ }
+ } else {
+ if err := cfg.db.View(ctx, func(tx kv.Tx) (err error) {
+ inputTxNum, maxTxNum, offsetFromBlockBeginning, err = restoreTxNum(ctx, &cfg, tx, doms, maxBlockNum)
+ return err
+ }); err != nil {
+ return err
+ }
+ }
- rwsConsumed := make(chan struct{}, 1)
- defer close(rwsConsumed)
+ if maxTxNum == 0 {
+ return nil
+ }
applyWorker := cfg.applyWorker
if isMining {
applyWorker = cfg.applyWorkerMining
}
- applyWorker.ResetState(rs, accumulator)
defer applyWorker.LogLRUStats()
+ applyWorker.ResetState(rs, accumulator)
+
commitThreshold := cfg.batchSize.Bytes()
+
+ // TODO are these dups ?
+ processed := NewProgress(blockNum, commitThreshold, workerCount, true, execStage.LogPrefix(), logger)
progress := NewProgress(blockNum, commitThreshold, workerCount, false, execStage.LogPrefix(), logger)
+
logEvery := time.NewTicker(20 * time.Second)
defer logEvery.Stop()
pruneEvery := time.NewTicker(2 * time.Second)
@@ -352,27 +347,27 @@ func ExecV3(ctx context.Context,
var logGas uint64
var stepsInDB float64
-
- processed := NewProgress(blockNum, commitThreshold, workerCount, true, execStage.LogPrefix(), logger)
-
var executor executor
if parallel {
pe := ¶llelExecutor{
- execStage: execStage,
- chainDb: cfg.db,
- applyWorker: applyWorker,
- applyTx: applyTx,
- outputTxNum: &outputTxNum,
- in: in,
- rs: rs,
- agg: agg,
- rwsConsumed: rwsConsumed,
- isMining: isMining,
- inMemExec: inMemExec,
+ txExecutor: txExecutor{
+ cfg: cfg,
+ execStage: execStage,
+ rs: rs,
+ doms: doms,
+ agg: agg,
+ accumulator: accumulator,
+ isMining: isMining,
+ inMemExec: inMemExec,
+ applyTx: applyTx,
+ applyWorker: applyWorker,
+ outputTxNum: &outputTxNum,
+ outputBlockNum: stages.SyncMetrics[stages.Execution],
+ logger: logger,
+ },
shouldGenerateChangesets: shouldGenerateChangesets,
workerCount: workerCount,
- accumulator: accumulator,
pruneEvery: pruneEvery,
logEvery: logEvery,
progress: progress,
@@ -382,7 +377,7 @@ func ExecV3(ctx context.Context,
defer executorCancel()
defer func() {
- processed.Log("Done", executor.readState(), in, pe.rws, 0 /*txCount - TODO*/, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
+ processed.Log("Done", executor.readState(), nil, pe.rws, 0 /*txCount - TODO*/, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
}()
executor = pe
@@ -391,31 +386,47 @@ func ExecV3(ctx context.Context,
doms.SetTx(applyTx)
se := &serialExecutor{
- cfg: cfg,
- execStage: execStage,
- rs: rs,
- doms: doms,
- agg: agg,
- u: u,
- isMining: isMining,
- inMemExec: inMemExec,
- applyTx: applyTx,
- worker: applyWorker,
- outputTxNum: &outputTxNum,
- logger: logger,
+ txExecutor: txExecutor{
+ cfg: cfg,
+ execStage: execStage,
+ rs: rs,
+ doms: doms,
+ agg: agg,
+ u: u,
+ isMining: isMining,
+ inMemExec: inMemExec,
+ applyTx: applyTx,
+ applyWorker: applyWorker,
+ outputTxNum: &outputTxNum,
+ outputBlockNum: stages.SyncMetrics[stages.Execution],
+ logger: logger,
+ },
}
defer func() {
- processed.Log("Done", executor.readState(), in, nil, se.txCount, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
+ processed.Log("Done", executor.readState(), nil, nil, se.txCount, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
}()
executor = se
}
- getHeaderFunc := func(hash common.Hash, number uint64) (h *types.Header) {
- return executor.getHeader(ctx, hash, number)
+ blockComplete.Store(true)
+
+ ts := time.Duration(0)
+ blockNum = executor.domains().BlockNum()
+ outputTxNum.Store(executor.domains().TxNum())
+
+ if maxBlockNum < blockNum {
+ return nil
}
+ if maxBlockNum > blockNum+16 {
+ log.Info(fmt.Sprintf("[%s] starting", execStage.LogPrefix()),
+ "from", blockNum, "to", maxBlockNum, "fromTxNum", executor.domains().TxNum(), "offsetFromBlockBeginning", offsetFromBlockBeginning, "initialCycle", initialCycle, "useExternalTx", useExternalTx)
+ }
+
+ agg.BuildFilesInBackground(outputTxNum.Load())
+
var readAhead chan uint64
if !parallel {
// snapshots are often stored on chaper drives. don't expect low-read-latency and manually read-ahead.
@@ -478,13 +489,12 @@ Loop:
skipAnalysis := core.SkipAnalysis(chainConfig, blockNum)
signer := *types.MakeSigner(chainConfig, blockNum, header.Time)
- f := core.GetHashFn(header, getHeaderFunc)
getHashFnMute := &sync.Mutex{}
- getHashFn := func(n uint64) common.Hash {
+ getHashFn := core.GetHashFn(header, func(hash common.Hash, number uint64) (h *types.Header) {
getHashFnMute.Lock()
defer getHashFnMute.Unlock()
- return f(n)
- }
+ return executor.getHeader(ctx, hash, number)
+ })
totalGasUsed += b.GasUsed()
blockContext := core.NewEVMBlockContext(header, getHashFn, cfg.engine, cfg.author /* author */, chainConfig)
// print type of engine
@@ -492,7 +502,7 @@ Loop:
if err := executor.status(ctx, commitThreshold); err != nil {
return err
}
- } else if shouldReportToTxPool {
+ } else if accumulator != nil {
txs, err := blockReader.RawTransactions(context.Background(), executor.tx(), b.NumberU64(), b.NumberU64())
if err != nil {
return err
@@ -610,9 +620,16 @@ Loop:
aggTx := executor.tx().(state2.HasAggTx).AggTx().(*state2.AggregatorRoTx)
aggTx.RestrictSubsetFileDeletions(true)
start := time.Now()
- if _, err := executor.domains().ComputeCommitment(ctx, true, blockNum, execStage.LogPrefix()); err != nil {
+ _ /*rh*/, err := executor.domains().ComputeCommitment(ctx, true, blockNum, execStage.LogPrefix())
+ if err != nil {
return err
}
+
+ //if !bytes.Equal(rh, header.Root.Bytes()) {
+ // logger.Error(fmt.Sprintf("[%s] Wrong trie root of block %d: %x, expected (from header): %x. Block hash: %x", execStage.LogPrefix(), header.Number.Uint64(), rh, header.Root.Bytes(), header.Hash()))
+ // return errors.New("wrong trie root")
+ //}
+
ts += time.Since(start)
aggTx.RestrictSubsetFileDeletions(false)
executor.domains().SavePastChangesetAccumulator(b.Hash(), blockNum, changeset)
@@ -637,8 +654,6 @@ Loop:
metrics2.UpdateBlockConsumerPostExecutionDelay(b.Time(), blockNum, logger)
}
- outputBlockNum.SetUint64(blockNum)
-
select {
case <-logEvery.C:
if inMemExec || isMining {
@@ -646,7 +661,7 @@ Loop:
}
stepsInDB := rawdbhelpers.IdxStepsCountV3(executor.tx())
- progress.Log("", executor.readState(), in, nil, count, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
+ progress.Log("", executor.readState(), nil, nil, count, logGas, inputBlockNum.Load(), outputBlockNum.GetValueUint64(), outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, shouldGenerateChangesets, inMemExec)
//TODO: https://github.com/erigontech/erigon/issues/10724
//if executor.tx().(state2.HasAggTx).AggTx().(*state2.AggregatorRoTx).CanPrune(executor.tx(), outputTxNum.Load()) {
@@ -712,6 +727,7 @@ Loop:
//log.Info("Executed", "blocks", inputBlockNum.Load(), "txs", outputTxNum.Load(), "repeats", mxExecRepeats.GetValueUint64())
+ //fmt.Println("WAIT")
executor.wait()
if u != nil && !u.HasUnwindPoint() {
diff --git a/eth/stagedsync/exec3_parallel.go b/eth/stagedsync/exec3_parallel.go
index 4ca19d50142..26d06c369f5 100644
--- a/eth/stagedsync/exec3_parallel.go
+++ b/eth/stagedsync/exec3_parallel.go
@@ -13,14 +13,16 @@ import (
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/log/v3"
+ "github.com/erigontech/erigon-lib/metrics"
state2 "github.com/erigontech/erigon-lib/state"
"github.com/erigontech/erigon/cmd/state/exec3"
"github.com/erigontech/erigon/consensus"
+ "github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/rawdb/rawdbhelpers"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
- "github.com/erigontech/erigon/eth/stagedsync/stages"
+ "github.com/erigontech/erigon/core/vm"
"github.com/erigontech/erigon/turbo/shards"
"golang.org/x/sync/errgroup"
)
@@ -78,54 +80,48 @@ type executor interface {
domains() *state2.SharedDomains
}
-type parallelExecutor struct {
+type txExecutor struct {
sync.RWMutex
- rwLoopErrCh chan error
- rwLoopG *errgroup.Group
- applyLoopWg sync.WaitGroup
- chainDb kv.RwDB
- applyTx kv.RwTx
- applyWorker *exec3.Worker
- execWorkers []*exec3.Worker
- stopWorkers func()
- waitWorkers func()
- execStage *StageState
- cfg ExecuteBlockCfg
- lastBlockNum atomic.Uint64
- outputTxNum *atomic.Uint64
- in *state.QueueWithRetry
- rws *state.ResultsQueue
- rs *state.StateV3
- doms *state2.SharedDomains
- agg *state2.Aggregator
- rwsConsumed chan struct{}
- isMining bool
- inMemExec bool
- shouldGenerateChangesets bool
- accumulator *shards.Accumulator
- workerCount int
- pruneEvery *time.Ticker
- logEvery *time.Ticker
- slowDownLimit *time.Ticker
- progress *Progress
+ cfg ExecuteBlockCfg
+ execStage *StageState
+ agg *state2.Aggregator
+ rs *state.StateV3
+ doms *state2.SharedDomains
+ accumulator *shards.Accumulator
+ u Unwinder
+ isMining bool
+ inMemExec bool
+ applyTx kv.RwTx
+ applyWorker *exec3.Worker
+ outputTxNum *atomic.Uint64
+ outputBlockNum metrics.Gauge
+ logger log.Logger
}
-func (pe *parallelExecutor) tx() kv.RwTx {
- return pe.applyTx
+func (te *txExecutor) tx() kv.RwTx {
+ return te.applyTx
}
-func (pe *parallelExecutor) readState() *state.StateV3 {
- return pe.rs
+func (te *txExecutor) readState() *state.StateV3 {
+ return te.rs
}
-func (pe *parallelExecutor) domains() *state2.SharedDomains {
- return pe.doms
+func (te *txExecutor) domains() *state2.SharedDomains {
+ return te.doms
}
-func (pe *parallelExecutor) getHeader(ctx context.Context, hash common.Hash, number uint64) (h *types.Header) {
+func (te *txExecutor) getHeader(ctx context.Context, hash common.Hash, number uint64) (h *types.Header) {
var err error
- if err = pe.chainDb.View(ctx, func(tx kv.Tx) error {
- h, err = pe.cfg.blockReader.Header(ctx, tx, hash, number)
+ if te.applyTx != nil {
+ h, err = te.cfg.blockReader.Header(ctx, te.applyTx, hash, number)
+ if err != nil {
+ panic(err)
+ }
+ return h
+ }
+
+ if err = te.cfg.db.View(ctx, func(tx kv.Tx) error {
+ h, err = te.cfg.blockReader.Header(ctx, tx, hash, number)
if err != nil {
return err
}
@@ -136,19 +132,39 @@ func (pe *parallelExecutor) getHeader(ctx context.Context, hash common.Hash, num
return h
}
+type parallelExecutor struct {
+ txExecutor
+ rwLoopErrCh chan error
+ rwLoopG *errgroup.Group
+ applyLoopWg sync.WaitGroup
+ execWorkers []*exec3.Worker
+ stopWorkers func()
+ waitWorkers func()
+ lastBlockNum atomic.Uint64
+ in *state.QueueWithRetry
+ rws *state.ResultsQueue
+ rwsConsumed chan struct{}
+ shouldGenerateChangesets bool
+ workerCount int
+ pruneEvery *time.Ticker
+ logEvery *time.Ticker
+ slowDownLimit *time.Ticker
+ progress *Progress
+}
+
func (pe *parallelExecutor) applyLoop(ctx context.Context, maxTxNum uint64, blockComplete *atomic.Bool, errCh chan error) {
defer pe.applyLoopWg.Done()
defer func() {
if rec := recover(); rec != nil {
- log.Warn("[dbg] apply loop panic", "rec", rec)
+ pe.logger.Warn("[dbg] apply loop panic", "rec", rec)
}
- log.Warn("[dbg] apply loop exit")
+ pe.logger.Warn("[dbg] apply loop exit")
}()
-
- outputBlockNum := stages.SyncMetrics[stages.Execution]
+ //fmt.Println("applyLoop started")
+ //defer fmt.Println("applyLoop done")
applyLoopInner := func(ctx context.Context) error {
- tx, err := pe.chainDb.BeginRo(ctx)
+ tx, err := pe.cfg.db.BeginRo(ctx)
if err != nil {
return err
}
@@ -161,18 +177,15 @@ func (pe *parallelExecutor) applyLoop(ctx context.Context, maxTxNum uint64, bloc
return err
}
- processedTxNum, conflicts, triggers, processedBlockNum, stoppedAtBlockEnd, err :=
- pe.processResultQueue(ctx, pe.outputTxNum.Load(), tx, pe.rwsConsumed, true, false)
+ processedTxNum, conflicts, triggers, _ /*processedBlockNum*/, stoppedAtBlockEnd, err :=
+ pe.processResultQueue(ctx, pe.outputTxNum.Load(), pe.rwsConsumed, true, false)
if err != nil {
return err
}
-
+ //fmt.Println("QR", processedTxNum, conflicts, triggers, processedBlockNum, stoppedAtBlockEnd, err)
mxExecRepeats.AddInt(conflicts)
mxExecTriggers.AddInt(triggers)
- if processedBlockNum > pe.lastBlockNum.Load() {
- outputBlockNum.SetUint64(processedBlockNum)
- pe.lastBlockNum.Store(processedBlockNum)
- }
+
if processedTxNum > 0 {
pe.outputTxNum.Store(processedTxNum)
blockComplete.Store(stoppedAtBlockEnd)
@@ -195,11 +208,17 @@ func (pe *parallelExecutor) applyLoop(ctx context.Context, maxTxNum uint64, bloc
// Maybe need split channels? Maybe don't exit from ApplyLoop? Maybe current way is also ok?
func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger log.Logger) error {
- tx, err := pe.chainDb.BeginRw(ctx)
- if err != nil {
- return err
+ //fmt.Println("rwLoop started", maxTxNum)
+ //defer fmt.Println("rwLoop done")
+
+ tx := pe.applyTx
+ if tx == nil {
+ tx, err := pe.cfg.db.BeginRw(ctx)
+ if err != nil {
+ return err
+ }
+ defer tx.Rollback()
}
- defer tx.Rollback()
pe.doms.SetTx(tx)
@@ -213,8 +232,6 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
go pe.applyLoop(applyCtx, maxTxNum, &blockComplete, pe.rwLoopErrCh)
- outputBlockNum := stages.SyncMetrics[stages.Execution]
-
for pe.outputTxNum.Load() <= maxTxNum {
select {
case <-ctx.Done():
@@ -222,16 +239,16 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
case <-pe.logEvery.C:
stepsInDB := rawdbhelpers.IdxStepsCountV3(tx)
- pe.progress.Log("", pe.rs, pe.in, pe.rws, pe.rs.DoneCount(), 0 /* TODO logGas*/, pe.lastBlockNum.Load(), outputBlockNum.GetValueUint64(), pe.outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, pe.shouldGenerateChangesets, pe.inMemExec)
+ pe.progress.Log("", pe.rs, pe.in, pe.rws, pe.rs.DoneCount(), 0 /* TODO logGas*/, pe.lastBlockNum.Load(), pe.outputBlockNum.GetValueUint64(), pe.outputTxNum.Load(), mxExecRepeats.GetValueUint64(), stepsInDB, pe.shouldGenerateChangesets, pe.inMemExec)
if pe.agg.HasBackgroundFilesBuild() {
logger.Info(fmt.Sprintf("[%s] Background files build", pe.execStage.LogPrefix()), "progress", pe.agg.BackgroundProgress())
}
case <-pe.pruneEvery.C:
if pe.rs.SizeEstimate() < pe.cfg.batchSize.Bytes() {
- if pe.doms.BlockNum() != outputBlockNum.GetValueUint64() {
- panic(fmt.Errorf("%d != %d", pe.doms.BlockNum(), outputBlockNum.GetValueUint64()))
+ if pe.doms.BlockNum() != pe.outputBlockNum.GetValueUint64() {
+ panic(fmt.Errorf("%d != %d", pe.doms.BlockNum(), pe.outputBlockNum.GetValueUint64()))
}
- _, err := pe.doms.ComputeCommitment(ctx, true, outputBlockNum.GetValueUint64(), pe.execStage.LogPrefix())
+ _, err := pe.doms.ComputeCommitment(ctx, true, pe.outputBlockNum.GetValueUint64(), pe.execStage.LogPrefix())
if err != nil {
return err
}
@@ -264,7 +281,7 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
pe.applyWorker.ResetTx(tx)
processedTxNum, conflicts, triggers, processedBlockNum, stoppedAtBlockEnd, err :=
- pe.processResultQueue(ctx, pe.outputTxNum.Load(), tx, nil, false, true)
+ pe.processResultQueue(ctx, pe.outputTxNum.Load(), nil, false, true)
if err != nil {
return err
}
@@ -272,7 +289,7 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
mxExecRepeats.AddInt(conflicts)
mxExecTriggers.AddInt(triggers)
if processedBlockNum > 0 {
- outputBlockNum.SetUint64(processedBlockNum)
+ pe.outputBlockNum.SetUint64(processedBlockNum)
}
if processedTxNum > 0 {
pe.outputTxNum.Store(processedTxNum)
@@ -309,16 +326,16 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
pe.doms.ClearRam(true)
t3 = time.Since(tt)
- if err = pe.execStage.Update(tx, outputBlockNum.GetValueUint64()); err != nil {
+ if err := pe.execStage.Update(tx, pe.outputBlockNum.GetValueUint64()); err != nil {
return err
}
- if _, err = rawdb.IncrementStateVersion(pe.applyTx); err != nil {
+ if _, err := rawdb.IncrementStateVersion(tx); err != nil {
return fmt.Errorf("writing plain state version: %w", err)
}
tx.CollectMetrics()
tt = time.Now()
- if err = tx.Commit(); err != nil {
+ if err := tx.Commit(); err != nil {
return err
}
t4 = time.Since(tt)
@@ -330,7 +347,8 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
}(); err != nil {
return err
}
- if tx, err = pe.chainDb.BeginRw(ctx); err != nil {
+ var err error
+ if tx, err = pe.cfg.db.BeginRw(ctx); err != nil {
return err
}
defer tx.Rollback()
@@ -344,29 +362,35 @@ func (pe *parallelExecutor) rwLoop(ctx context.Context, maxTxNum uint64, logger
logger.Info("Committed", "time", time.Since(commitStart), "drain", t0, "drain_and_lock", t1, "rs.flush", t2, "agg.flush", t3, "tx.commit", t4)
}
}
- if err = pe.doms.Flush(ctx, tx); err != nil {
+ if err := pe.doms.Flush(ctx, tx); err != nil {
return err
}
- if err = pe.execStage.Update(tx, outputBlockNum.GetValueUint64()); err != nil {
+ if err := pe.execStage.Update(tx, pe.outputBlockNum.GetValueUint64()); err != nil {
return err
}
- if err = tx.Commit(); err != nil {
+ if err := tx.Commit(); err != nil {
return err
}
return nil
}
-func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum uint64, applyTx kv.Tx, backPressure chan<- struct{}, canRetry, forceStopAtBlockEnd bool) (outputTxNum uint64, conflicts, triggers int, processedBlockNum uint64, stopedAtBlockEnd bool, err error) {
+func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum uint64, backPressure chan<- struct{}, canRetry, forceStopAtBlockEnd bool) (outputTxNum uint64, conflicts, triggers int, processedBlockNum uint64, stopedAtBlockEnd bool, err error) {
rwsIt := pe.rws.Iter()
defer rwsIt.Close()
+ //defer fmt.Println("PRQ", "Done")
var i int
outputTxNum = inputTxNum
for rwsIt.HasNext(outputTxNum) {
txTask := rwsIt.PopNext()
+ //fmt.Println("PRQ", txTask.BlockNum, txTask.TxIndex, txTask.TxNum)
if txTask.Error != nil || !pe.rs.ReadsValid(txTask.ReadLists) {
conflicts++
-
+ //fmt.Println(txTask.TxNum, txTask.Error)
+ if errors.Is(txTask.Error, vm.ErrIntraBlockStateFailed) ||
+ errors.Is(txTask.Error, core.ErrStateTransitionFailed) {
+ return outputTxNum, conflicts, triggers, processedBlockNum, false, fmt.Errorf("%w: %v", consensus.ErrInvalidBlock, txTask.Error)
+ }
if i > 0 && canRetry {
//send to re-exex
pe.rs.ReTry(txTask, pe.in)
@@ -374,8 +398,9 @@ func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum u
}
// resolve first conflict right here: it's faster and conflict-free
- pe.applyWorker.RunTxTask(txTask, pe.isMining)
+ pe.applyWorker.RunTxTaskNoLock(txTask.Reset(), pe.isMining)
if txTask.Error != nil {
+ //fmt.Println("RETRY", txTask.TxNum, txTask.Error)
return outputTxNum, conflicts, triggers, processedBlockNum, false, fmt.Errorf("%w: %v", consensus.ErrInvalidBlock, txTask.Error)
}
if pe.cfg.syncCfg.ChaosMonkey {
@@ -395,6 +420,11 @@ func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum u
if err != nil {
return outputTxNum, conflicts, triggers, processedBlockNum, false, fmt.Errorf("StateV3.Apply: %w", err)
}
+
+ if processedBlockNum > pe.lastBlockNum.Load() {
+ pe.outputBlockNum.SetUint64(processedBlockNum)
+ pe.lastBlockNum.Store(processedBlockNum)
+ }
//if !bytes.Equal(rh, txTask.BlockRoot[:]) {
// log.Error("block hash mismatch", "rh", hex.EncodeToString(rh), "blockRoot", hex.EncodeToString(txTask.BlockRoot[:]), "bn", txTask.BlockNum, "txn", txTask.TxNum)
// return outputTxNum, conflicts, triggers, processedBlockNum, false, fmt.Errorf("block hashk mismatch: %x != %x bn =%d, txn= %d", rh, txTask.BlockRoot[:], txTask.BlockNum, txTask.TxNum)
@@ -412,7 +442,9 @@ func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum u
return outputTxNum, conflicts, triggers, processedBlockNum, false, fmt.Errorf("StateV3.Apply: %w", err)
}
processedBlockNum = txTask.BlockNum
- stopedAtBlockEnd = txTask.Final
+ if !stopedAtBlockEnd {
+ stopedAtBlockEnd = txTask.Final
+ }
if forceStopAtBlockEnd && txTask.Final {
break
}
@@ -422,8 +454,12 @@ func (pe *parallelExecutor) processResultQueue(ctx context.Context, inputTxNum u
func (pe *parallelExecutor) run(ctx context.Context, maxTxNum uint64, logger log.Logger) context.CancelFunc {
pe.slowDownLimit = time.NewTicker(time.Second)
+ pe.rwsConsumed = make(chan struct{}, 1)
+ pe.rwLoopErrCh = make(chan error)
+ pe.in = state.NewQueueWithRetry(100_000)
+
pe.execWorkers, _, pe.rws, pe.stopWorkers, pe.waitWorkers = exec3.NewWorkersPool(
- pe.RWMutex.RLocker(), pe.accumulator, logger, ctx, true, pe.chainDb, pe.rs, pe.in,
+ pe.RWMutex.RLocker(), pe.accumulator, logger, ctx, true, pe.cfg.db, pe.rs, pe.in,
pe.cfg.blockReader, pe.cfg.chainConfig, pe.cfg.genesis, pe.cfg.engine, pe.workerCount+1, pe.cfg.dirs, pe.isMining)
rwLoopCtx, rwLoopCtxCancel := context.WithCancel(ctx)
@@ -433,7 +469,7 @@ func (pe *parallelExecutor) run(ctx context.Context, maxTxNum uint64, logger log
defer pe.in.Close()
defer pe.applyLoopWg.Wait()
defer func() {
- log.Warn("[dbg] rwloop exit")
+ logger.Warn("[dbg] rwloop exit")
}()
return pe.rwLoop(rwLoopCtx, maxTxNum, logger)
})
@@ -443,6 +479,8 @@ func (pe *parallelExecutor) run(ctx context.Context, maxTxNum uint64, logger log
pe.slowDownLimit.Stop()
pe.wait()
pe.stopWorkers()
+ close(pe.rwsConsumed)
+ pe.in.Close()
}
}
diff --git a/eth/stagedsync/exec3_serial.go b/eth/stagedsync/exec3_serial.go
index 2a59dc12099..cb271284533 100644
--- a/eth/stagedsync/exec3_serial.go
+++ b/eth/stagedsync/exec3_serial.go
@@ -4,40 +4,22 @@ import (
"context"
"errors"
"fmt"
- "sync/atomic"
"time"
chaos_monkey "github.com/erigontech/erigon/tests/chaos-monkey"
- "github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/log/v3"
state2 "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon/cmd/state/exec3"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb/rawtemporaldb"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
- "github.com/erigontech/erigon/turbo/shards"
)
type serialExecutor struct {
- cfg ExecuteBlockCfg
- execStage *StageState
- agg *state2.Aggregator
- rs *state.StateV3
- doms *state2.SharedDomains
- accumulator *shards.Accumulator
- u Unwinder
- isMining bool
- inMemExec bool
+ txExecutor
skipPostEvaluation bool
- applyTx kv.RwTx
- worker *exec3.Worker
- outputTxNum *atomic.Uint64
- logger log.Logger
-
// outputs
txCount uint64
usedGas uint64
@@ -58,7 +40,7 @@ func (se *serialExecutor) execute(ctx context.Context, tasks []*state.TxTask) (c
return false, nil
}
- se.worker.RunTxTaskNoLock(txTask, se.isMining)
+ se.applyWorker.RunTxTaskNoLock(txTask, se.isMining)
if err := func() error {
if errors.Is(txTask.Error, context.Canceled) {
return txTask.Error
@@ -91,6 +73,8 @@ func (se *serialExecutor) execute(ctx context.Context, tasks []*state.TxTask) (c
return fmt.Errorf("%w, txnIdx=%d, %v", consensus.ErrInvalidBlock, txTask.TxIndex, err) //same as in stage_exec.go
}
}
+
+ se.outputBlockNum.SetUint64(txTask.BlockNum)
}
if se.cfg.syncCfg.ChaosMonkey {
chaosErr := chaos_monkey.ThrowRandomConsensusError(se.execStage.CurrentSyncCycle.IsInitialCycle, txTask.TxIndex, se.cfg.badBlockHalt, txTask.Error)
@@ -149,27 +133,6 @@ func (se *serialExecutor) execute(ctx context.Context, tasks []*state.TxTask) (c
return true, nil
}
-func (se *serialExecutor) tx() kv.RwTx {
- return se.applyTx
-}
-
-func (se *serialExecutor) readState() *state.StateV3 {
- return se.rs
-}
-
-func (se *serialExecutor) domains() *state2.SharedDomains {
- return se.doms
-}
-
-func (se *serialExecutor) getHeader(ctx context.Context, hash common.Hash, number uint64) (h *types.Header) {
- var err error
- h, err = se.cfg.blockReader.Header(ctx, se.applyTx, hash, number)
- if err != nil {
- panic(err)
- }
- return h
-}
-
func (se *serialExecutor) commit(ctx context.Context, txNum uint64, blockNum uint64, useExternalTx bool) (t2 time.Duration, err error) {
se.doms.Close()
if err = se.execStage.Update(se.applyTx, blockNum); err != nil {
@@ -199,8 +162,8 @@ func (se *serialExecutor) commit(ctx context.Context, txNum uint64, blockNum uin
se.doms.SetTxNum(txNum)
se.rs = state.NewStateV3(se.doms, se.logger)
- se.worker.ResetTx(se.applyTx)
- se.worker.ResetState(se.rs, se.accumulator)
+ se.applyWorker.ResetTx(se.applyTx)
+ se.applyWorker.ResetState(se.rs, se.accumulator)
return t2, nil
}
diff --git a/eth/stagedsync/stage_bodies.go b/eth/stagedsync/stage_bodies.go
index 4b9364252c4..9e403ccf7ce 100644
--- a/eth/stagedsync/stage_bodies.go
+++ b/eth/stagedsync/stage_bodies.go
@@ -98,7 +98,7 @@ func BodiesForward(s *StageState, u Unwinder, ctx context.Context, tx kv.RwTx, c
}
}
// This will update bd.maxProgress
- if _, _, _, _, err = cfg.bd.UpdateFromDb(tx); err != nil {
+ if err = cfg.bd.UpdateFromDb(tx); err != nil {
return err
}
defer cfg.bd.ClearBodyCache()
diff --git a/eth/stagedsync/stage_commit_rebuild.go b/eth/stagedsync/stage_commit_rebuild.go
index 2bb0d6696af..82ce0303181 100644
--- a/eth/stagedsync/stage_commit_rebuild.go
+++ b/eth/stagedsync/stage_commit_rebuild.go
@@ -19,7 +19,6 @@ package stagedsync
import (
"context"
"errors"
-
"github.com/erigontech/erigon/turbo/snapshotsync/freezeblocks"
"github.com/erigontech/erigon/turbo/stages/headerdownload"
@@ -29,7 +28,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/trie"
+ "github.com/erigontech/erigon/turbo/trie"
)
type TrieCfg struct {
diff --git a/eth/stagedsync/stage_mining_exec.go b/eth/stagedsync/stage_mining_exec.go
index db03cb9fe53..f9a07141143 100644
--- a/eth/stagedsync/stage_mining_exec.go
+++ b/eth/stagedsync/stage_mining_exec.go
@@ -33,13 +33,13 @@ import (
"github.com/erigontech/erigon-lib/kv/membatchwithdb"
"github.com/erigontech/erigon-lib/log/v3"
state2 "github.com/erigontech/erigon-lib/state"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon-lib/wrap"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm"
"github.com/erigontech/erigon/eth/stagedsync/stages"
"github.com/erigontech/erigon/params"
diff --git a/eth/stagedsync/stage_polygon_sync.go b/eth/stagedsync/stage_polygon_sync.go
index 290e4346bd3..ea5a0dd9d4e 100644
--- a/eth/stagedsync/stage_polygon_sync.go
+++ b/eth/stagedsync/stage_polygon_sync.go
@@ -25,6 +25,8 @@ import (
"golang.org/x/sync/errgroup"
+ lru "github.com/hashicorp/golang-lru/arc/v2"
+
"github.com/erigontech/erigon-lib/chain"
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/generics"
@@ -44,6 +46,7 @@ import (
"github.com/erigontech/erigon/polygon/bridge"
"github.com/erigontech/erigon/polygon/heimdall"
"github.com/erigontech/erigon/polygon/p2p"
+ "github.com/erigontech/erigon/polygon/sync"
polygonsync "github.com/erigontech/erigon/polygon/sync"
"github.com/erigontech/erigon/turbo/services"
"github.com/erigontech/erigon/turbo/shards"
@@ -115,6 +118,12 @@ func NewPolygonSyncStageCfg(
checkpointVerifier := polygonsync.VerifyCheckpointHeaders
milestoneVerifier := polygonsync.VerifyMilestoneHeaders
blocksVerifier := polygonsync.VerifyBlocks
+
+ signaturesCache, err := lru.NewARC[common.Hash, common.Address](sync.InMemorySignatures)
+ if err != nil {
+ panic(err)
+ }
+
syncStore := polygonsync.NewStore(logger, executionEngine, bridgeService)
blockDownloader := polygonsync.NewBlockDownloader(
logger,
@@ -135,11 +144,12 @@ func NewPolygonSyncStageCfg(
blocksVerifier,
p2pService,
blockDownloader,
- polygonsync.NewCanonicalChainBuilderFactory(chainConfig, borConfig, heimdallService),
+ polygonsync.NewCanonicalChainBuilderFactory(chainConfig, borConfig, heimdallService, signaturesCache),
heimdallService,
bridgeService,
events.Events(),
notifications,
+ sync.NewWiggleCalculator(borConfig, signaturesCache, heimdallService),
)
syncService := &polygonSyncStageService{
logger: logger,
diff --git a/eth/stagedsync/testutil.go b/eth/stagedsync/testutil.go
index 802a9a8aec1..5bb4a71ef13 100644
--- a/eth/stagedsync/testutil.go
+++ b/eth/stagedsync/testutil.go
@@ -24,8 +24,8 @@ import (
"github.com/holiman/uint256"
libcommon "github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/state"
+ "github.com/erigontech/erigon/core/types/accounts"
)
const (
diff --git a/eth/tracers/js/goja.go b/eth/tracers/js/goja.go
index e8f84ce44bf..ba223d598f9 100644
--- a/eth/tracers/js/goja.go
+++ b/eth/tracers/js/goja.go
@@ -676,8 +676,12 @@ func (do *dbObj) GetBalance(addrSlice goja.Value) goja.Value {
return nil
}
addr := libcommon.BytesToAddress(a)
- value := do.ibs.GetBalance(addr).ToBig()
- res, err := do.toBig(do.vm, value.String())
+ value, err := do.ibs.GetBalance(addr)
+ if err != nil {
+ do.vm.Interrupt(err)
+ return nil
+ }
+ res, err := do.toBig(do.vm, value.ToBig().String())
if err != nil {
do.vm.Interrupt(err)
return nil
@@ -692,7 +696,12 @@ func (do *dbObj) GetNonce(addrSlice goja.Value) uint64 {
return 0
}
addr := libcommon.BytesToAddress(a)
- return do.ibs.GetNonce(addr)
+ nonce, err := do.ibs.GetNonce(addr)
+ if err != nil {
+ do.vm.Interrupt(err)
+ return 0
+ }
+ return nonce
}
func (do *dbObj) GetCode(addrSlice goja.Value) goja.Value {
@@ -702,7 +711,11 @@ func (do *dbObj) GetCode(addrSlice goja.Value) goja.Value {
return nil
}
addr := libcommon.BytesToAddress(a)
- code := do.ibs.GetCode(addr)
+ code, err := do.ibs.GetCode(addr)
+ if err != nil {
+ do.vm.Interrupt(err)
+ return nil
+ }
res, err := do.toBuf(do.vm, code)
if err != nil {
do.vm.Interrupt(err)
@@ -741,7 +754,12 @@ func (do *dbObj) Exists(addrSlice goja.Value) bool {
return false
}
addr := libcommon.BytesToAddress(a)
- return do.ibs.Exist(addr)
+ exists, err := do.ibs.Exist(addr)
+ if err != nil {
+ do.vm.Interrupt(err)
+ return false
+ }
+ return exists
}
func (do *dbObj) setupObject() *goja.Object {
diff --git a/eth/tracers/js/tracer_test.go b/eth/tracers/js/tracer_test.go
index 96624bca385..8e43dd6a44a 100644
--- a/eth/tracers/js/tracer_test.go
+++ b/eth/tracers/js/tracer_test.go
@@ -56,8 +56,10 @@ type dummyStatedb struct {
state.IntraBlockState
}
-func (*dummyStatedb) GetRefund() uint64 { return 1337 }
-func (*dummyStatedb) GetBalance(addr libcommon.Address) *uint256.Int { return &uint256.Int{} }
+func (*dummyStatedb) GetRefund() uint64 { return 1337 }
+func (*dummyStatedb) GetBalance(addr libcommon.Address) (*uint256.Int, error) {
+ return &uint256.Int{}, nil
+}
type vmContext struct {
blockCtx evmtypes.BlockContext
diff --git a/eth/tracers/logger/access_list_tracer.go b/eth/tracers/logger/access_list_tracer.go
index 882bb51955b..9dbfe7d8ebc 100644
--- a/eth/tracers/logger/access_list_tracer.go
+++ b/eth/tracers/logger/access_list_tracer.go
@@ -222,7 +222,7 @@ func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint6
if op == vm.CREATE {
// contract address for CREATE can only be generated with state
if a.state != nil {
- nonce := a.state.GetNonce(caller)
+ nonce, _ := a.state.GetNonce(caller)
addr := crypto.CreateAddress(caller, nonce)
if _, ok := a.excl[addr]; !ok {
a.createdContracts[addr] = struct{}{}
@@ -240,7 +240,6 @@ func (a *AccessListTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint6
a.createdContracts[addr] = struct{}{}
}
}
-
}
func (*AccessListTracer) CaptureFault(pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
diff --git a/eth/tracers/native/prestate.go b/eth/tracers/native/prestate.go
index e32084d263f..0a896748906 100644
--- a/eth/tracers/native/prestate.go
+++ b/eth/tracers/native/prestate.go
@@ -171,7 +171,7 @@ func (t *prestateTracer) CaptureState(pc uint64, op vm.OpCode, gas, cost uint64,
addr := libcommon.Address(stackData[stackLen-2].Bytes20())
t.lookupAccount(addr)
case op == vm.CREATE:
- nonce := t.env.IntraBlockState().GetNonce(caller)
+ nonce, _ := t.env.IntraBlockState().GetNonce(caller)
addr := crypto.CreateAddress(caller, nonce)
t.lookupAccount(addr)
t.created[addr] = true
@@ -203,12 +203,12 @@ func (t *prestateTracer) CaptureTxEnd(restGas uint64) {
}
modified := false
postAccount := &account{Storage: make(map[libcommon.Hash]libcommon.Hash)}
- newBalance := t.env.IntraBlockState().GetBalance(addr).ToBig()
- newNonce := t.env.IntraBlockState().GetNonce(addr)
+ newBalance, _ := t.env.IntraBlockState().GetBalance(addr)
+ newNonce, _ := t.env.IntraBlockState().GetNonce(addr)
- if newBalance.Cmp(t.pre[addr].Balance) != 0 {
+ if newBalance.ToBig().Cmp(t.pre[addr].Balance) != 0 {
modified = true
- postAccount.Balance = newBalance
+ postAccount.Balance = newBalance.ToBig()
}
if newNonce != t.pre[addr].Nonce {
modified = true
@@ -216,7 +216,7 @@ func (t *prestateTracer) CaptureTxEnd(restGas uint64) {
}
if !t.config.DisableCode {
- newCode := t.env.IntraBlockState().GetCode(addr)
+ newCode, _ := t.env.IntraBlockState().GetCode(addr)
if !bytes.Equal(newCode, t.pre[addr].Code) {
modified = true
postAccount.Code = newCode
@@ -292,13 +292,17 @@ func (t *prestateTracer) lookupAccount(addr libcommon.Address) {
return
}
+ balance, _ := t.env.IntraBlockState().GetBalance(addr)
+ nonce, _ := t.env.IntraBlockState().GetNonce(addr)
+ code, _ := t.env.IntraBlockState().GetCode(addr)
+
t.pre[addr] = &account{
- Balance: t.env.IntraBlockState().GetBalance(addr).ToBig(),
- Nonce: t.env.IntraBlockState().GetNonce(addr),
+ Balance: balance.ToBig(),
+ Nonce: nonce,
}
if !t.config.DisableCode {
- t.pre[addr].Code = t.env.IntraBlockState().GetCode(addr)
+ t.pre[addr].Code = code
}
if !t.config.DisableStorage {
t.pre[addr].Storage = make(map[libcommon.Hash]libcommon.Hash)
diff --git a/go.mod b/go.mod
index 2c7323d2d1f..dbbf326467b 100644
--- a/go.mod
+++ b/go.mod
@@ -23,6 +23,7 @@ require (
github.com/c2h5oh/datasize v0.0.0-20231215233829-aa82cc1e6500
github.com/cenkalti/backoff/v4 v4.2.1
github.com/consensys/gnark-crypto v0.12.1
+ github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc
github.com/crate-crypto/go-kzg-4844 v0.7.0
github.com/davecgh/go-spew v1.1.1
github.com/deckarep/golang-set v1.8.0
@@ -106,7 +107,6 @@ require (
require (
github.com/alecthomas/atomic v0.1.0-alpha2 // indirect
github.com/benesch/cgosymbolizer v0.0.0-20190515212042-bec6fe6e597b // indirect
- github.com/crate-crypto/go-ipa v0.0.0-20221111143132-9aa5d42120bc // indirect
github.com/elastic/go-freelru v0.13.0 // indirect
github.com/erigontech/speedtest v0.0.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
diff --git a/p2p/sentry/sentry_multi_client/sentry_multi_client.go b/p2p/sentry/sentry_multi_client/sentry_multi_client.go
index 4136cf01757..8ac05870cce 100644
--- a/p2p/sentry/sentry_multi_client/sentry_multi_client.go
+++ b/p2p/sentry/sentry_multi_client/sentry_multi_client.go
@@ -202,8 +202,7 @@ func NewMultiClient(
if !disableBlockDownload {
bd = bodydownload.NewBodyDownload(engine, blockBufferSize, int(syncCfg.BodyCacheLimit), blockReader, logger)
if err := db.View(context.Background(), func(tx kv.Tx) error {
- _, _, _, _, err := bd.UpdateFromDb(tx)
- return err
+ return bd.UpdateFromDb(tx)
}); err != nil {
return nil, err
}
@@ -226,7 +225,7 @@ func NewMultiClient(
disableBlockDownload: disableBlockDownload,
logger: logger,
getReceiptsActiveGoroutineNumber: semaphore.NewWeighted(1),
- ethApiWrapper: receipts.NewGenerator(32, blockReader, engine),
+ ethApiWrapper: receipts.NewGenerator(blockReader, engine),
}
return cs, nil
diff --git a/polygon/bor/bor.go b/polygon/bor/bor.go
index 36337ac941c..3b5c8c9401e 100644
--- a/polygon/bor/bor.go
+++ b/polygon/bor/bor.go
@@ -47,13 +47,13 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/consensus/misc"
"github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/tracing"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm/evmtypes"
"github.com/erigontech/erigon/eth/ethconfig/estimate"
"github.com/erigontech/erigon/params"
@@ -1673,22 +1673,42 @@ func (c *Bor) getNextHeimdallSpanForTest(
}
// BorTransfer transfer in Bor
-func BorTransfer(db evmtypes.IntraBlockState, sender, recipient libcommon.Address, amount *uint256.Int, bailout bool) {
+func BorTransfer(db evmtypes.IntraBlockState, sender, recipient libcommon.Address, amount *uint256.Int, bailout bool) error {
// get inputs before
- input1 := db.GetBalance(sender).Clone()
- input2 := db.GetBalance(recipient).Clone()
-
+ input1, err := db.GetBalance(sender)
+ if err != nil {
+ return err
+ }
+ input1 = input1.Clone()
+ input2, err := db.GetBalance(recipient)
+ if err != nil {
+ return err
+ }
+ input2 = input2.Clone()
if !bailout {
- db.SubBalance(sender, amount, tracing.BalanceChangeTransfer)
+ err := db.SubBalance(sender, amount, tracing.BalanceChangeTransfer)
+ if err != nil {
+ return err
+ }
+ }
+ err = db.AddBalance(recipient, amount, tracing.BalanceChangeTransfer)
+ if err != nil {
+ return err
}
- db.AddBalance(recipient, amount, tracing.BalanceChangeTransfer)
-
// get outputs after
- output1 := db.GetBalance(sender).Clone()
- output2 := db.GetBalance(recipient).Clone()
-
+ output1, err := db.GetBalance(sender)
+ if err != nil {
+ return err
+ }
+ output1 = output1.Clone()
+ output2, err := db.GetBalance(recipient)
+ if err != nil {
+ return err
+ }
+ output2 = output2.Clone()
// add transfer log into state
addTransferLog(db, transferLogSig, sender, recipient, amount, input1, input2, output1, output2)
+ return nil
}
func (c *Bor) GetTransferFunc() evmtypes.TransferFunc {
diff --git a/polygon/sync/canonical_chain_builder_factory.go b/polygon/sync/canonical_chain_builder_factory.go
index 72314d57161..0a25621ee4a 100644
--- a/polygon/sync/canonical_chain_builder_factory.go
+++ b/polygon/sync/canonical_chain_builder_factory.go
@@ -33,12 +33,8 @@ func NewCanonicalChainBuilderFactory(
chainConfig *chain.Config,
borConfig *borcfg.BorConfig,
blockProducersReader blockProducersReader,
+ signaturesCache *lru.ARCCache[common.Hash, common.Address],
) CanonicalChainBuilderFactory {
- signaturesCache, err := lru.NewARC[common.Hash, common.Address](InMemorySignatures)
- if err != nil {
- panic(err)
- }
-
difficultyCalculator := &DifficultyCalculator{
borConfig: borConfig,
signaturesCache: signaturesCache,
diff --git a/polygon/sync/metrics.go b/polygon/sync/metrics.go
new file mode 100644
index 00000000000..a2815bef920
--- /dev/null
+++ b/polygon/sync/metrics.go
@@ -0,0 +1,31 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package sync
+
+import (
+ "time"
+
+ "github.com/erigontech/erigon-lib/metrics"
+)
+
+var (
+ wiggleDuration = metrics.NewSummary(`wiggle_duration`)
+)
+
+func UpdateWiggleDuration(duration time.Duration) {
+ wiggleDuration.ObserveDuration(time.Now().Add(-duration))
+}
diff --git a/polygon/sync/service.go b/polygon/sync/service.go
index a1eef4132c2..06406b7c111 100644
--- a/polygon/sync/service.go
+++ b/polygon/sync/service.go
@@ -22,7 +22,10 @@ import (
"golang.org/x/sync/errgroup"
+ lru "github.com/hashicorp/golang-lru/arc/v2"
+
"github.com/erigontech/erigon-lib/chain"
+ "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/gointerfaces/executionproto"
"github.com/erigontech/erigon-lib/gointerfaces/sentryproto"
"github.com/erigontech/erigon-lib/log/v3"
@@ -52,6 +55,12 @@ func NewService(
blocksVerifier := VerifyBlocks
p2pService := p2p.NewService(logger, maxPeers, sentryClient, statusDataProvider.GetStatusData)
execution := newExecutionClient(executionClient)
+
+ signaturesCache, err := lru.NewARC[common.Hash, common.Address](InMemorySignatures)
+ if err != nil {
+ panic(err)
+ }
+
store := NewStore(logger, execution, bridgeService)
blockDownloader := NewBlockDownloader(
logger,
@@ -63,7 +72,7 @@ func NewService(
store,
blockLimit,
)
- ccBuilderFactory := NewCanonicalChainBuilderFactory(chainConfig, borConfig, heimdallService)
+ ccBuilderFactory := NewCanonicalChainBuilderFactory(chainConfig, borConfig, heimdallService, signaturesCache)
events := NewTipEvents(logger, p2pService, heimdallService)
sync := NewSync(
logger,
@@ -78,6 +87,7 @@ func NewService(
bridgeService,
events.Events(),
notifications,
+ NewWiggleCalculator(borConfig, signaturesCache, heimdallService),
)
return &Service{
logger: logger,
diff --git a/polygon/sync/sync.go b/polygon/sync/sync.go
index 10ad46d2798..c2f702bafcd 100644
--- a/polygon/sync/sync.go
+++ b/polygon/sync/sync.go
@@ -46,6 +46,10 @@ type bridgeSynchronizer interface {
Ready(ctx context.Context) <-chan error
}
+type wiggleCalculator interface {
+ CalculateWiggle(ctx context.Context, header *types.Header) (time.Duration, error)
+}
+
func NewSync(
logger log.Logger,
store Store,
@@ -59,6 +63,7 @@ func NewSync(
bridgeSync bridgeSynchronizer,
events <-chan Event,
notifications *shards.Notifications,
+ wiggleCalculator wiggleCalculator,
) *Sync {
badBlocksLru, err := simplelru.NewLRU[common.Hash, struct{}](1024, nil)
if err != nil {
@@ -79,6 +84,7 @@ func NewSync(
events: events,
badBlocks: badBlocksLru,
notifications: notifications,
+ wiggleCalculator: wiggleCalculator,
}
}
@@ -96,6 +102,7 @@ type Sync struct {
events <-chan Event
badBlocks *simplelru.LRU[common.Hash, struct{}]
notifications *shards.Notifications
+ wiggleCalculator wiggleCalculator
}
func (s *Sync) commitExecution(ctx context.Context, newTip *types.Header, finalizedHeader *types.Header) error {
@@ -306,6 +313,26 @@ func (s *Sync) applyNewBlockOnTip(ctx context.Context, event EventNewBlock, ccb
return nil
}
+ go func() {
+ for i := range newConnectedHeaders {
+ select {
+ case <-ctx.Done():
+ return
+ default:
+ wiggle, err := s.wiggleCalculator.CalculateWiggle(ctx, newConnectedHeaders[i])
+ if err != nil {
+ s.logger.Error(
+ syncLogPrefix("failed update wiggle metrics"),
+ "err", err,
+ )
+ continue
+ }
+
+ UpdateWiggleDuration(wiggle)
+ }
+ }
+ }()
+
newTip := ccb.Tip()
firstNewConnectedHeader := newConnectedHeaders[0]
if newTip != oldTip && oldTip.Hash() != firstNewConnectedHeader.ParentHash {
diff --git a/polygon/sync/wiggle.go b/polygon/sync/wiggle.go
new file mode 100644
index 00000000000..db148cd2caf
--- /dev/null
+++ b/polygon/sync/wiggle.go
@@ -0,0 +1,62 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package sync
+
+import (
+ "context"
+ "time"
+
+ libcommon "github.com/erigontech/erigon-lib/common"
+ "github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/polygon/bor"
+ "github.com/erigontech/erigon/polygon/bor/borcfg"
+ lru "github.com/hashicorp/golang-lru/arc/v2"
+)
+
+type wiggleCalc struct {
+ borConfig *borcfg.BorConfig
+ signaturesCache *lru.ARCCache[libcommon.Hash, libcommon.Address]
+ blockProducersReader blockProducersReader
+}
+
+func NewWiggleCalculator(borConfig *borcfg.BorConfig, signaturesCache *lru.ARCCache[libcommon.Hash, libcommon.Address], blockProducersReader blockProducersReader) *wiggleCalc {
+ return &wiggleCalc{
+ borConfig: borConfig,
+ signaturesCache: signaturesCache,
+ blockProducersReader: blockProducersReader,
+ }
+}
+
+func (calc *wiggleCalc) CalculateWiggle(ctx context.Context, header *types.Header) (time.Duration, error) {
+ signer, err := bor.Ecrecover(header, calc.signaturesCache, calc.borConfig)
+ if err != nil {
+ return 0, err
+ }
+
+ producers, err := calc.blockProducersReader.Producers(ctx, header.Number.Uint64())
+ if err != nil {
+ return 0, err
+ }
+
+ succession, err := producers.GetSignerSuccessionNumber(signer, header.Number.Uint64())
+ if err != nil {
+ return 0, err
+ }
+
+ wiggle := time.Duration(succession) * time.Duration(calc.borConfig.CalculateBackupMultiplier(header.Number.Uint64())) * time.Second
+ return wiggle, nil
+}
diff --git a/rpc/client_test.go b/rpc/client_test.go
index 22e9bf3fd6d..6af327275d0 100644
--- a/rpc/client_test.go
+++ b/rpc/client_test.go
@@ -223,13 +223,13 @@ func testClientCancel(transport string, t *testing.T, logger log.Logger) {
if index < ncallers/2 {
// For half of the callers, create a context without deadline
// and cancel it later.
- ctx, cancel = context.WithCancel(context.Background()) //nolint:fatcontext
+ ctx, cancel = context.WithCancel(context.Background())
time.AfterFunc(timeout, cancel)
} else {
// For the other half, create a context with a deadline instead. This is
// different because the context deadline is used to set the socket write
// deadline.
- ctx, cancel = context.WithTimeout(context.Background(), timeout) //nolint:fatcontext
+ ctx, cancel = context.WithTimeout(context.Background(), timeout)
}
// Now perform a call with the context.
diff --git a/tests/block_test_util.go b/tests/block_test_util.go
index 079da8e4280..c7241381b04 100644
--- a/tests/block_test_util.go
+++ b/tests/block_test_util.go
@@ -320,9 +320,18 @@ func (bt *BlockTest) validatePostState(statedb *state.IntraBlockState) error {
// validate post state accounts in test file against what we have in state db
for addr, acct := range bt.json.Post {
// address is indirectly verified by the other fields, as it's the db key
- code2 := statedb.GetCode(addr)
- balance2 := statedb.GetBalance(addr)
- nonce2 := statedb.GetNonce(addr)
+ code2, err := statedb.GetCode(addr)
+ if err != nil {
+ return err
+ }
+ balance2, err := statedb.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ nonce2, err := statedb.GetNonce(addr)
+ if err != nil {
+ return err
+ }
if nonce2 != acct.Nonce {
return fmt.Errorf("account nonce mismatch for addr: %x want: %d have: %d", addr, acct.Nonce, nonce2)
}
diff --git a/tests/statedb_chain_test.go b/tests/statedb_chain_test.go
index 7449ea92215..525b3c0f12c 100644
--- a/tests/statedb_chain_test.go
+++ b/tests/statedb_chain_test.go
@@ -105,10 +105,18 @@ func TestSelfDestructReceive(t *testing.T) {
if err := m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ exist, err := st.Exist(address)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist before block 0", contractAddress.String())
}
return nil
@@ -131,13 +139,25 @@ func TestSelfDestructReceive(t *testing.T) {
// and that means that the state of the accounts written in the first block was correct.
// This test checks that the storage root of the account is properly set to the root of the empty tree
st := state.New(m.NewStateReader(tx))
- if !st.Exist(address) {
+ exist, err := st.Exist(address)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if !st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected contractAddress to exist at the block 2", contractAddress.String())
}
- if len(st.GetCode(contractAddress)) != 0 {
+ code, err := st.GetCode(contractAddress)
+ if err != nil {
+ t.Error(err)
+ }
+ if len(code) != 0 {
t.Error("expected empty code in contract at block 2", contractAddress.String())
}
return nil
diff --git a/tests/statedb_insert_chain_transaction_test.go b/tests/statedb_insert_chain_transaction_test.go
index e9f28a610d2..a2d3eddd264 100644
--- a/tests/statedb_insert_chain_transaction_test.go
+++ b/tests/statedb_insert_chain_transaction_test.go
@@ -93,17 +93,33 @@ func TestInsertIncorrectStateRootDifferentAccounts(t *testing.T) {
defer tx.Rollback()
st := state.New(m.NewStateReader(tx))
- if !st.Exist(to) {
+ exist, err := st.Exist(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if balance := st.GetBalance(from); balance.Uint64() != 1000000000 {
+ balance, err := st.GetBalance(from)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 1000000000 {
t.Fatalf("got %v, expected %v", balance, 1000000000)
}
- if balance := st.GetBalance(data.addresses[1]); balance.Uint64() != 999995000 {
+ balance, err = st.GetBalance(data.addresses[1])
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 999995000 {
t.Fatalf("got %v, expected %v", balance, 999995000)
}
- if balance := st.GetBalance(to); balance.Uint64() != 5000 {
+ balance, err = st.GetBalance(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 5000 {
t.Fatalf("got %v, expected %v", balance, 5000)
}
}
@@ -161,14 +177,26 @@ func TestInsertIncorrectStateRootSameAccount(t *testing.T) {
defer tx.Rollback()
st := state.New(m.NewStateReader(tx))
- if !st.Exist(to) {
+ exist, err := st.Exist(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if balance := st.GetBalance(from); balance.Uint64() != 999995000 {
+ balance, err := st.GetBalance(from)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 999995000 {
t.Fatalf("got %v, expected %v", balance, 999995000)
}
- if balance := st.GetBalance(to); balance.Uint64() != 5000 {
+ balance, err = st.GetBalance(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 5000 {
t.Fatalf("got %v, expected %v", balance, 5000)
}
}
@@ -223,14 +251,26 @@ func TestInsertIncorrectStateRootSameAccountSameAmount(t *testing.T) {
defer tx.Rollback()
st := state.New(m.NewStateReader(tx))
- if !st.Exist(to) {
+ exist, err := st.Exist(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if balance := st.GetBalance(from); balance.Uint64() != 999999000 {
+ balance, err := st.GetBalance(from)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 999999000 {
t.Fatalf("got %v, expected %v", balance, 999999000)
}
- if balance := st.GetBalance(to); balance.Uint64() != 1000 {
+ balance, err = st.GetBalance(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 1000 {
t.Fatalf("got %v, expected %v", balance, 1000)
}
}
@@ -285,14 +325,26 @@ func TestInsertIncorrectStateRootAllFundsRoot(t *testing.T) {
defer tx.Rollback()
st := state.New(m.NewStateReader(tx))
- if !st.Exist(to) {
+ exist, err := st.Exist(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if balance := st.GetBalance(from); balance.Uint64() != 2000 {
+ balance, err := st.GetBalance(from)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 2000 {
t.Fatalf("got %v, expected %v", balance, 2000)
}
- if balance := st.GetBalance(to); balance.Uint64() != 1000 {
+ balance, err = st.GetBalance(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 1000 {
t.Fatalf("got %v, expected %v", balance, 1000)
}
}
@@ -347,14 +399,26 @@ func TestInsertIncorrectStateRootAllFunds(t *testing.T) {
defer tx.Rollback()
st := state.New(m.NewStateReader(tx))
- if !st.Exist(to) {
+ exist, err := st.Exist(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if balance := st.GetBalance(from); balance.Uint64() != 2000 {
+ balance, err := st.GetBalance(from)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 2000 {
t.Fatalf("got %v, expected %v", balance, 2000)
}
- if balance := st.GetBalance(to); balance.Uint64() != 1000 {
+ balance, err = st.GetBalance(to)
+ if err != nil {
+ t.Error(err)
+ }
+ if balance.Uint64() != 1000 {
t.Fatalf("got %v, expected %v", balance, 1000)
}
}
@@ -388,11 +452,18 @@ func TestAccountDeployIncorrectRoot(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
-
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist at the block 0", contractAddress.Hash().String())
}
return nil
@@ -411,11 +482,19 @@ func TestAccountDeployIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist at the block 1", contractAddress.Hash().String())
}
return nil
@@ -429,11 +508,19 @@ func TestAccountDeployIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if !st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected contractAddress to not exist at the block 1", contractAddress.Hash().String())
}
return nil
@@ -475,11 +562,19 @@ func TestAccountCreateIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist at the block 0", contractAddress.Hash().String())
}
@@ -493,11 +588,19 @@ func TestAccountCreateIncorrectRoot(t *testing.T) {
}
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if !st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected contractAddress to exist at the block 2", contractAddress.Hash().String())
}
@@ -559,11 +662,19 @@ func TestAccountUpdateIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist at the block 0", contractAddress.Hash().String())
}
@@ -578,11 +689,19 @@ func TestAccountUpdateIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if !st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected contractAddress to exist at the block 2", contractAddress.Hash().String())
}
return nil
@@ -648,11 +767,19 @@ func TestAccountDeleteIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("expected contractAddress to not exist at the block 0", contractAddress.Hash().String())
}
return nil
@@ -666,11 +793,19 @@ func TestAccountDeleteIncorrectRoot(t *testing.T) {
err = m.DB.View(context.Background(), func(tx kv.Tx) error {
st := state.New(m.NewStateReader(tx))
- if !st.Exist(from) {
+ exist, err := st.Exist(from)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected account to exist")
}
- if !st.Exist(contractAddress) {
+ exist, err = st.Exist(contractAddress)
+ if err != nil {
+ return err
+ }
+ if !exist {
t.Error("expected contractAddress to exist at the block 1", contractAddress.Hash().String())
}
return nil
diff --git a/turbo/adapter/ethapi/get_proof.go b/turbo/adapter/ethapi/get_proof.go
index 855e6ea3f27..3bc2f606fe9 100644
--- a/turbo/adapter/ethapi/get_proof.go
+++ b/turbo/adapter/ethapi/get_proof.go
@@ -24,8 +24,8 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/length"
- "github.com/erigontech/erigon-lib/trie"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/trie"
)
// Result structs for GetProof
diff --git a/turbo/app/snapshots_cmd.go b/turbo/app/snapshots_cmd.go
index 2244ccc68a0..5495457c31c 100644
--- a/turbo/app/snapshots_cmd.go
+++ b/turbo/app/snapshots_cmd.go
@@ -1473,7 +1473,7 @@ func dbCfg(label kv.Label, path string) mdbx.MdbxOpts {
Accede(true) // integration tool: open db without creation and without blocking erigon
}
func openAgg(ctx context.Context, dirs datadir.Dirs, chainDB kv.RwDB, logger log.Logger) *libstate.Aggregator {
- agg, err := libstate.NewAggregator(ctx, dirs, config3.HistoryV3AggregationStep, chainDB, logger)
+ agg, err := libstate.NewAggregator(ctx, dirs, config3.DefaultStepSize, chainDB, logger)
if err != nil {
panic(err)
}
diff --git a/turbo/app/squeeze_cmd.go b/turbo/app/squeeze_cmd.go
index f5445471f9f..da096ff2c02 100644
--- a/turbo/app/squeeze_cmd.go
+++ b/turbo/app/squeeze_cmd.go
@@ -137,7 +137,7 @@ func squeezeStorage(ctx context.Context, dirs datadir.Dirs, logger log.Logger) e
ac := agg.BeginFilesRo()
defer ac.Close()
- aggOld, err := state.NewAggregator(ctx, dirsOld, config3.HistoryV3AggregationStep, db, logger)
+ aggOld, err := state.NewAggregator(ctx, dirsOld, config3.DefaultStepSize, db, logger)
if err != nil {
panic(err)
}
@@ -178,7 +178,7 @@ func squeezeStorage(ctx context.Context, dirs datadir.Dirs, logger log.Logger) e
func squeezeCode(ctx context.Context, dirs datadir.Dirs, logger log.Logger) error {
db := dbCfg(kv.ChainDB, dirs.Chaindata).MustOpen()
defer db.Close()
- agg, err := state.NewAggregator(ctx, dirs, config3.HistoryV3AggregationStep, db, logger)
+ agg, err := state.NewAggregator(ctx, dirs, config3.DefaultStepSize, db, logger)
if err != nil {
return err
}
diff --git a/turbo/engineapi/engine_block_downloader/block_downloader.go b/turbo/engineapi/engine_block_downloader/block_downloader.go
index 43f2f239e76..a516896d265 100644
--- a/turbo/engineapi/engine_block_downloader/block_downloader.go
+++ b/turbo/engineapi/engine_block_downloader/block_downloader.go
@@ -17,7 +17,6 @@
package engine_block_downloader
import (
- "bytes"
"context"
"encoding/binary"
"fmt"
@@ -35,7 +34,6 @@ import (
"github.com/erigontech/erigon-lib/etl"
execution "github.com/erigontech/erigon-lib/gointerfaces/executionproto"
"github.com/erigontech/erigon-lib/kv"
- "github.com/erigontech/erigon-lib/kv/dbutils"
"github.com/erigontech/erigon-lib/rlp"
"github.com/erigontech/erigon/core/rawdb"
@@ -164,10 +162,11 @@ func (e *EngineBlockDownloader) waitForEndOfHeadersDownload(ctx context.Context)
}
// waitForEndOfHeadersDownload waits until the download of headers ends and returns the outcome.
-func (e *EngineBlockDownloader) loadDownloadedHeaders(tx kv.RwTx) (fromBlock uint64, toBlock uint64, fromHash libcommon.Hash, err error) {
+func (e *EngineBlockDownloader) loadDownloadedHeaders(tx kv.RwTx) (fromBlock uint64, toBlock uint64, err error) {
var lastValidHash libcommon.Hash
var badChainError error // TODO(yperbasis): this is not set anywhere
var foundPow bool
+ var found bool
headerLoadFunc := func(key, value []byte, _ etl.CurrentTableReader, _ etl.LoadNextFunc) error {
var h types.Header
@@ -185,8 +184,8 @@ func (e *EngineBlockDownloader) loadDownloadedHeaders(tx kv.RwTx) (fromBlock uin
lastValidHash = h.ParentHash
// If we are in PoW range then block validation is not required anymore.
if foundPow {
- if (fromHash == libcommon.Hash{}) {
- fromHash = h.Hash()
+ if !found {
+ found = true
fromBlock = h.Number.Uint64()
}
toBlock = h.Number.Uint64()
@@ -195,15 +194,15 @@ func (e *EngineBlockDownloader) loadDownloadedHeaders(tx kv.RwTx) (fromBlock uin
foundPow = h.Difficulty.Sign() != 0
if foundPow {
- if (fromHash == libcommon.Hash{}) {
- fromHash = h.Hash()
+ if !found {
+ found = true
fromBlock = h.Number.Uint64()
}
toBlock = h.Number.Uint64()
return saveHeader(tx, &h, h.Hash())
}
- if (fromHash == libcommon.Hash{}) {
- fromHash = h.Hash()
+ if !found {
+ found = true
fromBlock = h.Number.Uint64()
}
toBlock = h.Number.Uint64()
@@ -222,7 +221,6 @@ func (e *EngineBlockDownloader) loadDownloadedHeaders(tx kv.RwTx) (fromBlock uin
func saveHeader(db kv.RwTx, header *types.Header, hash libcommon.Hash) error {
blockHeight := header.Number.Uint64()
// TODO(yperbasis): do we need to check if the header is already inserted (oldH)?
-
parentTd, err := rawdb.ReadTd(db, header.ParentHash, blockHeight-1)
if err != nil || parentTd == nil {
return fmt.Errorf("[saveHeader] parent's total difficulty not found with hash %x and height %d for header %x %d: %v", header.ParentHash, blockHeight-1, hash, blockHeight, err)
@@ -235,70 +233,7 @@ func saveHeader(db kv.RwTx, header *types.Header, hash libcommon.Hash) error {
return fmt.Errorf("[saveHeader] failed to WriteTd: %w", err)
}
if err = rawdb.WriteCanonicalHash(db, hash, blockHeight); err != nil {
- return fmt.Errorf("[saveHeader] failed to canonical hash: %w", err)
+ return fmt.Errorf("[saveHeader] failed to save canonical hash: %w", err)
}
return nil
}
-
-func (e *EngineBlockDownloader) insertHeadersAndBodies(ctx context.Context, tx kv.Tx, fromBlock uint64, fromHash libcommon.Hash, toBlock uint64) error {
- blockBatchSize := 500
- blockWrittenLogSize := 20_000
- // We divide them in batches
- blocksBatch := []*types.Block{}
-
- headersCursors, err := tx.Cursor(kv.Headers)
- if err != nil {
- return err
- }
- inserted := uint64(0)
-
- log.Info("Beginning downloaded blocks insertion")
- // Start by seeking headers
- for k, v, err := headersCursors.Seek(dbutils.HeaderKey(fromBlock, fromHash)); k != nil; k, v, err = headersCursors.Next() {
- if err != nil {
- return err
- }
- if len(blocksBatch) == blockBatchSize {
- if err := e.chainRW.InsertBlocksAndWait(ctx, blocksBatch); err != nil {
- return err
- }
- currentHeader := e.chainRW.CurrentHeader(ctx)
- lastBlockNumber := blocksBatch[len(blocksBatch)-1].NumberU64()
- isForkChoiceNeeded := currentHeader == nil || lastBlockNumber > currentHeader.Number.Uint64()
- inserted += uint64(len(blocksBatch))
- if inserted >= uint64(e.syncCfg.LoopBlockLimit) {
- lastHash := blocksBatch[len(blocksBatch)-1].Hash()
- if isForkChoiceNeeded {
- if _, _, _, err := e.chainRW.UpdateForkChoice(ctx, lastHash, lastHash, lastHash); err != nil {
- return err
- }
- }
- inserted = 0
- }
- blocksBatch = blocksBatch[:0]
- }
- header := new(types.Header)
- if err := rlp.Decode(bytes.NewReader(v), header); err != nil {
- e.logger.Error("Invalid block header RLP", "err", err)
- return nil
- }
- number := header.Number.Uint64()
- if number > toBlock {
- return e.chainRW.InsertBlocksAndWait(ctx, blocksBatch)
- }
- hash := header.Hash()
- body, err := rawdb.ReadBodyWithTransactions(tx, hash, number)
- if err != nil {
- return err
- }
- if body == nil {
- return fmt.Errorf("missing body at block=%d", number)
- }
- blocksBatch = append(blocksBatch, types.NewBlockFromStorage(hash, header, body.Transactions, body.Uncles, body.Withdrawals))
- if number%uint64(blockWrittenLogSize) == 0 {
- e.logger.Info("[insertHeadersAndBodies] Written blocks", "progress", number, "to", toBlock)
- }
- }
- return e.chainRW.InsertBlocksAndWait(ctx, blocksBatch)
-
-}
diff --git a/turbo/engineapi/engine_block_downloader/body.go b/turbo/engineapi/engine_block_downloader/body.go
index 645d4a3651e..bdb640a385f 100644
--- a/turbo/engineapi/engine_block_downloader/body.go
+++ b/turbo/engineapi/engine_block_downloader/body.go
@@ -27,7 +27,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/dbg"
"github.com/erigontech/erigon-lib/kv"
- "github.com/erigontech/erigon/core/rawdb"
+ "github.com/erigontech/erigon/core/types"
"github.com/erigontech/erigon/dataflow"
"github.com/erigontech/erigon/eth/stagedsync/stages"
"github.com/erigontech/erigon/turbo/stages/bodydownload"
@@ -50,7 +50,7 @@ func (e *EngineBlockDownloader) downloadAndLoadBodiesSyncronously(ctx context.Co
timeout := e.timeout
// This will update bd.maxProgress
- if _, _, _, _, err = e.bd.UpdateFromDb(tx); err != nil {
+ if err = e.bd.UpdateFromDb(tx); err != nil {
return
}
defer e.bd.ClearBodyCache()
@@ -80,6 +80,9 @@ func (e *EngineBlockDownloader) downloadAndLoadBodiesSyncronously(ctx context.Co
prevProgress := bodyProgress
var noProgressCount uint = 0 // How many time the progress was printed without actual progress
var totalDelivered uint64 = 0
+ blockBatchSize := 500
+ // We divide them in batches
+ blocksBatch := []*types.Block{}
loopBody := func() (bool, error) {
// loopCount is used here to ensure we don't get caught in a constant loop of making requests
@@ -146,14 +149,20 @@ func (e *EngineBlockDownloader) downloadAndLoadBodiesSyncronously(ctx context.Co
return false, fmt.Errorf("[%s] Header block unexpected when matching body, got %v, expected %v", logPrefix, blockHeight, nextBlock)
}
+ if len(blocksBatch) == blockBatchSize {
+ if err := e.chainRW.InsertBlocksAndWait(ctx, blocksBatch); err != nil {
+ return false, fmt.Errorf("InsertBlock: %w", err)
+ }
+ blocksBatch = blocksBatch[:0]
+ }
// Check existence before write - because WriteRawBody isn't idempotent (it allocates new sequence range for transactions on every call)
- ok, err := rawdb.WriteRawBodyIfNotExists(tx, header.Hash(), blockHeight, rawBody)
+ rawBlock := types.RawBlock{Header: header, Body: rawBody}
+ block, err := rawBlock.AsBlock()
if err != nil {
- return false, fmt.Errorf("WriteRawBodyIfNotExists: %w", err)
- }
- if ok {
- dataflow.BlockBodyDownloadStates.AddChange(blockHeight, dataflow.BlockBodyCleared)
+ return false, fmt.Errorf("Could not construct block: %w", err)
}
+ blocksBatch = append(blocksBatch, block)
+ dataflow.BlockBodyDownloadStates.AddChange(blockHeight, dataflow.BlockBodyCleared)
if blockHeight > bodyProgress {
bodyProgress = blockHeight
@@ -202,6 +211,12 @@ func (e *EngineBlockDownloader) downloadAndLoadBodiesSyncronously(ctx context.Co
return err
}
}
+ if len(blocksBatch) > 0 {
+ if err := e.chainRW.InsertBlocksAndWait(ctx, blocksBatch); err != nil {
+ return fmt.Errorf("InsertBlock: %w", err)
+ }
+ blocksBatch = blocksBatch[:0]
+ }
if stopped {
return libcommon.ErrStopped
diff --git a/turbo/engineapi/engine_block_downloader/core.go b/turbo/engineapi/engine_block_downloader/core.go
index 1e9352f4388..03e7fa47a47 100644
--- a/turbo/engineapi/engine_block_downloader/core.go
+++ b/turbo/engineapi/engine_block_downloader/core.go
@@ -23,6 +23,7 @@ import (
execution "github.com/erigontech/erigon-lib/gointerfaces/executionproto"
"github.com/erigontech/erigon-lib/kv/mdbx"
"github.com/erigontech/erigon-lib/kv/membatchwithdb"
+ "github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/types"
"github.com/erigontech/erigon/turbo/stages/headerdownload"
)
@@ -79,9 +80,17 @@ func (e *EngineBlockDownloader) download(ctx context.Context, hashToDownload lib
memoryMutation := membatchwithdb.NewMemoryBatchWithCustomDB(tx, tmpDb, tmpTx)
defer memoryMutation.Rollback()
- startBlock, endBlock, startHash, err := e.loadDownloadedHeaders(memoryMutation)
+ if block != nil {
+ err = rawdb.WriteCanonicalHash(memoryMutation, block.Hash(), block.NumberU64())
+ if err != nil {
+ e.logger.Warn("[EngineBlockDownloader] Could not make leading header canonical", "err", err)
+ e.status.Store(headerdownload.Idle)
+ return
+ }
+ }
+ startBlock, endBlock, err := e.loadDownloadedHeaders(memoryMutation)
if err != nil {
- e.logger.Warn("[EngineBlockDownloader] Could load headers", "err", err)
+ e.logger.Warn("[EngineBlockDownloader] Could not load headers", "err", err)
e.status.Store(headerdownload.Idle)
return
}
@@ -93,11 +102,6 @@ func (e *EngineBlockDownloader) download(ctx context.Context, hashToDownload lib
return
}
tx.Rollback() // Discard the original db tx
- if err := e.insertHeadersAndBodies(ctx, tmpTx, startBlock, startHash, endBlock); err != nil {
- e.logger.Warn("[EngineBlockDownloader] Could not insert headers and bodies", "err", err)
- e.status.Store(headerdownload.Idle)
- return
- }
e.logger.Info("[EngineBlockDownloader] Finished downloading blocks", "from", startBlock-1, "to", endBlock)
if block == nil {
e.status.Store(headerdownload.Idle)
diff --git a/turbo/engineapi/engine_server.go b/turbo/engineapi/engine_server.go
index f5b4500d5f2..ec4b0414b09 100644
--- a/turbo/engineapi/engine_server.go
+++ b/turbo/engineapi/engine_server.go
@@ -868,7 +868,6 @@ func (e *EngineServer) HandleNewPayload(
if !success {
return &engine_types.PayloadStatus{Status: engine_types.SyncingStatus}, nil
}
-
status, _, latestValidHash, err := e.chainRW.ValidateChain(ctx, headerHash, headerNumber)
if err != nil {
return nil, err
diff --git a/turbo/execution/eth1/forkchoice.go b/turbo/execution/eth1/forkchoice.go
index 92844d9836a..a7d1bf0563e 100644
--- a/turbo/execution/eth1/forkchoice.go
+++ b/turbo/execution/eth1/forkchoice.go
@@ -280,15 +280,6 @@ func (e *EthereumExecutionModule) updateForkChoice(ctx context.Context, original
return
}
- // If we don't have it, too bad
- if fcuHeader == nil {
- sendForkchoiceReceiptWithoutWaiting(outcomeCh, &execution.ForkChoiceReceipt{
- LatestValidHash: gointerfaces.ConvertHashToH256(common.Hash{}),
- Status: execution.ExecutionStatus_MissingSegment,
- }, false)
- return
- }
-
currentParentHash := fcuHeader.ParentHash
currentParentNumber := fcuHeader.Number.Uint64() - 1
isCanonicalHash, err := e.isCanonicalHash(ctx, tx, currentParentHash)
diff --git a/turbo/jsonrpc/debug_api.go b/turbo/jsonrpc/debug_api.go
index 013dcfd62cb..139c62485f1 100644
--- a/turbo/jsonrpc/debug_api.go
+++ b/turbo/jsonrpc/debug_api.go
@@ -30,8 +30,8 @@ import (
jsoniter "github.com/json-iterator/go"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/state"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/eth/stagedsync/stages"
tracersConfig "github.com/erigontech/erigon/eth/tracers/config"
"github.com/erigontech/erigon/rpc"
diff --git a/turbo/jsonrpc/erigon_block.go b/turbo/jsonrpc/erigon_block.go
index 8b66cec0032..e78381ab7ff 100644
--- a/turbo/jsonrpc/erigon_block.go
+++ b/turbo/jsonrpc/erigon_block.go
@@ -32,9 +32,9 @@ import (
"github.com/erigontech/erigon/turbo/services"
"github.com/erigontech/erigon/turbo/snapshotsync/freezeblocks"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/rpc"
"github.com/erigontech/erigon/turbo/adapter/ethapi"
"github.com/erigontech/erigon/turbo/rpchelper"
diff --git a/turbo/jsonrpc/eth_api.go b/turbo/jsonrpc/eth_api.go
index 13ad6d2bd6b..94a5e53ddb2 100644
--- a/turbo/jsonrpc/eth_api.go
+++ b/turbo/jsonrpc/eth_api.go
@@ -39,12 +39,12 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/kvcache"
"github.com/erigontech/erigon-lib/log/v3"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/consensus"
"github.com/erigontech/erigon/consensus/misc"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
ethFilters "github.com/erigontech/erigon/eth/filters"
"github.com/erigontech/erigon/ethdb/prune"
"github.com/erigontech/erigon/polygon/bor/borcfg"
@@ -149,13 +149,11 @@ type BaseAPI struct {
func NewBaseApi(f *rpchelper.Filters, stateCache kvcache.Cache, blockReader services.FullBlockReader, singleNodeMode bool, evmCallTimeout time.Duration, engine consensus.EngineReader, dirs datadir.Dirs, bridgeReader bridgeReader) *BaseAPI {
var (
- blocksLRUSize = 128 // ~32Mb
- receiptsCacheLimit = 32
+ blocksLRUSize = 128 // ~32Mb
)
// if RPCDaemon deployed as independent process: increase cache sizes
if !singleNodeMode {
blocksLRUSize *= 5
- receiptsCacheLimit *= 5
}
blocksLRU, err := lru.New[common.Hash, *types.Block](blocksLRUSize)
if err != nil {
@@ -170,8 +168,8 @@ func NewBaseApi(f *rpchelper.Filters, stateCache kvcache.Cache, blockReader serv
_txnReader: blockReader,
evmCallTimeout: evmCallTimeout,
_engine: engine,
- receiptsGenerator: receipts.NewGenerator(receiptsCacheLimit, blockReader, engine),
- borReceiptGenerator: receipts.NewBorGenerator(receiptsCacheLimit, blockReader, engine),
+ receiptsGenerator: receipts.NewGenerator(blockReader, engine),
+ borReceiptGenerator: receipts.NewBorGenerator(blockReader, engine),
dirs: dirs,
useBridgeReader: bridgeReader != nil && !reflect.ValueOf(bridgeReader).IsNil(), // needed for interface nil caveat
bridgeReader: bridgeReader,
diff --git a/turbo/jsonrpc/eth_call.go b/turbo/jsonrpc/eth_call.go
index cc6d8dc748a..eb88d667f13 100644
--- a/turbo/jsonrpc/eth_call.go
+++ b/turbo/jsonrpc/eth_call.go
@@ -34,10 +34,10 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
"github.com/erigontech/erigon-lib/log/v3"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm"
"github.com/erigontech/erigon/core/vm/evmtypes"
"github.com/erigontech/erigon/eth/tracers/logger"
@@ -205,7 +205,10 @@ func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi2.CallArgs
return 0, errors.New("can't get the current state")
}
- balance := state.GetBalance(*args.From) // from can't be nil
+ balance, err := state.GetBalance(*args.From) // from can't be nil
+ if err != nil {
+ return 0, err
+ }
available := balance.ToBig()
if args.Value != nil {
if args.Value.ToInt().Cmp(available) >= 0 {
diff --git a/turbo/jsonrpc/eth_call_test.go b/turbo/jsonrpc/eth_call_test.go
index c69b69da3f0..b95a1228254 100644
--- a/turbo/jsonrpc/eth_call_test.go
+++ b/turbo/jsonrpc/eth_call_test.go
@@ -39,7 +39,6 @@ import (
"github.com/erigontech/erigon-lib/log/v3"
"github.com/erigontech/erigon/turbo/testlog"
- "github.com/erigontech/erigon-lib/trie"
"github.com/erigontech/erigon/cmd/rpcdaemon/rpcdaemontest"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/rawdb"
@@ -51,6 +50,7 @@ import (
"github.com/erigontech/erigon/turbo/adapter/ethapi"
"github.com/erigontech/erigon/turbo/rpchelper"
"github.com/erigontech/erigon/turbo/stages/mock"
+ "github.com/erigontech/erigon/turbo/trie"
)
func TestEstimateGas(t *testing.T) {
@@ -553,13 +553,17 @@ func chainWithDeployedContract(t *testing.T) (*mock.MockSentry, libcommon.Addres
assert.NoError(t, err)
st := state.New(stateReader)
assert.NoError(t, err)
- assert.False(t, st.Exist(contractAddr), "Contract should not exist at block #1")
+ exist, err := st.Exist(contractAddr)
+ assert.NoError(t, err)
+ assert.False(t, exist, "Contract should not exist at block #1")
stateReader, err = rpchelper.CreateHistoryStateReader(tx, rawdbv3.TxNums, 2, 0, "")
assert.NoError(t, err)
st = state.New(stateReader)
assert.NoError(t, err)
- assert.True(t, st.Exist(contractAddr), "Contract should exist at block #2")
+ exist, err = st.Exist(contractAddr)
+ assert.NoError(t, err)
+ assert.True(t, exist, "Contract should exist at block #2")
return m, bankAddress, contractAddr
}
diff --git a/turbo/jsonrpc/eth_receipts.go b/turbo/jsonrpc/eth_receipts.go
index 2c2677d3145..92066aaf4a4 100644
--- a/turbo/jsonrpc/eth_receipts.go
+++ b/turbo/jsonrpc/eth_receipts.go
@@ -22,7 +22,6 @@ import (
"fmt"
"github.com/RoaringBitmap/roaring"
-
"github.com/erigontech/erigon-lib/chain"
"github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv"
diff --git a/turbo/jsonrpc/otterscan_contract_creator.go b/turbo/jsonrpc/otterscan_contract_creator.go
index d26e3b3aa81..3d1d13ec484 100644
--- a/turbo/jsonrpc/otterscan_contract_creator.go
+++ b/turbo/jsonrpc/otterscan_contract_creator.go
@@ -28,7 +28,7 @@ import (
"github.com/erigontech/erigon-lib/kv/order"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/turbo/rpchelper"
"github.com/erigontech/erigon/turbo/snapshotsync/freezeblocks"
)
diff --git a/turbo/jsonrpc/otterscan_transaction_by_sender_and_nonce.go b/turbo/jsonrpc/otterscan_transaction_by_sender_and_nonce.go
index 62b52ba945a..2411bb10c5c 100644
--- a/turbo/jsonrpc/otterscan_transaction_by_sender_and_nonce.go
+++ b/turbo/jsonrpc/otterscan_transaction_by_sender_and_nonce.go
@@ -28,7 +28,7 @@ import (
"github.com/erigontech/erigon-lib/kv/order"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/turbo/snapshotsync/freezeblocks"
)
diff --git a/turbo/jsonrpc/overlay_api.go b/turbo/jsonrpc/overlay_api.go
index ba4e970f01b..dead2ff8405 100644
--- a/turbo/jsonrpc/overlay_api.go
+++ b/turbo/jsonrpc/overlay_api.go
@@ -237,7 +237,10 @@ func (api *OverlayAPIImpl) CallConstructor(ctx context.Context, address common.A
if err != nil {
return nil, err
}
- code := evm.IntraBlockState().GetCode(address)
+ code, err := evm.IntraBlockState().GetCode(address)
+ if err != nil {
+ return nil, err
+ }
if len(code) > 0 {
c := hexutility.Bytes(code)
resultCode.Code = &c
@@ -506,7 +509,16 @@ func (api *OverlayAPIImpl) replayBlock(ctx context.Context, blockNum uint64, sta
if !contractCreation {
// bump the nonce of the sender
sender := vm.AccountRef(msg.From())
- statedb.SetNonce(msg.From(), statedb.GetNonce(sender.Address())+1)
+ nonce, err := statedb.GetNonce(sender.Address())
+ if err != nil {
+ log.Error(err.Error())
+ return nil, err
+ }
+ err = statedb.SetNonce(msg.From(), nonce+1)
+ if err != nil {
+ log.Error(err.Error())
+ return nil, err
+ }
continue
}
}
diff --git a/turbo/jsonrpc/overlay_create_tracer.go b/turbo/jsonrpc/overlay_create_tracer.go
index 29be53228a8..c80641a5465 100644
--- a/turbo/jsonrpc/overlay_create_tracer.go
+++ b/turbo/jsonrpc/overlay_create_tracer.go
@@ -55,7 +55,11 @@ func (ct *OverlayCreateTracer) CaptureEnter(typ vm.OpCode, from libcommon.Addres
if err != nil {
ct.err = err
} else {
- ct.resultCode = ct.evm.IntraBlockState().GetCode(ct.contractAddress)
+ if result, err := ct.evm.IntraBlockState().GetCode(ct.contractAddress); err != nil {
+ ct.resultCode = result
+ } else {
+ ct.err = err
+ }
}
}
}
diff --git a/turbo/jsonrpc/receipts/bor_receipts_generator.go b/turbo/jsonrpc/receipts/bor_receipts_generator.go
index 6838e6c54e4..5e950043fe2 100644
--- a/turbo/jsonrpc/receipts/bor_receipts_generator.go
+++ b/turbo/jsonrpc/receipts/bor_receipts_generator.go
@@ -27,9 +27,9 @@ type BorGenerator struct {
engine consensus.EngineReader
}
-func NewBorGenerator(cacheSize int, blockReader services.FullBlockReader,
+func NewBorGenerator(blockReader services.FullBlockReader,
engine consensus.EngineReader) *BorGenerator {
- receiptCache, err := lru.New[libcommon.Hash, *types.Receipt](cacheSize)
+ receiptCache, err := lru.New[libcommon.Hash, *types.Receipt](receiptsCacheLimit)
if err != nil {
panic(err)
}
@@ -62,7 +62,7 @@ func (g *BorGenerator) GenerateBorReceipt(ctx context.Context, tx kv.Tx, block *
return nil, err
}
- g.receiptCache.Add(block.Hash(), receipt)
+ g.receiptCache.Add(block.Hash(), receipt.Copy())
return receipt, nil
}
diff --git a/turbo/jsonrpc/receipts/receipts_generator.go b/turbo/jsonrpc/receipts/receipts_generator.go
index ff9c7ca9a2b..05d6f92fa7b 100644
--- a/turbo/jsonrpc/receipts/receipts_generator.go
+++ b/turbo/jsonrpc/receipts/receipts_generator.go
@@ -4,10 +4,9 @@ import (
"context"
"fmt"
- lru "github.com/hashicorp/golang-lru/v2"
-
"github.com/erigontech/erigon-lib/chain"
"github.com/erigontech/erigon-lib/common"
+ "github.com/erigontech/erigon-lib/common/dbg"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/kv/rawdbv3"
"github.com/erigontech/erigon-lib/log/v3"
@@ -19,12 +18,15 @@ import (
"github.com/erigontech/erigon/turbo/services"
"github.com/erigontech/erigon/turbo/snapshotsync/freezeblocks"
"github.com/erigontech/erigon/turbo/transactions"
+ lru "github.com/hashicorp/golang-lru/v2"
)
type Generator struct {
- receiptsCache *lru.Cache[common.Hash, []*types.Receipt]
- blockReader services.FullBlockReader
- engine consensus.EngineReader
+ receiptsCache *lru.Cache[common.Hash, types.Receipts]
+ receiptsCacheTrace bool
+
+ blockReader services.FullBlockReader
+ engine consensus.EngineReader
}
type ReceiptEnv struct {
@@ -37,20 +39,33 @@ type ReceiptEnv struct {
header *types.Header
}
-func NewGenerator(cacheSize int, blockReader services.FullBlockReader,
- engine consensus.EngineReader) *Generator {
- receiptsCache, err := lru.New[common.Hash, []*types.Receipt](cacheSize)
+var (
+ receiptsCacheLimit = dbg.EnvInt("R_LRU", 1024) //ethmainnet: 1K receipts is ~200mb RAM
+ receiptsCacheTrace = dbg.EnvBool("R_LRU_TRACE", false)
+)
+
+func NewGenerator(blockReader services.FullBlockReader, engine consensus.EngineReader) *Generator {
+ receiptsCache, err := lru.New[common.Hash, types.Receipts](receiptsCacheLimit)
if err != nil {
panic(err)
}
return &Generator{
- receiptsCache: receiptsCache,
- blockReader: blockReader,
- engine: engine,
+ receiptsCache: receiptsCache,
+ blockReader: blockReader,
+ engine: engine,
+ receiptsCacheTrace: receiptsCacheTrace,
}
}
+func (g *Generator) LogStats() {
+ if g == nil || !g.receiptsCacheTrace {
+ return
+ }
+ //m := g.receiptsCache.Metrics()
+ //log.Warn("[dbg] ReceiptsCache", "hit", m.Hits, "total", m.Hits+m.Misses, "Collisions", m.Collisions, "Evictions", m.Evictions, "Inserts", m.Inserts, "limit", receiptsCacheLimit, "ratio", fmt.Sprintf("%.2f", float64(m.Hits)/float64(m.Hits+m.Misses)))
+}
+
func (g *Generator) GetCachedReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, bool) {
return g.receiptsCache.Get(blockHash)
}
@@ -87,7 +102,15 @@ func (g *Generator) PrepareEnv(ctx context.Context, block *types.Block, cfg *cha
}, nil
}
+func (g *Generator) addToCache(header *types.Header, receipts types.Receipts) {
+ g.receiptsCache.Add(header.Hash(), receipts.Copy()) // .Copy() helps pprof to attribute memory to cache - instead of evm (where it was allocated).
+}
+
func (g *Generator) GetReceipt(ctx context.Context, cfg *chain.Config, tx kv.Tx, block *types.Block, index int, optimize bool) (*types.Receipt, error) {
+ if receipts, ok := g.receiptsCache.Get(block.Hash()); ok && len(receipts) > index {
+ return receipts[index], nil
+ }
+
var receipt *types.Receipt
if optimize {
genEnv, err := g.PrepareEnv(ctx, block, cfg, tx, index)
@@ -142,6 +165,6 @@ func (g *Generator) GetReceipts(ctx context.Context, cfg *chain.Config, tx kv.Tx
receipts[i] = receipt
}
- g.receiptsCache.Add(block.Hash(), receipts)
+ g.addToCache(block.HeaderNoCopy(), receipts)
return receipts, nil
}
diff --git a/turbo/jsonrpc/trace_adhoc.go b/turbo/jsonrpc/trace_adhoc.go
index 86c2ba0db9d..fdc5e8be790 100644
--- a/turbo/jsonrpc/trace_adhoc.go
+++ b/turbo/jsonrpc/trace_adhoc.go
@@ -33,10 +33,10 @@ import (
math2 "github.com/erigontech/erigon-lib/common/math"
"github.com/erigontech/erigon-lib/kv"
"github.com/erigontech/erigon-lib/log/v3"
- "github.com/erigontech/erigon-lib/types/accounts"
"github.com/erigontech/erigon/core"
"github.com/erigontech/erigon/core/state"
"github.com/erigontech/erigon/core/types"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon/core/vm"
"github.com/erigontech/erigon/core/vm/evmtypes"
"github.com/erigontech/erigon/eth/tracers/config"
@@ -662,16 +662,30 @@ func (sd *StateDiff) CreateContract(address libcommon.Address) error {
}
// CompareStates uses the addresses accumulated in the sdMap and compares balances, nonces, and codes of the accounts, and fills the rest of the sdMap
-func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) {
+func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) error {
var toRemove []libcommon.Address
for addr, accountDiff := range sd.sdMap {
- initialExist := initialIbs.Exist(addr)
- exist := ibs.Exist(addr)
+ initialExist, err := initialIbs.Exist(addr)
+ if err != nil {
+ return err
+ }
+ exist, err := ibs.Exist(addr)
+ if err != nil {
+ return err
+ }
if initialExist {
if exist {
var allEqual = len(accountDiff.Storage) == 0
- fromBalance := initialIbs.GetBalance(addr).ToBig()
- toBalance := ibs.GetBalance(addr).ToBig()
+ ifromBalance, err := initialIbs.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ fromBalance := ifromBalance.ToBig()
+ itoBalance, err := ibs.GetBalance(addr)
+ if err != nil {
+ return err
+ }
+ toBalance := itoBalance.ToBig()
if fromBalance.Cmp(toBalance) == 0 {
accountDiff.Balance = "="
} else {
@@ -680,8 +694,14 @@ func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) {
accountDiff.Balance = m
allEqual = false
}
- fromCode := initialIbs.GetCode(addr)
- toCode := ibs.GetCode(addr)
+ fromCode, err := initialIbs.GetCode(addr)
+ if err != nil {
+ return err
+ }
+ toCode, err := ibs.GetCode(addr)
+ if err != nil {
+ return err
+ }
if bytes.Equal(fromCode, toCode) {
accountDiff.Code = "="
} else {
@@ -690,8 +710,14 @@ func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) {
accountDiff.Code = m
allEqual = false
}
- fromNonce := initialIbs.GetNonce(addr)
- toNonce := ibs.GetNonce(addr)
+ fromNonce, err := initialIbs.GetNonce(addr)
+ if err != nil {
+ return err
+ }
+ toNonce, err := ibs.GetNonce(addr)
+ if err != nil {
+ return err
+ }
if fromNonce == toNonce {
accountDiff.Nonce = "="
} else {
@@ -705,35 +731,59 @@ func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) {
}
} else {
{
+ balance, err := initialIbs.GetBalance(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]*hexutil.Big)
- m["-"] = (*hexutil.Big)(initialIbs.GetBalance(addr).ToBig())
+ m["-"] = (*hexutil.Big)(balance.ToBig())
accountDiff.Balance = m
}
{
+ code, err := initialIbs.GetCode(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]hexutility.Bytes)
- m["-"] = initialIbs.GetCode(addr)
+ m["-"] = code
accountDiff.Code = m
}
{
+ nonce, err := initialIbs.GetNonce(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]hexutil.Uint64)
- m["-"] = hexutil.Uint64(initialIbs.GetNonce(addr))
+ m["-"] = hexutil.Uint64(nonce)
accountDiff.Nonce = m
}
}
} else if exist {
{
+ balance, err := ibs.GetBalance(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]*hexutil.Big)
- m["+"] = (*hexutil.Big)(ibs.GetBalance(addr).ToBig())
+ m["+"] = (*hexutil.Big)(balance.ToBig())
accountDiff.Balance = m
}
{
+ code, err := ibs.GetCode(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]hexutility.Bytes)
- m["+"] = ibs.GetCode(addr)
+ m["+"] = code
accountDiff.Code = m
}
{
+ nonce, err := ibs.GetNonce(addr)
+ if err != nil {
+ return err
+ }
m := make(map[string]hexutil.Uint64)
- m["+"] = hexutil.Uint64(ibs.GetNonce(addr))
+ m["+"] = hexutil.Uint64(nonce)
accountDiff.Nonce = m
}
// Transform storage
@@ -749,6 +799,7 @@ func (sd *StateDiff) CompareStates(initialIbs, ibs *state.IntraBlockState) {
for _, addr := range toRemove {
delete(sd.sdMap, addr)
}
+ return nil
}
func (api *TraceAPIImpl) ReplayTransaction(ctx context.Context, txHash libcommon.Hash, traceTypes []string, gasBailOut *bool, traceConfig *config.TraceConfig) (*TraceCallResult, error) {
diff --git a/erigon-lib/rlphacks/bytes.go b/turbo/rlphacks/bytes.go
similarity index 100%
rename from erigon-lib/rlphacks/bytes.go
rename to turbo/rlphacks/bytes.go
diff --git a/erigon-lib/rlphacks/bytes_test.go b/turbo/rlphacks/bytes_test.go
similarity index 100%
rename from erigon-lib/rlphacks/bytes_test.go
rename to turbo/rlphacks/bytes_test.go
diff --git a/erigon-lib/rlphacks/serializable.go b/turbo/rlphacks/serializable.go
similarity index 100%
rename from erigon-lib/rlphacks/serializable.go
rename to turbo/rlphacks/serializable.go
diff --git a/erigon-lib/rlphacks/struct.go b/turbo/rlphacks/struct.go
similarity index 100%
rename from erigon-lib/rlphacks/struct.go
rename to turbo/rlphacks/struct.go
diff --git a/erigon-lib/rlphacks/utils_bytes.go b/turbo/rlphacks/utils_bytes.go
similarity index 100%
rename from erigon-lib/rlphacks/utils_bytes.go
rename to turbo/rlphacks/utils_bytes.go
diff --git a/turbo/shards/state_cache.go b/turbo/shards/state_cache.go
index e42a8f0e98f..2e7a4e59482 100644
--- a/turbo/shards/state_cache.go
+++ b/turbo/shards/state_cache.go
@@ -29,7 +29,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/metrics"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
// LRU state cache consists of two structures - B-Tree and binary heap
diff --git a/turbo/shards/state_cache_test.go b/turbo/shards/state_cache_test.go
index da425e68074..4ad54f3c6da 100644
--- a/turbo/shards/state_cache_test.go
+++ b/turbo/shards/state_cache_test.go
@@ -26,7 +26,7 @@ import (
"github.com/stretchr/testify/assert"
"golang.org/x/crypto/sha3"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func TestCacheBtreeOrderAccountStorage2(t *testing.T) {
diff --git a/turbo/shards/trie_cache.go b/turbo/shards/trie_cache.go
index e9002f882c1..28c1d29331d 100644
--- a/turbo/shards/trie_cache.go
+++ b/turbo/shards/trie_cache.go
@@ -27,7 +27,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/kv/dbutils"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
// An optional addition to the state cache, helping to calculate state root
diff --git a/turbo/snapshotsync/caplin_state_snapshots.go b/turbo/snapshotsync/caplin_state_snapshots.go
index 48bc93cc693..8cd6f6c1350 100644
--- a/turbo/snapshotsync/caplin_state_snapshots.go
+++ b/turbo/snapshotsync/caplin_state_snapshots.go
@@ -81,7 +81,7 @@ func getKvGetterForStateTable(db kv.RoDB, tableName string) KeyValueGetter {
var err error
if err := db.View(context.TODO(), func(tx kv.Tx) error {
key = base_encoding.Encode64ToBytes4(numId)
- value, err = tx.GetOne(tableName, base_encoding.Encode64ToBytes4(numId))
+ value, err = tx.GetOne(tableName, key)
value = libcommon.Copy(value)
return err
}); err != nil {
diff --git a/turbo/snapshotsync/snapshotsync.go b/turbo/snapshotsync/snapshotsync.go
index 5f96e176f90..7bbfee50d17 100644
--- a/turbo/snapshotsync/snapshotsync.go
+++ b/turbo/snapshotsync/snapshotsync.go
@@ -228,11 +228,11 @@ func getMinimumBlocksToDownload(tx kv.Tx, blockReader blockReader, minStep uint6
frozenBlocks := blockReader.Snapshots().SegmentsMax()
minToDownload := uint64(math.MaxUint64)
minStepToDownload := uint64(math.MaxUint32)
- stateTxNum := minStep * config3.HistoryV3AggregationStep
+ stateTxNum := minStep * config3.DefaultStepSize
if err := blockReader.IterateFrozenBodies(func(blockNum, baseTxNum, txAmount uint64) error {
if blockNum == historyPruneTo {
- minStepToDownload = (baseTxNum - (config3.HistoryV3AggregationStep - 1)) / config3.HistoryV3AggregationStep
- if baseTxNum < (config3.HistoryV3AggregationStep - 1) {
+ minStepToDownload = (baseTxNum - (config3.DefaultStepSize - 1)) / config3.DefaultStepSize
+ if baseTxNum < (config3.DefaultStepSize - 1) {
minStepToDownload = 0
}
}
diff --git a/turbo/stages/blockchain_test.go b/turbo/stages/blockchain_test.go
index 3c58f35a1b4..a37243413bc 100644
--- a/turbo/stages/blockchain_test.go
+++ b/turbo/stages/blockchain_test.go
@@ -1015,7 +1015,11 @@ func TestEIP161AccountRemoval(t *testing.T) {
return
}
defer tx.Rollback()
- if st := state.New(m.NewStateReader(tx)); !st.Exist(theAddr) {
+ exist, err := state.New(m.NewStateReader(tx)).Exist(theAddr)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !exist {
t.Error("expected account to exist")
}
tx.Rollback()
@@ -1025,7 +1029,11 @@ func TestEIP161AccountRemoval(t *testing.T) {
t.Fatal(err)
}
if err = m.DB.View(m.Ctx, func(tx kv.Tx) error {
- if st := state.New(m.NewStateReader(tx)); st.Exist(theAddr) {
+ exist, err := state.New(m.NewStateReader(tx)).Exist(theAddr)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("account should not exist")
}
return nil
@@ -1038,7 +1046,11 @@ func TestEIP161AccountRemoval(t *testing.T) {
t.Fatal(err)
}
if err = m.DB.View(m.Ctx, func(tx kv.Tx) error {
- if st := state.New(m.NewStateReader(tx)); st.Exist(theAddr) {
+ exist, err := state.New(m.NewStateReader(tx)).Exist(theAddr)
+ if err != nil {
+ return err
+ }
+ if exist {
t.Error("account should not exist")
}
return nil
@@ -1104,19 +1116,27 @@ func TestDoubleAccountRemoval(t *testing.T) {
st := state.New(m.NewStateReader(tx))
assert.NoError(t, err)
- assert.False(t, st.Exist(theAddr), "Contract should've been removed")
+ exist, err := st.Exist(theAddr)
+ assert.NoError(t, err)
+ assert.False(t, exist, "Contract should've been removed")
st = state.New(m.NewHistoryStateReader(1, tx))
assert.NoError(t, err)
- assert.False(t, st.Exist(theAddr), "Contract should not exist at block #0")
+ exist, err = st.Exist(theAddr)
+ assert.NoError(t, err)
+ assert.False(t, exist, "Contract should not exist at block #0")
st = state.New(m.NewHistoryStateReader(2, tx))
assert.NoError(t, err)
- assert.True(t, st.Exist(theAddr), "Contract should exist at block #1")
+ exist, err = st.Exist(theAddr)
+ assert.NoError(t, err)
+ assert.True(t, exist, "Contract should exist at block #1")
st = state.New(m.NewHistoryStateReader(3, tx))
assert.NoError(t, err)
- assert.True(t, st.Exist(theAddr), "Contract should exist at block #2")
+ exist, err = st.Exist(theAddr)
+ assert.NoError(t, err)
+ assert.True(t, exist, "Contract should exist at block #2")
}
// This is a regression test (i.e. as weird as it is, don't delete it ever), which
@@ -1608,7 +1628,10 @@ func TestCVE2020_26265(t *testing.T) {
reader := m.NewHistoryStateReader(2, tx)
statedb := state.New(reader)
- got := statedb.GetBalance(aa)
+ got, err := statedb.GetBalance(aa)
+ if err != nil {
+ t.Fatal(err)
+ }
if !got.Eq(new(uint256.Int).SetUint64(5)) {
t.Errorf("got %x exp %x", got, 5)
}
@@ -1870,7 +1893,11 @@ func TestDeleteRecreateSlotsAcrossManyBlocks(t *testing.T) {
}
exp := expectations[i]
if exp.exist {
- if !statedb.Exist(aa) {
+ exist, err := statedb.Exist(aa)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if !exist {
t.Fatalf("block %d, expected %x to exist, it did not", blockNum, aa)
}
for slot, val := range exp.values {
@@ -1882,7 +1909,11 @@ func TestDeleteRecreateSlotsAcrossManyBlocks(t *testing.T) {
}
}
} else {
- if statedb.Exist(aa) {
+ exist, err := statedb.Exist(aa)
+ if err != nil {
+ t.Fatal(err)
+ }
+ if exist {
t.Fatalf("block %d, expected %x to not exist, it did", blockNum, aa)
}
}
@@ -1988,7 +2019,11 @@ func TestInitThenFailCreateContract(t *testing.T) {
// Import the canonical chain
statedb := state.New(m.NewHistoryStateReader(2, tx))
- if got, exp := statedb.GetBalance(aa), uint64(100000); got.Uint64() != exp {
+ got, err := statedb.GetBalance(aa)
+ if err != nil {
+ return err
+ }
+ if exp := uint64(100000); got.Uint64() != exp {
t.Fatalf("Genesis err, got %v exp %v", got, exp)
}
// First block tries to create, but fails
@@ -1998,7 +2033,11 @@ func TestInitThenFailCreateContract(t *testing.T) {
t.Fatalf("block %d: failed to insert into chain: %v", block.NumberU64(), err)
}
statedb = state.New(m.NewHistoryStateReader(1, tx))
- if got, exp := statedb.GetBalance(aa), uint64(100000); got.Uint64() != exp {
+ got, err := statedb.GetBalance(aa)
+ if err != nil {
+ return err
+ }
+ if exp := uint64(100000); got.Uint64() != exp {
t.Fatalf("block %d: got %v exp %v", block.NumberU64(), got, exp)
}
}
@@ -2198,7 +2237,10 @@ func TestEIP1559Transition(t *testing.T) {
statedb := state.New(m.NewHistoryStateReader(1, tx))
// 3: Ensure that miner received only the tx's tip.
- actual := statedb.GetBalance(block.Coinbase())
+ actual, err := statedb.GetBalance(block.Coinbase())
+ if err != nil {
+ return err
+ }
expected := new(uint256.Int).Add(
new(uint256.Int).SetUint64(block.GasUsed()*block.Transactions()[0].GetPrice().Uint64()),
ethash.ConstantinopleBlockReward,
@@ -2208,7 +2250,11 @@ func TestEIP1559Transition(t *testing.T) {
}
// 4: Ensure the txn sender paid for the gasUsed * (tip + block baseFee).
- actual = new(uint256.Int).Sub(funds, statedb.GetBalance(addr1))
+ balance, err := statedb.GetBalance(addr1)
+ if err != nil {
+ return err
+ }
+ actual = new(uint256.Int).Sub(funds, balance)
expected = new(uint256.Int).SetUint64(block.GasUsed() * (block.Transactions()[0].GetPrice().Uint64() + block.BaseFee().Uint64()))
if actual.Cmp(expected) != 0 {
t.Fatalf("sender expenditure incorrect: expected %d, got %d", expected, actual)
@@ -2240,7 +2286,10 @@ func TestEIP1559Transition(t *testing.T) {
effectiveTip := block.Transactions()[0].GetPrice().Uint64() - block.BaseFee().Uint64()
// 6+5: Ensure that miner received only the tx's effective tip.
- actual := statedb.GetBalance(block.Coinbase())
+ actual, err := statedb.GetBalance(block.Coinbase())
+ if err != nil {
+ return err
+ }
expected := new(uint256.Int).Add(
new(uint256.Int).SetUint64(block.GasUsed()*effectiveTip),
ethash.ConstantinopleBlockReward,
@@ -2250,7 +2299,11 @@ func TestEIP1559Transition(t *testing.T) {
}
// 4: Ensure the txn sender paid for the gasUsed * (effectiveTip + block baseFee).
- actual = new(uint256.Int).Sub(funds, statedb.GetBalance(addr2))
+ balance, err := statedb.GetBalance(addr2)
+ if err != nil {
+ return err
+ }
+ actual = new(uint256.Int).Sub(funds, balance)
expected = new(uint256.Int).SetUint64(block.GasUsed() * (effectiveTip + block.BaseFee().Uint64()))
if actual.Cmp(expected) != 0 {
t.Fatalf("sender balance incorrect: expected %d, got %d", expected, actual)
diff --git a/turbo/stages/bodydownload/body_algos.go b/turbo/stages/bodydownload/body_algos.go
index 509af2bc67b..b6580584ce5 100644
--- a/turbo/stages/bodydownload/body_algos.go
+++ b/turbo/stages/bodydownload/body_algos.go
@@ -19,7 +19,6 @@ package bodydownload
import (
"bytes"
"context"
- "errors"
"fmt"
"math/big"
@@ -33,19 +32,18 @@ import (
"github.com/erigontech/erigon/eth/stagedsync/stages"
"github.com/erigontech/erigon/turbo/adapter"
"github.com/erigontech/erigon/turbo/services"
- "github.com/holiman/uint256"
)
// UpdateFromDb reads the state of the database and refreshes the state of the body download
-func (bd *BodyDownload) UpdateFromDb(db kv.Tx) (headHeight, headTime uint64, headHash libcommon.Hash, headTd256 *uint256.Int, err error) {
+func (bd *BodyDownload) UpdateFromDb(db kv.Tx) (err error) {
var headerProgress, bodyProgress uint64
headerProgress, err = stages.GetStageProgress(db, stages.Headers)
if err != nil {
- return 0, 0, libcommon.Hash{}, nil, err
+ return err
}
bodyProgress, err = stages.GetStageProgress(db, stages.Bodies)
if err != nil {
- return 0, 0, libcommon.Hash{}, nil, err
+ return err
}
bd.maxProgress = headerProgress + 1
// Resetting for requesting a new range of blocks
@@ -58,37 +56,7 @@ func (bd *BodyDownload) UpdateFromDb(db kv.Tx) (headHeight, headTime uint64, hea
clear(bd.requests)
clear(bd.peerMap)
bd.ClearBodyCache()
- headHeight = bodyProgress
- var ok bool
- headHash, ok, err = bd.br.CanonicalHash(context.Background(), db, headHeight)
- if err != nil {
- return 0, 0, libcommon.Hash{}, nil, err
- }
- if !ok {
- return 0, 0, libcommon.Hash{}, nil, fmt.Errorf("canonical marker not found: %d", headHeight)
- }
- var headTd *big.Int
- headTd, err = rawdb.ReadTd(db, headHash, headHeight)
- if err != nil {
- return 0, 0, libcommon.Hash{}, nil, fmt.Errorf("reading total difficulty for head height %d and hash %x: %d, %w", headHeight, headHash, headTd, err)
- }
- if headTd == nil {
- headTd = new(big.Int)
- }
- headTd256 = new(uint256.Int)
- overflow := headTd256.SetFromBig(headTd)
- if overflow {
- return 0, 0, libcommon.Hash{}, nil, errors.New("headTd higher than 2^256-1")
- }
- headTime = 0
- headHeader, err := bd.br.Header(context.Background(), db, headHash, headHeight)
- if err != nil {
- return 0, 0, libcommon.Hash{}, nil, fmt.Errorf("reading header for head height %d and hash %x: %d, %w", headHeight, headHash, headTd, err)
- }
- if headHeader != nil {
- headTime = headHeader.Time
- }
- return headHeight, headTime, headHash, headTd256, nil
+ return nil
}
// RequestMoreBodies - returns nil if nothing to request
diff --git a/turbo/stages/bodydownload/body_test.go b/turbo/stages/bodydownload/body_test.go
index 4164eb977e7..2545b0d6cd5 100644
--- a/turbo/stages/bodydownload/body_test.go
+++ b/turbo/stages/bodydownload/body_test.go
@@ -33,7 +33,7 @@ func TestCreateBodyDownload(t *testing.T) {
require.NoError(t, err)
defer tx.Rollback()
bd := bodydownload.NewBodyDownload(ethash.NewFaker(), 128, 100, m.BlockReader, m.Log)
- if _, _, _, _, err := bd.UpdateFromDb(tx); err != nil {
+ if err := bd.UpdateFromDb(tx); err != nil {
t.Fatalf("update from db: %v", err)
}
}
diff --git a/turbo/stages/chain_makers_test.go b/turbo/stages/chain_makers_test.go
index 08dcd772cc2..e33f34ef5dd 100644
--- a/turbo/stages/chain_makers_test.go
+++ b/turbo/stages/chain_makers_test.go
@@ -118,14 +118,26 @@ func TestGenerateChain(t *testing.T) {
if big.NewInt(5).Cmp(current(m, tx).Number()) != 0 {
t.Errorf("wrong block number: %d", current(m, tx).Number())
}
- if !uint256.NewInt(989000).Eq(st.GetBalance(addr1)) {
- t.Errorf("wrong balance of addr1: %s", st.GetBalance(addr1))
+ balance, err := st.GetBalance(addr1)
+ if err != nil {
+ t.Error(err)
+ }
+ if !uint256.NewInt(989000).Eq(balance) {
+ t.Errorf("wrong balance of addr1: %s", balance)
+ }
+ balance, err = st.GetBalance(addr2)
+ if err != nil {
+ t.Error(err)
+ }
+ if !uint256.NewInt(10000).Eq(balance) {
+ t.Errorf("wrong balance of addr2: %s", balance)
}
- if !uint256.NewInt(10000).Eq(st.GetBalance(addr2)) {
- t.Errorf("wrong balance of addr2: %s", st.GetBalance(addr2))
+ balance, err = st.GetBalance(addr3)
+ if err != nil {
+ t.Error(err)
}
- if fmt.Sprintf("%s", st.GetBalance(addr3)) != "19687500000000001000" { //nolint
- t.Errorf("wrong balance of addr3: %s", st.GetBalance(addr3))
+ if fmt.Sprintf("%s", balance) != "19687500000000001000" { //nolint
+ t.Errorf("wrong balance of addr3: %s", balance)
}
if sentry_multi_client.EnableP2PReceipts {
diff --git a/turbo/stages/mock/mock_sentry.go b/turbo/stages/mock/mock_sentry.go
index 3ecd3d1827f..2598beb5312 100644
--- a/turbo/stages/mock/mock_sentry.go
+++ b/turbo/stages/mock/mock_sentry.go
@@ -313,7 +313,7 @@ func MockWithEverything(tb testing.TB, gspec *types.Genesis, key *ecdsa.PrivateK
PeerId: gointerfaces.ConvertHashToH512([64]byte{0x12, 0x34, 0x50}), // "12345"
BlockSnapshots: allSnapshots,
BlockReader: br,
- ReceiptsReader: receipts.NewGenerator(16, br, engine),
+ ReceiptsReader: receipts.NewGenerator(br, engine),
HistoryV3: true,
}
diff --git a/erigon-lib/trie/.gitignore b/turbo/trie/.gitignore
similarity index 100%
rename from erigon-lib/trie/.gitignore
rename to turbo/trie/.gitignore
diff --git a/erigon-lib/trie/account_node_test.go b/turbo/trie/account_node_test.go
similarity index 99%
rename from erigon-lib/trie/account_node_test.go
rename to turbo/trie/account_node_test.go
index 04c50eb0208..d36cfa47bd9 100644
--- a/erigon-lib/trie/account_node_test.go
+++ b/turbo/trie/account_node_test.go
@@ -27,7 +27,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/kv/dbutils"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func TestGetAccount(t *testing.T) {
diff --git a/erigon-lib/trie/debug.go b/turbo/trie/debug.go
similarity index 100%
rename from erigon-lib/trie/debug.go
rename to turbo/trie/debug.go
diff --git a/erigon-lib/trie/delete_subrtee_test.go b/turbo/trie/delete_subrtee_test.go
similarity index 99%
rename from erigon-lib/trie/delete_subrtee_test.go
rename to turbo/trie/delete_subrtee_test.go
index b29dccf8e90..ea226f49843 100644
--- a/erigon-lib/trie/delete_subrtee_test.go
+++ b/turbo/trie/delete_subrtee_test.go
@@ -28,7 +28,7 @@ import (
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/crypto"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func TestTrieDeleteSubtree_ShortNode(t *testing.T) {
diff --git a/erigon-lib/trie/encoding.go b/turbo/trie/encoding.go
similarity index 100%
rename from erigon-lib/trie/encoding.go
rename to turbo/trie/encoding.go
diff --git a/erigon-lib/trie/encoding_test.go b/turbo/trie/encoding_test.go
similarity index 79%
rename from erigon-lib/trie/encoding_test.go
rename to turbo/trie/encoding_test.go
index 20d70ef06b2..8f5ce4a0760 100644
--- a/erigon-lib/trie/encoding_test.go
+++ b/turbo/trie/encoding_test.go
@@ -23,8 +23,9 @@ import (
"bytes"
"testing"
- libcommon "github.com/erigontech/erigon-lib/common"
"github.com/stretchr/testify/assert"
+
+ "github.com/erigontech/erigon-lib/common"
)
func TestHexCompact(t *testing.T) {
@@ -82,39 +83,39 @@ func TestHexKeybytes(t *testing.T) {
}
func TestKeybytesToCompact(t *testing.T) {
- keybytes := Keybytes{libcommon.FromHex("5a70"), true, true}
+ keybytes := Keybytes{common.FromHex("5a70"), true, true}
compact := keybytes.ToCompact()
- assert.Equal(t, libcommon.FromHex("35a7"), compact)
+ assert.Equal(t, common.FromHex("35a7"), compact)
- keybytes = Keybytes{libcommon.FromHex("5a70"), true, false}
+ keybytes = Keybytes{common.FromHex("5a70"), true, false}
compact = keybytes.ToCompact()
- assert.Equal(t, libcommon.FromHex("15a7"), compact)
+ assert.Equal(t, common.FromHex("15a7"), compact)
- keybytes = Keybytes{libcommon.FromHex("5a7c"), false, true}
+ keybytes = Keybytes{common.FromHex("5a7c"), false, true}
compact = keybytes.ToCompact()
- assert.Equal(t, libcommon.FromHex("205a7c"), compact)
+ assert.Equal(t, common.FromHex("205a7c"), compact)
- keybytes = Keybytes{libcommon.FromHex("5a7c"), false, false}
+ keybytes = Keybytes{common.FromHex("5a7c"), false, false}
compact = keybytes.ToCompact()
- assert.Equal(t, libcommon.FromHex("005a7c"), compact)
+ assert.Equal(t, common.FromHex("005a7c"), compact)
}
func TestCompactToKeybytes(t *testing.T) {
- compact := libcommon.FromHex("35a7")
+ compact := common.FromHex("35a7")
keybytes := CompactToKeybytes(compact)
- assert.Equal(t, Keybytes{libcommon.FromHex("5a70"), true, true}, keybytes)
+ assert.Equal(t, Keybytes{common.FromHex("5a70"), true, true}, keybytes)
- compact = libcommon.FromHex("15a7")
+ compact = common.FromHex("15a7")
keybytes = CompactToKeybytes(compact)
- assert.Equal(t, Keybytes{libcommon.FromHex("5a70"), true, false}, keybytes)
+ assert.Equal(t, Keybytes{common.FromHex("5a70"), true, false}, keybytes)
- compact = libcommon.FromHex("205a7c")
+ compact = common.FromHex("205a7c")
keybytes = CompactToKeybytes(compact)
- assert.Equal(t, Keybytes{libcommon.FromHex("5a7c"), false, true}, keybytes)
+ assert.Equal(t, Keybytes{common.FromHex("5a7c"), false, true}, keybytes)
- compact = libcommon.FromHex("005a7c")
+ compact = common.FromHex("005a7c")
keybytes = CompactToKeybytes(compact)
- assert.Equal(t, Keybytes{libcommon.FromHex("5a7c"), false, false}, keybytes)
+ assert.Equal(t, Keybytes{common.FromHex("5a7c"), false, false}, keybytes)
}
func BenchmarkHexToCompact(b *testing.B) {
diff --git a/erigon-lib/trie/errors.go b/turbo/trie/errors.go
similarity index 100%
rename from erigon-lib/trie/errors.go
rename to turbo/trie/errors.go
diff --git a/erigon-lib/trie/flatdb_sub_trie_loader_test.go b/turbo/trie/flatdb_sub_trie_loader_test.go
similarity index 85%
rename from erigon-lib/trie/flatdb_sub_trie_loader_test.go
rename to turbo/trie/flatdb_sub_trie_loader_test.go
index 5dc501f8dd6..a9b8a399b73 100644
--- a/erigon-lib/trie/flatdb_sub_trie_loader_test.go
+++ b/turbo/trie/flatdb_sub_trie_loader_test.go
@@ -25,17 +25,18 @@ import (
"github.com/erigontech/erigon-lib/kv"
"github.com/stretchr/testify/assert"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon-lib/common"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func TestCreateLoadingPrefixes(t *testing.T) {
assert := assert.New(t)
tr := New(libcommon.Hash{})
- kAcc1 := libcommon.FromHex("0001cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83")
+ kAcc1 := common.FromHex("0001cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83")
kInc := make([]byte, 8)
binary.BigEndian.PutUint64(kInc, uint64(1))
- ks1 := libcommon.FromHex("0000000000000000000000000000000000000000000000000000000000000001")
+ ks1 := common.FromHex("0000000000000000000000000000000000000000000000000000000000000001")
acc1 := accounts.NewAccount()
acc1.Balance.SetUint64(12345)
acc1.Incarnation = 1
@@ -43,9 +44,9 @@ func TestCreateLoadingPrefixes(t *testing.T) {
tr.UpdateAccount(kAcc1, &acc1)
tr.Update(concat(kAcc1, ks1...), []byte{1, 2, 3})
- kAcc2 := libcommon.FromHex("0002cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83")
- ks2 := libcommon.FromHex("0000000000000000000000000000000000000000000000000000000000000001")
- ks22 := libcommon.FromHex("0000000000000000000000000000000000000000000000000000000000000002")
+ kAcc2 := common.FromHex("0002cf1ce0664746d39af9f6db99dc3370282f1d9d48df7f804b7e6499558c83")
+ ks2 := common.FromHex("0000000000000000000000000000000000000000000000000000000000000001")
+ ks22 := common.FromHex("0000000000000000000000000000000000000000000000000000000000000002")
acc2 := accounts.NewAccount()
acc2.Balance.SetUint64(6789)
acc2.Incarnation = 1
@@ -124,8 +125,8 @@ func TestIsSequence(t *testing.T) {
{prev: "1234", next: "5678", expect: false},
}
for _, tc := range cases {
- next, _ := kv.NextSubtree(libcommon.FromHex(tc.prev))
- res := isSequenceOld(next, libcommon.FromHex(tc.next))
+ next, _ := kv.NextSubtree(common.FromHex(tc.prev))
+ res := isSequenceOld(next, common.FromHex(tc.next))
assert.Equal(tc.expect, res, "%s, %s", tc.prev, tc.next)
}
diff --git a/erigon-lib/trie/gen_struct_step.go b/turbo/trie/gen_struct_step.go
similarity index 99%
rename from erigon-lib/trie/gen_struct_step.go
rename to turbo/trie/gen_struct_step.go
index 93eda075aaf..6a751c84b9c 100644
--- a/erigon-lib/trie/gen_struct_step.go
+++ b/turbo/trie/gen_struct_step.go
@@ -26,7 +26,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/rlphacks"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
// Experimental code for separating data and structural information
diff --git a/turbo/trie/hack.go b/turbo/trie/hack.go
new file mode 100644
index 00000000000..fd59eab089c
--- /dev/null
+++ b/turbo/trie/hack.go
@@ -0,0 +1,146 @@
+// Copyright 2024 The Erigon Authors
+// This file is part of Erigon.
+//
+// Erigon is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Erigon is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with Erigon. If not, see .
+
+package trie
+
+import (
+ "fmt"
+
+ libcommon "github.com/erigontech/erigon-lib/common"
+
+ "github.com/erigontech/erigon-lib/common"
+ "github.com/erigontech/erigon-lib/rlp"
+)
+
+func FullNode1() {
+ f := &fullNode{}
+ b, err := rlp.EncodeToBytes(f)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("FullNode1 %x\n", b)
+}
+
+func FullNode2() {
+ f := &fullNode{}
+ f.Children[0] = valueNode(nil)
+ b, err := rlp.EncodeToBytes(f)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("FullNode2 %x\n", b)
+}
+
+func FullNode3() {
+ f := &fullNode{}
+ f.Children[0] = valueNode(nil)
+ h := libcommon.Hash{}
+ f.Children[1] = hashNode{hash: h[:]}
+ b, err := rlp.EncodeToBytes(f)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("FullNode3 %x\n", b)
+}
+
+func FullNode4() {
+ f := &fullNode{}
+ h := libcommon.Hash{}
+ for i := 0; i < 17; i++ {
+ f.Children[i] = hashNode{hash: h[:]}
+ }
+ b, err := rlp.EncodeToBytes(f)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("FullNode4 %x\n", b)
+}
+
+func ShortNode1() {
+ s := NewShortNode([]byte("1"), valueNode("2"))
+ b, err := rlp.EncodeToBytes(s)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("ShortNode1 %x\n", b)
+}
+
+func ShortNode2() {
+ s := NewShortNode([]byte("1"), valueNode("123456789012345678901234567890123456789012345678901234567890"))
+ b, err := rlp.EncodeToBytes(s)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("ShortNode2 %x\n", b)
+}
+
+func hashRoot(n node, title string) {
+ h := newHasher(false)
+ h1 := newHasher(true)
+ defer returnHasherToPool(h)
+ defer returnHasherToPool(h1)
+ var hash libcommon.Hash
+ hLen, _ := h.hash(n, true, hash[:])
+ if hLen < 32 {
+ panic("expected hashNode")
+ }
+ fmt.Printf("%s noencode: %x\n", title, hash[:])
+ hLen, _ = h1.hash(n, true, hash[:])
+ if hLen < 32 {
+ panic("expected hashNode")
+ }
+ fmt.Printf("%s encode: %x\n", title, hash[:])
+}
+
+func Hash1() {
+ f := &fullNode{}
+ hashRoot(f, "Hash1")
+}
+
+func Hash2() {
+ f := &fullNode{}
+ f.Children[0] = &fullNode{}
+ hashRoot(f, "Hash2")
+}
+
+func Hash3() {
+ s := NewShortNode([]byte("12"), valueNode("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012"))
+ hashRoot(s, "Hash3")
+}
+
+func Hash4() {
+ s := NewShortNode([]byte("12345678901234567890123456789012"), valueNode("12345678901234567890"))
+ hashRoot(s, "Hash4")
+}
+
+func Hash5() {
+ s := NewShortNode([]byte("1234567890123456789012345678901"), valueNode("1"))
+ hashRoot(s, "Hash5")
+}
+
+func Hash6() {
+ s := NewShortNode(common.FromHex("080010"), valueNode(common.FromHex("f90129a0bc7bbe9ce39e604900ca736606290650c4c630501a97745a3f21fae5261623df830362c0b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0")))
+ hashRoot(s, "Hash6")
+}
+
+func Hash7() {
+ d := &duoNode{}
+ d.child1 = NewShortNode(common.FromHex("0110"), valueNode(common.FromHex("f871820ba5850ba43b7400830186a0942eb08efb9e10d9f56e46938f28c13ecb33f67b158a085c1bad4187cfe90000801ba0a7e45cf38e44d2c39a4b94bae2e14fccde41e3280c57b611d9cb6494fde12fc7a00858adac2ba2381c591978b8404c22981f7141f0aef9c3cab8f93a55efc40acc")))
+ d.child2 = NewShortNode(common.FromHex("0010"), valueNode(common.FromHex("fa02368e820276850ba43b7400830f4240947fd85d1fc04087b3d9d1e610410989191c09b97380ba023624847b07e7000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000011af74000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000790000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000008b0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000008b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b10000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000dd000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000d50000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000f30000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000f50000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000c90000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000680000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000da0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000f10000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000bf0000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000db0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000430000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000003d00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000840000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000007500000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000810000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000eb0000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000009d000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000003900000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000310000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000dd0000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000b500000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000034000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009f0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000009d0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000b30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000008700000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000820000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000006500000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000480000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000007500000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000730000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000830000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000330000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000009d0000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000f200000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000ef0000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000b10000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000340000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000be0000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000390000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000008c00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000f8000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000740000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000a60000000000000000000000000000000000000000000000000000000000000033000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000a5000000000000000000000000000000000000000000000000000000000000005d0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000f20000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f60000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000ed0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000a100000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000c7000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000009c00000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a50000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000001d0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000ec0000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000630000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000e200000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000870000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000af0000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000b80000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009900000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000008d000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000c50000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000007c0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000520000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000004a000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000e7000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000039000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000dc00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000009d00000000000000000000000000000000000000000000000000000000000000ea0000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ac0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000009b0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000550000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a90000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000093000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000670000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000c90000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c700000000000000000000000000000000000000000000000000000000000000780000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a80000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000a4000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000003700000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000620000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d50000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000a10000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000e70000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000009a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000c60000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000970000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000fc00000000000000000000000000000000000000000000000000000000000000e600000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000006e0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000006100000000000000000000000000000000000000000000000000000000000000ec0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000008b00000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000007b0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000230000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000005f000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009e0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000470000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f6000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000ff0000000000000000000000000000000000000000000000000000000000000046000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000056000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000d3000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000ac00000000000000000000000000000000000000000000000000000000000000ba000000000000000000000000000000000000000000000000000000000000006900000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000b50000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000cb0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000008400000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000ae00000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000fc0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000eb000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000008c0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000e900000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001500000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000e8000000000000000000000000000000000000000000000000000000000000003500000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000005f0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000a80000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000dc000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000009f0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006d00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000b20000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000000000000000000000000000000000000000005a00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000008d00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000bf00000000000000000000000000000000000000000000000000000000000000e5000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000720000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000047000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000002f0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005b0000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000650000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001b0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000a20000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e4000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000094000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000001f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000d900000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000e20000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000a70000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000c4000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000ae000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000130000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000fb0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002600000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000002b0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000004800000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000059000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000005500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f40000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000cd000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000c400000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000069000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000250000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000dc000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000bb000000000000000000000000000000000000000000000000000000000000001f00000000000000000000000000000000000000000000000000000000000000ea000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000007900000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000042000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000410000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000006f00000000000000000000000000000000000000000000000000000000000000fc0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000e6000000000000000000000000000000000000000000000000000000000000006e000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000a2000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000002e0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000f800000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000d5000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000e90000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000540000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000b5000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000da000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000cc000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002500000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000ca000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000b3000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000f700000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000071000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000009400000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000db000000000000000000000000000000000000000000000000000000000000008d0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000004f00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000007c000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000ac0000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000009c0000000000000000000000000000000000000000000000000000000000000099000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000a8000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000bf0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000008a000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000ef000000000000000000000000000000000000000000000000000000000000005b00000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000009e000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000980000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000e20000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000008600000000000000000000000000000000000000000000000000000000000000a400000000000000000000000000000000000000000000000000000000000000cf00000000000000000000000000000000000000000000000000000000000000cf0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000003a0000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000a70000000000000000000000000000000000000000000000000000000000000035000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003b00000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000077000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000086000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000fb000000000000000000000000000000000000000000000000000000000000008e000000000000000000000000000000000000000000000000000000000000005200000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000005900000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000b200000000000000000000000000000000000000000000000000000000000000ee00000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000058000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000006d0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000a40000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000b40000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005a0000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004d0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000b00000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000be00000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000061000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000087000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000006f000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000051000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000cc0000000000000000000000000000000000000000000000000000000000000025000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000004f0000000000000000000000000000000000000000000000000000000000000057000000000000000000000000000000000000000000000000000000000000003f00000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000004e00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000b900000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000003c00000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003e00000000000000000000000000000000000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000bd0000000000000000000000000000000000000000000000000000000000000062000000000000000000000000000000000000000000000000000000000000008200000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000c600000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000fa0000000000000000000000000000000000000000000000000000000000000074000000000000000000000000000000000000000000000000000000000000005e0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000490000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000d8000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000002d000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000065000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008900000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000fa00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000092000000000000000000000000000000000000000000000000000000000000005c0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000e50000000000000000000000000000000000000000000000000000000000000049000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000bf000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a40000000000000000000000000000000000000000000000000000000000000017000000000000000000000000000000000000000000000000000000000000003b000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000b300000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000004600000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000ca00000000000000000000000000000000000000000000000000000000000000b70000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000007a0000000000000000000000000000000000000000000000000000000000000045000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000ea00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000009500000000000000000000000000000000000000000000000000000000000000b700000000000000000000000000000000000000000000000000000000000000d90000000000000000000000000000000000000000000000000000000000000055000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000b7000000000000000000000000000000000000000000000000000000000000006700000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000760000000000000000000000000000000000000000000000000000000000000031000000000000000000000000000000000000000000000000000000000000006200000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000008e00000000000000000000000000000000000000000000000000000000000000590000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000004300000000000000000000000000000000000000000000000000000000000000d500000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000005b000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000f70000000000000000000000000000000000000000000000000000000000000095000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000b100000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000a600000000000000000000000000000000000000000000000000000000000000f1000000000000000000000000000000000000000000000000000000000000009800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000f2000000000000000000000000000000000000000000000000000000000000003f000000000000000000000000000000000000000000000000000000000000004c00000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000043000000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000000b1000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000c70000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000f900000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000c3000000000000000000000000000000000000000000000000000000000000007300000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000f500000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000920000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000005700000000000000000000000000000000000000000000000000000000000000f4000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000fd0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000007100000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004a0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000079000000000000000000000000000000000000000000000000000000000000005c000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000008500000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000d100000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000bd00000000000000000000000000000000000000000000000000000000000000560000000000000000000000000000000000000000000000000000000000000041000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000b60000000000000000000000000000000000000000000000000000000000000084000000000000000000000000000000000000000000000000000000000000009f000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000f3000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ec00000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000066000000000000000000000000000000000000000000000000000000000000004b000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000fe00000000000000000000000000000000000000000000000000000000000000ba00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000b600000000000000000000000000000000000000000000000000000000000000a20000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000da00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000dd00000000000000000000000000000000000000000000000000000000000000940000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000008a0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000530000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000002b000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000081000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000850000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000005e00000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000007b00000000000000000000000000000000000000000000000000000000000000fb00000000000000000000000000000000000000000000000000000000000000b2000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000a700000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000a500000000000000000000000000000000000000000000000000000000000000bb0000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e800000000000000000000000000000000000000000000000000000000000000fe000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000370000000000000000000000000000000000000000000000000000000000000083000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000c20000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000bc00000000000000000000000000000000000000000000000000000000000000e2000000000000000000000000000000000000000000000000000000000000006800000000000000000000000000000000000000000000000000000000000000c9000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000af000000000000000000000000000000000000000000000000000000000000007800000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000007700000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004700000000000000000000000000000000000000000000000000000000000000cd00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000770000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000d7000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000002e000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000ed00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000004e000000000000000000000000000000000000000000000000000000000000008800000000000000000000000000000000000000000000000000000000000000e9000000000000000000000000000000000000000000000000000000000000006a000000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000df00000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000073000000000000000000000000000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000ab00000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000009700000000000000000000000000000000000000000000000000000000000000d600000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000001b000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000088000000000000000000000000000000000000000000000000000000000000003600000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000a800000000000000000000000000000000000000000000000000000000000000930000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000cc00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004400000000000000000000000000000000000000000000000000000000000000a300000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000000f300000000000000000000000000000000000000000000000000000000000000510000000000000000000000000000000000000000000000000000000000000091000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000f9000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000009b00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000c200000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000004c000000000000000000000000000000000000000000000000000000000000003400000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000007a00000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000bc000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000d4000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000005d000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000008f0000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000003a000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000a900000000000000000000000000000000000000000000000000000000000000de00000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000001d00000000000000000000000000000000000000000000000000000000000000df0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001b00000000000000000000000000000000000000000000000000000000000000f7000000000000000000000000000000000000000000000000000000000000005c00000000000000000000000000000000000000000000000000000000000000e100000000000000000000000000000000000000000000000000000000000000fd000000000000000000000000000000000000000000000000000000000000007c00000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000004d000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000000750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005300000000000000000000000000000000000000000000000000000000000000a9000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000d9000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000c6000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000a30000000000000000000000000000000000000000000000000000000000000021000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000b800000000000000000000000000000000000000000000000000000000000000ec000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000003300000000000000000000000000000000000000000000000000000000000000e1000000000000000000000000000000000000000000000000000000000000009300000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000004e0000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000c5000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000ab000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000097000000000000000000000000000000000000000000000000000000000000006b0000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000420000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000960000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000b8000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000089000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000000000000000000000000000000000000000000d10000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000002700000000000000000000000000000000000000000000000000000000000000e3000000000000000000000000000000000000000000000000000000000000007d000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000008300000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000290000000000000000000000000000000000000000000000000000000000000052000000000000000000000000000000000000000000000000000000000000004100000000000000000000000000000000000000000000000000000000000000df000000000000000000000000000000000000000000000000000000000000008100000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000001a00000000000000000000000000000000000000000000000000000000000000bd000000000000000000000000000000000000000000000000000000000000009e00000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000fd00000000000000000000000000000000000000000000000000000000000000f600000000000000000000000000000000000000000000000000000000000000a7000000000000000000000000000000000000000000000000000000000000004200000000000000000000000000000000000000000000000000000000000000aa00000000000000000000000000000000000000000000000000000000000000d1000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000d200000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000c100000000000000000000000000000000000000000000000000000000000000ac000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000bc0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000cf000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000053000000000000000000000000000000000000000000000000000000000000005400000000000000000000000000000000000000000000000000000000000000fa000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000950000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000002d00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000009a00000000000000000000000000000000000000000000000000000000000000a3000000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000eb000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000002900000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000d300000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000d70000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000660000000000000000000000000000000000000000000000000000000000000085000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000002b00000000000000000000000000000000000000000000000000000000000000a6000000000000000000000000000000000000000000000000000000000000008f000000000000000000000000000000000000000000000000000000000000005100000000000000000000000000000000000000000000000000000000000000bb00000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000048000000000000000000000000000000000000000000000000000000000000008c000000000000000000000000000000000000000000000000000000000000004c0000000000000000000000000000000000000000000000000000000000000078000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000f80000000000000000000000000000000000000000000000000000000000000036000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000aa0000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000f100000000000000000000000000000000000000000000000000000000000000a1000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000067000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000005800000000000000000000000000000000000000000000000000000000000000b400000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000350000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000006a00000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000037000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000ee000000000000000000000000000000000000000000000000000000000000007e00000000000000000000000000000000000000000000000000000000000000c2000000000000000000000000000000000000000000000000000000000000006b00000000000000000000000000000000000000000000000000000000000000580000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004d00000000000000000000000000000000000000000000000000000000000000b4000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000c1000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000000000000000e500000000000000000000000000000000000000000000000000000000000000db00000000000000000000000000000000000000000000000000000000000000c500000000000000000000000000000000000000000000000000000000000000af00000000000000000000000000000000000000000000000000000000000000f400000000000000000000000000000000000000000000000000000000000000460000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006e00000000000000000000000000000000000000000000000000000000000000710000000000000000000000000000000000000000000000000000000000000082000000000000000000000000000000000000000000000000000000000000007e0000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000006d000000000000000000000000000000000000000000000000000000000000004a00000000000000000000000000000000000000000000000000000000000000d800000000000000000000000000000000000000000000000000000000000000cb000000000000000000000000000000000000000000000000000000000000003d000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000e400000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000002f000000000000000000000000000000000000000000000000000000000000007b000000000000000000000000000000000000000000000000000000000000006c000000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000006a0000000000000000000000000000000000000000000000000000000000000072000000000000000000000000000000000000000000000000000000000000000d00000000000000000000000000000000000000000000000000000000000000d400000000000000000000000000000000000000000000000000000000000000c300000000000000000000000000000000000000000000000000000000000000f60000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000008a00000000000000000000000000000000000000000000000000000000000000f5000000000000000000000000000000000000000000000000000000000000007a000000000000000000000000000000000000000000000000000000000000003f0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000005d00000000000000000000000000000000000000000000000000000000000000c900000000000000000000000000000000000000000000000000000000000000ae0000000000000000000000000000000000000000000000000000000000000068000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000d60000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000008b000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000d700000000000000000000000000000000000000000000000000000000000000b9000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000004500000000000000000000000000000000000000000000000000000000000000cb00000000000000000000000000000000000000000000000000000000000000ce0000000000000000000000000000000000000000000000000000000000000070000000000000000000000000000000000000000000000000000000000000003a00000000000000000000000000000000000000000000000000000000000000e700000000000000000000000000000000000000000000000000000000000000ab0000000000000000000000000000000000000000000000000000000000000075000000000000000000000000000000000000000000000000000000000000009f00000000000000000000000000000000000000000000000000000000000000d6000000000000000000000000000000000000000000000000000000000000004900000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000009b000000000000000000000000000000000000000000000000000000000000001ba05d4d29b6f1b101809f9b43edea6e227828ed7df55663b482cff3d9d7a14ec20aa023db82ed86dd399e73aee94f0f0f8854d352c413e64c4b7f8d8a9bf5cb198d4b")))
+ d.mask |= uint32(1) << 0
+ d.mask |= uint32(1) << 8
+ hashRoot(d, "Hash7")
+}
diff --git a/erigon-lib/trie/hashbuilder.go b/turbo/trie/hashbuilder.go
similarity index 98%
rename from erigon-lib/trie/hashbuilder.go
rename to turbo/trie/hashbuilder.go
index 8dff485a678..d8e3c53126d 100644
--- a/erigon-lib/trie/hashbuilder.go
+++ b/turbo/trie/hashbuilder.go
@@ -31,8 +31,8 @@ import (
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/rlphacks"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
const hashStackStride = length2.Hash + 1 // + 1 byte for RLP encoding
@@ -658,7 +658,6 @@ func (hb *HashBuilder) code(code []byte) error {
return nil
}
-// nolint
func (hb *HashBuilder) emptyRoot() {
if hb.trace {
fmt.Printf("EMPTYROOT\n")
@@ -696,12 +695,12 @@ func (hb *HashBuilder) rootHash() libcommon.Hash {
func (hb *HashBuilder) topHash() []byte {
pos := len(hb.hashStack) - hashStackStride
- length := hb.hashStack[pos] - 0x80
- if length > 32 {
+ len := hb.hashStack[pos] - 0x80
+ if len > 32 {
// node itself (RLP list), not its hash
- length = hb.hashStack[pos] - 0xc0
+ len = hb.hashStack[pos] - 0xc0
}
- return hb.hashStack[pos : pos+1+int(length)]
+ return hb.hashStack[pos : pos+1+int(len)]
}
func (hb *HashBuilder) printTopHashes(prefix []byte, _, children uint16) {
diff --git a/erigon-lib/trie/hasher.go b/turbo/trie/hasher.go
similarity index 99%
rename from erigon-lib/trie/hasher.go
rename to turbo/trie/hasher.go
index e191ca32044..27e41816c24 100644
--- a/erigon-lib/trie/hasher.go
+++ b/turbo/trie/hasher.go
@@ -31,7 +31,7 @@ import (
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/rlphacks"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
type hasher struct {
diff --git a/erigon-lib/trie/hasher_test.go b/turbo/trie/hasher_test.go
similarity index 100%
rename from erigon-lib/trie/hasher_test.go
rename to turbo/trie/hasher_test.go
diff --git a/erigon-lib/trie/intermediate_hashes_test.go b/turbo/trie/intermediate_hashes_test.go
similarity index 100%
rename from erigon-lib/trie/intermediate_hashes_test.go
rename to turbo/trie/intermediate_hashes_test.go
diff --git a/erigon-lib/trie/node.go b/turbo/trie/node.go
similarity index 99%
rename from erigon-lib/trie/node.go
rename to turbo/trie/node.go
index 5fbdfb187df..1423a8aeba4 100644
--- a/erigon-lib/trie/node.go
+++ b/turbo/trie/node.go
@@ -25,7 +25,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
"github.com/erigontech/erigon-lib/rlp"
)
diff --git a/erigon-lib/trie/proof.go b/turbo/trie/proof.go
similarity index 99%
rename from erigon-lib/trie/proof.go
rename to turbo/trie/proof.go
index 9fcd8770aea..5c3eb271418 100644
--- a/erigon-lib/trie/proof.go
+++ b/turbo/trie/proof.go
@@ -26,7 +26,7 @@ import (
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
// Prove constructs a merkle proof for key. The result contains all encoded nodes
diff --git a/erigon-lib/trie/retain_list.go b/turbo/trie/retain_list.go
similarity index 99%
rename from erigon-lib/trie/retain_list.go
rename to turbo/trie/retain_list.go
index fb9215c3c4f..5d43c95b451 100644
--- a/erigon-lib/trie/retain_list.go
+++ b/turbo/trie/retain_list.go
@@ -34,7 +34,7 @@ import (
"github.com/erigontech/erigon-lib/common/hexutility"
"github.com/erigontech/erigon-lib/common/length"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
type RetainDecider interface {
diff --git a/erigon-lib/trie/retain_list_test.go b/turbo/trie/retain_list_test.go
similarity index 98%
rename from erigon-lib/trie/retain_list_test.go
rename to turbo/trie/retain_list_test.go
index 26bea0dc64f..96e1381544a 100644
--- a/erigon-lib/trie/retain_list_test.go
+++ b/turbo/trie/retain_list_test.go
@@ -24,7 +24,7 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/hexutil"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func FakePreimage(hash libcommon.Hash) libcommon.Hash {
@@ -39,7 +39,7 @@ func FakePreimage(hash libcommon.Hash) libcommon.Hash {
// manually construct a ProofRetainer based on a set of keys. This is
// especially useful for tests which want to manually manipulate the hash
// databases without worrying about generating and tracking pre-images.
-func NewManualProofRetainer(t *testing.T, acc *accounts.Account, rl *RetainList, keys [][]byte) *ProofRetainer { //nolint
+func NewManualProofRetainer(t *testing.T, acc *accounts.Account, rl *RetainList, keys [][]byte) *ProofRetainer {
var accHexKey []byte
var storageKeys []libcommon.Hash
var storageHexKeys [][]byte
diff --git a/erigon-lib/trie/stream.go b/turbo/trie/stream.go
similarity index 99%
rename from erigon-lib/trie/stream.go
rename to turbo/trie/stream.go
index 9d106f62c78..19e81503d05 100644
--- a/erigon-lib/trie/stream.go
+++ b/turbo/trie/stream.go
@@ -29,8 +29,8 @@ import (
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/rlphacks"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
// StreamItem is an enum type for values that help distinguish different
diff --git a/erigon-lib/trie/stream_test.go b/turbo/trie/stream_test.go
similarity index 98%
rename from erigon-lib/trie/stream_test.go
rename to turbo/trie/stream_test.go
index 213859c4d07..2c4ea1ee298 100644
--- a/erigon-lib/trie/stream_test.go
+++ b/turbo/trie/stream_test.go
@@ -28,7 +28,7 @@ import (
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func TestHashWithModificationsEmpty(t *testing.T) {
diff --git a/erigon-lib/trie/structural_test.go b/turbo/trie/structural_test.go
similarity index 78%
rename from erigon-lib/trie/structural_test.go
rename to turbo/trie/structural_test.go
index 7766d96f24f..83219343804 100644
--- a/erigon-lib/trie/structural_test.go
+++ b/turbo/trie/structural_test.go
@@ -31,12 +31,12 @@ import (
"github.com/stretchr/testify/require"
- "github.com/erigontech/erigon-lib/common"
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/common/length"
"github.com/erigontech/erigon-lib/crypto"
- "github.com/erigontech/erigon-lib/rlphacks"
+ "github.com/erigontech/erigon-lib/common"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
func TestV2HashBuilding(t *testing.T) {
@@ -261,28 +261,28 @@ func TestEmbeddedStorage11(t *testing.T) {
}{
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae9800000000000000010d2f4a412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"),
- v: libcommon.FromHex("496e7374616e6365000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae9800000000000000010d2f4a412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"),
+ v: common.FromHex("496e7374616e6365000000000000000000000000000000000000000000000000"),
},
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae98000000000000000123a5384746519cbca71a22098063e5608768276f2dc212e71fd2c6c643c726c4"),
- v: libcommon.FromHex("65eea643e9a9d6f5f2f7e13ccdff36cf45b46aab"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae98000000000000000123a5384746519cbca71a22098063e5608768276f2dc212e71fd2c6c643c726c4"),
+ v: common.FromHex("65eea643e9a9d6f5f2f7e13ccdff36cf45b46aab"),
},
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001387a79e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"),
- v: libcommon.FromHex("01"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001387a79e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"),
+ v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001a8dc6a21510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"),
- v: libcommon.FromHex("53706f7265000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001a8dc6a21510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"),
+ v: common.FromHex("53706f7265000000000000000000000000000000000000000000000000000000"),
},
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001dee260551c74e3b37ed31b6e5f482a3ff9342f863a5880c9090db0cc9e002750"),
- v: libcommon.FromHex("5067247f2214dca445bfb213277b5f19711e309f"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001dee260551c74e3b37ed31b6e5f482a3ff9342f863a5880c9090db0cc9e002750"),
+ v: common.FromHex("5067247f2214dca445bfb213277b5f19711e309f"),
},
{
- k: libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001fe59747b95e3ddbc3fd7e47a8bdf2465d2d88a030c9bd19cc3c0b7a9860c0d5f"),
- v: libcommon.FromHex("01"),
+ k: common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001fe59747b95e3ddbc3fd7e47a8bdf2465d2d88a030c9bd19cc3c0b7a9860c0d5f"),
+ v: common.FromHex("01"),
},
}
hb := NewHashBuilder(true)
@@ -332,16 +332,16 @@ func TestAccountsOnly(t *testing.T) {
k []byte
v []byte
}{
- {k: libcommon.FromHex("10002a312d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("10002a412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("10002b412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("10009384e46519cbc71a22098063e5608768276f2dc212e71fd2c6c643c726c4"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("10009484e46519cbc71a22098063e5608768276f2dc212e71fd2c6c643c726c4"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("1000a9e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("110006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("120006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("121006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: libcommon.FromHex("01")},
- {k: libcommon.FromHex("200c6a21510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: libcommon.FromHex("01")},
+ {k: common.FromHex("10002a312d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: common.FromHex("01")},
+ {k: common.FromHex("10002a412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: common.FromHex("01")},
+ {k: common.FromHex("10002b412d2809e00f42a7f8cb0e659bddf0b4f201d24eb1b2946493cbae334c"), v: common.FromHex("01")},
+ {k: common.FromHex("10009384e46519cbc71a22098063e5608768276f2dc212e71fd2c6c643c726c4"), v: common.FromHex("01")},
+ {k: common.FromHex("10009484e46519cbc71a22098063e5608768276f2dc212e71fd2c6c643c726c4"), v: common.FromHex("01")},
+ {k: common.FromHex("1000a9e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01")},
+ {k: common.FromHex("110006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: common.FromHex("01")},
+ {k: common.FromHex("120006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: common.FromHex("01")},
+ {k: common.FromHex("121006a1510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: common.FromHex("01")},
+ {k: common.FromHex("200c6a21510692d70d47860a1bbd432c801d1860bfbbe6856756ad4c062ba601"), v: common.FromHex("01")},
}
hb := NewHashBuilder(false)
var succ bytes.Buffer
@@ -356,22 +356,22 @@ func TestAccountsOnly(t *testing.T) {
i++
switch i {
case 1:
- require.Equal(t, libcommon.FromHex("0100000002"), keyHex)
+ require.Equal(t, common.FromHex("0100000002"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b10000000000)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b000)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 2:
- require.Equal(t, libcommon.FromHex("01000000"), keyHex)
+ require.Equal(t, common.FromHex("01000000"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b1000000100)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b100)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 3:
- require.Equal(t, libcommon.FromHex("01"), keyHex)
+ require.Equal(t, common.FromHex("01"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b100)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b001)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 4:
- require.Equal(t, libcommon.FromHex(""), keyHex)
+ require.Equal(t, common.FromHex(""), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
@@ -412,19 +412,19 @@ func TestBranchesOnly(t *testing.T) {
k []byte
hasTree bool
}{
- {k: libcommon.FromHex("0100000002000a03"), hasTree: false},
- {k: libcommon.FromHex("0100000002000a04"), hasTree: true},
- {k: libcommon.FromHex("01000000020b"), hasTree: false},
- {k: libcommon.FromHex("010000000900000103"), hasTree: false},
- //{k:libcommon.FromHex("010000000900000104"), hasTree: false},
- //{k:libcommon.FromHex("010000000900000203"), hasTree: false},
- //{k:libcommon.FromHex("010000000900000204"), hasTree: false},
- {k: libcommon.FromHex("010000000901"), hasTree: false},
- {k: libcommon.FromHex("010000000a"), hasTree: false},
- {k: libcommon.FromHex("0101"), hasTree: false},
- {k: libcommon.FromHex("010200000a"), hasTree: false},
- {k: libcommon.FromHex("010200000b"), hasTree: false},
- {k: libcommon.FromHex("0201"), hasTree: false},
+ {k: common.FromHex("0100000002000a03"), hasTree: false},
+ {k: common.FromHex("0100000002000a04"), hasTree: true},
+ {k: common.FromHex("01000000020b"), hasTree: false},
+ {k: common.FromHex("010000000900000103"), hasTree: false},
+ //{k: common.FromHex("010000000900000104"), hasTree: false},
+ //{k: common.FromHex("010000000900000203"), hasTree: false},
+ //{k: common.FromHex("010000000900000204"), hasTree: false},
+ {k: common.FromHex("010000000901"), hasTree: false},
+ {k: common.FromHex("010000000a"), hasTree: false},
+ {k: common.FromHex("0101"), hasTree: false},
+ {k: common.FromHex("010200000a"), hasTree: false},
+ {k: common.FromHex("010200000b"), hasTree: false},
+ {k: common.FromHex("0201"), hasTree: false},
}
hb := NewHashBuilder(false)
var succ, curr bytes.Buffer
@@ -438,37 +438,37 @@ func TestBranchesOnly(t *testing.T) {
i++
switch i {
case 1:
- require.Equal(t, libcommon.FromHex("0100000002000a"), keyHex)
+ require.Equal(t, common.FromHex("0100000002000a"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b11000)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b1000)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 2:
- require.Equal(t, libcommon.FromHex("0100000002"), keyHex)
+ require.Equal(t, common.FromHex("0100000002"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b100000000000)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b1)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 3:
- require.Equal(t, libcommon.FromHex("0100000009"), keyHex)
+ require.Equal(t, common.FromHex("0100000009"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b0)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 4:
- require.Equal(t, libcommon.FromHex("01000000"), keyHex)
+ require.Equal(t, common.FromHex("01000000"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b11000000100)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b01000000100)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 5:
- require.Equal(t, libcommon.FromHex("01020000"), keyHex)
+ require.Equal(t, common.FromHex("01020000"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b110000000000)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b0)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 6:
- require.Equal(t, libcommon.FromHex("01"), keyHex)
+ require.Equal(t, common.FromHex("01"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b101)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 7:
- require.Equal(t, libcommon.FromHex(""), keyHex)
+ require.Equal(t, common.FromHex(""), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b10)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
@@ -500,28 +500,28 @@ func TestBranchesOnly(t *testing.T) {
}
func TestStorageOnly(t *testing.T) {
- //acc :=libcommon.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001")
+ //acc := common.FromHex("fff9c1aa5884f1130301f60f98419b9d4217bc4ab65a2976b41e9a00bbceae980000000000000001")
keys := []struct {
k []byte
v []byte
}{
{
- k: libcommon.FromHex("500020e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("500020e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("500021e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("500021e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("500027e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("500027e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("5000979e93fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("5000979e93fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("5000a7e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("5000a7e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
{
- k: libcommon.FromHex("600a79e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: libcommon.FromHex("01"),
+ k: common.FromHex("600a79e493fff57a9c96dc0a7efb356613eafd5c89ea9f2be54d8ecf96ce0d28"), v: common.FromHex("01"),
},
}
hb := NewHashBuilder(false)
@@ -537,17 +537,17 @@ func TestStorageOnly(t *testing.T) {
i++
switch i {
case 1:
- require.Equal(t, libcommon.FromHex("05000000"), keyHex)
+ require.Equal(t, common.FromHex("05000000"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b100)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b0)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 3:
- require.Equal(t, libcommon.FromHex("05000000"), keyHex)
+ require.Equal(t, common.FromHex("05000000"), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b100)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b000)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 4:
- require.Equal(t, libcommon.FromHex(""), keyHex)
+ require.Equal(t, common.FromHex(""), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b0)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b100000)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
@@ -595,15 +595,15 @@ func TestStorageWithoutBranchNodeInRoot(t *testing.T) {
hasTree bool
}{
{
- k: libcommon.FromHex("500020"),
+ k: common.FromHex("500020"),
hasTree: true,
},
{
- k: libcommon.FromHex("500021"),
+ k: common.FromHex("500021"),
hasTree: false,
},
{
- k: libcommon.FromHex("500027"),
+ k: common.FromHex("500027"),
hasTree: false,
},
}
@@ -615,13 +615,13 @@ func TestStorageWithoutBranchNodeInRoot(t *testing.T) {
i++
switch i {
case 1:
- require.Equal(t, libcommon.FromHex("0500000002"), keyHex)
+ require.Equal(t, common.FromHex("0500000002"), keyHex)
//require.Equal(t, fmt.Sprintf("%b", uint16(0b10000011)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b10000011)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b1)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
case 2:
- require.Equal(t, libcommon.FromHex(""), keyHex)
+ require.Equal(t, common.FromHex(""), keyHex)
require.Equal(t, fmt.Sprintf("%b", uint16(0b0)), fmt.Sprintf("%b", hasHash))
require.Equal(t, fmt.Sprintf("%b", uint16(0b100000)), fmt.Sprintf("%b", hasTree))
require.NotNil(t, hashes)
@@ -671,32 +671,32 @@ func Test2(t *testing.T) {
v []byte
}{
{
- k: libcommon.FromHex("000000"),
- v: libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("000000"),
+ v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
},
{
- k: libcommon.FromHex("000001"),
- v: libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("000001"),
+ v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
},
{
- k: libcommon.FromHex("000009"),
- v: libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("000009"),
+ v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
},
//{
- // k:libcommon.FromHex("000010"),
- // v:libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ // k: common.FromHex("000010"),
+ // v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
//},
//{
- // k:libcommon.FromHex("000020"),
- // v:libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ // k: common.FromHex("000020"),
+ // v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
//},
{
- k: libcommon.FromHex("01"),
- v: libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("01"),
+ v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
},
{
- k: libcommon.FromHex("02"),
- v: libcommon.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
+ k: common.FromHex("02"),
+ v: common.FromHex("0100000000000000000000000000000000000000000000000000000000000000"),
},
}
hb := NewHashBuilder(false)
diff --git a/erigon-lib/trie/sub_trie_loader.go b/turbo/trie/sub_trie_loader.go
similarity index 100%
rename from erigon-lib/trie/sub_trie_loader.go
rename to turbo/trie/sub_trie_loader.go
diff --git a/erigon-lib/trie/trie.go b/turbo/trie/trie.go
similarity index 99%
rename from erigon-lib/trie/trie.go
rename to turbo/trie/trie.go
index 5fb5c9e7dd9..09686362c77 100644
--- a/erigon-lib/trie/trie.go
+++ b/turbo/trie/trie.go
@@ -28,7 +28,8 @@ import (
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/crypto"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/ethdb"
)
var (
@@ -333,7 +334,7 @@ func (t *Trie) UpdateAccountCode(key []byte, code codeNode) error {
accNode, gotValue := t.getAccount(t.root, hex, 0)
if accNode == nil || !gotValue {
- return fmt.Errorf("account not found with key: %x", key)
+ return fmt.Errorf("account not found with key: %x, %w", key, ethdb.ErrKeyNotFound)
}
actualCodeHash := crypto.Keccak256(code)
@@ -359,7 +360,7 @@ func (t *Trie) UpdateAccountCodeSize(key []byte, codeSize int) error {
accNode, gotValue := t.getAccount(t.root, hex, 0)
if accNode == nil || !gotValue {
- return fmt.Errorf("account not found with key: %x", key)
+ return fmt.Errorf("account not found with key: %x, %w", key, ethdb.ErrKeyNotFound)
}
accNode.codeSize = codeSize
diff --git a/erigon-lib/trie/trie_root.go b/turbo/trie/trie_root.go
similarity index 99%
rename from erigon-lib/trie/trie_root.go
rename to turbo/trie/trie_root.go
index 6ec60f00a2b..fe89780a437 100644
--- a/erigon-lib/trie/trie_root.go
+++ b/turbo/trie/trie_root.go
@@ -32,8 +32,8 @@ import (
"github.com/erigontech/erigon-lib/kv"
dbutils2 "github.com/erigontech/erigon-lib/kv/dbutils"
- "github.com/erigontech/erigon-lib/rlphacks"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
+ "github.com/erigontech/erigon/turbo/rlphacks"
)
/*
@@ -127,6 +127,7 @@ type RootHashAggregator struct {
curr bytes.Buffer // Current key for the structure generation algorithm, as well as the input tape for the hash builder
succ bytes.Buffer
currAccK []byte
+ value []byte // Current value to be used as the value tape for the hash builder
hadTreeAcc bool
groups []uint16 // `groups` parameter is the map of the stack. each element of the `groups` slice is a bitmask, one bit per element currently on the stack. See `GenStructStep` docs
hasTree []uint16
diff --git a/erigon-lib/trie/trie_test.go b/turbo/trie/trie_test.go
similarity index 99%
rename from erigon-lib/trie/trie_test.go
rename to turbo/trie/trie_test.go
index f3e1b85dcd4..c7edcb84eb3 100644
--- a/erigon-lib/trie/trie_test.go
+++ b/turbo/trie/trie_test.go
@@ -31,10 +31,11 @@ import (
"github.com/davecgh/go-spew/spew"
"github.com/stretchr/testify/assert"
+ "github.com/erigontech/erigon-lib/common"
libcommon "github.com/erigontech/erigon-lib/common"
"github.com/erigontech/erigon-lib/crypto"
"github.com/erigontech/erigon-lib/rlp"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
func init() {
@@ -631,7 +632,7 @@ func TestNextSubtreeHex(t *testing.T) {
}
for _, tc := range cases {
- res := isDenseSequence(libcommon.FromHex(tc.prev), libcommon.FromHex(tc.next))
+ res := isDenseSequence(common.FromHex(tc.prev), common.FromHex(tc.next))
assert.Equal(tc.expect, res, "%s, %s", tc.prev, tc.next)
}
}
diff --git a/erigon-lib/trie/trie_transform.go b/turbo/trie/trie_transform.go
similarity index 94%
rename from erigon-lib/trie/trie_transform.go
rename to turbo/trie/trie_transform.go
index 17e9e0be57d..ff1d15a2324 100644
--- a/erigon-lib/trie/trie_transform.go
+++ b/turbo/trie/trie_transform.go
@@ -18,12 +18,12 @@ package trie
import (
"github.com/erigontech/erigon-lib/common"
- "github.com/erigontech/erigon-lib/types/accounts"
+ "github.com/erigontech/erigon/core/types/accounts"
)
-type keyTransformFunc func([]byte) []byte //nolint
+type keyTransformFunc func([]byte) []byte
-func transformSubTrie(nd node, hex []byte, newTrie *Trie, transformFunc keyTransformFunc) { //nolint
+func transformSubTrie(nd node, hex []byte, newTrie *Trie, transformFunc keyTransformFunc) {
switch n := nd.(type) {
case nil:
return
diff --git a/erigon-lib/trie/utils.go b/turbo/trie/utils.go
similarity index 100%
rename from erigon-lib/trie/utils.go
rename to turbo/trie/utils.go
diff --git a/erigon-lib/trie/vtree/verkle_utils.go b/turbo/trie/vtree/verkle_utils.go
similarity index 100%
rename from erigon-lib/trie/vtree/verkle_utils.go
rename to turbo/trie/vtree/verkle_utils.go
diff --git a/erigon-lib/trie/vtree/verkle_utils_test.go b/turbo/trie/vtree/verkle_utils_test.go
similarity index 100%
rename from erigon-lib/trie/vtree/verkle_utils_test.go
rename to turbo/trie/vtree/verkle_utils_test.go